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

VBA Excel. Вырезание, копирование и вставка ячеек (диапазонов)

    Вырезание, перемещение, копирование и вставка ячеек (диапазонов) в VBA Excel. Методы Cut, Copy и PasteSpecial объекта Range, метод Paste объекта Worksheet.

    Метод Range.Cut

    Range.Cut – это метод, который вырезает объект Range (диапазон ячеек) в буфер обмена или перемещает его в указанное место на рабочем листе.

    Синтаксис

    Параметры

    Параметры Описание
    Destination Необязательный параметр. Диапазон ячеек рабочего листа, в который будет вставлен (перемещен) вырезанный объект Range (достаточно указать верхнюю левую ячейку диапазона). Если этот параметр опущен, объект вырезается в буфер обмена.

    Для вставки на рабочий лист диапазона ячеек, вырезанного в буфер обмена методом Range.Cut, следует использовать метод Worksheet.Paste.

    Метод Range.Copy

    Range.Copy – это метод, который копирует объект Range (диапазон ячеек) в буфер обмена или в указанное место на рабочем листе.

    Синтаксис

    Параметры

    Параметры Описание
    Destination Необязательный параметр. Диапазон ячеек рабочего листа, в который будет вставлен скопированный объект Range (достаточно указать верхнюю левую ячейку диапазона). Если этот параметр опущен, объект копируется в буфер обмена.

    Метод Worksheet.Paste

    Worksheet.Paste – это метод, который вставляет содержимое буфера обмена на рабочий лист.

    Синтаксис

    Метод Worksheet.Paste работает как с диапазонами ячеек, вырезанными в буфер обмена методом Range.Cut, так и скопированными в буфер обмена методом Range.Copy.

    Параметры

    Параметры Описание
    Destination Необязательный параметр. Диапазон (ячейка), указывающий место вставки содержимого буфера обмена. Если этот параметр не указан, используется текущий выделенный объект.
    Link Необязательный параметр. Булево значение, которое указывает, устанавливать ли ссылку на источник вставленных данных: True – устанавливать, False – не устанавливать (значение по умолчанию).

    В выражении с методом Worksheet.Paste можно указать только один из параметров: или Destination, или Link.

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

    Примеры

    Вырезание и вставка диапазона одной строкой (перемещение):

    Вырезание ячеек в буфер обмена и вставка методом ActiveSheet.Paste:

    Копирование и вставка диапазона одной строкой:

    Копирование ячеек в буфер обмена и вставка методом ActiveSheet.Paste:

    Копирование одной ячейки и вставка ее данных во все ячейки заданного диапазона:


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

    50 комментариев для “VBA Excel. Вырезание, копирование и вставка ячеек (диапазонов)”

    1. Странно, что не рассмотрено копирование ячеек, которые Cells.
      Например, следующая строка копирует ячейку A1 в B2

      а эта делает тоже самое, но демонстрирует,
      как можно добавить размер и смещение:

    2. Здравствуйте!
      Скажите, как можно копировать на Лист 1, а вставить на Лист 2 диапазон ячеек целиком, либо отсортированный по 1 признаку диапазон(например по какому-то определенному значению, скажем, числу «500» в одном столбце Листа 1)?

      1. Евгений

        Привет, Максим!
        Вот пример сортировки таблицы по значению 500 в первом столбце на "Лист6" и копирования диапазона с "Лист6" на "Лист4":

    3. Спасибо большое, только я, наверно, неправильно описал ситуацию.
      Сперва из эталонной таблицы Лист 1 копируем весь список на существующий Лист4.
      Затем, пропускаем шапку, и, начиная со строки7, уже на Лист4 ищем строку, у которой в столбце 5 стоит число 500.
      Вырезаем эту строку и вставляем на позицию строки 7. т.е первая после шапки.
      Ищем следующую строку — вырезаем, потом вставляем на позицию строки 7+1=8 и т.д.
      В итоге оставим только те строки, у которых в столбце 5 стоит число «500», остальные удаляются строки.

      (пробовал менять местами строки в предыдущем коде, ошибок нет, копирует, переходит на лист 4, но строки на нем не удаляет, циклы пошагово проходят, но ничего не изменяется.)

      Спасибо за ответ.

      1. Евгений

        Максим, в этом случае код будет еще проще:

    4. На одном компе копирует на лист 4 , но не удаляет строки на нем, хотя циклы проходит. Может много значений? в таблице более 2000 строк.
      На втором — вылетает ошибка 9 сразу на 3 строке кода.

      1. Евгений

        А файл один и тот же, или код вставлен на разных компьютерах в разные файлы?

    5. разные документы. Код вставлен в разные файлы.

      1. Евгений

        В файле на первом компьютере числа 500 сохранены как текст.
        В файле на втором компьютере нет ярлыка с именем "Лист4", если третья строка — With Worksheets("Лист4").

    6. Здравствуйте,Евгений. Все заработало. Я прогонял ее в ручном режиме. А в автомате заработала. Были повторения в названиях, поэтому после перепроверки всех кодов, все заработало.Спасибо! И файл взял прежний, без левых надстроек и автоматизации.

    7. Добрый день!
      Подскажите пожалуйста код.
      Есть книга состаящая из 2 листов.
      Есть заполненный столбец А на листе Text
      Задача:
      1) взять на листе Text значение A1
      2)вставить в лист «главная» ячейка Т4.
      3)Запустить формирование текста (этот блок готов)
      4) с листа «главная» ячейка Т5 копируем текст и вставляем в лист Text колонка В на против ранее скопированного текста (задание 1)
      И так далее по циклу

    8. Здравствуйте!
      Помогите пожалуйста, преобразовать часть макроса и сделать вставку не со следующей строки а со следующего столбца:

      1. Евгений

        Добрый день, Максим!
        Попробуйте так:

        1. Спасибо Евгений,
          Такой код каждый лист вставляет с новой строки, а не столбца

          Очень хотелось бы чтобы новый лист с нового столбца

        2. Евгений,Спасибо.
          Данный скрипт вставляет в следующую строку, а мне хотелось бы в следующий столбец

          1. Евгений

            Это странно, что у вас скопированный диапазон вставляется в новую строку. Запустите этот код и вы увидите, как пять раз происходит вставка и каждый раз в новый столбец:

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

            1. Евгений простите.
              С VBA только знакомлюсь.
              Помогите пожалуйста скорректировать код:

              Нужно со всех листов собрать только столбец «B» в один лист в той-же книге. Шапка столбца совпадает с именем листа. Листов много и их количество меняется.

              Заранее благодарю.
              Очень Выручаете

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

    10. Владимир

      Добрый день. Не подскажете как в VBA EXCEL скопировать строку из листа1 и вставить в лист2, потом выбрать например другую строку в листе1 и вставить в лист2 после предыдущей

      1. Евгений

        Добрый день, Владимир!

        1. Владимир

          Евгений, благодарю! А не подскажете, как именно строку активной ячейки скопировать с одного листа на другой, а потом добавлять на другой лист с нарастающей. (Да, и куда можно перевести благодарность :))

          1. Евгений

            Владимир, используйте следующий код, заменив Лист15 на название ярлыка целевого листа, куда будут добавляться копируемые строки:

            Первая ячейка копируемой строки должна быть непустой. Если она может быть пустой, тогда .Range("A:A") замените на столбец в котором не будет пустых ячеек, например: .Range("D:D") или любой другой, где не будет пустых ячеек.

            И еще вариант, при котором допускаются пустые ячейки, но в первой строке хотя бы одна ячейка в диапазоне Range("A1:S1") целевого листа должна быть непустой:

            1. Владимир

              Благодарю за помощь! Скиньте номер карты или телефона- поддержу ваш канал

    11. Владимир

      Добрый день! Есть два листа: на одном у меня все обращения жителей, на другом у меня та же таблица с обращениями, но ячейки содержат ссылки на первую и стоит фильтр по категориям обращения (например, ЖКХ). Мне нужна помощь: если я нахожу ошибку в ячейке в таблице второго листа, то перехожу на первый лист и мотаю ползунок, пока не нахожу искомую строку. Как написать код, чтобы по активной ячейке ВТОРОГО листа (нажатие кнопки) активировалась ячейка таблицы ПЕРВОГО листа? Если кратко — активная ячейка второго листа — команда — активная ячейка первого листа. Спасибо.

      1. Не за что

    12. Добрый день. Подскажите, пожалуйста следующие условия (в виде кода vba) для копирования диапазона ячеек (к примеру A1:A10) из таблицы 1 и вставки в Талицу 2 с одинаковым количеством столбцов: если значения копируемых ячеек совпадают со значениями в Таблице 2, то копировать данные поверх; если не совпадают, то копировать на строку ниже; если хотя бы одна из ячейка из данного диапазона пуста, то выводить ошибку, либо не выполнять действие.

    13. Алексей

      Здравствуйте! На листе есть данные в трех столбцах по пять тысяч строк — в строках ссылки в перемешку. Помогите этим ссылкам создать каждой свой столбец без потери своей строки в которой до этого ссылка находилась.
      Вижу так: Было три столбца в 5000 строк. Станет n — кол-во столбцов (зависит от кол-ва доменов в 3 столбцах) с тем же кол-вом строк.
      p.s. доменов 249, ссылок 5000. — Пробовал создать столбцы с названием домена и туда поместить ссылки к нему относящиеся.
      Но не смог придумать как автоматизировать это. Помогите пожалуйста с этим вопросом и что почитать чтобы самому в этом разобраться.

    14. Добрый день.
      Подскажите пожалуйста как написать код что бы скопировать строки, диапазоном А-N по столбцам, если хотя бы в одной ячейке есть значения и вставить их на другой лист в ячейку А9.

      1. Евгений

        Здравствуйте, Иван!
        Копируем с Лист12 на Лист13 с помощью цикла:

        1. извините что прошу помощи опять, но могли бы помочь? у меня на 13 листе заготовлена одна строка для вставки энного количества строчек, а с 10 строки заполнены поля, при копировании строк он их не смещает, а перезаписывает. можно ли как то еще сделать что бы при вставке строк на 13 листе не перезаписывал строки которые там есть ниже 9, а как бы смещал их вниз?

          1. Евгений

            Замените блок If на следующий:

          2. Евгений

            Если не хотите, чтобы добавлялась разделительная пустая строка, замените строчку кода

            на

            1. Благодарю за наставления, все работает отлично

    15. Здравствуйте, подскажите пожалуйста код, который позволит мне копировать по одной нужной ячейке в рабочий excel файл из других файлов находящихся в той же папке. Есть некая база в виде excel таблички из которой постоянно берутся значения из столбца «№ реестр» + 4 столбца рядом стоящих, которые могут менять своё положение — пример: A1:C1, E1. Эти данные мне нужно скопировать в другой excel файл в активную строчку, чтоб данные копировались в таком же порядке. То есть работа происходит только с одной строчкой, но разными файлами по требованию, хочу сделать готовый макрос с определённым названием, для облегчения отчётности и актуализации базы.

    16. Виталий

      Здравствуйте!
      Подскажите пожалуйста код, который соберёт в один файл на один лист, из нескольких файлов с одинаковыми именами файлов и листов, таблицу в 50 столбцов с последовательным добавлением данных, чтобы собрать данные со всех листов в один.

    17. Павел Краков

      Как сделать макрос который бы находил название комнаты, например — "Помещение 1" в 1 колонке, далее по колонкам — пол, стяжка, цементно-песч. и по строкам вниз снова "Помещение 1" и так далее. Мне нужно чтобы макрос таблицу с Помещениями 1 скопировал и вставил ниже, после пустой строки, как бы шаблон сделал, чтобы все строки с помещениями 1 скопировались, а не строгий диапазон. Определял помещение по названию и дублировал таблицу ниже.

    18. Владимир

      Здравствуйте!
      Подскажите пожалуйста, требуется сравнить список 1 со списком 2 и если значения из списка 1 есть в списке 2 то перенести некоторые значения на указанный лист в книге. Выдаётся ошибка 91

      Sub Ðååñòð()
      Dim i As Long
      Dim a As Variant
      Dim b As Variant
      Dim ñ As Variant
      Dim n As Long
      Dim z As Long
      Dim Sum As Object
      a = Application.InputBox("Значение 1: ")
      b = Application.InputBox("Значение 2: ")
      n = Int(Application.InputBox("Значение 3: "))
      b = Int(Application.InputBox("Значение 4: "))
      For i = 1 To n
      Set Sum = Range("C2:C1025").Find(Sheets("Лист2").Cells(i, 1))
      Sheets("Лист3").Cells(i + 1, 2) = Sheets("Лист1").Cells(Sum.Row, 3)
      Next
      End Sub

      1. Евгений

        Здравствуйте, Владимир!
        Попробуйте так:

    19. Виталий

      Подскажите какой метод использовать что бы вставить в ячеку Excel значение (простое 5 значное число ) скопированое не в другой ячеке, а в другой програме просто как число из строки ?

      1. Евгений

        Здравствуйте, Виталий!
        Это можно сделать, используя объект DataObject:

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

    20. Добрый день, у меня есть файлы, в которых одинаковые шаблоны. Мне надо макросом из всех собрать данные в одну. Кол-во столбцов неизменно B:R. Проблема в том, что где-то есть информация, где-то 50 строчек, а где-то одна. Как прописать, чтобы выделялся только диапазон с данными? Т.е. если пусто, ничего, если одна строка, то только одна, если 50, то все 50.
      Спасибо.

        1. Не работает, выделяется все что сверху, в том числе и шапка таблицы. Мне это не надо.
          Нужен диапазон B4:R4 и ниже строки, если есть.

        2. Евгений, если пусто то выбирается шапка таблицы, как прописать, чтобы ничего не выбиралось?

          1. Евгений

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