Как очистить буфер обмена 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