我有一些复杂的代码,需要一些用户输入(要复制的形状名称),然后将所述形状从一张纸复制到另一张纸多次。这些项目是在Excel中绘制的分组形状,并且均正确且唯一地命名。
我间歇性地收到复制和粘贴错误“对象_Worksheet'的方法'粘贴'失败” 和“对象'_worksheet'的方法'复制'失败。通过研究我们知道这个问题很普遍,并且与在访问剪贴板时与Excel冲突的程序有关。
到目前为止,我和我的同事推断出,特别是两个程序对复制/粘贴操作的干扰最大-Adobe Reader和Autodesk Powershape。 (Autodesk和Adobe都在VBA中提供了参考库,不确定这是否是巧合吗?)
在我们打开程序时,该问题曾经经常发生,因此我们编写了以下宏/函数来尝试稳定代码:-
Public Sub CopyShape(ItemName, CopyDestination)
Call ClearClipboard Sheets(CopyDestination).Shapes(ItemName).Copy
Do Until IsClipboardEmpty = False DoEvents Loop
End Sub
其中“ ClearClipboard”为:-
Public Function ClearClipboard()
OpenClipboard (0&)
EmptyClipboard
CloseClipboard
End Function
并且函数IsClipboardEmpty是:-
Function IsClipboardEmpty() As Boolean
IsClipboardEmpty = (CountClipboardFormats() = 0)
End Function
具有以下公共声明:-
Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Declare Function EmptyClipboard Lib "user32" () As Long
Declare Function CloseClipboard Lib "user32" () As Long
Public Declare Function CountClipboardFormats Lib "user32" () As Long
此代码在很多时候都有效(比试图在复制操作后不幸失败而尝试使用“ DoEvents”要好得多),因为它强制代码在尝试粘贴之前检查复制的项目是否在剪贴板中它,但是它并不总是有效-后台的某些东西仍然使代码混乱。
有任何一种方式可以吗:-
任何和所有解决方案都欢迎,当然很高兴回答任何问题。
谢谢