【问题标题】:Copy from Excel Paste in Word从 Excel 复制粘贴到 Word
【发布时间】:2020-01-27 21:24:37
【问题描述】:

在 Excel 中,我有大约 20 张表,每张表中有 20 个图表,我需要将它们复制/粘贴到 Word 文档中。每个 Excel 工作表一个 Word 文档。我发现this article 有一个解决方案,我将其修改为接受一个 ChartObject 作为参数,这样我就不必考虑正在复制哪个图表。我在 CopyChart2Word() 函数中调用 PasteSpecial 的最后一行收到以下运行时错误:

这不是很有帮助,因为它没有告诉我哪里出了问题。但是图表被粘贴到 Word 文档中,缺少一半的数据点。

代码:

Public Function moveCharts()
  Dim i As Integer
  Dim name As String
  Dim ChtObj As ChartObject
  Dim dummy As Variant

  initGlobals
  For i = 0 To UBound(employees)
    name = employees(i)
    For Each ChtObj In Worksheets(name).ChartObjects
        dummy = CopyChart2Word(ChtObj)
    Next ChtObj
  Next i
End Function

Public Function CopyChart2Word(chartObj As ChartObject)
  Dim wd As Object
  Dim ObjDoc As Object
  Dim FilePath As String
  Dim FileName As String
  FilePath = "C:\Users\name\Desktop"
  'Empty document for now
  FileName = "Template.docx"

  'check if template document is open in Word, otherwise open it
  On Error Resume Next
  Set wd = GetObject(, "Word.Application")
  If wd Is Nothing Then
    Set wd = CreateObject("Word.Application")
    Set ObjDoc = wd.Documents.Open(FilePath & "\" & FileName)
  Else
    On Error GoTo notOpen
    Set ObjDoc = wd.Documents(FileName)
    GoTo OpenAlready
    notOpen:
    Set ObjDoc = wd.Documents.Open(FilePath & "\" & FileName)
  End If
  OpenAlready:
  On Error GoTo 0

  'find Bookmark in template doc
  wd.Visible = True
  'ObjDoc.Bookmarks("Bookmark1").Select

  'copy chart from Excel
   chartObj.chart.ChartArea.Copy

   'insert chart to Bookmark in template doc
   'wdPasteMetafilePicture didn't work so I used the numeric value 3
   'wdInLine didn't work so I used the numeric value 0
   wd.Selection.PasteSpecial Link:=False, _
   DataType:=3, _
   Placement:=0, _
   DisplayAsIcon:=False
 End Function

链接到sample chart

【问题讨论】:

  • 当您收到错误并单击调试时,可能包括突出显示的行?仅供参考,大多数人不会从您的谷歌驱动器下载文件。
  • A minimal reproducible example - 包含在问题中 - 会很有用...

标签: excel vba ms-word copy-paste


【解决方案1】:

我怀疑该错误可能是由同时打开的不同 Word 实例引起的。为了消除这种可能性,我建议整理一下您处理 Word 和文档的方式。您的代码逻辑有点混乱。请改用这个。

On Error Resume Next
Set Wd = GetObject(, "Word.Application")
If Err Then Set Wd = CreateObject("Word.Application")

On Error Resume Next
Set ObjDoc = Wd.Documents(Filename)
If Err Then Set ObjDoc = Wd.Documents.Open(FilePath & "\" & Filename)

On Error GoTo 0

我想知道你为什么需要Wd.Visible = True。默认情况下它应该是可见的。然而,也许 Window 不是 ActiveWindow。事实上,Word 可能不是活动应用程序。我不认为这对代码很重要。

但这对Selection 对象应该很重要。只有 ActiveWindow 可以有Selection。因此,如果您打开 Excel 并运行代码,您将无法在 Word 中访问 Selection 对象。反过来,如果您打开 Word 并进行选择,然后更改为 Excel,Selection 对象将丢失。这也可能导致致命错误。只需遵循以下规则:“永远不要在 VBA 中使用 Select 任何内容 [直到代码的最后一行]。

【讨论】:

  • 我在最初测试时打开了几个 Word 文档。一旦我关闭所有文件并再次尝试,我就没有问题了。您能解释一下您推荐的代码更改吗?由于我是 VBA 新手并且我目前拥有的东西有效,所以我不明白您的更改会产生什么影响。
  • 我的代码将您的测试If wd Is Nothing Then 替换为If Err Then。它更短更整洁,但在本质上没有什么不同。该错误仍然无法识别,但消除了由语法不精确引起的可能性。我的代码无法打开两个 Word 实例。现在新的嫌疑人是Selection 对象,可能(由您)在非活动窗口中假定。避免使用SelectActivate,而是通过它们的名称引用您创建的对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多