Как очистить буфер обмена Office с помощью VBA

Как бы вы очистили буфер обмена Microsoft Office, используя VBA, в частности Word VBA?

Я копирую много данных за раз в буфер обмена и не хочу, чтобы избыточные данные хранились в буфере обмена.

7 ответов

Решение

Видел это в другом посте, и я проверил это с Word VBA.

'Clearing the Office Clipboard

    Dim oData   As New DataObject 'object to use the clipboard

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

Просто скопируйте и вставьте в свой код все, что вам нужно, чтобы очистить буфер обмена.

Еще я заметил, что когда я .Quit программа, скажем Excel, постоянно спрашивает меня, хочу ли я сохранить данные в буфере обмена. Обходной путь - очистить буфер обмена, используя вышеуказанный код. Увидеть ниже:

'Clearing the Office Clipboard

    Dim oData   As New DataObject 'object to use the clipboard

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


'You can also just remove the Alert Messages from the Excel Program while    
'the code is running
'Remove alert Messages from the Excel Program when closing
ExcelProgram.DisplayAlerts = False   

'Quiting the Excel Application
ExcelProgram.Quit

Я использовал приведенный выше пример в коде VBA для импорта данных из файла Excel. Смотрите здесь

Был бы простой

Application.CutCopyMode = False

работать в вашей ситуации, или этот вариант не подходит?

Вот решение, которое сработало для меня. Это основано на сообщении Зака ​​Барресса на VBAexpress.com:

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 ClearClipboard()
    OpenClipboard (0&)
    EmptyClipboard
    CloseClipboard
End Sub

Один это в вашем проекте VBA, используется ClearClipboard очистить это.

Если кто-то похож на меня и просто берет код и бьет его программным молотком, пока он не будет соответствовать вашим потребностям: приведенное выше решение обновлено для современной эпохи с помощьюptrsafeиlongptrуже добавлено. В случае, если вы, как и я, понятия не имеете, что они означают, и потребуется слишком много времени, чтобы понять, куда их поместить.

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

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

Sub ccc()
    Call ClearClipboard
End Sub

Я только что использовал быстрое и простое решение:

      MyDoc.Range.Characters(1).Copy

Где «MyDoc» - это имя используемого вами документа.

Технически он не очищает буфер обмена, он просто делает его длиной в один символ (при условии, что ваш документ начинается с символов), что предотвращает появление Word с раздражающими вопросами.

Пуристам это может не понравиться, но, хей-хо, это очень просто :)

Эта функциональность хранится в библиотеке "Библиотека объектов Microsoft Forms 2.0". Для ссылки на эту библиотеку перейдите в редактор VBA, затем Инструменты, Ссылки и выберите ее из списка, если она еще не отмечена.

Вы можете делать более интересные вещи с кучей вызовов WinAPI, но я обычно предпочитаю избегать их, если в этом нет крайней необходимости.

Кроме того, не забывайте о свойстве DisplayAlerts, которое будет подавлять диалоговые окна - хотя я не уверен, что оно всегда даст желаемый результат.

Если вы получаете сообщение об ошибке при закрытии книги, используйте примерно такой код

      wbk.close False
Application.CutCopyMode = False 
Другие вопросы по тегам