Вырезание, перемещение, копирование и вставка ячеек (диапазонов) в 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 (Destination, Link) |
Метод Worksheet.Paste работает как с диапазонами ячеек, вырезанными в буфер обмена методом Range.Cut, так и скопированными в буфер обмена методом Range.Copy.
Параметры
| Параметры | Описание |
|---|---|
| Destination | Необязательный параметр. Диапазон (ячейка), указывающий место вставки содержимого буфера обмена. Если этот параметр не указан, используется текущий выделенный объект. |
| Link | Необязательный параметр. Булево значение, которое указывает, устанавливать ли ссылку на источник вставленных данных: True – устанавливать, False – не устанавливать (значение по умолчанию). |
В выражении с методом Worksheet.Paste можно указать только один из параметров: или Destination, или Link.
Для вставки из буфера обмена отдельных компонентов скопированных ячеек (значения, форматы, примечания и т.д.), а также для проведения транспонирования и вычислений, используйте метод Range.PasteSpecial (специальная вставка).
Примеры
Вырезание и вставка диапазона одной строкой (перемещение):
|
Range(«A1:C3»).Cut Range(«E1») |
Вырезание ячеек в буфер обмена и вставка методом ActiveSheet.Paste:
|
Range(«A1:C3»).Cut ActiveSheet.Paste Range(«E1») |
Копирование и вставка диапазона одной строкой:
|
Range(«A18:C20»).Copy Range(«E18») |
Копирование ячеек в буфер обмена и вставка методом ActiveSheet.Paste:
|
Range(«A18:C20»).Copy ActiveSheet.Paste Range(«E18») |
Копирование одной ячейки и вставка ее данных во все ячейки заданного диапазона:
|
Range(«A1»).Copy Range(«B1:D10») |
|
Алиса82 Пользователь Сообщений: 153 |
Добрый день, подскажите, пожалуйста, как выделить и скопировать в другое место диапазон с данными без сохранения формата? |
|
Luna2903 Пользователь Сообщений: 44 |
Копировать- специальная вставка-значение |
|
Пытливый Пользователь Сообщений: 4586 |
#3 15.05.2019 13:28:18 Добрый день. Можно как-то так, макросом:
Если же требуется только значения копировать, и принципиально важно, чтобы в точке назначения формат ячеек не менялся, то так:
Изменено: Пытливый — 15.05.2019 13:32:00 Кому решение нужно — тот пример и рисует. |
||||
|
Алиса82 Пользователь Сообщений: 153 |
Пытливый
, спасибо, а как что бы без сохранения формата? |
|
Алиса82 Пользователь Сообщений: 153 |
Пытливый
, спасибо большое, не совсем то, что хотела, если рядом ячейки заполнены, то выделяет не только желаемые колонки, а и соседние данные ((( |
|
Jack Famous Пользователь Сообщений: 10846 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
#6 15.05.2019 14:24:31 Алиса82, если диапазон цельный (одна область, как в примере)то можно совсем быстро и просто:
«виноват» [b1].CurrentRegion — программный аналог нажатия Ctrl+A в ячейке «B1» — прописывайте адреса диапазонов другим способом… Изменено: Jack Famous — 15.05.2019 14:29:20 Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
||
|
Алиса82 Пользователь Сообщений: 153 |
Jack Famou
, не пойму куда это выражение вставлять. Наверное в примере я неточно указала что хочу. Мне нужно скопировать часть столбца например B2:B14 в какое то другое место, например D2:D14 без сохранения формата. |
|
Пытливый Пользователь Сообщений: 4586 |
#8 15.05.2019 15:20:30 Если вы четко знаете размер и адрес диапазона, который хотите скопировать, то прямо его и указывайте:
Если вы диапазон для копирования не знаете (как я предположил в примере), то его надо сначала определить. Я его в коде определял от текущего диапазона относительно ячейки В1 (поскольку в примере данные для копирования были отделены пустыми строками/столбцами от остального, то этот метод сработал). Если у вас данные как-то по-другому располагаются, то хорошо бы в примере показывать как именно, чтоб не переделывать потом код по десять раз. Кому решение нужно — тот пример и рисует. |
||
|
Jack Famous Пользователь Сообщений: 10846 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
#9 15.05.2019 15:50:05
очевидно, раз «с помощью VBA», то в макрос. Так, например, макрос …
… перенесёт только значения на активном листе из диапазона «b2:b14» в диапазон «d2:d14». Если проблемы с использованием макросов, то учим матчасть Изменено: Jack Famous — 15.05.2019 15:51:29 Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
||||
|
Алиса82 Пользователь Сообщений: 153 |
#10 15.05.2019 22:26:47 Пытливый
, Jack Famous , спасибо! |
На чтение 3 мин. Просмотров 51.6k.
Итог: Изучите 3 различных способа копирования и вставки ячеек или диапазонов в Excel с помощью макросов VBA. Это серия из трех частей, также вы сможете скачать файл, содержащий код.
Уровень мастерства: Начинающий
Копировать и вставить: наиболее распространенное действие Excel
Копирование и вставка, вероятно, является одним из самых
распространенных действий в Excel. Это также одна из самых распространенных
задач, которые мы автоматизируем при написании макросов.
Есть несколько различных способов выполнить эту задачу, и устройство записи макросов не всегда дает вам наиболее эффективный код VBA.
В следующих трех видео я объясняю:
- Самый эффективный метод для простого копирования
и вставки в VBA. - Самый простой способ вставить значения.
- Как использовать метод PasteSpecial для других
типов вставок.
Видео № 1: Простой метод «Копировать-вставить»
Видео лучше всего просматривать в полноэкранном HD.
Sub Примеры_копирования_диапазона()
'Используйте метод Range.Copy для простого копирования / вставки
'Метод Range.Copy - копирование и вставка с 1 строкой
Range("A1").Copy Range("C1")
Range("A1:A3").Copy Range("D1:D3")
Range("A1:A3").Copy Range("D1")
'Range.Copy с одного листа на другой
Worksheets("Лист1").Range("A1").Copy Worksheets("Лист2").Range("A1")
'Range.Copy с одного файла (на другой
Workbooks("План.xlsx").Worksheets("Лист1").Range("A1").Copy _
Workbooks("Факт.xlsx").Worksheets("Лист1").Range("A1")
End Sub
Видео № 2: Простой способ вставить значения
Sub Копируем_только_значения()
'Установите значения ячеек равными другим, чтобы вставить значения
'Устанавливает равенство одного диапазона другому
Range("C1").Value = Range("A1").Value
Range("D1:D3").Value = Range("A1:A3").Value
'Равенство значений между листами
Worksheets("Лист1").Range("A1").Value = Worksheets("Лист2").Range("A1").Value
'Равенство значений между книгами
Workbooks("Факт.xlsx").Worksheets("Лист1").Range("A1").Value = _
Workbooks("План.xlsx").Worksheets("Лист1").Range("A1").Value
End Sub
Видео № 3: Метод PasteSpecial
Sub Копируем_с_помощью_специальной_вставки()
'Используйте метод Range.PasteSpecial для выбора типа вставки
'Копируем и вставляем через СпецВставку
Range("A1").Copy
Range("A5").PasteSpecial Paste:=xlPasteFormats
'Используем спецвставку между листами
Worksheets("Лист1").Range("A2").Copy
Worksheets("Лист2").Range("A2").PasteSpecial Paste:=xlPasteFormulas
'Используем спецвставку между файлами
Workbooks("План.xlsx").Worksheets("Лист1").Range("A3").Copy
Workbooks("Факт.xlsx").Worksheets("Лист1").Range("A1").PasteSpecial Paste:=xlPasteFormats
'Убираем "бегающих муравьёв" после копирования (очищаем буфер обмена)
Application.CutCopyMode = False
End Sub
Вставить данные ниже последней заполненной строки
Один из самых распространенных вопросов, которые я получаю о копировании и вставке с помощью VBA: «Как мне вставить данные в конец таблицы? «
Сначала нужно найти последнюю заполненную строку данных, а затем скопировать и вставить ниже неё.
Переходите по ссылке, чтобы научиться 3 способам поиска последней заполненной ячейки

Это наверно очень просто, но никак пока не получается. Как скопировать диапазон ячеек с одной части таблицы в другую пользуясь средствами VBA. Я сделал это через цикл, работает, но очень медленно. Затем попробовал применить вариант типа:
| Visual Basic | ||
|
или например, через присвоение
| Visual Basic | ||
|
, где x-ы и y-ки — переменные Integer, z — переменная Variant.
Но в этих случаях возникает ошибка 1004. Возможно это связано с тем, что в диапазоне есть незаполненные ячейки, так как если все ячейки заполнены, ошибка не генерируется. Возможно есть и другие способы. Помогите, очень срочно! Если код очень большой то можно на мыло. Заранее благодарен.
Задача состоит в том, чтобы скопировать определенный диапазон текущего листа, открыть другую книгу, и вставить эти скопированные данные в определенную ячейку, сохранить этот файл и закрыть. Ниже приведен код VBA.
Sub Название_Макроса()
'Выделить диапазон который необходимо скопировать
Range("A1:F52").Select
'Скопировать то, что выделено
Selection.Copy
ChDir "путь к папке где лежит файл в который необходимо скопировать"
Workbooks.Open Filename:= "Название файла, который находится в папке, путь к которой указан выше"
'Выделить начальную ячейку в которую необходимо вставить скопированные данные
Range("A6").Select
'Вставить данные
ActiveSheet.Paste
'сохранить текущую книгу
ActiveWorkbook.Save
'Закрыть книгу
ActiveWorkbook.Close
End Sub
Вариант 2: В открывшейся книге запускаем макрос, чтобы он открыл нужную нам книгу, скопировал от туда нужные нам данные и вставил в нашу открытую книгу, закрыв файл из которого эти данные были скопированы
Sub Название_Макроса2()
'Открываем файл с которого нужно скопировать данные
Workbooks.Open Filename:="C:Данные.xlsx"
'Скопировать нужный диапазон в открывшейся книге на листе 1
Workbooks("Данные.xlsx").Worksheets("Лист1").Range("A16:E16").Copy
'Активируем нужную нам книгу
Workbooks("Книга1.xlsm").Activate
'Выделяем и вставляем скопированные данные в ячейку А1
ActiveWorkbook.Worksheets("Лист1").Range("A1").Select
ActiveSheet.Paste
'Закрываем книгу откуда мы скопировали данные
Workbooks("Данные.xlsx").Close
End Sub
Еще пример — Скопировать диапазоны данных из активной открытой книги Excel нескольких листов (в нашем примере 3-х листов) в другую книгу, которая хранится в определенном месте. Данные будут вставлены как значения, плюс будут перенесены форматы ячеек.
Sub Копируем_листы_в_другую_книгу()
Dim bookconst As Workbook
Dim abook As Workbook
Set abook = ActiveWorkbook 'присваиваем перменную активной книге
Set bookconst = Workbooks.Open("C:UsersUserDesktop1.xlsx") 'присваиваем перменную книге куда необходимо копировать данные
'переходим в активную книгу откуда необходимо скопировать данные
abook.Worksheets("Лист1").Activate
Range("A1:I23").Copy 'копируем определенный диапазон листа, укажите свой диапазон
bookconst.Worksheets("Лист1").Activate 'активируем лист куда необходимо вставить данные
Range("A1:I23").Select 'встаем на ячейку А1
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'вставляем только форматы ячеек
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
'второй лист
abook.Worksheets("Лист2").Activate
Range("A1:I23").Copy
bookconst.Worksheets("Лист2").Activate
Range("A1:I23").Select 'выделяем диапазон
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'вставляем только форматы ячеек
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
'третий лист
abook.Worksheets("Лист3").Activate
Range("A1:I23").Copy
bookconst.Worksheets("Лист3").Activate
Range("A1:I23").Select 'выделяем диапазон
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'вставляем только форматы ячеек
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
'сохранить текущую книгу
bookconst.Save
'Закрыть книгу
bookconst.Close
abook.Activate
End Sub
Если статья была вам полезна, то буду благодарен, если вы поделитесь ей со своими друзьями с помощью кнопок расположенных ниже.
Спасибо за внимание.
