Очистка буфера обмена с помощью макроса в Office 365 Word

Я использую Office 365 под Windows 10, 64-разрядная версия. Я пытаюсь очистить буфер обмена макросом Word. Регистратор макросов просто производит пустой саб.

Следующие попытки в основном собраны из Как очистить буфер обмена Office с помощью VBA:

Option Explicit
Public Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function EmptyClipboard Lib "user32" () As Long
Public Declare Function CloseClipboard Lib "user32" () As Long

Public Sub ClearClipboardA()
    Application.CutCopyMode = False
End Sub

Public Sub ClearClipBoardB()
    ' Source: http://www.vbaexpress.com/kb/getarticle.php?kb_id=462
    Dim oData As New DataObject
    oData.SetText Text:=Empty ' Clear
    oData.PutInClipboard ' Putting empty text into the clipboard to empty it
End Sub

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

Версия A: метод или элемент данных не найден

Версия B: работает без очистки буфера обмена. Вскоре появится небольшое желтое окно состояния: "7 из 24 - Буфер обмена | Элемент не извлечен" (переведено на английский)

Версия C: Похоже, ничего не происходит.

В приведенном выше справочнике пользователь iamstrained пишет: "Спустя годы, но если кто-то ищет, как это сделать в Office 365 под 64-разрядной версией, теперь вам нужно использовать модификации для обратной совместимости, чтобы эта работа работала: Private Declare PtrSafe и LongPtr. поскольку два ваших изменения этих значений решат проблемы и позволят ему по-прежнему работать ".

Я нашел ссылку на страницу Microsoft, где, возможно, это было сделано:

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

Используя показанные здесь подпрограммы, я могу вставлять текст в буфер обмена и извлекать из него текст. Но не понятно.

Если кому-нибудь удастся найти подпрограмму, которая фактически полностью очищает буфер обмена, я был бы очень признателен за ее публикацию здесь!

5 ответов

Чтобы очистить буфер обмена офиса (из 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, ByVal cChildren 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, 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

Я могу подтвердить, что приведенный ниже код очищает буфер обмена 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.

У меня, вероятно, есть 8 часов на поиск VBA, чтобы очистить буфер обмена Office (а не Windows) в 64-битном Office 365. Все другие сообщения, которые я нашел, либо давали код, который выполнялся, но не очищал буфер обмена, либо говорили, что это невозможно сделать.

Если это помогает другим, #If, #Else, #End if дали мне ошибки, поэтому я выбрал 4 строки после #if для своих заявлений объявления.

Кстати, я запускаю это в MS Word VBA.

СПАСИБО!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Макрос EvR для очистки буфера обмена Office очень умен. (См . выше .) Он работает в Excel с моей 64-разрядной версией Microsoft (Office) 365 и Windows 10.

VBA7 был представлен вместе с Office 2010; это должно быть у всех сейчас. Директива vba7 не различает 64-битные; директива win64 делает это, если это необходимо. Итак, вот моя версия макроса EvR:

      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
Sub ClearOfficeClipboard()
    Dim A() As Variant, CB As Variant, n As Variant, i As Integer
    With Application
        If Not .DisplayClipboardWindow Then
            ClearClipboard
            .DisplayClipboardWindow = True
            ClearOfficeClipboard ' recurse
            Exit Sub
        End If
        On Error GoTo ErrHandler
        Set CB = .CommandBars("Office Clipboard")
        A = Array(0, 3, 0, 3, 0, 3, 1)
        For i = 0 To UBound(A)
            AccessibleChildren CB, A(i), 1, CB, n
        Next i
        CB.accDoDefaultAction CLng(0)
    End With
ErrHandler:: Set CB = Nothing
End Sub

Макрос ClearClipboard предоставлен Чипом Пирсоном, http://www.cpearson.com/Excel/Clipboard.aspx . (См. Тимоти Рилатт выше , но вместо win64 замените vba7.)

Я не понимаю цикл For, который вызывает AccessibleChildren. Может кто-нибудь объяснить, как это работает? Обратите внимание, что CB должен быть Variant, а не CommandBar или Object.

I've used this above code snippet and it worked well until recent software updates that prevented me to clear the office clipboard without opening clipboard window. My solution it's very simple: Add just this to the code:#If VBA7 ThenPrivate 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 LongPublic Const myVBA7 As Long = 1#ElsePrivate 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 LongPublic Const myVBA7 As Long = 0#End If

Public Sub EvRClearOfficeClipBoard()Dim cmnB, IsVis As Boolean, j As Long, Arr As VariantArr = Array(4, 7, 2, 0) '4 and 2 for 32 bit, 7 and 0 for 64 bitSet cmnB = Application.CommandBars("Office Clipboard")

'Just add here...First'---------------------
With Application.DisplayClipboardWindow = True End With

      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

'And finish with this '-------------------- With Application .DisplayClipboardWindow = False End With

End Sub

Другие вопросы по тегам