【问题标题】:How to Open File and then Activate that Window in VBA (Microsoft Word)?如何在 VBA(Microsoft Word)中打开文件然后激活该窗口?
【发布时间】:2019-05-22 04:30:40
【问题描述】:

我已经打开了一个 Word 文档(“Template1”)。我正在尝试编写 VBA 代码来打开 Word 文档文件(“FileWithData”)并将信息从“FileWithData”复制到“Template1”。 “FileWithData”可以是任何文件,这就是我使用 OpenDialog 的原因。

一切正常,但在激活“FileWithData”窗口以启动“复制和粘贴”过程时我被卡住了。

Dim intChoice As Integer
Dim strPath As String
Dim objWord As Object
Set objWord = CreateObject("Word.Application")
objWord.Visible = True

Application.FileDialog(msoFileDialogOpen).AllowMultiSelect = False
intChoice = Application.FileDialog(msoFileDialogOpen).Show
'if the user selects a file
If intChoice <> 0 Then
'get the path selected
strPath = Application.FileDialog( _
msoFileDialogOpen).SelectedItems(1)
'opens the document
objWord.Documents.Open (strPath)


 FileName = objWord.ActiveDocument.Name


在这里它坏了:(

Windows(FileName).Activate
Selection.GoTo What:=wdGoToBookmark, Name:="Page1"
With ActiveDocument.Bookmarks
    .DefaultSorting = wdSortByName
    .ShowHidden = True
End With
Selection.Copy

Windows("Template1").Activate
Selection.GoTo What:=wdGoToBookmark, Name:="Page1"
With ActiveDocument.Bookmarks
    .DefaultSorting = wdSortByName
    .ShowHidden = True
End With
Selection.PasteAndFormat (wdFormatOriginalFormatting)
Selection.MoveLeft Unit:=wdCharacter, Count:=2

我收到以下错误: 运行时错误“5941”

请求的集合成员不存在。

【问题讨论】:

    标签: vba ms-word


    【解决方案1】:

    这段代码有很多因素会或可能导致问题。

    错误的原因是这段代码是在Excel中运行的,所以如果objWord没有用于Word语法,并且Word和Excel都对一个对象使用相同的名字,VBA会尝试使用Excel对象模型。在这种情况下,由于文件是 Word 而不是 Excel,使用 objWord.Windows(Filename).Activate 应该可以避免这个特殊错误。

    其他注意事项:

    与 Excel 一样,在 Word VBA 中使用 ActiveActivateSelection 是不可靠的,除非绝对必要,否则不应使用。最好直接使用应用程序的对象。因此,为 Word 文档声明并实例化一个变量并使用它来代替 ActiveDocument

    Dim objDoc as Object 'Word.Document
    Set objDoc = objWord.Documents.Open(strPath)
    
    FileName = objDoc.Name
    

    不确定您是否真的需要激活此窗口。不需要通过 VBA 操作文档的内容。如果是为了向用户展示它,进行编辑,那么无论如何。我可能会等到代码结束,但这将是个人喜好......无论如何,可以专门解决文档的窗口,而不是让 VBA 搜索它:

    objDoc.Windows(1).Activate
    

    为了将格式化的内容从任何文档中的一个位置 (Range) 传输到同一或另一个文档中的另一个位置 (Range),使用书签可以一步完成,无需任何选择或激活:

    objDoc.Bookmarks("Page1").Range.FormattedText = _
           objWord.Documents("Template1").Bookmarks("Page1").Range.FormattedText
    

    【讨论】:

    • 感谢您的回复。我只使用 Word(根本不使用 Excel)。我喜欢你回复的最后一部分。你是对的,我真的不需要激活窗口。我正在使用代码,但它给了我一个错误的文件名错误。 Template1 = ActiveDocument.Name Dim objDoc As Object Set objDoc = objWord.Documents.Open(strPath) FileWithData = objDoc.Name objDoc.Documents(FileWithData).Bookmarks("Page1").Range.FormattedText = _ objWord.Documents(Template1).Bookmarks("Page1").Range.FormattedText
    • @AyupovSukhrab 那么这段代码在哪个应用程序中运行呢?您在原始问题中包含了标签 excel-vba。由于代码使用CreateObject,我没有理由质疑...
    • 代码仅在 MS Word 中运行。抱歉,我删除了标签 excel-vba。
    【解决方案2】:

    听起来您想将数据从 Word 文档复制到 Excel。那正确吗?下面的代码将为您执行此操作。只需更改您引用的 Word 文件的路径,并根据需要更改范围。

    Sub Copy_From_Word()
    
        Application.DisplayAlerts = False 'Disable all the Alerts from excel
        Application.ScreenUpdating = False 'After opening Word Doc, Document will not be visible
        'Create a New Object for Microsoft Word Application
        Dim objWord As New Word.Application
        'Create a New Word Document Object
        Dim objDoc As New Word.Document
        'Open a Word Document and Set it to the newly created object above
        Set objDoc = objWord.documents.Open("C:\path_here\your_document.docx")
        'To Store all the content of that word Document in a variable
        strTemp = objDoc.Range(0, objDoc.Range.End)
        'Now store that variable value in to a cell range
        Range("A1").Value = strTemp
        str1 = objDoc.Range(0, 1)
        Range("A2").Value = str1
        Range("B2").Value = strTemp
    
        objDoc.Close SaveChanges:=wdDoNotSaveChanges
        objWord.Quit
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2010-10-16
      • 2019-04-04
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 2019-11-26
      • 1970-01-01
      相关资源
      最近更新 更多