【问题标题】:Find.Execute with confirmation dialogFind.Execute 带有确认对话框
【发布时间】:2015-06-26 12:38:48
【问题描述】:

我正在用 Visual Basic(呃,我知道)编写一个宏来解析 Microsoft Word 中的文档。这是我想要实现的工作流程:

  • 在文档中搜索字符串(相当于Edit > Find > Find...)。
  • 询问用户是否要将匹配的字符串替换为另一个字符串(相当于Edit > Find > Replace... > Replace,但在执行替换之前会显示确认对话框)。
  • 如果是,请更换。如果没有,请转到下一场比赛。

我可以用Find.Execute method 进行查找和替换:

Set myRange = ActiveDocument.Content 
myRange.Find.Execute FindText:="hi", _ 
    ReplaceWith:="hello", Replace:=wdReplaceAll

但我不知道在执行替换之前如何提示用户。

【问题讨论】:

  • 当用户使用 UI 执行查找/替换时,他将收到的唯一确认是 完成替换后(假设找到要查找的文本)。这可以使用Application.DisplayAlerts 属性进行切换。如果您想在替换文本之前显示一个对话框,您需要检查是否找到任何内容并循环显示如下结果:stackoverflow.com/a/14309412/1710577
  • 另外,您是否希望确认文档中的每个 instance 文本字符串或找到的每个不同文本字符串?

标签: vba replace ms-word


【解决方案1】:

您可以通过消息框进行提示,然后测试返回值并在此基础上进行替换:

Private Sub PromptForReplace()

    Dim myRange As Range

    Set myRange = ActiveDocument.Content
    myRange.Find.ClearFormatting
    myRange.Find.MatchWildcards = True

    Dim cached As Long
    cached = myRange.End
    Do While myRange.Find.Execute("hi")
        myRange.Select
        If MsgBox("Replace " & myRange.Find.Text & "?", vbYesNo) = vbYes Then
            myRange.Text = "hello"
        End If
        myRange.Start = myRange.Start + Len(myRange.Find.Text)
        myRange.End = cached
    Loop

End Sub

【讨论】:

  • MsgBox()中,是否可以打印匹配的文本(在本例中为“hi”)?
  • 谢谢。我的措辞不好,但我想问的是:如何访问匹配的文本以便将其包含在提示中?例如:MsgBox('Replace with ' + match + '?', vbYesNo).
  • @JoeMornin - 我不确定我是否遵循 - 除非您使用通配符,否则匹配的文本将始终是您搜索的内容。您是否需要添加更多搜索参数,例如仅匹配单词而不是子字符串?最简单的方法是只选择文档中的匹配项。
  • 是的,我将使用通配符。在文档中选择匹配项也可以。
猜你喜欢
  • 1970-01-01
  • 2012-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
相关资源
最近更新 更多