VBA Excel. Буфер обмена (копирование, вставка, очистка)

    Работа с буфером обмена в VBA Excel: копирование и вставка ячеек, копирование текста из переменной, очистка буфера обмена. Объект DataObject. Примеры.

    Копирование и вставка ячеек

    Копирование содержимого и форматов ячеек (диапазона) в буфер обмена осуществляется методом Range.Copy, а вставка – методом Worksheet.Paste:

    При вставке диапазона ячеек из буфера обмена на рабочий лист достаточно указать верхнюю левую ячейку места (диапазона) вставки.

    Для вставки из буфера обмена отдельных компонентов скопированных ячеек (значения, формулы, примечания и т.д.), а также применения к диапазону транспонирования или вычислений, используется метод Range.PasteSpecial (специальная вставка).

    Буфер обмена и переменная

    Передача текста между переменной и буфером обмена в VBA Excel осуществляется с помощью объекта DataObject. Стоит иметь в виду, что на некоторых компьютерах DataObject может некорректно работать при открытом окне проводника.

    Объект DataObject

    DataObject – это область временного хранения форматированных фрагментов текста, используемая в операциях переноса данных.

    Подробнее об элементе DataObject вы можете прочитать на сайте разработчиков.

    Методы объекта DataObject:

    Метод Описание
    GetFromClipboard Копирует данные из буфера обмена в DataObject
    GetText Извлекает текстовую строку из объекта DataObject в указанном формате
    PutInClipboard Перемещает данные из DataObject в буфер обмена
    SetText Копирует текстовую строку в DataObject, используя указанный формат

    Копирование текста из переменной в буфер обмена

    Копирование текста из буфера обмена в переменную

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

    Специального метода для очистки буфера обмена в VBA Excel нет. Для решения этой задачи можно использовать выход из режима вырезания-копирования:

    Следующий пример демонстрирует вставку скопированной ячейки "A1" в ячейки "A2" и "A3" и отсутствие вставки в ячейки "A4" и "A5" после строки Application.CutCopyMode = False:

    Оператор On Error Resume Next необходим для обработки (пропуска) ошибки, возникающей при вставке из пустого буфера обмена.

    Функции для работы с буфером обмена

    В некоторых системах, начиная с Windows 8, метод DataObject.PutInClipboard не работает правильно: если открыт хотя бы один экземпляр Проводника (папка), в буфер обмена записываются два квадратика. Следующие функции должны решить эту проблему:

    Пример использования функций для работы с буфером обмена:


    Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи.

    6 комментариев для “VBA Excel. Буфер обмена (копирование, вставка, очистка)”

    1. Код — не работает ▼

      В А1 вставляется какой-то непечатаемый символ и всё. При переходе к другому приложению и попытке вставить содержимое буфера — фиаско.

      1. Евгений

        Добрый день, Михаил!
        Такое встречается, начиная с Windows 8, когда открыта хотя бы одна папка в Проводнике. Я добавил в статью функции для работы с буфером обмена, они должны работать.

    2. Нашёл такую информацию на случай получения ошибки относительно типа данных DataObject.
      Чтобы заработал тип данных «DataObject» нужно подключить инструмент «Microsoft Forms Object Libraries». Для этого необходимо выполнить действия в редакторе макросов Эксель:
      1. Открыть Tools/References;
      2. Через кнопку Browse открыть файл C:\WINDOWS\SYSTEM32\FM20.DLL. Файл «FM20.DLL» может оказаться в другой подпапке Windows, поискать по названию. Может быть в «SysWOW64» или в «System».

    3. Добрый день. Подскажите пожалуйста в чем ошибка? Как только открывается вторая табличка, то файлы скопированные пропадают из буфера и пишет ошибку 424 Objekt required.

      Sub Макрос1()
      '
      ' Макрос1 Макрос
      '
      ' Сочетание клавиш: Ctrl+й
      '
      ActiveSheet.Range("$A$11:$AD$182").AutoFilter Field:=1, Criteria1:= _
      xlFilterToday, Operator:=xlFilterDynamic
      Range("D11:D247").Select
      Selection.SpecialCells(xlCellTypeConstants, 23).Select
      Selection.Copy
      Dim fn As String: wb = ThisWorkbook.Path & "\ПВКоборудование.xlsm"
      With Application
      .EnableEvents = True
      .Calculation = xlCalculationManual
      .ScreenUpdating = True
      .Visible = True
      Workbooks.Open Filename:=wb
      Sheets("наименования").Select
      Range("C1").Select
      AktiveSheet.Paste
      End With
      End Sub

      1. Евгений

        Здравствуйте, Иван!
        Попробуйте заменить строку
        AktiveSheet.Paste
        на
        ActiveSheet.Paste Range("C1")

    Добавить комментарий

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