1

我在这里使用 VBA 代码将 Excel 工作簿中的所有图表和表格复制到模板中的新 Word 文档中,该模板使用书签(标记为 Book1、Book2 等)预先格式化。不幸的是,我只有几张表,但大约有 20 个图表,如果我在汇总表中为我得到的范围留一个空白

运行时错误“5101”:
应用程序定义或对象定义错误

它只复制并粘贴到差距之前的图表和表格上。

这是我的excel汇总表:

在此处输入图像描述

知道如何修改代码以防止这种情况发生吗?

对不起 - 我是一个完整的 VBA 菜鸟

'You must set a reference to Microsoft Word Object Library from Tools | References

Option Explicit 

Sub ExportToWord() 

    Dim appWrd          As Object 
    Dim objDoc          As Object 
    Dim FilePath        As String 
    Dim FileName        As String 
    Dim x               As Long 
    Dim LastRow         As Long 
    Dim SheetChart      As String 
    Dim SheetRange      As String 
    Dim BookMarkChart   As String 
    Dim BookMarkRange   As String 
    Dim Prompt          As String 
    Dim Title           As String 

     'Turn some stuff off while the macro is running
    Application.ScreenUpdating = False 
    Application.EnableEvents = False 
    Application.DisplayAlerts = False 

     'Assign the Word file path and name to variables
    FilePath = ThisWorkbook.Path 
    FileName = "WorkWithExcel.doc" 

     'Determine the last row of data for our loop
    LastRow = Sheets("Summary").Range("A65536").End(xlUp).Row 

     'Create an instance of Word for us to use
    Set appWrd = CreateObject("Word.Application") 

     'Open our specified Word file, On Error is used in case the file is not there
    On Error Resume Next 
    Set objDoc = appWrd.Documents.Open(FilePath & "\" & FileName) 
    On Error Goto 0 

     'If the file is not found, we need to end the sub and let the user know
    If objDoc Is Nothing Then 
        MsgBox "Unable to find the Word file.", vbCritical, "File Not Found" 
        appWrd.Quit 
        Set appWrd = Nothing 
        Exit Sub 
    End If 

     'Copy/Paste Loop starts here
    For x = 2 To LastRow 

         'Use the Status Bar to let the user know what the current progress is
        Prompt = "Copying Data: " & x - 1 & " of " & LastRow - 1 & "   (" & _ 
        Format((x - 1) / (LastRow - 1), "Percent") & ")" 
        Application.StatusBar = Prompt 

         'Assign the worksheet names and bookmark names to a variable
         'Use With to group these lines together
        With ThisWorkbook.Sheets("Summary") 
            SheetChart = .Range("A" & x).Text 
            SheetRange = .Range("B" & x).Text 
            BookMarkChart = .Range("C" & x).Text 
            BookMarkRange = .Range("D" & x).Text 
        End With 

         'Tell Word to goto the bookmark assigned to the variable BookMarkRange
        appWrd.Selection.Goto What:=wdGoToBookmark, Name:=BookMarkRange 

         'Copy the data from Thisworkbook
        ThisWorkbook.Sheets(SheetRange).UsedRange.Copy 

         'Paste into Word
        appWrd.Selection.Paste 

         'Tell Word to goto the bookmark assigned to the variable BookMarkChart
        appWrd.Selection.Goto What:=wdGoToBookmark, Name:=BookMarkChart 

         'Copy the data from Thisworkbook
        ThisWorkbook.Sheets(SheetChart).ChartObjects(1).Copy 

         'Paste into Word
        appWrd.Selection.Paste 
    Next 

     'Turn everything back on
    Application.ScreenUpdating = True 
    Application.EnableEvents = True 
    Application.DisplayAlerts = True 
    Application.StatusBar = False 

     'Let the user know the procedure is now complete
    Prompt = "The procedure is now completed." & vbCrLf & vbCrLf & "www.VBAExpress.com" 
    Title = "Procedure Completion" 
    MsgBox Prompt, vbOKOnly + vbInformation, Title 

     'Make our Word session visible
    appWrd.Visible = True 

     'Clean up
    Set appWrd = Nothing 
    Set objDoc = Nothing 

End Sub 

完整的工作代码如下。我修改了代码,将图表粘贴为增强的元文件,因为这是我老板想要的。

    'You must set a reference to Microsoft Word Object Library from Tools | References

Option Explicit

Sub ExportToWord()

Dim appWrd          As Object
Dim objDoc          As Object
Dim FilePath        As String
Dim FileName        As String
Dim x               As Long
Dim LastRow         As Long
Dim SheetChart      As String
Dim SheetRange      As String
Dim BookMarkChart   As String
Dim BookMarkRange   As String
Dim Prompt          As String
Dim Title           As String

    'Turn some stuff off while the macro is running
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.DisplayAlerts = False

    'Assign the Word file path and name to variables
    FilePath = ThisWorkbook.Path
    FileName = "WorkWithExcel.doc"

    'Determine the last row of data for our loop
    LastRow = Sheets("Summary").Range("A" & Rows.Count).End(xlUp).Row

    'Create an instance of Word for us to use
    Set appWrd = CreateObject("Word.Application")

    'Open our specified Word file, On Error is used in case the file is not there
    On Error Resume Next
    Set objDoc = appWrd.Documents.Open(FilePath & "\" & FileName)
    On Error GoTo 0

    'If the file is not found, we need to end the sub and let the user know
    If objDoc Is Nothing Then
        MsgBox "Unable to find the Word file.", vbCritical, "File Not Found"
        appWrd.Quit
        Set appWrd = Nothing
        Exit Sub
    End If

    'Copy/Paste Loop starts here
    For x = 2 To LastRow

        'Use the Status Bar to let the user know what the current progress is
        Prompt = "Copying Data: " & x - 1 & " of " & LastRow - 1 & "   (" & _
            Format((x - 1) / (LastRow - 1), "Percent") & ")"
        Application.StatusBar = Prompt

        'Assign the worksheet names and bookmark names to a variable
        'Use With to group these lines together
        With ThisWorkbook.Sheets("Summary")
            SheetChart = .Range("A" & x).Text
            SheetRange = .Range("B" & x).Text
            BookMarkChart = .Range("C" & x).Text
            BookMarkRange = .Range("D" & x).Text
        End With

If Len(BookMarkRange) > 0 Then

'Tell Word to goto the bookmark assigned to the variable BookMarkRange
appWrd.Selection.Goto What:=wdGoToBookmark, Name:=BookMarkRange

'Copy the data from Thisworkbook
ThisWorkbook.Sheets(SheetRange).UsedRange.Copy

'Paste into Word
appWrd.Selection.Paste
End If

If Len(BookMarkChart) > 0 Then

'Tell Word to goto the bookmark assigned to the variable BookMarkChart
appWrd.Selection.Goto What:=wdGoToBookmark, Name:=BookMarkChart

'Copy the data from Thisworkbook
ThisWorkbook.Sheets(SheetChart).ChartObjects(1).Copy

'Paste into Word
'appWrd.Selection.PasteSpecial ppPasteEnhancedMetafile
 appWrd.Selection.PasteSpecial Link:=False, DataType:=wdPasteEnhancedMetafile, _
        Placement:=wdInLine, DisplayAsIcon:=False

End If

    Next

    'Turn everything back on
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.DisplayAlerts = True
    Application.StatusBar = False

    'Let the user know the procedure is now complete
    Prompt = "The procedure is now completed." & vbCrLf & vbCrLf & "www.VBAExpress.com"
    Title = "Procedure Completion"
    MsgBox Prompt, vbOKOnly + vbInformation, Title

    'Make our Word session visible
    appWrd.Visible = True

    'Clean up
    Set appWrd = Nothing
    Set objDoc = Nothing

End Sub
4

1 回答 1

2

此代码存在多个问题,包括如果您的范围比图表多,它只会复制与图表一样多的范围。

但是要快速解决您的问题,请更换

 'Tell Word to goto the bookmark assigned to the variable BookMarkRange
appWrd.Selection.Goto What:=wdGoToBookmark, Name:=BookMarkRange 

 'Copy the data from Thisworkbook
ThisWorkbook.Sheets(SheetRange).UsedRange.Copy 

 'Paste into Word
appWrd.Selection.Paste 

 'Tell Word to goto the bookmark assigned to the variable BookMarkChart
appWrd.Selection.Goto What:=wdGoToBookmark, Name:=BookMarkChart 

 'Copy the data from Thisworkbook
ThisWorkbook.Sheets(SheetChart).ChartObjects(1).Copy 

 'Paste into Word
appWrd.Selection.Paste 

if len (BookMarkRange) > 0 then
   'Tell Word to goto the bookmark assigned to the variable BookMarkRange
  appWrd.Selection.Goto What:=wdGoToBookmark, Name:=BookMarkRange 

   'Copy the data from Thisworkbook
  ThisWorkbook.Sheets(SheetRange).UsedRange.Copy 

   'Paste into Word
  appWrd.Selection.Paste 
end if

if len(BookMarkChart) > 0 then
   'Tell Word to goto the bookmark assigned to the variable BookMarkChart
  appWrd.Selection.Goto What:=wdGoToBookmark, Name:=BookMarkChart 

   'Copy the data from Thisworkbook
  ThisWorkbook.Sheets(SheetChart).ChartObjects(1).Copy 

   'Paste into Word
  appWrd.Selection.Paste 
end if
于 2012-07-18T14:50:51.707 回答