当前位置: 首页 > 知识库问答 >
问题:

在Microsoft Word 2010中查找和替换

程举
2023-03-14

我有一个Microsoft Word的VBA宏,我正在努力改进。

该宏通常用于大约50,000字的Word文档,该文档分为大约500个部分

宏的目的是突出显示Word文档中的单词/短语,并在每个部分中为该单词/短语的第一次出现插入脚注。

然后,它对下一节重复此操作,直到文档结束。

然后返回到第一节,并在Excel列表中重复下一个单词的过程。

问题是查找和替换操作需要永远才能完成。

Excel列表按降序排序,使最大的短语或单词在前。

我这样做是因为一些短语是较小的单词或短语的复合体。首先定位和更改较大的短语,以便查找和替换不会错误地拾取短语的较小元素。

    Sub Test()
Word.Application.ScreenUpdating = False
Dim xlapp As Object
Dim xlbook As Object
Dim xlsheet As Object
Dim xlrange1 As Object
Dim xlrange2 As Object
Dim myarray As Variant
Dim Findarray As Variant
Dim Replarray As Variant
On Error Resume Next
Set xlapp = GetObject(, "Excel.Application")
If Err Then
 bstartApp = True
 Set xlapp = CreateObject("Excel.Application")
End If
On Error GoTo 0
With xlapp
 Set xlbook = .Workbooks.Open("C:\Users\Documents\test.xlsx")
 Set xlsheet = xlbook.Worksheets(2)
 With xlsheet
 Set xlrange1 = .Range("A1", .Range("A1").End(4))
 Set xlrange2 = .Range("B1", .Range("B1").End(4))
 Findarray = xlrange1.Value
 Replarray = xlrange2.Value
 End With
End With
If bstartApp = True Then
 xlapp.Quit
End If
Set xlapp = Nothing
Set xlbook = Nothing
Set xlsheet = Nothing
Set xlrange1 = Nothing
Set xlrange2 = Nothing
iSectCount = ActiveDocument.Sections.Count
For i = 2 To UBound(Findarray)
For x = 1 To iSectCount
ActiveDocument.Sections(x).Range.Select
Selection.Find.ClearFormatting
 Selection.Find.Font.Color = -587137025
 Selection.Find.Replacement.ClearFormatting
 With Selection.Find
 .Text = Findarray(i, 1)
 .Forward = True
 .Format = True
 .MatchWholeWord = True
 End With
 If Selection.Find.Execute Then
 ActiveDocument.Footnotes.Add Range:=Selection.Range, Text:=Replarray(i, 1)
 End If
 ActiveDocument.Sections(x).Range.Select
Selection.Find.ClearFormatting
 Selection.Find.Font.Color = -587137025
 Selection.Find.Replacement.ClearFormatting
 Selection.Find.Replacement.Font.Color = wdColorBlue
 With Selection.Find
 .Text = Findarray(i, 1)
 .Replacement.Text = Findarray(i, 1)
 .Forward = True
 .Format = True
 .MatchWholeWord = True
 End With
Selection.Find.Execute Replace:=wdReplaceAll
ActiveDocument.Save
 Next x
 Next i
End Sub    

共有1个答案

郦良才
2023-03-14

使用VBA时的一些一般原则是:

  1. 避免使用selection对象,因为它会大大减慢代码的速度,尤其是在这种情况下,因为每次都必须重新绘制屏幕。关闭ScreenUpdating不会有太大帮助。
  2. 每个...next循环通常比使用索引计数器执行得更快。
  3. 确保在模块顶部包含选项explicit,以提醒您声明所有变量。在VBE中,通过选择Tools Options Requires Variable Declaration最容易实现这一点,因为这将把它添加到您添加的每个新模块中。

下面的代码从Excel完成后开始替换示例中的代码。考虑到处理500个部分需要190次的迭代次数,它仍然不会很快,但它应该比当前代码执行得更快。

Set doc = ActiveDocument
For i = 2 To UBound(findArray)
    For Each sec In doc.Sections
        Set findRange = sec.Range
        With findRange.Find
            .ClearFormatting
            .Replacement.ClearFormatting
            .Text = findArray(i, 1)
            .Forward = True
            .Format = True
            .MatchWholeWord = True
        End With
        If findRange.Find.Execute Then
            ActiveDocument.Footnotes.Add Range:=findRange, Text:=replArray(i, 1)
        End If
        Set findRange = sec.Range
        With findRange.Find
            .Replacement.ClearFormatting
            .Replacement.Font.Color = wdColorBlue
            .Text = findArray(i, 1)
            .Replacement.Text = findArray(i, 1)
            .Forward = True
            .Format = True
            .MatchWholeWord = True
        End With
        findRange.Find.Execute Replace:=wdReplaceAll
        doc.Save
    Next sec
Next i
Application.ScreenUpdating = True
 类似资料:
  • 在Atom中,对你文件或者项目中的文本进行查找或者替换,非常快速而且容易。 cmd-F 在缓冲区中查找 cmd-shift-f 在整个项目中查找 如果你执行了这些命令,你屏幕的底部会出现一个“Find and Replace”面板。 你可以按下cmd-F,输入需要搜索的字符串,并且多次按下回车(或者cmd-G,或者“Find Next”按钮)来在当前文件中搜索,循环查找当前文件中的匹配内容。“Fi

  • 我有一些占位符的docx文档。现在我应该用其他内容替换它们,并保存新的docx文档。我从docx4j开始,发现了这个方法: 但这很少起作用,因为通常占位符会在多个文本运行中拆分。 如何解决这个问题?

  • 我在用VSCode编辑的一个文件中有以下一行: <码>.................111........111.................... 我想用s替换所有s。但是,当我突出显示该行并对执行查找/替换操作时,文档中的所有都会被替换,而不仅仅是我选择的行中的那些,即使是在切换“在选择中查找”按钮时也是如此。这是虫子吗?在其他编辑器中,如果我选择一个文本块,然后进行查找/替换,它将只

  • 我试图在表格的第2列中找到所有文本为“0.118”的单元格,并为该行列出命令列表。我还试图从该行中找到的选定文本的第5列中获取值,然后减去我在该行的输入框中输入的值。 我遇到的问题是,它只改变了我找到的“0.118”之一,而不是每行中的所有内容。 我不知道如何搜索选定行的列(5)。 任何帮助都将不胜感激。 非常感谢。

  • 问题内容: 我有一列包含街道清单的列。我需要将“街道”替换为“圣”。可以使用所需格式的地址在当前列或新列中进行替换。以下是示例数据。“列1”包含当前格式的数据。“第2列”包含所需格式的数据。 我该怎么做呢? 编辑: 此查询适用于以下情况: 是否可以为此列设置规则。这样添加到此的所有数据会自动以这种方式格式化吗?还是我每次都需要重复此查询? 问题答案: 运行这样的查询以在 同一 列中进行更新:

  • 在替换文本时尝试获取不同类型的引号字符时,似乎存在问题: 当文档包含:{QUOTE:abc:QUOTE} 代码给出:"abc" 但预期结果是:“abc” Word版本:“Microsoft Office Professional Plus 2013”和“Microsoft Office 365 ProPlus”。 该问题不会发生时文件- 如何更改代码以获得预期结果?

  • 问题内容: 我有一个大约40万行的文本文件。我需要将此文本文件导入一个程序,该程序仅接受以空格或制表符分隔的文本文件,但是此文本文件以分号分隔。我要从(Arcmap)导出文本文件的程序中没有选项来更改分隔,并且在文本文件本身中进行查找和替换实际上需要2天。 我已经搜索了一个脚本来执行此操作,但是它们似乎都用空格替换了单词文件的整个LINE,而不是单独替换了每个分号,而给我留了一个空的文本文件。 这

  • 我需要用替换当前项目中的所有文件中的……有什么简单的方法可以做到这一点?(搜索导航器中只有搜索)。 另外,我需要在所有.m文件的开头添加一行。这是如何快速完成的?(这样的文件有500多个。)