Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA Word bug:如果使用UndoRecord录制,则撤消列表获取错误";替换所有的“;虽然有一个;“应用快速样式”;在“撤消”列表中。如何避免?_Vba_Ms Word_Ms Office - Fatal编程技术网

VBA Word bug:如果使用UndoRecord录制,则撤消列表获取错误";替换所有的“;虽然有一个;“应用快速样式”;在“撤消”列表中。如何避免?

VBA Word bug:如果使用UndoRecord录制,则撤消列表获取错误";替换所有的“;虽然有一个;“应用快速样式”;在“撤消”列表中。如何避免?,vba,ms-word,ms-office,Vba,Ms Word,Ms Office,在Word窗口中,执行诸如键入、格式化字体、段落等操作。。。确保“撤消”列表不为空,然后通过单击功能区上的任何样式来更改某些文本的样式。“撤消”列表中将显示一个名为“应用快速样式”的条目。然后运行宏,如下所示: Sub SampleMacro() Dim myUndoRecord As UndoRecord Set myUndoRecord = Application.UndoRecord myUndoRecord.StartCustomRecord ("VBA - Format Text")

在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(从其他文档到当前文档)而不是“应用快速样式”也会出现错误,撤消列表中的“粘贴”条目也会重命名为“全部替换”。在该条目之前,差异仍然可以返回。如果使用UndoRecord记录“全部替换”,可能还有另一种方法会出错。

更新10/01

工作场所

问题特定于
wdReplaceAll
。如果省略或替换了特定的WDC常量,则不会重命名“应用快速样式”,并且撤消堆栈仍然可以访问

幸运的是,
Find.Execute
返回一个布尔值(如果成功,则为True)。这意味着,我们可以使用
wdFindOne
循环替换所有匹配项,并使用
.Execute=False
作为退出条件

将单词
Do
添加到带有
块的
上方,并将行替换为
。执行

Do
    With Selection.Find
         [....]
    End With
Loop While Selection.Find.Execute(Replace:=wdReplaceOne)
警告一句:某些情况会产生无限循环(例如将“A”替换为“A”)。因此,您应该考虑使用第二个退出条件,或者用<代码> > WDFunDebug < /COD>或<代码> WdFunDestEng/<代码>替换<代码> > WDDFundEng/<代码> < /P>
更新9/30

(编辑10/01)哎呀!!Apply Quick Style条目没有重命名(良好),但我错误地认为,当存在相同的限制时(不良),可以到达撤消堆栈。另外,在今天的测试中,我学到了第三个条件:
。Execute
不能找到任何匹配项(更糟)。我只想说,这是一个如何不测试解决方案的示范,我希望每个人都能从中吸取教训

当我创建一个新文档并遵循您的步骤时,我可以始终如一地重现您描述的问题。谢谢你让事情变得简单

虽然我能够复制这个问题,但我也能够通过满足两个条件来防止它

  • 确保上面的
    Apply Quick Style
    中列出了
    Replace All

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

无论是使用“Ctrl+H”手动执行,还是作为宏的一部分,此方法都有效。用相同的字符替换一个字符就足够了


显示问题行后执行点的屏幕截图:


Undo堆栈
包含一个故意放置的
Replace All
以保留
Apply Quick样式
。 本文适用于Excel,但与Word相关

简言之,你只能靠自己了


您有两个选项:还原到以前保存的版本;或者,编写一个模拟“撤消”的宏,并确保该宏正在运行,然后再启动破坏“撤消”列表的宏

谢谢回答,但是,我不知道同一个应用程序。在VBA Word中,Word可能没有相同的功能?编写一个模拟撤销的宏在很多步骤和条件下都很复杂(在我的主代码中,不是这个示例代码中),在错误发生后,它仍然无法在“全部替换”条目之前返回。恢复到以前保存的版本可能是一个很好的理想,但我现在的情况并非如此。@Tien先生,我理解你并同情你。我的分布式应用程序使用保存的文件来解决此问题。在继续进行小作业之前,我会提示用户保存。在大型作业中,我将在临时文件夹中保存一份副本,并在下一次保存事件后删除该文件。如果应用程序加载且临时文件夹不为空,我会提示用户进行恢复。我从用户那里得到了积极的反馈,他们关闭了文件,打算在不知道我保存了副本的情况下恢复到以前的保存。他们说我们很高兴能恢复到一个更新的版本。我想语言是一样的。今天晚些时候我将尝试重新创建问题,并用结果更新我的答案。我正在尝试围绕撤消列表做一些事情以避免此错误。希望看到你们的结果。谢谢你们的回答,我试着按照你们的指导去做,但结果并没有改变。请你把你的步骤写得更详细一些好吗?我的步骤:新建>键入“查找文本”>更改为样式标题1>按Ctrl+H>在“查找内容”和“替换为”中键入“文本”>单击“全部替换”(名为“全部替换”的条目出现在“应用快速样式”的条目上方)>在我的问题中运行宏,但错误仍然发生,条目“应用快速样式”变为“全部替换”不能回到那个条目之前。