Vba 将图表从Excel粘贴到Word错误-远程服务器计算机不存在(错误462)

Vba 将图表从Excel粘贴到Word错误-远程服务器计算机不存在(错误462),vba,excel,ms-word,Vba,Excel,Ms Word,我有一个宏,它在excel中的VBA中执行以下逻辑: 打开word文档 循环浏览文档中所有预设的书签 找到书签后,循环浏览特定工作表中的所有图表对象,当图表名称与书签名称匹配时,将其复制到word文档中 我在第二次运行宏时遇到错误462。我意识到这与没有正确引用对象有关,但我似乎找不到罪犯在哪里 我的代码如下所示: Sub buildDocument() '#### Initialise our variables Dim wdApp As Word.Application Dim wdD

我有一个宏,它在excel中的VBA中执行以下逻辑:

  • 打开word文档

  • 循环浏览文档中所有预设的书签

  • 找到书签后,循环浏览特定工作表中的所有图表对象,当图表名称与书签名称匹配时,将其复制到word文档中

  • 我在第二次运行宏时遇到错误462。我意识到这与没有正确引用对象有关,但我似乎找不到罪犯在哪里

    我的代码如下所示:

    Sub buildDocument()
    
    '####   Initialise our variables
    Dim wdApp As Word.Application
    Dim wdDoc As Word.Document
    Dim theWorksheet As Worksheet
    Dim Chart As ChartObject
    
    Dim wdBookmarksArray() As Variant
    
    Dim counter1 As Integer
    Dim counter2 As Integer
    Dim noCharts As Integer
    Dim counter4 As Integer
    Dim PasteObect As Variant
    Dim quarter As String
    Dim sheetsArr As String
    
    '####   Switch off update   ####
    Application.ScreenUpdating = False
    
    '####   Create a new word doc; minimise;    ####
    Set wdApp = New Word.Application
    
    With wdApp
        .Visible = True
        .WindowState = wdWindowStateMinimize
    End With
    
    On Error GoTo ErrorHandler
    
    '####   Build a dialog box to find the
    '       correct word template file      ####
    Set wdDoc = wdApp.Documents.Open(openDialog())
    
    counter2 = 1
    counter3 = 1
    
    For counter1 = 1 To wdDoc.Bookmarks.Count
    
        '####   Export "New Issue Timing" graphs to
        '       word document                       ####
    
        Call copyGraphs(newIssuesTiming, _
                        counter1, _
                        wdDoc, _
                        wdApp)
    Next
    
    ThisWorkbook.sheets(mainSheet).Select
    
    Set wdApp = Nothing
    Set wdDoc = Nothing
    
    Exit Sub
    
    错误退出:

    wdDoc.Close
    wdApp.Quit
    
    Set wdApp = Nothing
    Set wdDoc = Nothing
    
    Exit Sub
    
    错误处理程序:

    Dim error_report As ErrorControl
    Set error_report = New ErrorControl
    
    error_report.SetErrorDetail = Err.Description
    error_report.SetErrorNumber = Err.Number
    error_report.SetErrorSection = "BUILD_WORD_DOC"
    
    If error_report.GenerateErrorReport Then
    
        Resume ErrorExit
    
    End If
    
    Set error_report = Nothing
    
    我的复印机看起来像:

    Sub copyGraphs(sheet As String, _
                counter1 As Integer, _
                wdDoc As Word.Document, _
                wdApp As Word.Application)
    
    Dim wdBookmarksArray() As Variant
    Dim counter2 As Integer
    Dim Chart As ChartObject
    Dim theWorksheet As Worksheet
    Dim noCharts As Integer
    Dim counter4 As Integer
    Dim PasteObect As Variant
    Dim quarter As String
    Dim sheetsArr As String
    
    For Each Chart In ThisWorkbook.sheets(sheet).ChartObjects
        If wdDoc.Bookmarks(counter1).name = Chart.name Then
    
            ThisWorkbook.sheets(sheet).ChartObjects(Chart.name).Copy
            wdApp.Selection.Goto What:=wdGoToBookmark, name:=wdDoc.Bookmarks(counter1).name
            wdApp.Selection.PasteSpecial DataType:=wdPasteEnhancedMetafile
    
        End If
    Next
    
    End Sub
    

    copyGraph子模块与调用它的子模块位于同一个模块中。

    添加ByVal确实有效,但需要关闭并重新打开excel工作表才能从内存中清除所有对象

    答案来自@R3uK

    以下代码有效:

    Sub buildDocument()
    
        '####   Initialise our variables
        Dim wdApp As Word.Application
        Dim wdDoc As Word.Document
        Dim theWorksheet As Worksheet
        Dim Chart As ChartObject
    
        Dim wdBookmarksArray() As Variant
    
        Dim counter1 As Integer
        Dim counter2 As Integer
        Dim noCharts As Integer
        Dim counter4 As Integer
        Dim PasteObect As Variant
        Dim quarter As String
        Dim sheetsArr As String
    
        '####   Switch off update   ####
        Application.ScreenUpdating = False
    
        '####   Create a new word doc; minimise;    ####
        Set wdApp = New Word.Application
    
        With wdApp
            .Visible = True
            .WindowState = wdWindowStateMinimize
        End With
    
        On Error GoTo ErrorHandler
    
        '####   Build a dialog box to find the
        '       correct word template file      ####
        Set wdDoc = wdApp.Documents.Open(openDialog())
    
        counter2 = 1
        counter3 = 1
    
        For counter1 = 1 To wdDoc.Bookmarks.Count
    
            '####   Export "New Issue Timing" graphs to
            '       word document                       ####
    
            Call copyGraphs(newIssuesTiming, _
                            counter1, _
                            wdDoc, _
                            wdApp)
    
        Next
        ThisWorkbook.sheets(mainSheet).Select
    
        wdDoc.Save
        wdDoc.Close
        wdApp.Quit
    
        Set wdApp = Nothing
        Set wdDoc = Nothing
    
        Exit Sub
    
    ErrorExit:
    
        wdDoc.Close
        wdApp.Quit
    
        Set wdApp = Nothing
        Set wdDoc = Nothing
    
        Exit Sub
    
    ErrorHandler:
    
        Dim error_report As ErrorControl
        Set error_report = New ErrorControl
    
        error_report.SetErrorDetail = Err.Description
        error_report.SetErrorNumber = Err.Number
        error_report.SetErrorSection = "BUILD_WORD_DOC"
    
        If error_report.GenerateErrorReport Then
    
            Resume ErrorExit
    
        End If
    
        Set error_report = Nothing
    
    End Sub
    
    复制图形的例程:

     Sub copyGraphs(ByVal sheet As String, _
                    ByVal counter1 As Integer, _
                    ByVal wdDoc As Word.Document, _
                    ByVal wdApp As Word.Application)
    
        Dim wdBookmarksArray() As Variant
        Dim counter2 As Integer
        Dim Chart As ChartObject
        Dim theWorksheet As Worksheet
        Dim noCharts As Integer
        Dim counter4 As Integer
        Dim PasteObect As Variant
        Dim quarter As String
        Dim sheetsArr As String
    
        For Each Chart In ThisWorkbook.sheets(sheet).ChartObjects
            If wdDoc.Bookmarks(counter1).name = Chart.name Then
    
                ThisWorkbook.sheets(sheet).ChartObjects(Chart.name).Copy
    
                ThisWorkbook.sheets(sheet).ChartObjects(Chart.name).Copy
                wdApp.Selection.Goto What:=wdGoToBookmark, name:=wdDoc.Bookmarks(counter1).name
                wdApp.Selection.PasteSpecial DataType:=wdPasteEnhancedMetafile
    
            End If
        Next
    
    End Sub
    

    在重新启动之前,您是否尝试关闭Word文档?因为如果它们仍然在另一个Word实例中打开,我不确定您是否能够正常打开它们…您好,是的,我已尝试关闭整个excel文件并重新打开。同样的问题还在被过滤。不,我指的是你的Word文档,因为你没有在代码中关闭它们,如果它们已经打开,这可能是它无法工作的原因。添加
    wdDoc。在
    子复制图的末尾关闭
    ,然后重试;)抱歉造成混乱,是的,我在抛出错误后关闭所有内容。值得一提的是,在第二次运行时,在wdApp.Selection.PasteSpecial DataType:=wdPasteEnhancedMetafile处抛出了462错误。图表被粘贴到文档中,然后崩溃。Mkay。。。我猜你的意思是在出错之前,因为如果你在出错之后手动关闭它,那就没有意义了。。。您是否尝试在
    wdDoc
    上而不是在
    wdApp
    上使用
    Selection
    ?并在
    copyGraphs
    的每个参数中添加一个
    ByVal
    ,因为您的文档将被修改。您可能能够验证您的答案,如果您有足够的声誉,您可以将您的答案作为社区wiki打开,以便其他人可以对其进行改进(您将知道是否有待定的编辑建议)。很高兴我能提供帮助;)