繁体   English   中英

尝试将图表、范围等插入到 Word 中时,在 excel 2010 VBA 中复制/粘贴时出错

[英]Error with copy/paste in excel 2010 VBA when trying to insert charts, ranges etc into word

在研究这个错误时,我得出的结论是,它与剪贴板没有像它应该的那样清除有关,这在我们使用 2003 时不是问题,但现在我们使用的是 2010。(我也继承了这个代码来自不再在这里工作的人)

运行时错误“4605”:
此方法或属性不可用,因为剪贴板为空或无效。

这是我的代码:

Worksheets("Exec Sum").Range("B140:I186").Copy

With myDoc.Bookmarks
  .Item("b3").Range.PasteSpecial Link:=True, DataType:=wdPasteMetafilePicture, Placement:=bmark, DisplayAsIcon:=False
End With

' Clears Clipboard
Application.CutCopyMode = False

我已经尝试过先选择一个空单元格的 sendkeys ("^C") 但没有运气。 有什么办法可以不使用复制/粘贴方法来执行此操作或使用不同的方法来清除剪贴板?

我从 2003 年升级到 2010 年时开始收到此错误,但该宏在 2003 年仍然有效。

桌子在那里,但我注意到有时复制不起作用。 由于这在调试模式下从未发生过,因此我在复制之前添加了 5 秒的等待时间。

这会使宏变慢,但至少它可以工作。

我仍在测试我的解决方案,但它与提出的建议不同,并且到目前为止工作得很好。 只是一种不同的方法:

我添加了一个标签并用错误处理程序包围了我的复制尝试...

Pg1CopyAttempt:
    DoEvents
    shSomeSheet.Range("A1:G30").Copy
    On Error GoTo Pg1PasteFail
    WordApp.Selection.PasteExcelTable False, False, False
    On Error goto 0 'disable the error handler 

我将标签称为“Pg1CopyAttempt”,因为我知道 Excel 可能无法将其复制到剪贴板,这并非我自己的过错。 如果 Excel 确实让我失望了,我会在尝试粘贴之前不知道。 当我尝试时,当粘贴方法失败时,我会被抛出错误处理程序 (Pg1PasteFail)。 这位于我的例程的底部(在直接退出子程序或退出例程之后)。

Pg1PasteFail:
If Err.Number = 4605 Then ' clipboard is empty or not valid.
    DoEvents
    Resume Pg1CopyAttempt
 End If

以编程方式测试空剪贴板会比依赖错误处理程序更好,但这里的想法是强制循环,以便它不断尝试复制直到成功。 对剪贴板进行编程测试的更简单的循环可以利用 Sean 的 ClipboardEmpty 函数(上图)。 DoEvents 仍然被利用,但即使使用 DoEvents,例程也可能失败,只是被指示继续尝试。

这是我使用的代码:

Private Declare Function apiOpenClipboard Lib "user32" Alias "OpenClipboard" (ByVal hWnd As Long) As Long
Private Declare Function apiEmptyClipboard Lib "user32" Alias "EmptyClipboard" () As Long
Private Declare Function apiCloseClipboard Lib "user32" Alias "CloseClipboard" () As Long
Private Declare Function CountClipboardFormats Lib "user32" () As Long

Function ClipboardEmpty() As Boolean
    ClipboardEmpty = (CountClipboardFormats() = 0)
End Function

Sub EmptyClipboard()
  If apiOpenClipboard(0&) <> 0 Then
    Call apiEmptyClipboard
    Call apiCloseClipboard
  End If
End Sub

ClipboardEmpty函数是一个测试。 例如, if clipboardempty then
EmptyClipboard将简单地清除剪贴板

我尚未确认这是最终解决方案,但似乎在复制时挂断了 - 复制的数据从未将其放入剪贴板,因此尝试粘贴时代码失败。 在启动下一个复制命令之前清除任何先前复制数据的剪贴板似乎有帮助。 我仍在使用上面显示的等待时间,但我似乎能够使用以下功能清除剪贴板以缩短等待时间:

Application.CutCopyMode = False

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM