【发布时间】:2020-01-10 18:08:02
【问题描述】:
几天前我一直在尝试使用以下脚本的一些变体来更改单词的样式 阵列内。该文档有大约 1200 页和 8MB 大小,但对于 MS Word 来说似乎更重。
它下面的脚本似乎比使用 Selection.Find 更快,但 40 分钟后我需要停止宏,因为
仅执行了 64 次迭代(共 182 次)。
还有其他方法可以提高这个宏的执行速度吗?我什至尝试使用嵌套循环查找每个段落的所有单词,但效果最差。
宏在文档中查找数组的每个单词并 如果单词是粗体而不是斜体,则适用 StyleA 如果单词不是粗体且不是斜体,则应用 StyleB 如果单词是斜体,则应用 StyleC
感谢您的帮助。
Sub ChangeStyles()
Dim i As Long
Dim Arr(1 To 182)
Dim rng As Word.Range
Application.ScreenUpdating = False
Arr=Array("Word1","Word2",..,"Word182",)
For i = 0 To UBound(Arr)
Set rng = ActiveDocument.Content
With rng.Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = Arr(i)
.Execute
If rng.Characters(1).Font.Bold = True And rng.Characters(1).Font.Italic = False Then
.Replacement.Style = ActiveDocument.Styles("StyleA")
ElseIf rng.Characters(1).Font.Bold = False And rng.Characters(1).Font.Italic = False Then
.Replacement.Style = ActiveDocument.Styles("StyleB")
ElseIf rng.Characters(1).Font.Italic = True Then
.Replacement.Style = ActiveDocument.Styles("StyleC")
End If
.Execute Replace:=wdReplaceAll
End With
Debug.Print "word: " & i
Next
Application.ScreenUpdating = True
End Sub
【问题讨论】:
-
这里的逻辑是错误的——我想我之前已经讨论过同样的基本问题。您在循环中有两次
Execute,第二次是ReplacAll。这根本没有意义。如果您打算走这条路线,而不是我建议的更快的路线,那么只需在If...Else中执行rng.Style = ActiveDocument.Styles("NameOfStyle"),而不是设置Replacement.Style并尝试再次执行Find。但我仍然说,为每个格式变体查找/替换会更有效...... -
嗨辛迪。对不起打扰你了。我已经用你的建议进行了测试,它可以工作,但在实际文件中卡住了。我不确定为什么。我知道在“.Text(i)”之后为了找到这个词需要发送“.Execute”并且在找到它之后我插入了if条件来应用相应的样式。我知道此时只有一个单词匹配,为了将样式更改为所有实例,我添加了“ReplaceAll”。应该如何?我应该使用“rng.Style=...”而不是什么?再次感谢. 我继续测试的主要原因是性能缓慢。
-
@CindyMeister。感谢您到目前为止的帮助。换风格行得通,但是执行速度太慢了。
标签: vba performance ms-word