问题描述
我正在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页面的引用,这可能是在其中完成的:
使用此处显示的字幕,我可以将文本插入剪贴板并从中提取。 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