【问题标题】:Activate/select a word-document and find the value of active cell in that document激活/选择一个word文档并在该文档中查找活动单元格的值
【发布时间】:2020-06-07 22:11:16
【问题描述】:

我想选择一个单元格并使用该单元格中的值文本,在特定的 word 文档 (xxxxxx.docx) 中搜索/查找。此文档已与其他 word 文档一起打开。

下面的代码可以满足我的需求……几乎。它打开特定文档,然后找到文本。但是文档已经打开,所以它不适合这项工作。它只需要被选中/激活,而不是再次打开。

有人知道如何管理这个:选择任何单元格,使用该单元格中的值,激活/选择 xxxxxx.docx,然后搜索该值。

** 最重要的是找到的文本显示在文档中,必须在屏幕中显示/弹出。所有这些都是为了在本文档中快速导航。

Sub FindName()

    Dim wrdApp As Object
    Dim wrdDoc As Object
    Set wrdApp = CreateObject("Word.Application")
    wrdApp.Visible = True
    Set wrdDoc = wrdApp.Documents.Open("C:\xxxxxx.docx")
    Dim FindWord As String
    Dim result As String
    FindWord = ActiveCell.Value
    wrdDoc.SelectAllEditableRanges

    With wrdDoc.ActiveWindow.Selection.Find
        .Text = FindWord
        .Replacement.Text = ""
        .Forward = True
        .Wrap = 1
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With

    wrdDoc.ActiveWindow.Selection.Find.Execute

End Sub

【问题讨论】:

  • 也许可以试试 'wrdApp.Documents.Content' 并在内容中寻找价值?
  • 您的 Word 相关变量应该是公开的,并且您应该先创建不同的 subs 以检查文档是否已经打开。如果文档未打开,则打开它并执行您的代码。如果它已经打开,只需激活该文档并执行您的代码。
  • 不久前我回答了一个非常相似的问题:Edit a workbook, whether open or closed, from Word VBA。它是为“另一种方式”的问题而编写的,但在从 Excel 自动化 Word 时也适用相同的原则。通读该答案,了解在其他 Office 应用程序可能运行或未运行以及文件可能打开或未打开时与其他 Office 应用程序交互的各种方式。

标签: excel vba search ms-word find


【解决方案1】:

如果文档已经打开,则 Word 必须已经在运行。在这种情况下,您也不想要:

  • 设置 wrdApp = CreateObject("Word.Application");或
  • 设置 wrdDoc = wrdApp.Documents.Open("C:\xxxxxx.docx")

您应该首先检查 Word 是否正在运行,如果是,则检查文档是否打开。因此:

Sub Demo()
Dim wdApp As Object, wdDoc As Object
Const StrNm As String = "C:\xxxxxx.docx"
On Error Resume Next
Set wdApp = GetObject(, "Word.Application")
If Err Then
  Set wdApp = CreateObject("Word.Application")
End If
On Error GoTo 0
With wdApp
  For Each wdDoc In .Documents
    If wdDoc.FullName = "StrNm" Then Exit For
  Next
  If wdDoc Is Nothing Then Set wdDoc = wdApp.Documents.Open(StrNm)
    'to Find & navigate to a particular string
    With wdDoc.Range
      With .Find
        .Text = ActiveCell.Value
        .Execute
      End If
      If .Find.Found = True Then .Select
    End With
    'To navigate to a particular bookmark
    wdDoc.Bookmarks("MyBookmark").Range.Select
End With
End Sub

【讨论】:

  • 你好Macropod,我想这就是我想要的!!作为测试,如果找到文本,我制作了一个 msgbox,它可以工作。但是,我需要在文本所在的位置显示 word 文档。这可能吗?它需要导航到word文档并在其中导航。非常感谢。
  • 你为什么需要导航到那个点?几乎所有通过代码编辑文档都可以在没有它的情况下完成。无论如何,请向我们展示您的尝试。
  • 这就是全部内容,导航到找到的文本。所有这些都是为了快速导航,因为该文档有 1000 多页和许多书签。我只是为了导航而打破我的头。我之前写的代码做了导航,但是因为它总是打开它而无法使用。你的代码就快到了,能不能最后推一下?
  • 如果你使用书签,你甚至不需要查找!!!请参阅修改后的代码。
  • 你是最好的。我不知道该怎么感谢你才足够!谢谢!
【解决方案2】:

您好 Macropod 和其他助手, 最新的代码是成功的!我稍微改了一下,去掉了书签搜索,还算幸运!为了让 word 文档在屏幕上显示,我使用了 shell……我知道这一定会伤害你的眼睛,或者破坏屏幕,但它确实有效(没有它,Word 会保持最小化)。如果有人想让这个更漂亮,我很想向它学习。但它有效,我很高兴。非常感谢,我很享受!超级有帮助。

    Sub Demo()
Dim wdApp As Object, wdDoc As Object
Const StrNm As String = "C:\xxxxxx.docx"
On Error Resume Next
Set wdApp = GetObject(, "Word.Application")
If Err Then
  Set wdApp = CreateObject("Word.Application")
End If
On Error GoTo 0
With wdApp
  For Each wdDoc In .Documents
    If wdDoc.FullName = "StrNm" Then Exit For
  Next
  If wdDoc Is Nothing Then Set wdDoc = wdApp.Documents.Open(StrNm)
    With wdDoc.Range
      With .Find
        .Text = ActiveCell.Value
        .Execute
      End With
      If .Find.Found = True Then .Select
    End With
    End With
Shell "C:\WINDOWS\explorer.exe """ & "C:\xxxxxx.docx" & "", vbNormalFocus
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多