Перейти к содержимому
Наше приложение «Дешевые авиабилеты» в AppGallery >>

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 по тематическим разделам со ссылками на все статьи.

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

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

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

      1. Евгений

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

        1. Алексей

          В Win 8.1 такой проблемы не наблюдаю, уж по всякому погонял, пытаясь вызвать ошибку — всегда правильно отрабатывает ))
          А за статью большое спасибо!

    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")

    4. Константин

      Проблема на виндовс 10 осталась только вместо 2-х квадратов пустоту переносит при открытой одной вкладке.
      Dim longString As String
      'Dim sel As Object
      ''Dim obj3ADes As New DataObject
      'Dim obj3ADes As String
      strFile = Intersect(listobjTechs.ListRows(1).Range, listobjTechs.ListColumns("Value").DataBodyRange)
      Set objWordApp = CreateObject("Word.Application") 'Word session creation Word.Application
      objWordApp.Visible = True
      Set objWordDoc = objWordApp.Documents.Open(strFile) 'open the .doc file
      Dim listrowRowChecked As ListRow
      Dim listcolumnColumnChecked As ListColumn
      For Each listrowRowChecked In listobjectData.ListRows
      Set objWordDoc = objWordApp.Documents.Open(strFile)
      For Each listcolumnColumnChecked In listobjectData.ListColumns
      If listcolumnColumnChecked.Name Like "" Then
      'REPLACEMENTS
      'Debug.Print listcolumnColumnChecked.Name, "is a placeholder" 'TEST
      objWordApp.Selection.Find.ClearFormatting
      objWordApp.Selection.Find.Replacement.ClearFormatting
      longString = Intersect(listcolumnColumnChecked.DataBodyRange, listrowRowChecked.Range).Value
      'obj3ADes.SetText longString
      SetClipBoardText longString
      'obj3ADes.PutInClipboard
      With objWordApp.Selection.Find
      .ClearFormatting
      .Text = listcolumnColumnChecked.Name
      .Replacement.ClearFormatting
      .Replacement.Text = "^c"
      .Execute Replace:=wdReplaceAll, Forward:=True, _
      Wrap:=wdFindContinue
      End With
      'objWordApp.Selection.Find.Execute Replace:=wdReplaceAll
      Else:
      'Debug.Print listcolumnColumnChecked.Name, "is no placeholder" 'Test
      End If
      ClearClipBoardText
      Next listcolumnColumnChecked

    Обсуждение закрыто.