使用Office 365 Word中的宏清除剪贴板

问题描述

我正在64位Windows 10下使用Office 365。我正在尝试使用 Word 宏清除剪贴板。宏记录器只会产生一个空子。

以下尝试主要是从How to Clear Office Clipboard with VBA收集的:

pcolor

版本A:找不到方法或数据成员

版本B:在不清除剪贴板的情况下运行。不久会出现一个黄色的小状态窗口:“ 24之7-剪贴板|未提取元素”(翻译成英文)

版本C:似乎什么都没发生。

在上面的参考用户iamstrained中写道:“几年后,但是如果有人正在寻找如何在64位下的Office 365中执行此操作,则现在需要使用向后兼容性的修改来使此工作有效:私有声明PtrSafe和LongPtr,您对这些值的两个更改将解决问题并使它仍然可以工作。”

我找到了对Microsoft页面的引用,这可能是在其中完成的:

https://docs.microsoft.com/da-dk/office/vba/access/Concepts/Windows-API/send-information-to-the-clipboard

使用此处显示的字幕,我可以将文本插入剪贴板并从中提取。 Bu不能清除它。

如果有人成功找到了一个实际上可以完全清除剪贴板的子程序,那么我很高兴看到它在这里发布!

解决方法

我可以确认下面的代码清除了Windows剪贴板

#If Win64 Then
Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As LongPtr) As Long
Declare PtrSafe Function CloseClipboard Lib "user32" () As Long
Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long
#Else
Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Declare Function CloseClipboard Lib "user32" () As Long
Declare Function EmptyClipboard Lib "user32" () As Long
#End If

Public Sub ClearClipboard()
   OpenClipboard (0&)
   EmptyClipboard
   CloseClipboard
End Sub

您可以从https://www.microsoft.com/en-us/download/confirmation.aspx?id=9970

下载指针安全声明。 ,

要清除Office剪贴板(从Excel):

#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,_
                                                              ByRef rgvarChildren As Any,ByRef pcObtained As Long) As Long
    Public Const myVBA7 As Long = 0
#End If

Public Sub EvRClearOfficeClipBoard()
    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,3,1),1,cmnB,1
    Next
        
    cmnB.accDoDefaultAction CLng(Arr(2 + myVBA7))

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

End Sub