【问题标题】:Finding all two words and bolding them all using vba in Word 2016在 Word 2016 中使用 vba 查找所有两个单词并将它们全部加粗
【发布时间】:2020-11-22 09:24:56
【问题描述】:

我有一个需求文档 RD,其中包含 Word 2016 中的“必须”和“应”,我试图找出所有出现的地方并将单词加粗。我正在使用 Microsoft 在其网站上为对象模型提供的示例,用于在此 Web 链接 https://docs.microsoft.com/en-us/office/vba/word/concepts/customizing-word/finding-and-replacing-text-or-formatting

上“如何查找和替换文本”

我已将单词“blue”更改为“must”,并添加了第二次搜索“shall”,并在相同的情况下对每个执行了执行。它只找到第一个,即使我设置了 wdFindContinue 也会停止。在下面的代码中,我注释掉了第二次搜索,因为我试图找出为什么它不会在文档中找到所有这些。

这是我用来运行 VBA 代码的 word 中的测试语句。

RD 应遵循模板标准。

RD 应使用 must 这个词。
必须检查 RD 以符合模板标准。 RD 将由组经理签字。

这是我使用的基于 Microsoft 示例的 VBA 代码。最后注释的代码也来自微软,将来可能会使用,因此可以忽略。

Public Sub BoldMustShall()

' This searches the RD document for must and shall
' and changes them to bold.

With ActiveDocument.Content.Find
  '.ClearFormatting
  .Forward = True
  .MatchWholeWord = True
  .Wrap = wdFindContinue
   
 '.Text = "must"
 .Execute FindText:="must"
 If .Found = True Then
 .Parent.Bold = True
 Debug.Print "Found must "
 End If
 
 ' .Text = "shall"
 '.Execute FindText:="shall"
 'If .Found = True Then
 '.Parent.Bold = True
 'Debug.Print "Found shall "
 'End If
End With

' The code having problems is above here.

' Alternate method of doing the same thing for must/shall
' Set myRange = ActiveDocument.Content
' myRange.Find.Execute FindText:="must", Forward:=True
' If myRange.Find.Found = True Then myRange.Bold = True

 ' A method that will replace all the "shalls" with "must" and then apply above to bold it.
 'With Selection.Find
 '.ClearFormatting
 '.Text = "shall"
 '.Replacement.ClearFormatting
 '.Replacement.Text = "must"
 '.Execute Replace:=wdReplaceAll, Forward:=True, _
 'Wrap:=wdFindContinue
 ' End With
 
 ' A method to find all bolded text and unbold it.
 'With ActiveDocument.Content.Find
 '.ClearFormatting
 '.Font.Bold = True
 'With .Replacement
 '.ClearFormatting
 '.Font.Bold = False
 'End With
 '.Execute FindText:="", ReplaceWith:="", _
 'Format:=True, Replace:=wdReplaceAll
 'End With
 
End Sub

【问题讨论】:

    标签: vba ms-word


    【解决方案1】:

    试试:

    Sub Demo()
    Application.ScreenUpdating = False
    With ActiveDocument.Range
      With .Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = True
        .MatchWildcards = False
        .Replacement.Font.Bold = True
        .Replacement.Text = "^&"
        .Text = "must"
        .Execute Replace:=wdReplaceAll
        .Text = "shall"
        .Execute Replace:=wdReplaceAll
      End With
    End With
    Application.ScreenUpdating = True
    End Sub
    

    【讨论】:

    • 这个答案有效。我很难找到 ^& 做了什么,但发现它不需要多个语句来搜索文本。这很漂亮。我还想将搜索范围缩小到只有正常样式的文本,并忽略包含这些词的图形/表格标题和标题。我修改了我的测试语句来测试修改。变化是,。 Replacement.Font.Name = "Arial" .Replacement.Font.Size = 20 .Replacement.Font.Italic = True .Style = wdStyleNormal
    • 其中一个问题是我有一个基于 Heading1-9 的用户定义样式附录 1-9。当指定 wdHeading1 时,它可以找到它并更改 Heading1 中的单词;但是,我不知道如何搜索用户定义的 Annex1 样式中的单词,因为它忽略了这种样式中的单词。这是上一条评论。
    • 我发现当没有指定替换文本并且执行指定wdreplaceall时,搜索到的文本被替换为null。而且。如果指定了 .parent.font.bold=true,它还将更改文档中的所有文本粗体,而不仅仅是搜索的内容。不知道这是否是由于 null 导致的错误,因为它无法确定要加粗的文本。如果未指定 wdreplacall,则无论 wdFindContinue 和 Wrap=true 是否为真,它将从范围开头为每个单词找到的第一个出现加粗。这同样适用于 wdFindask nopopup
    • 请将每个问题发布在其单独的线程中,而不是在与该线程中的原始问题无关的 cmets 中。 '.Parent' 行为是意料之中的,因为任何找到的范围的 '.Parent' 都是整个文档。
    【解决方案2】:
    Selection.HomeKey Unit:=wdStory
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "shall"
        .Replacement.Text = "shall"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchWholeWord = False
        .MatchControl = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    
    Selection.HomeKey Unit:=wdStory
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "must"
        .Replacement.Text = "must"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchWholeWord = False
        .MatchControl = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    

    我只是录制了一个宏,将shall 替换为shall 粗体。然后将其复制为must

    您需要为查找和替换设置相同的文本。一个快捷方式是使用^& 作为替换,这意味着查找文本。 EG BB^& 在搜索 must 时将变为 BBmust

    【讨论】:

    • 这让我了解了录制宏的功能,虽然我没有使用过。缺少一条语句,一旦找到就将文本变为粗体。我从发布的其他答案中添加了它,并且此例程有效。
    猜你喜欢
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多