Vba 单词宏搜索&;替换格式化问题

Vba 单词宏搜索&;替换格式化问题,vba,ms-word,Vba,Ms Word,我正在尝试构建一个宏(作为noob)来查找某些单词,然后更改该单词的格式(即,将其设置为粗体或斜体) 这段代码“有点有效”。它会找到一些单词并进行更改,但不会更改其他单词。奇怪的是,它一直工作,直到我添加另一个子元素,然后它停止对某些单词进行格式化,而对其他单词进行格式化。例行程序从不中断,一直运行到结束,没有错误 有人能教我为什么会这样,我做错了什么吗?我不是程序员。谢谢 Sub Macro2() ' ' Macro2 Macro ' ' Selection.Find.ClearFor

我正在尝试构建一个宏(作为noob)来查找某些单词,然后更改该单词的格式(即,将其设置为粗体或斜体)

这段代码“有点有效”。它会找到一些单词并进行更改,但不会更改其他单词。奇怪的是,它一直工作,直到我添加另一个子元素,然后它停止对某些单词进行格式化,而对其他单词进行格式化。例行程序从不中断,一直运行到结束,没有错误

有人能教我为什么会这样,我做错了什么吗?我不是程序员。谢谢

Sub Macro2()
'
' Macro2 Macro
'
'
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "Printer"
        .Replacement.Text = ""
        .Replacement.Font.bold = True
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchCase = False
        .MatchWholeWord = True
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    With Selection.Find
        .Text = "Parameter Values"
        .Replacement.Text = ""
        .Replacement.Font.bold = True
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With

    With Selection.Find
        .Text = "Use All Applicants Indicator"
        .Replacement.Text = ""
        .Replacement.Font.bold = True
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With

    With Selection.Find
        .Text = "Next Section"
        .Replacement.Text = ""
        .Replacement.Font.bold = True
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With

选择
是包含当前所选文档部分的对象。
Find
是定义
Find
对象的
选择
对象的属性(名称相同,但一个是属性,另一个是对象)。
Find
对象具有诸如
Text
Forward
Wrap
等属性,并且它具有类似
ClearFormatting
Execute
的方法。所有这些都可以在MSDN库中阅读

现在,当您定义
Find
对象时,您正在描述要查找的内容。使用
Execute
命令开始查找它。您的代码在某些地方缺少此命令

搜索仅限于
选择
。如果未选择任何内容,Word将假定您要搜索整个文档。但是
Selection.Find
将更改选择以突出显示找到的项目。因此,如果要继续搜索整个文档,则需要在每次搜索后使用
Activedocument.Content.Select来重置选择


简而言之,如果在每次使用后清除
Find
对象,请在每次重复使用前设置新的描述,为每次搜索定义
选择
对象,不要忘记
执行
每次单独的搜索,您的代码应该按照您的预期工作。

选择
是一个包含当前所选文档部分的对象。
Find
是定义
Find
对象的
选择
对象的属性(名称相同,但一个是属性,另一个是对象)。
Find
对象具有诸如
Text
Forward
Wrap
等属性,并且它具有类似
ClearFormatting
Execute
的方法。所有这些都可以在MSDN库中阅读

现在,当您定义
Find
对象时,您正在描述要查找的内容。使用
Execute
命令开始查找它。您的代码在某些地方缺少此命令

搜索仅限于
选择
。如果未选择任何内容,Word将假定您要搜索整个文档。但是
Selection.Find
将更改选择以突出显示找到的项目。因此,如果要继续搜索整个文档,则需要在每次搜索后使用
Activedocument.Content.Select来重置选择


简而言之,如果在每次使用后清除
Find
对象,请在每次重复使用前设置新的描述,为每个搜索定义
选择
对象,不要忘记
执行
每个单独的搜索。您的代码应该按照您希望的方式工作。

我会将搜索宏编程为一个单独的子项,如下所示

Private Sub FindAndReplace(ByVal Txt As String, _
                           Optional ByVal NewTxt As String, _
                           Optional ByVal Fmt As Boolean = False, _
                           Optional ByVal BldFmt As Boolean = False)

    With ActiveDocument.Content
        With .Find
            .ClearFormatting
            .Text = Txt
            .Format = Fmt Or BldFmt

            With .Replacement
                .ClearFormatting
                .Text = NewTxt
                .Font.Bold = BldFmt
            End With
            .Forward = True
            .Wrap = wdFindContinue
            .MatchCase = False
            .MatchWholeWord = True
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
        End With
        .Find.Execute Replace:=wdReplaceAll
    End With
End Sub
您可以使用但不必使用的所有可选参数。 然后我会用不同的参数重复调用sub,可能是这样的:-

Sub MakeReplacements1()

    FindAndReplace "Printer", BldFmt:=True
    FindAndReplace "Parameter values", BldFmt:=True
    FindAndReplace "Use All Applicants Indicator", BldFmt:=True
    FindAndReplace "Next Section", BldFmt:=True
End Sub
Sub MakeReplacements2()

    Dim Fnd() As String
    Dim i As Long

    Fnd = Split("Printer|Parameter values|Use All Applicants Indicator|Next Section", "|")
    For i = 0 To UBound(Fnd)
        FindAndReplace Fnd(i), BldFmt:=True
    Next i
End Sub
甚至像这样:-

Sub MakeReplacements1()

    FindAndReplace "Printer", BldFmt:=True
    FindAndReplace "Parameter values", BldFmt:=True
    FindAndReplace "Use All Applicants Indicator", BldFmt:=True
    FindAndReplace "Next Section", BldFmt:=True
End Sub
Sub MakeReplacements2()

    Dim Fnd() As String
    Dim i As Long

    Fnd = Split("Printer|Parameter values|Use All Applicants Indicator|Next Section", "|")
    For i = 0 To UBound(Fnd)
        FindAndReplace Fnd(i), BldFmt:=True
    Next i
End Sub

我会将搜索宏编程为一个单独的子对象,如下所示

Private Sub FindAndReplace(ByVal Txt As String, _
                           Optional ByVal NewTxt As String, _
                           Optional ByVal Fmt As Boolean = False, _
                           Optional ByVal BldFmt As Boolean = False)

    With ActiveDocument.Content
        With .Find
            .ClearFormatting
            .Text = Txt
            .Format = Fmt Or BldFmt

            With .Replacement
                .ClearFormatting
                .Text = NewTxt
                .Font.Bold = BldFmt
            End With
            .Forward = True
            .Wrap = wdFindContinue
            .MatchCase = False
            .MatchWholeWord = True
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
        End With
        .Find.Execute Replace:=wdReplaceAll
    End With
End Sub
您可以使用但不必使用的所有可选参数。 然后我会用不同的参数重复调用sub,可能是这样的:-

Sub MakeReplacements1()

    FindAndReplace "Printer", BldFmt:=True
    FindAndReplace "Parameter values", BldFmt:=True
    FindAndReplace "Use All Applicants Indicator", BldFmt:=True
    FindAndReplace "Next Section", BldFmt:=True
End Sub
Sub MakeReplacements2()

    Dim Fnd() As String
    Dim i As Long

    Fnd = Split("Printer|Parameter values|Use All Applicants Indicator|Next Section", "|")
    For i = 0 To UBound(Fnd)
        FindAndReplace Fnd(i), BldFmt:=True
    Next i
End Sub
甚至像这样:-

Sub MakeReplacements1()

    FindAndReplace "Printer", BldFmt:=True
    FindAndReplace "Parameter values", BldFmt:=True
    FindAndReplace "Use All Applicants Indicator", BldFmt:=True
    FindAndReplace "Next Section", BldFmt:=True
End Sub
Sub MakeReplacements2()

    Dim Fnd() As String
    Dim i As Long

    Fnd = Split("Printer|Parameter values|Use All Applicants Indicator|Next Section", "|")
    For i = 0 To UBound(Fnd)
        FindAndReplace Fnd(i), BldFmt:=True
    Next i
End Sub

添加execute有效。非常感谢。然而,我确信必须有一种更干净的方法来做到这一点。我试图阅读MSDN文档,但对我来说没有意义。不过谢谢。添加execute成功了。非常感谢。然而,我确信必须有一种更干净的方法来做到这一点。我试图阅读MSDN文档,但对我来说没有意义。谢谢你。