Вырезание, перемещение, копирование и вставка ячеек (диапазонов) в 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
Если статья была вам полезна, то буду благодарен, если вы поделитесь ей со своими друзьями с помощью кнопок расположенных ниже.
Спасибо за внимание.