【发布时间】:2017-10-20 21:54:24
【问题描述】:
我有一个用于 Microsoft Word 的 VBA 宏,我正在努力改进。
该宏通常用于大约 50,000 个单词的 Word 文档,该文档分为大约 500 个部分
宏的目的是突出显示 Word 文档中的单词/短语,并为每个部分中该单词/短语的第一次出现插入脚注。
宏进行的操作如下:
它计算文档中的节数和 Excel 文件中的单词数(Excel 文件中大约 190 个单词或短语)
然后它会在 Word 文档的第一部分中查找 Excel 文件中第一个单词或短语的第一次出现。
然后为该单词或短语插入脚注(其文本来自 Excel 文件中的另一列)
然后它会更改该部分中该单词或短语的所有实例的颜色
然后它对下一部分重复此操作,直到文档结束。
然后它返回到第一部分并为 Excel 列表中的下一个单词重复该过程。
问题是查找和替换操作需要很长时间才能完成。
Excel 列表按降序排列,因此最大的短语或单词排在第一位。
我这样做是因为某些短语是较小单词或短语的复合词。较大的短语首先被定位和更改,以便短语的较小元素不会被查找和替换错误地拾取。
文档是分段的,因为我希望每个部分中的单词/短语的第一个实例都有一个脚注,其余部分通过更改颜色突出显示。
查找和替换操作发生了 190,000 次(500 个部分* 190 个字* 每个部分 2 次操作),这意味着在我的计算机上运行需要几天时间。
我玩弄了循环的顺序,不知道如何减少这段代码的运行时间,同时保持我想要实现的输出。
我能否提供一些帮助/建议以更好地进行此操作?
这是我正在使用的代码的副本:
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
excel 电子表格的屏幕截图
Word文档截图
【问题讨论】:
-
您能否添加word文档和excel文件的屏幕截图以及预期结果的样子。
-
因此,如果您的电子表格中的一个条目出现在文档的每个部分中,您将拥有该条目的 500 个脚注。这真的是你想要的吗?对我来说,仅在条目第一次出现在整个文档中时才添加脚注。
-
感谢您查看此问题并提供您的 cmets。我添加了 Word 文档和 Excel 文件的屏幕截图。虽然仅在第一次将脚注添加到文档中似乎更合乎逻辑,但创建此文档的目的需要在电子表格中的每个条目的每个部分都添加脚注。但是,您建议的逻辑确实扩展到每个部分,其中脚注只会与该部分中的第一个条目相关。