我想准备并显示“查找/替换”对话框。但是,以下代码以模态状态显示对话框,并且您无法获取文档文本。
有什么想法可以让它变得无模式,就像你从 Ctl-H 获得的那样?
Public Sub AutoFind()
On Error GoTo myErrorHandler
Selection.HomeKey Unit:=wdStory
Dim theDialog As dialog
Set theDialog = Application.Dialogs(wdDialogEditReplace)
theDialog.Find = "the"
theDialog.replace = "an"
theDialog.Show
End Sub
答案1
看起来模态是唯一的设计行为,但有一个解决方法:
CommandBars.FindControl(ID).Execute
有了正确的 ID,这类似于用鼠标点击按钮来打开对话框。
除了确认它在 v2010 中有效之外,我自己从未使用过它,我的直觉告诉我应该寻找一种方法来确认或导出 ID 号(或者也许有一个可以使用的常数),因为这是一个硬编码的“神奇数字”,可能会因版本而异。
在我手边的 Word 2010 中,“查找”是 ID:=141,“替换”是 ID:=313。
因此,您可以设置“程序化”搜索,然后调用上述 CommandBars 方法打开对话框。它应该按照您想要的方式填充,并且应该是非模态的。
Sub TestMacro()
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "test find field"
.Replacement.Text = "test replace field"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
CommandBars.FindControl(ID:=313).Execute
end sub
当然,非模态也意味着代码执行立即继续。
答案2
这是我的解决办法:
SendKeys "^h" ' Hack to obtain "Dialogs(wdDialogEditReplace).Show" modelessly.
' MS Disclaimer: SendKeys is unreliable as to there being no certainty as to where focus is when called.
答案3
我知道这篇文章已经很老了,但它对找到我非常相似的问题的解决方案非常有帮助,因此我敢于回答:
为了让我的目标群体中经验较少的 Word 用户更容易使用交叉引用,我编写了一个宏,允许使用某些预设调用相应的对话框,特别是“编号项”作为引用类型以及插入交叉引用作为超链接。
其中一个原因是,启动 Word 后,默认引用类型为“标题”,并且“插入为超链接”复选框被停用(之后,最后使用的设置成为默认设置)。另一方面,我们所有的标题样式都由实际标题(文本)的样式和文本前面的层次编号的链接列表样式组成。除了这种方法具有更高的可靠性之外,一方面标题文本和另一方面标题编号的不同内部样式规范也使这种方法成为必要。但结果是,我们的标题在引用类型方面是“编号项目”而不是“标题”。因此,如果用户预设或手动选择了“标题”引用类型,则对话框中不会列出任何可以引用的元素。现在想要设置对他或她自然认为是“标题”的内容的交叉引用的用户可能会因此而感到沮丧。因此,为了可用性,上述默认设置可以通过对话框对象非常简单地实现:
With Dialogs(wdDialogInsertCrossReference)
.ReferenceType = "Numbered item"
.InsertAsHyperlink = True
End With
但是,交叉引用对话框以这种方式显示为模式,即用户必须先关闭它才能继续在 Word 文档中工作。如果用户想在文档中的多个位置插入多个交叉引用,他或她必须多次打开和关闭对话框 - 这反过来又导致我的目标群体中喜欢一次性插入多个交叉引用的有经验的用户感到沮丧。
作为使用对话框对象的替代方法,也可以使用 CommandBar 对象和 FindControl 方法打开交叉引用对话框,然后将该对话框显示为非模式对话框。但是,这种方法不允许分配所需的预设。
对我来说,解决这一困境的办法与 Yorik 上述建议类似,即两种方法的结合:首先,通过上述对话框对象调用对话框以及所需的预设,但使用 Show 方法 (TimeOut) 立即再次关闭。然后使用 FindControl 方法将对话框重新打开为 CommandBar 对象。Word 会将之前分配的预设保留为最后使用的设置。
With Dialogs(wdDialogInsertCrossReference)
.ReferenceType = "Numbered item"
.InsertAsHyperlink = True
.Show (1)
End With
Application.CommandBars.FindControl(ID:=775).Execute
此解决方案的缺点是打开、关闭和重新打开的对话框似乎对用户来说会闪烁。我可以忍受这一点,但这也意味着这不是最佳解决方案,而只是一种可以解决我的问题并能为我接受的变通方法。特里格拉夫