[英]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.