5

在研究此错误时,我得出的结论是,它与剪贴板没有像应有的清除方式有关,这在我们使用 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") 但没有运气。有什么方法可以不使用复制/粘贴方法来执行此操作,或者使用其他方法来清除剪贴板?

4

4 回答 4

8

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

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

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

于 2012-08-22T18:04:59.060 回答
7

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

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

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,例程也可能失败,只是被指示继续尝试。

于 2013-03-13T10:46:12.563 回答
1

这是我使用的代码:

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
subEmptyClipboard将简单地清除剪贴板

于 2012-08-22T18:14:07.767 回答
1

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

Application.CutCopyMode = False

于 2016-10-13T19:20:42.483 回答