VBA-Word错误:在撤消列表中有“应用快速样式”的情况下,如果使用UndoRecord记录“全部替换”,则撤消列表会出错。如何避免?

时间:2019-09-28 12:57:52

标签: vba ms-word ms-office word-vba

在Word窗口上,执行诸如键入,设置字体格式,段落...之类的操作,以确保撤消列表不为空,然后通过单击功能区上的任何“样式”来更改某些文本的样式。名为“应用快速样式”的条目将显示在撤消列表中。然后像这样运行宏:

Sub SampleMacro()
Dim myUndoRecord As UndoRecord

Set myUndoRecord = Application.UndoRecord
myUndoRecord.StartCustomRecord ("VBA - Format Text")
'I do a lot of step here, but for this example, just simple like below
Selection.Characters(1).Bold = True     'just for example
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
    .Text = "Find Text"
    .Replacement.Text = "Replace Text"
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
End With
'Word undo list get error after below step
Selection.Find.Execute Replace:=wdReplaceAll
'no crash, no error message, but the entry "Apply Quick Style" 
'become to "Replace All", and Word can't go back before that entry
myUndoRecord.EndCustomRecord
End Sub

此行代码之后:

Selection.Find.Execute Replace:=wdReplaceAll

撤消列表中名为“应用快速样式”的条目将变为“全部替换”,并且我无法撤消(通过按Ctrl-Z或单击快速访问工具栏上的箭头按钮)以返回到之前的任何步骤该条目“全部替换”。它始终显示在撤消列表中,Word将不再返回。 如何避免这个错误? 我正在使用Word 2016 pro 64位

其他信息:通过按Ctrl + C,Ctrl + V(从其他文档到当前文档)而不是“ Apply Quick Style”(使用快速样式)使用复制粘贴也会出现错误,撤消列表中的“ Paste”项也重命名为“ Replace”所有”。另一个仍然可以在该条目之前返回。如果使用UndoRecord记录“全部替换”,也许还有另一种方法会出错。

1 个答案:

答案 0 :(得分:1)

更新10/01

可解决的问题

该问题特定于wdReplaceAll。如果省略或替换了该特定wdConstant,则“ Apply Quick Style”将不会重命名,并且撤消堆栈仍可访问。

对我们来说很幸运,Find.Execute返回一个布尔值(表示成功)。也就是说,我们可以循环wdFindOne来替换所有匹配项,并使用.Execute = False作为退出条件。

Do块上方添加With一词,并将行替换为.Execute

Do
    With Selection.Find
         [....]
    End With
Loop While Selection.Find.Execute(Replace:=wdReplaceOne)

请注意:在某些情况下会创建无限循环(例如,将“ A”替换为“ A” )。因此,您应该考虑使用第二个退出条件或将wdFindContinue替换为wdFindAskwdFindStop


更新9/30

(编辑10/01)糟糕! Apply Quick Style条目未重命名(好),但我错误地认为当存在相同限制时(坏)可以到达撤消堆栈。另外,在今天的测试中,我了解到 还有第三个条件:.Execute一定找不到任何匹配项 (更糟)。可以说,这是如何不测试解决方案的典范,希望大家都从中学到了!

当我创建一个新文档并按照您的步骤进行操作时,我可以始终如一地重现您描述的问题。谢谢您让一切变得简单!

尽我所能重现该问题,但我也可以通过满足两个条件来预防该问题。

  • 确保Replace All上方的Undo Stack中列出了Apply Quick Style

  • Replace All应用于整个文档(如果将Replace All应用于文档中的Selection,则问题仍然存在)

无论使用Ctrl + H手动完成还是宏的一部分,此方法均有效。用相同的字符替换字符就足够了。


屏幕快照,显示有问题的行之后的执行点:

Can be avoided


Undo Stack包含一个故意放置的Replace All,以保留Apply Quick Style。 本文适用于Excel,但与Word有关。

https://excel.tips.net/T002060_Preserving_the_Undo_List.html

简而言之,你是一个人。

您有两个选择:恢复为以前保存的版本;或者,编写一个模仿“撤消”的宏并确保此宏在运行之前,先启动与“撤消”列表弄乱的