无法通过VBA清空Office剪贴板

5

我正在使用一个函数从Access数据库中复制一堆图片并将它们存储到磁盘上。然而,这个函数使用Office剪贴板,剪贴板在大约150条记录后就会填满并导致程序崩溃。以下是我清空剪贴板的方法:

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

Sub EmptyClipboard()
    Call apiOpenClipboard(0&)
    Call apiEmptyClipboard
    Call apiCloseClipboard
End Sub

有人知道如何更有效地清空剪贴板吗?


根据版本的不同,这可能有效:Application.CutCopyMode = False。 - PinkElephantsOnParade
谢谢,我已经尝试过了,但好像没有什么帮助。我正在使用Office 2010。 - DasPete
你已经将你的问题标记为 ms-access-2007,可能需要更新标签以获得更好/适当的可见性。 - LittleBobbyTables - Au Revoir
谢谢@LittleBobbyTables,显然我还没有喝足够的咖啡。 - DasPete
你看到了http://social.msdn.microsoft.com/Forums/en-US/exceldev/thread/fb6d1863-01ee-48f3-be26-b50b97b36aca/吗?它说除非使用sendkeys,否则无法做到这一点。我想知道如果你不时地将一些小东西复制到剪贴板上,是否会清空它? - Fionnuala
3个回答

1
您正在使用的功能涉及到Windows剪贴板。这与Office剪贴板不同。
我找到的唯一清除该剪贴板的代码是Application.CommandBars("Clipboard").Controls(4).Execute,但由于我已禁用Office剪贴板(并且显然没有启用它的方法),因此我无法确定这是否是实际解决方案。

谢谢,我尝试了一下,但是Access似乎不太喜欢它,出现了“下标超出范围”的错误。我发现如果我保持剪贴板面板打开,当我的程序循环浏览记录时,我可以点击“全部清除”按钮。这似乎是最好的解决方案。虽然不是理想的,但它有效。感谢大家的帮助! - DasPete

0

我在其他地方读到,这个可以满足你的需求:

Option Explicit 

Public Sub ClearClipBoard() 
    Dim oData   As New DataObject 'object to use the clipboard

    oData.SetText Text:=Empty 'Clear
    oData.PutInClipboard 'take in the clipboard to empty it
End Sub 

这也适用于 Windows 剪贴板,而不是 Office 剪贴板。 - Andre

0
尝试一下: (旧帖,我知道;-))
    #If VBA7 Then
    Private Declare PtrSafe Function AccessibleChildren Lib "oleacc" (ByVal paccContainer As Office.IAccessible, _
    ByVal iChildStart As Long, ByVal cChildren As Long, _
    ByRef rgvarChildren As Any, ByRef pcObtained As Long) As Long
    Public Const myVBA7 As Long = 1
#Else
    Private Declare Function AccessibleChildren Lib "oleacc" (ByVal paccContainer As Office.IAccessible, _
                                                              ByVal iChildStart As Long, ByVal cChildren As Long, _
                                                              ByRef rgvarChildren As Any, ByRef pcObtained As Long) As Long
    Public Const myVBA7 As Long = 0
#End If

Public Sub ClearOfficeClipBoard()
    Dim cmnB, IsVis As Boolean, j As Long, Arr As Variant
    Arr = Array(4, 7, 2, 0)                      '4 and 2 for 32 bit, 7 and 0 for 64 bit
    Set cmnB = Application.CommandBars("Office Clipboard")
    IsVis = cmnB.Visible
    If Not IsVis Then
        cmnB.Visible = True
        DoEvents
    End If

    For j = 1 To Arr(0 + myVBA7)
        AccessibleChildren cmnB, Choose(j, 0, 3, 0, 3, 0, 3, 1), 1, cmnB, 1
    Next
        
    cmnB.accDoDefaultAction CLng(Arr(2 + myVBA7))

    Application.CommandBars("Office Clipboard").Visible = IsVis

End Sub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接