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