查找匹配项并替换为动态值

问题描述 投票:0回答:1

我需要查找某些字符并将其替换为其他字符(或者只是删除它们)。 替换规则:如果找到的第一个字符是“A”,则将该字符替换为currNumber +100的值;如果找到的第一个字符是“B”,则将此字符替换为 currNumber -10 的值。如果找到字符“*_”(_符号可以重复多次),则只需替换为“”即可。

不幸的是我的代码版本不起作用。也许搜索并不是每次都从头开始

    Dim xStr_1 As Long    ' A
    Dim xStr_2 As Long    ' B
    Dim xStr_3 As Long    ' *_
    
    Dim i As Long
    
    Dim  currNumber As long
    
    currNumber = 0
    
    xStr_1 = InStr(1, Selection, "A")
    xStr_2 = InStr(1, Selection, "B")
    xStr_3 = InStr(1, Selection, "*_")
    
    if xStr_1 > 0 and xStr_1 < xStr_2 and xStr_1 < xStr_3 then i = xStr_1
    if xStr_2 > 0 and xStr_2 < xStr_1 and xStr_2 < xStr_3 then i = xStr_2
    if xStr_3 > 0 and xStr_3 < xStr_1 and xStr_3 < xStr_2 then i = xStr_3
    
    Do While i <> 0
    
        If xStr_1 = i Then
            
            With Selection.Find
                .ClearFormatting
                .Text = "A"
                .Wrap = wdFindContinue
                With .Replacement
                    .ClearFormatting
                    .Text = currNumber + 100
                End With
                .Execute Replace:=wdReplaceOne
            End With
            
            currNumber  = currNumber + 100
            
        elseif xStr_2 = i Then
            
            With Selection.Find
                .ClearFormatting
                .Text = "B"
                .Wrap = wdFindContinue
                With .Replacement
                    .ClearFormatting
                    .Text = currNumber - 10
                End With
                .Execute Replace:=wdReplaceOne
            End With
                
            currNumber  = currNumber - 10
    
        elseif xStr_3 = i Then
            
            With Selection.Find
                .ClearFormatting
                .Text = "\*{1}\_{1,}"
                .Wrap = wdFindContinue
                With .Replacement
                    .ClearFormatting
                    .Text = currNumber
                End With
                .Execute Replace:=wdReplaceOne
            End With
                
        end if

        xStr_1 = InStr(1, Selection, "A")
        xStr_2 = InStr(1, Selection, "B")
        xStr_3 = InStr(1, Selection, "*_")
        
        if xStr_1 > 0 and xStr_1 < xStr_2 and xStr_1 < xStr_3 then i = xStr_1
        if xStr_2 > 0 and xStr_2 < xStr_1 and xStr_2 < xStr_3 then i = xStr_2
        if xStr_3 > 0 and xStr_3 < xStr_1 and xStr_3 < xStr_2 then i = xStr_3   
    
    Loop    
vba ms-word
1个回答
0
投票

以下“If”子句无法按预期工作。例如,Word 中的选择显示在第一个快照中。在这种情况下,xStr_1 = 16,并且 xStr_2 和 xStr_3 = 0。但是,尽管 xStr_1 > 0,但条件 xStr_1 < xStr_2 and xStr_1 < xStr_3 are evaluated as False. The vlaue of i is 0 after three If clauses.

    if xStr_1 > 0 and xStr_1 < xStr_2 and xStr_1 < xStr_3 then i = xStr_1
    if xStr_2 > 0 and xStr_2 < xStr_1 and xStr_2 < xStr_3 then i = xStr_2
    if xStr_3 > 0 and xStr_3 < xStr_1 and xStr_3 < xStr_2 then i = xStr_3

请尝试一下。

Sub demo()
    Dim xStr_1 As Long    ' A
    Dim xStr_2 As Long    ' B
    Dim xStr_3 As Long    ' *_
    Dim i As Long
    Dim currNumber As Long
    currNumber = 0
    xStr_1 = InStr(1, Selection, "A")
    xStr_2 = InStr(1, Selection, "B")
    xStr_3 = InStr(1, Selection, "*_")
    If xStr_1 > 0 And (xStr_1 < xStr_2 Or xStr_2 = 0) And (xStr_1 < xStr_3 Or xStr_3 = 0) Then i = xStr_1
    If xStr_2 > 0 And (xStr_2 < xStr_1 Or xStr_1 = 0) And (xStr_2 < xStr_3 Or xStr_3 = 0) Then i = xStr_2
    If xStr_3 > 0 And (xStr_3 < xStr_1 Or xStr_1 = 0) And (xStr_3 < xStr_2 Or xStr_2 = 0) Then i = xStr_3
    Debug.Print xStr_1, xStr_2, xStr_3
    Debug.Print i
End Sub

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.