在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记录“全部替换”,也许还有另一种方法会出错。
答案 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
替换为wdFindAsk
或wdFindStop
。
更新9/30
(编辑10/01)糟糕! Apply Quick Style条目未重命名(好),但我错误地认为当存在相同限制时(坏)可以到达撤消堆栈。另外,在今天的测试中,我了解到 还有第三个条件:.Execute
一定找不到任何匹配项 (更糟)。可以说,这是如何不测试解决方案的典范,希望大家都从中学到了!
当我创建一个新文档并按照您的步骤进行操作时,我可以始终如一地重现您描述的问题。谢谢您让一切变得简单!
尽我所能重现该问题,但我也可以通过满足两个条件来预防该问题。
确保Replace All
上方的Undo Stack
中列出了Apply Quick Style
。
Replace All
应用于整个文档(如果将Replace All
应用于文档中的Selection
,则问题仍然存在)
无论使用Ctrl + H手动完成还是宏的一部分,此方法均有效。用相同的字符替换字符就足够了。
屏幕快照,显示有问题的行之后的执行点:
Undo Stack
包含一个故意放置的Replace All
,以保留Apply Quick Style
。
本文适用于Excel,但与Word有关。
https://excel.tips.net/T002060_Preserving_the_Undo_List.html
简而言之,你是一个人。
您有两个选择:恢复为以前保存的版本;或者,编写一个模仿“撤消”的宏并确保此宏在运行之前,先启动与“撤消”列表弄乱的