Vba excel очистить буфер обмена

Обновлено: 03.07.2024

Я искал формулу и Интернет, но все решения не помогли мне.
Чтобы показать Office Clippoard, у меня работает код:

Как очистить буфер обмена?
Какой код вы используете?

С наилучшими пожеланиями,
Яцек Антек

Факты об Excel

Крисдонтм

Известный участник

Это то, что вы ищете?

яришек

Обычная доска

Спасибо, Chrisdontm, за ответ,

К сожалению, нет.
Я ищу решение для очистки буфера обмена Office, а не буфера обмена Windows.
Что-то вроде этого, но работает во всех версиях Excel (32-разрядная версия, 64-разрядная версия):

Может быть, кто-то нашел что-то для этой темы?

яришек

Обычная доска

Крэггс82

Обычная доска

яришек

Обычная доска

Привет, Craggs82. спасибо за ваше решение.

К сожалению, это не работает.
Это код для 32-битной версии, у меня 64-битная, все мои клиенты используют разные версии офисов.

Может быть, вы знаете, как настроить этот код на 64-битную версию?

РориА

MrExcel MVP, модератор
  1. 365
  2. 2019
  3. 2016
  4. 2010
    1. Окна
    2. MacOS

    Крэггс82

    Обычная доска

    приведенный мной код адаптирован для работы в 64- и 32-разрядных системах (обратите внимание на ptrsafe).

    Это для буфера обмена Windows, хотя для меня это также очищает буфер обмена Office. В этот момент я сделаю шаг назад, чтобы меня отругали за незнание буфера обмена :D

    Крэггс82

    Обычная доска

    приведенный мной код адаптирован для работы в 64- и 32-разрядных системах (обратите внимание на ptrsafe).

    Это для буфера обмена Windows, хотя для меня это также очищает буфер обмена Office. На этом этапе я сделаю шаг назад, чтобы меня отругали за незнание буфера обмена :D

    яришек

    Обычная доска

    Хм, РориА, какой код из сообщения номер 3 у вас работал?
    У вас есть рабочий?

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

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


    6 ответов 6

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


    Спасибо, я видел это раньше, но никогда не пробовал. Это работает и для моего приложения. По сути, он удаляет функцию CutCopy, которая автоматически удаляет данные из буфера обмена.

    Стоит отметить, что при этом очищается только буфер обмена Excel. Если у вас есть что-то еще в буфере обмена, это не имеет никакого эффекта. Хорошо для вопроса, но Google задает мне этот вопрос, когда я ищу способ очистить буфер обмена в макросе, для которого мне нужно действительно очистить буфер обмена - и этот ответ с наибольшим количеством голосов на МОЙ вопрос на самом деле не помогите мне.

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

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

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

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


    После копирования этой функции в проект VBA используйте ClearClipboard, чтобы очистить ее.


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

    Быстрое и простое решение, которое я только что использовал, это

    Где "MyDoc" – это название документа, который вы используете.

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

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

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

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

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


    Спасибо за это, свойство DisplayAlerts отлично сработало для блокировки предупреждений из Excel. Я думаю, что для повторного импорта данных из Excel будет полезно очищать буфер обмена в конце каждого цикла

    Просто для подтверждения; это свойство также доступно в Word. Я не проверял, как значения перечисления Word сравниваются со значениями Excel для этого свойства.

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

    Существует около 30 типов данных, которые можно скопировать в буфер обмена, помимо текста и формул, таких как графика, диаграммы и гиперссылки. Чтобы по-настоящему очистить буфер обмена, требуется больше, чем просто нажатие клавиши Esc или выполнение кодовой строки VBA Application.CutCopyMode = False .

    При использовании Windows API этот макрос VBA под названием ClearClipboard очищает все типы данных в вашем буфере обмена:

    7 комментариев к «Tom’s Tutorials For Excel: *Really* Clear the Clipboard »

    Том, когда я вставляю это в модуль или рабочую книгу, 3 верхних общедоступных объявления выделяются КРАСНЫМ цветом и не компилируются. Есть идеи, почему? Я никогда раньше не использовал публичное объявление, поэтому, очевидно, не понимаю, что делаю.

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

    Я получаю сообщение об ошибке компиляции: код необходимо обновить для использования в 64-разрядных системах. Просмотрите и обновите операторы Declare, а затем пометьте их атрибутом PtrSafe.

    Возможно, вам понадобится это в вашем модуле (чтобы заменить код с моей веб-страницы) для соответствия вашей 64-битной системе:

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

    Я пробую это в Windows 10 из Excel VBA.
    Код компилируется и выдает какие-либо ошибки, но после этого, если я нажму Win+V, все содержимое останется в буфере обмена.

    Вызов WriteLog(bdm, «Очистка буфера обмена Excel»)
    Application.CutCopyMode = False

    Вызовите WriteLog(bdm, «Очистка буфера обмена Windows»)
    OpenClipboard (0&)
    EmptyClipboard ‘ ОБЗОР. Кажется, это не очищает буфер обмена Windows.
    Закрыть буфер обмена

    Вызов WriteLog(bdm, «Очистка буфера завершена», True)

    Ой. – Код, который я вставил, испортился и не читается. У меня есть три вызова API, и я могу выполнить отладчик VBA и заметить, что после EmptyClipboard Win+V все еще имеет список элементов.

    Существует большая разница между очисткой буфера обмена, чтобы действительно сделать его пустым, и простым выполнением кодовой строки,
    Application.CutCopyMode = False,
    чтобы предположить (как некоторые ошибочно делают), что указанная кодовая строка очищает буфер обмена. буфер обмена, когда на самом деле это не так.

    Эта кодовая строка просто делает то, что говорит, то есть, если вы находитесь в режиме CutCopyMode, например, выбрав ячейку и нажав «Правка» > «Копировать» или «Правка» > «Вырезать», выполнение этой кодовой строки приведет к выходу из этого режима.

    Может быть один или несколько из более чем 30 форматов данных, поддерживаемых Windows и Excel, которые могут находиться в буфере обмена и не иметь ничего общего с CutCopyMode.

    Приведенный ниже макрос оценивает, какие форматы находятся в буфере обмена.

    Код выглядит длинным, но он предназначен для поиска каждого типа данных. Я мог пропустить 2 или 3, поэтому, если кто-то увидит, что я пропустил, напишите об этом, но общая идея такова:

    Sub TestClipboard()
    Dim vaFormats As Variant, dFormat As Variant
    vaFormats = Application.ClipboardFormats
    Для каждого dFormat в vaFormats
    Выберите регистр dFormat
    Case xlClipboardFormatBIFF
    MsgBox "xlClipboardFormatBIFF (" & dFormat & ")"
    Case xlClipboardFormatBIFF2
    MsgBox " xlClipboardFormatBIFF2 ("&dFormat &")"
    Case xlClipboardFormatBIFF3
    MsgBox "xlClipboardFormatBIFF3 ("&dFormat &")"
    Case xlClipboardFormatBIFF4
    MsgBox "xlClipboardFormatBIFF4 ("&dFormat &") "
    Case xlClipboardFormatBinary
    MsgBox "xlClipboardFormatBinary (" & dFormat & ")"
    Case xlClipboardFormatBitmap
    MsgBox "xlClipboardFormatBitmap ("& dFormat & ")"
    Case xlClipboardFormatCGM < br />MsgBox "xlClipboardFormatCGM ("&dFormat &")"
    Case xlClipboardFormatCSV
    MsgBox "xlClipboardFormatCSV ("&dFormat &")"
    Case xlClipboardFormatDIF
    MsgBox "xlClipboardFormatDIF (" & dFormat & ")"
    Case xlClipboardFormatDspText
    MsgBox "xlClipboardFormatDspText (" & dFormat & ")"
    Case xlClipboardForma tEmbeddedObject
    MsgBox "xlClipboardFormatEmbeddedObject ("&dFormat &")"
    Case xlClipboardFormatEmbedSource
    MsgBox "xlClipboardFormatEmbedSource ("&dFormat &")"
    Case xlClipboardFormatLink
    MsgBox "xlClipboardFormatLink ("&dFormat & ")"
    Case xlClipboardFormatLinkSource
    MsgBox "xlClipboardFormatLinkSource (" & dFormat & ")"
    Case xlClipboardFormatLinkSourceDesc
    MsgBox "xlClipboardFormatLinkSourceDesc (" & dFormat & ")"
    Case xlClipboardFormatMovie
    MsgBox "xlClipboardFormatMovie (" & dFormat & ")"
    Case xlClipboardFormatNative
    MsgBox "xlClipboardFormatNative (" & dFormat & ")"
    Case xlClipboardFormatObjectDesc
    />MsgBox "xlClipboardFormatObjectDesc (" & dFormat & ")"
    Case xlClipboardFormatObjectLink
    MsgBox "xlClipboardFormatObjectLink (" & dFormat & ")"
    Case xlClipboardFormatOwnerLink
    MsgBox "xlClipboardFormatOwnerLink (" & dFormat & ")"
    Case xlClipboardFormatPICT
    Ms gBox "xlClipboardFormatPICT ("&dFormat &")"
    Case xlClipboardFormatPrintPICT
    MsgBox "xlClipboardFormatPrintPICT ("&dFormat &")"
    Case xlClipboardFormatRTF
    MsgBox "xlClipboardFormatRTF ("&dFormat & ")"
    Case xlClipboardFormatScreenPICT
    MsgBox "xlClipboardFormatScreenPICT ("&dFormat &")"
    Case xlClipboardFormatStandardFont
    MsgBox "xlClipboardFormatStandardFont ("&dFormat &")"
    Case xlClipboardFormatStandardScale
    MsgBox "xlClipboardFormatStandardScale ("&dFormat &")"
    Case xlClipboardFormatSYLK
    MsgBox "xlClipboardFormatSYLK ("&dFormat &")"
    Case xlClipboardFormatTable
    MsgBox "xlClipboardFormatTable (" & dFormat & ")"
    Case xlClipboardFormatText
    MsgBox "xlClipboardFormatText (" & dFormat & ")"
    Case xlClipboardFormatToolFace
    MsgBox "xlClipboardFormatToolFace (" & dFormat & ")"
    Case xlClipboardFormatToolFacePICT
    MsgBox "xlClipboardFormatToolFacePICT (" & dFormat & ")"
    Case xlClipboardFormatVALU
    MsgBox "xlClipboardFormatVALU (" & dFormat & ")"
    Case xlClipboardFormatWK1
    MsgBox "xlClipboardFormatWK1 (" & dFormat & ")"
    Case dFormat = -1
    MsgBox "В буфере обмена ничего нет"
    Case Else
    MsgBox "В буфере обмена есть данные формата номер ("&dFormat &")"
    Конец Выберите
    Далее
    Конец подпункта

    Тот факт, что
    Application.CutCopyMode = False
    не очищает буфер обмена, можно легко проверить, скопировав объект рисования, строку текста из строки формул или встроенное поле со списком… в любом случае, и выполните кодовую строку
    Application.CutCopyMode = False,
    но вы все равно сможете вставить этот объект или текст в другое место в Excel столько раз, сколько позволяет ваша системная память, если вы не перезагрузите компьютер.

    Обратите также внимание, что динамическое включение функции «Вставить» в меню «Правка» или контекстном меню не является надежным способом предположить, что буфер обмена очищен. Это означает только то, что данные, которые можно вставить на лист Excel, могут быть в буфере обмена, а могут и не быть.


    Зарегистрированный пользователь Дата регистрации 20.12.2016 Местоположение Австралия MS-Off Ver 2010 Сообщений 16

    Код VBA Excel для очистки всего в буфере обмена

    Я пытаюсь написать макрос, чтобы "очистить все" в буфере обмена Excel.

    Эффект должен быть эквивалентен переходу в буфер обмена и нажатию «Очистить все» (см. снимок экрана ниже)

    Смысл этого в том, чтобы очистить все данные буфера обмена в конце очень длинного макроса, который я разработал, который не будет выдавать сообщение "изображение слишком велико, и его нужно будет обрезать" после закрытия книги.

    Я потратил часы, пытаясь найти решение, но ничего не увенчалось успехом.

    Ниже приведено распространенное решение, когда вы вставляете этот код после «вставки значения." Я пробовал это, но данные по-прежнему помещаются в буфер обмена.
    Application.CutCopyMode = False

    Есть ли способ просто закодировать команду "Очистить все", как показано на скриншоте?

    Кажется простым, но трудно найти ответ.

    Гуру форума Дата регистрации 14.12.2012 Местоположение Лондон Англия MS-Off Ver MS 365 Office Suite. Сообщений 8450

    Мои общие правила, если вам нужна моя помощь. Не направлено ни на кого конкретно:

    <р>1. Пожалуйста, делайте запросы, а не требования, никому из нас здесь не платят.

    <р>2. Регулярно проверяйте свой пост. Я не вернусь к посту через 4 дня.
    Если это не важно для вас, то это точно не важно для меня.


    Зарегистрированный пользователь Дата регистрации 20.12.2016 Местоположение Австралия MS-Off Ver 2010 Сообщений 16

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

    Ниже приведено относительное кодирование. Даже с Application.CutCopyMode = False кажется, что скопированные данные помещаются в буфер обмена.


    Листы("Свод").ИспользованныйДиапазон.Выбрать
    Выделение.Копировать
    Листы("Окончательный").Выбрать
    Диапазон("A1").Выбрать
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    Application.CutCopyMode = False

    Forum Expert Дата регистрации 23.12.2012 Местоположение Северная Каролина MS-Off Ver Excel 2019 Professional Plus — 2007 Enterprise Сообщений 6 463

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

    'Очистка буфера обмена Office

    Затемнить объект oData As New DataObject для использования буфера обмена

    oData.SetText text:=Empty 'Очистить
    oData.PutInClipboard 'возьмите буфер обмена, чтобы очистить его
    Просто скопируйте и вставьте в свой код, когда вам нужно очистить буфер обмена.

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

    'Очистка буфера обмена Office

    Затемнить объект oData As New DataObject для использования буфера обмена

    oData.SetText text:=Empty 'Очистить
    oData.PutInClipboard' взять буфер обмена, чтобы очистить его


    'Вы также можете просто удалить предупреждающие сообщения из программы Excel во время
    'исполнения кода
    'Удалить предупреждающие сообщения из программы Excel при закрытии
    ExcelProgram. DisplayAlerts = Ложь

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


    Эта функциональность реализована в библиотеке "Microsoft Forms 2.0 Object Library". Чтобы создать ссылку на эту библиотеку, перейдите в редактор VBA, выберите "Инструменты", "Ссылки" и выберите ее из списка, если она еще не отмечена галочкой.

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

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

    Читайте также: