Вырезание, перемещение, копирование и вставка ячеек (диапазонов) в 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») |
7even Пользователь Сообщений: 85 |
Из программы в которой приходится работать некорректно выгружается табличка. Данные которые должны быть в одной строки разбросаны в 2 строки. Нужен макрос который собирет разбросанное в 2 строки в 1 строку. Такое возможно? |
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
#2 13.07.2015 21:05:06
Прикрепленные файлы
<#0> |
||
7even Пользователь Сообщений: 85 |
JayBhagavan, |
7even Пользователь Сообщений: 85 |
JayBhagavan, к сожалению, с таблицей в 20000 строк макрос не работает. ничего не происходит. Или же удаляется вся таблица. возможно ли это поправить? Изменено: SevenZZ — 14.07.2015 10:51:27 |
vikttur Пользователь Сообщений: 47199 |
#5 14.07.2015 11:49:45 JayBhagavan, если данные в какой-то из ячеек будут отсутствовать, получится нехорошее смещение (я понял так: не удалять пустоты, а объединить две строки в одну).
Код сработает на активном листе. Обработка всего массива данных, т.е. если на листе есть данные, которые изменять не нужно, необходимо подправить код Аккуратнее с кнопкой! Можно и несколько раз нажать, но строк станет меньше Прикрепленные файлы
|
||
Юрий М Модератор Сообщений: 60575 Контакты см. в профиле |
Попробуйте такой вариант. Если на 20 000 строк будет медленно, то можно сделать на массивах. |
Юрий М Модератор Сообщений: 60575 Контакты см. в профиле |
А вот и вариант на массивах. |
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
vikttur, каков пример — таков ответ. <#0> |
SevenZZ Пользователь Сообщений: 85 |
завтра на работе опробую все предложенные варианты. спасибо всем кто отозвался помочь. Изменено: SevenZZ — 14.07.2015 22:25:07 |
Юрий М Модератор Сообщений: 60575 Контакты см. в профиле |
#10 14.07.2015 22:34:57
Так КАК всё же нужно? |
||
Юрий М Модератор Сообщений: 60575 Контакты см. в профиле |
|
SevenZZ Пользователь Сообщений: 85 |
#12 15.07.2015 07:13:24
не принципиально как.
спасибо сегодня опробую. Только вот если в таблице 7 колонок, а не 5, то 2 последние на добавляются на 2 лист. |
||||
vikttur Пользователь Сообщений: 47199 |
Файл из сообщения 11: если перенести значение С9 в С10, последняя строка игнорируется. |
Юрий М Модератор Сообщений: 60575 Контакты см. в профиле |
#14 15.07.2015 13:16:40
Мой недочёт… Исправил файл — скачайте его заново. Количество столбцов определяется автоматически. |
||
SevenZZ Пользователь Сообщений: 85 |
#15 15.07.2015 22:22:40
Спасибо, всё работает как надо. |
||
53 / 3 / 0 Регистрация: 08.10.2011 Сообщений: 200 |
|
1 |
|
Копирование данных из одной ячейки в другую25.10.2011, 21:51. Показов 15903. Ответов 18
Добрый вечер. С данным заданием, как и с Visual Basic сталкиваюсь впервые, но мне очень важно решить это задание. Помогите, пжлста!
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
25.10.2011, 21:51 |
18 |
Заблокирован |
||||
25.10.2011, 22:01 |
2 |
|||
С циклом For
0 |
53 / 3 / 0 Регистрация: 08.10.2011 Сообщений: 200 |
|
25.10.2011, 22:08 [ТС] |
3 |
а это только часть кода? просто я в вижуал не разбираюсь, я учу си, паскаль. Для этого кода надо еще основную программку писать? если да, киньте, пжлста линк какой-нить как это все должно выглядить, спасибо!
0 |
Заблокирован |
||||
25.10.2011, 22:18 |
4 |
|||
Эту процедуру вставляешь в модуль листа или в общий модуль.
Запускаем по [Alt+F8].
1 |
53 / 3 / 0 Регистрация: 08.10.2011 Сообщений: 200 |
|
25.10.2011, 22:25 [ТС] |
5 |
Апострофф, спасибо
0 |
0 / 0 / 0 Регистрация: 01.03.2011 Сообщений: 44 |
|
25.10.2011, 22:34 |
6 |
Объясните пожалуйста как работает алгоритм)
0 |
Заблокирован |
||||
25.10.2011, 22:46 |
7 |
|||
Объясните пожалуйста как работает алгоритм)
0 |
letnjaja 53 / 3 / 0 Регистрация: 08.10.2011 Сообщений: 200 |
||||
25.10.2011, 23:19 [ТС] |
8 |
|||
А что значит Dim? Добавлено через 32 минуты
0 |
15136 / 6410 / 1730 Регистрация: 24.09.2011 Сообщений: 9,999 |
|
25.10.2011, 23:29 |
9 |
А что значит Dim? Ставим курсор в это слово, жмем F1.
0 |
letnjaja 53 / 3 / 0 Регистрация: 08.10.2011 Сообщений: 200 |
||||
26.10.2011, 19:31 [ТС] |
10 |
|||
полистала нет, добавила loop,скажите, что не так?
0 |
1508 / 478 / 56 Регистрация: 10.04.2009 Сообщений: 8,008 |
|
26.10.2011, 20:16 |
11 |
6 строку пробуем в мусорку
0 |
Заблокирован |
||||
26.10.2011, 20:23 |
12 |
|||
0 |
53 / 3 / 0 Регистрация: 08.10.2011 Сообщений: 200 |
|
26.10.2011, 20:35 [ТС] |
13 |
спасибо огромное!
0 |
FRANZEE 0 / 0 / 0 Регистрация: 01.03.2011 Сообщений: 44 |
||||
27.10.2011, 22:12 |
14 |
|||
почему после Range(«A1:B10») мы пишем (I) ?
0 |
Заблокирован |
|
27.10.2011, 22:16 |
15 |
Потому что обращаемся к I-ой ячейке указанного диапазона.
1 |
Казанский 15136 / 6410 / 1730 Регистрация: 24.09.2011 Сообщений: 9,999 |
||||
27.10.2011, 23:54 |
16 |
|||
Потому что обращаемся к I-ой ячейке указанного диапазона В первом приближении — да. На самом деле, выражение Range(«A1:B10»)(I) означает Range(«A1:B10»).Cells(I), а если совсем подробно, то Range(«A1:B10»).Cells.Item(I)
0 |
0 / 0 / 0 Регистрация: 01.03.2011 Сообщений: 44 |
|
28.10.2011, 00:01 |
17 |
Вроде ошибка где-то? Миниатюры
0 |
15136 / 6410 / 1730 Регистрация: 24.09.2011 Сообщений: 9,999 |
|
28.10.2011, 00:12 |
18 |
Это не ошибка, это сюрприз
0 |
0 / 0 / 0 Регистрация: 01.03.2011 Сообщений: 44 |
|
28.10.2011, 13:08 |
19 |
Так в чем сюрприз, объясните пожалуйста)))!
0 |
Всю ячейку перенести в другую ячейку, но как текст с заменой |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
Содержание
- Выбор ячейки / диапазона в Excel с помощью VBA
- Копирование ячеек / диапазонов с помощью VBA
- Назначение диапазонов объектным переменным
- Введите данные в следующую пустую ячейку (используя поле ввода)
- Цикл по ячейкам / диапазонам
- Куда поместить код VBA
При работе с Excel большую часть времени вы проводите в области рабочего листа, работая с ячейками и диапазонами.
А если вы хотите автоматизировать свою работу в Excel с помощью VBA, вам нужно знать, как работать с ячейками и диапазонами с помощью VBA.
С диапазонами в VBA можно делать много разных вещей (например, выбирать, копировать, перемещать, редактировать и т. Д.).
Чтобы охватить эту тему, я разделю это руководство на разделы и покажу вам, как работать с ячейками и диапазонами в Excel VBA на примерах.
Давайте начнем.
Все коды, которые я упоминаю в этом руководстве, необходимо поместить в редактор VB. Перейдите в раздел «Где разместить код VBA», чтобы узнать, как это работает.
Если вы заинтересованы в изучении VBA простым способом, ознакомьтесь с моими Онлайн-обучение по Excel VBA.
Чтобы работать с ячейками и диапазонами в Excel с помощью VBA, вам не нужно выбирать его.
В большинстве случаев лучше не выбирать ячейки или диапазоны (как мы увидим).
Несмотря на это, важно, чтобы вы прошли через этот раздел и поняли, как он работает. Это будет иметь решающее значение в вашем обучении VBA, и многие концепции, описанные здесь, будут использоваться в этом руководстве.
Итак, давайте начнем с очень простого примера.
Выбор отдельной ячейки с помощью VBA
Если вы хотите выбрать одну ячейку на активном листе (скажем, A1), вы можете использовать приведенный ниже код:
Sub SelectCell () Диапазон ("A1"). Выберите End Sub
В приведенном выше коде есть обязательные части «Sub» и «End Sub», а также строка кода, которая выбирает ячейку A1.
Диапазон («A1») сообщает VBA адрес ячейки, на которую мы хотим сослаться.
Выбирать является методом объекта Range и выбирает ячейки / диапазон, указанные в объекте Range. Ссылки на ячейки необходимо заключать в двойные кавычки.
Этот код покажет ошибку, если лист диаграммы является активным. Лист диаграммы содержит диаграммы и не используется широко. Поскольку в нем нет ячеек / диапазонов, приведенный выше код не может выбрать его, и в результате будет отображаться ошибка.
Обратите внимание: поскольку вы хотите выбрать ячейку на активном листе, вам просто нужно указать адрес ячейки.
Но если вы хотите выделить ячейку на другом листе (скажем, Sheet2), вам нужно сначала активировать Sheet2, а затем выбрать ячейку в нем.
Sub SelectCell () Worksheets ("Sheet2"). Активируйте диапазон ("A1"). Выберите End Sub
Точно так же вы также можете активировать книгу, затем активировать в ней определенный рабочий лист, а затем выбрать ячейку.
Sub SelectCell () Рабочие книги («Book2.xlsx»). Рабочие листы («Sheet2»). Активировать диапазон («A1»). Выберите End Sub
Обратите внимание, что при обращении к книгам необходимо использовать полное имя вместе с расширением файла (.xlsx в приведенном выше коде). Если книга никогда не сохранялась, вам не нужно использовать расширение файла.
Эти примеры не очень полезны, но позже в этом руководстве вы увидите, как мы можем использовать те же концепции для копирования и вставки ячеек в Excel (с использованием VBA).
Так же, как мы выбираем ячейку, мы также можем выбрать диапазон.
В случае диапазона это может быть диапазон фиксированного или переменного размера.
В диапазоне фиксированного размера вы будете знать, насколько велик этот диапазон, и можете использовать точный размер в своем коде VBA. Но с диапазоном переменного размера вы не представляете, насколько велик диапазон, и вам нужно использовать немного магии VBA.
Посмотрим, как это сделать.
Выбор диапазона фиксированного размера
Вот код, который выберет диапазон A1: D20.
Sub SelectRange () Диапазон ("A1: D20"). Выберите End Sub
Другой способ сделать это — использовать приведенный ниже код:
Sub SelectRange () Диапазон ("A1", "D20"). Выберите End Sub
Приведенный выше код берет адрес верхней левой ячейки (A1) и адрес нижней правой ячейки (D20) и выбирает весь диапазон. Этот метод становится полезным, когда вы работаете с диапазонами переменного размера (как мы увидим, когда позже в этом руководстве будет рассмотрено свойство End).
Если вы хотите, чтобы выбор происходил в другой книге или на другом листе, вам необходимо сообщить VBA точные имена этих объектов.
Например, приведенный ниже код выберет диапазон A1: D20 на листе Sheet2 в книге Book2.
Sub SelectRange () Рабочие книги ("Book2.xlsx"). Рабочие листы ("Sheet1"). Активировать диапазон ("A1: D20"). Выбрать End Sub
А что, если вы не знаете, сколько там строк. Что, если вы хотите выбрать все ячейки, в которых есть значение.
В этих случаях вам необходимо использовать методы, показанные в следующем разделе (при выборе диапазона переменного размера).
Выбор диапазона переменного размера
Вы можете выбрать диапазон ячеек разными способами. Выбранный вами метод будет зависеть от того, как структурированы данные.
В этом разделе я расскажу о некоторых полезных методах, которые действительно полезны при работе с диапазонами в VBA.
Выберите с помощью свойства CurrentRange
В случаях, когда вы не знаете, сколько строк / столбцов содержат данные, вы можете использовать свойство CurrentRange объекта Range.
Свойство CurrentRange охватывает все смежные заполненные ячейки в диапазоне данных.
Ниже приведен код, который выберет текущий регион, содержащий ячейку A1.
Sub SelectCurrentRegion () Диапазон ("A1"). CurrentRegion.Select End Sub
Вышеупомянутый метод хорош, когда у вас есть все данные в виде таблицы без пустых строк / столбцов в ней.
Но если у вас есть пустые строки / столбцы в ваших данных, он не будет выбирать те, которые находятся после пустых строк / столбцов. На изображении ниже код CurrentRegion выбирает данные до строки 10, поскольку строка 11 пуста.
В таких случаях вы можете использовать свойство UsedRange объекта Worksheet.
Выберите с помощью свойства UsedRange
UsedRange позволяет ссылаться на любые измененные ячейки.
Таким образом, приведенный ниже код выберет все используемые ячейки на активном листе.
Sub SelectUsedRegion () ActiveSheet.UsedRange.Выберите End Sub
Обратите внимание, что если у вас есть удаленная ячейка, которая использовалась, она будет учитываться приведенным выше кодом, и все ячейки до тех пор, пока эта используемая ячейка не будет выбрана.
Выберите с помощью свойства конца
Теперь эта часть действительно полезна.
Свойство End позволяет выбрать последнюю заполненную ячейку. Это позволяет имитировать действие клавиш управления стрелками вниз / вверх или клавиш управления вправо / влево.
Попробуем разобраться в этом на примере.
Предположим, у вас есть набор данных, показанный ниже, и вы хотите быстро выбрать последние заполненные ячейки в столбце A.
Проблема здесь в том, что данные могут меняться, и вы не знаете, сколько ячеек заполнено. Если вам нужно сделать это с помощью клавиатуры, вы можете выбрать ячейку A1, а затем использовать клавиши Control + стрелка вниз, и она выберет последнюю заполненную ячейку в столбце.
Теперь давайте посмотрим, как это сделать с помощью VBA. Этот метод пригодится, когда вы хотите быстро перейти к последней заполненной ячейке в столбце переменного размера.
Sub GoToLastFilledCell () Диапазон ("A1"). End (xlDown). Выберите End Sub
Приведенный выше код перейдет к последней заполненной ячейке в столбце A.
Точно так же вы можете использовать End (xlToRight) для перехода к последней заполненной ячейке в строке.
Sub GoToLastFilledCell () Range ("A1"). End (xlToRight). Select End Sub
Теперь, что, если вы хотите выбрать весь столбец вместо перехода к последней заполненной ячейке.
Вы можете сделать это, используя приведенный ниже код:
Sub SelectFilledCells () Range ("A1", Range ("A1"). End (xlDown)). Выберите End Sub
В приведенном выше коде мы использовали первую и последнюю ссылку на ячейку, которую нам нужно выбрать. Независимо от количества заполненных ячеек, приведенный выше код выберет все.
Вспомните приведенный выше пример, в котором мы выбрали диапазон A1: D20, используя следующую строку кода:
Диапазон («A1 ″,« D20 »)
Здесь A1 — это верхняя левая ячейка, а D20 — нижняя правая ячейка в диапазоне. Мы можем использовать ту же логику при выборе диапазонов переменного размера. Но поскольку мы не знаем точного адреса нижней правой ячейки, мы использовали свойство End, чтобы получить его.
В Range («A1», Range («A1»). End (xlDown)) «A1» относится к первой ячейке, а Range («A1»). End (xlDown) относится к последней ячейке. Поскольку мы предоставили обе ссылки, метод Select выбирает все ячейки между этими двумя ссылками.
Точно так же вы также можете выбрать весь набор данных, состоящий из нескольких строк и столбцов.
Приведенный ниже код выберет все заполненные строки / столбцы, начиная с ячейки A1.
Sub SelectFilledCells () Range ("A1", Range ("A1"). End (xlDown) .End (xlToRight)). Выберите End Sub
В приведенном выше коде мы использовали Range («A1»). End (xlDown) .End (xlToRight), чтобы получить ссылку на заполненную нижнюю правую ячейку набора данных.
Разница между использованием CurrentRegion и End
Если вам интересно, зачем использовать свойство End для выбора заполненного диапазона, когда у нас есть свойство CurrentRegion, позвольте мне рассказать вам разницу.
С помощью свойства End вы можете указать начальную ячейку. Например, если у вас есть данные в формате A1: D20, но первая строка — это заголовки, вы можете использовать свойство End для выбора данных без заголовков (используя приведенный ниже код).
Sub SelectFilledCells () Range ("A2", Range ("A2"). End (xlDown) .End (xlToRight)). Выберите End Sub
Но CurrentRegion автоматически выберет весь набор данных, включая заголовки.
До сих пор в этом руководстве мы видели, как по-разному ссылаться на диапазон ячеек.
Теперь давайте посмотрим, как мы можем использовать эти методы для выполнения некоторой работы.
Копирование ячеек / диапазонов с помощью VBA
Как я упоминал в начале этого урока, выбор ячейки не является необходимым для выполнения действий с ней. В этом разделе вы увидите, как копировать ячейки и диапазоны, даже не выбирая их.
Начнем с простого примера.
Копирование одной ячейки
Если вы хотите скопировать ячейку A1 и вставить ее в ячейку D1, приведенный ниже код сделает это.
Sub CopyCell () Range ("A1"). Copy Range ("D1") End Sub
Обратите внимание, что метод копирования объекта диапазона копирует ячейку (точно так же, как Control + C) и вставляет ее в указанное место назначения.
В приведенном выше примере кода место назначения указано в той же строке, где вы используете метод копирования. Если вы хотите сделать свой код еще более читаемым, вы можете использовать приведенный ниже код:
Sub CopyCell () Range ("A1"). Место назначения копирования: = Range ("D1") End Sub
Приведенные выше коды скопируют и вставят значение, а также форматирование / формулы в него.
Как вы уже могли заметить, приведенный выше код копирует ячейку, не выбирая ее. Независимо от того, где вы находитесь на листе, код скопирует ячейку A1 и вставит ее в D1.
Также обратите внимание, что приведенный выше код перезапишет любой существующий код в ячейке D2. Если вы хотите, чтобы Excel сообщал вам, есть ли что-то в ячейке D1, не перезаписывая это, вы можете использовать приведенный ниже код.
Sub CopyCell () If Range ("D1") "" Then Response = MsgBox ("Вы хотите перезаписать существующие данные", vbYesNo) End If If Response = vbYes Then Range ("A1"). Copy Range ("D1" ") End If End Sub
Копирование диапазона фиксированного размера
Если вы хотите скопировать A1: D20 в J1: M20, вы можете использовать следующий код:
Sub CopyRange () Range ("A1: D20"). Copy Range ("J1") End Sub
В ячейке назначения вам просто нужно указать адрес верхней левой ячейки. Код автоматически скопирует точный скопированный диапазон в место назначения.
Вы можете использовать ту же конструкцию для копирования данных с одного листа на другой.
Приведенный ниже код скопирует A1: D20 с активного листа на Sheet2.
Sub CopyRange () Range ("A1: D20"). Копировать рабочие листы ("Sheet2"). Range ("A1") End Sub
Вышеупомянутое копирует данные с активного листа. Поэтому перед запуском кода убедитесь, что лист с данными является активным. На всякий случай вы также можете указать имя рабочего листа при копировании данных.
Sub CopyRange () Worksheets ("Sheet1"). Range ("A1: D20"). Copy Worksheets ("Sheet2"). Range ("A1") End Sub
Преимущество приведенного выше кода заключается в том, что независимо от того, какой лист активен, он всегда копирует данные из Sheet1 и вставляет их в Sheet2.
Вы также можете скопировать именованный диапазон, используя его имя вместо ссылки.
Например, если у вас есть именованный диапазон под названием «SalesData», вы можете использовать приведенный ниже код, чтобы скопировать эти данные в Sheet2.
Sub CopyRange () Range ("SalesData"). Копировать рабочие листы ("Sheet2"). Range ("A1") End Sub
Если область действия именованного диапазона — это вся книга, вам не нужно находиться на листе с именованным диапазоном для запуска этого кода. Поскольку именованный диапазон ограничен рабочей книгой, вы можете получить к нему доступ с любого листа, используя этот код.
Если у вас есть таблица с именем Table1, вы можете использовать приведенный ниже код, чтобы скопировать ее на Sheet2.
Sub CopyTable () Range ("Table1 [#All]"). Копировать рабочие листы ("Sheet2"). Range ("A1") End Sub
Вы также можете скопировать диапазон в другую рабочую книгу.
В следующем примере я копирую таблицу Excel (Table1) в книгу Book2.
Подложка CopyCurrentRegion () Range ("Table1 [#All]"). Копировать книги ("Book2.xlsx"). Worksheets ("Sheet1"). Range ("A1") End Sub
Этот код будет работать, только если рабочая книга уже открыта.
Копирование диапазона переменного размера
Один из способов скопировать диапазоны переменного размера — преобразовать их в именованные диапазоны или таблицу Excel и использовать коды, как показано в предыдущем разделе.
Но если вы не можете этого сделать, вы можете использовать свойство CurrentRegion или End объекта диапазона.
Приведенный ниже код скопирует текущую область на активном листе и вставит ее в Sheet2.
Подложка CopyCurrentRegion () Range ("A1"). CurrentRegion.Copy Worksheets ("Sheet2"). Range ("A1") End Sub
Если вы хотите скопировать первый столбец вашего набора данных до последней заполненной ячейки и вставить его в Sheet2, вы можете использовать следующий код:
Sub CopyCurrentRegion () Range ("A1", Range ("A1"). End (xlDown)). Копировать рабочие листы ("Sheet2"). Range ("A1") End Sub
Если вы хотите скопировать как строки, так и столбцы, вы можете использовать приведенный ниже код:
Sub CopyCurrentRegion () Range ("A1", Range ("A1"). End (xlDown) .End (xlToRight)). Копировать рабочие листы ("Sheet2"). Range ("A1") End Sub
Обратите внимание, что все эти коды не выделяют ячейки при выполнении. В общем, вы найдете только несколько случаев, когда вам действительно нужно выбрать ячейку / диапазон, прежде чем работать с ним.
Назначение диапазонов объектным переменным
До сих пор мы использовали полный адрес ячеек (например, Workbooks («Book2.xlsx»). Worksheets («Sheet1»). Range («A1»)).
Чтобы сделать ваш код более управляемым, вы можете назначить эти диапазоны объектным переменным, а затем использовать эти переменные.
Например, в приведенном ниже коде я назначил диапазон источника и назначения переменным объекта, а затем использовал эти переменные для копирования данных из одного диапазона в другой.
Sub CopyRange () Dim SourceRange As Range Dim DestinationRange As Range Set SourceRange = Worksheets ("Sheet1"). Range ("A1: D20") Set DestinationRange = Worksheets ("Sheet2"). Range ("A1") SourceRange.Copy DestinationRange Конец подписки
Начнем с объявления переменных как объектов Range. Затем мы назначаем диапазон этим переменным с помощью оператора Set. После того, как диапазон был назначен переменной, вы можете просто использовать переменную.
Введите данные в следующую пустую ячейку (используя поле ввода)
Вы можете использовать поля ввода, чтобы пользователь мог вводить данные.
Например, предположим, что у вас есть набор данных ниже, и вы хотите ввести запись о продажах, вы можете использовать поле ввода в VBA. Используя код, мы можем убедиться, что он заполняет данные в следующей пустой строке.
Sub EnterData () Dim RefRange As Range Set RefRange = Range ("A1"). End (xlDown) .Offset (1, 0) Set ProductCategory = RefRange.Offset (0, 1) Set Quantity = RefRange.Offset (0, 2 ) Set Amount = RefRange.Offset (0, 3) RefRange.Value = RefRange.Offset (-1, 0) .Value + 1 ProductCategory.Value = InputBox ("Категория продукта") Quantity.Value = InputBox ("Количество") Amount.Value = InputBox ("Amount") End Sub
Приведенный выше код использует поле ввода VBA для получения входных данных от пользователя, а затем вводит их в указанные ячейки.
Обратите внимание, что мы не использовали точные ссылки на ячейки. Вместо этого мы использовали свойства End и Offset, чтобы найти последнюю пустую ячейку и заполнить ее данными.
Этот код нельзя использовать. Например, если вы вводите текстовую строку, когда поле ввода запрашивает количество или сумму, вы заметите, что Excel позволяет это. Вы можете использовать условие If, чтобы проверить, является ли значение числовым или нет, и затем разрешить его соответственно.
Цикл по ячейкам / диапазонам
До сих пор мы видели, как выбирать, копировать и вводить данные в ячейки и диапазоны.
В этом разделе мы увидим, как перебирать набор ячеек / строк / столбцов в диапазоне. Это может быть полезно, когда вы хотите проанализировать каждую ячейку и выполнить какое-либо действие на ее основе.
Например, если вы хотите выделить каждую третью строку в выделенном фрагменте, вам нужно пройтись по ней и проверить номер строки. Точно так же, если вы хотите выделить все отрицательные ячейки, изменив цвет шрифта на красный, вам нужно пройти и проанализировать значение каждой ячейки.
Вот код, который будет перебирать строки в выбранных ячейках и выделять альтернативные строки.
Sub HighlightAlternateRows () Dim Myrange As Range Dim Myrow As Range Set Myrange = Selection For Each Myrow In Myrange.Rows, если Myrow.Row Mod 2 = 0, то Myrow.Interior.Color = vbCyan End, если следующий Myrow End Sub
В приведенном выше коде функция MOD используется для проверки номера строки в выделенном фрагменте. Если номер строки четный, он выделяется голубым цветом.
Вот еще один пример, в котором код проходит через каждую ячейку и выделяет ячейки с отрицательными значениями.
Sub HighlightAlternateRows () Dim Myrange As Range Dim Mycell As Range Set Myrange = Выбор для каждой ячейки Mycell в Myrange Если Mycell <0, то Mycell.Interior.Color = vbRed End, если следующий Mycell End Sub
Обратите внимание, что вы можете сделать то же самое, используя условное форматирование (которое является динамическим и лучший способ сделать это). Этот пример предназначен только для того, чтобы показать вам, как цикл работает с ячейками и диапазонами в VBA.
Куда поместить код VBA
Хотите знать, где находится код VBA в вашей книге Excel?
В Excel есть серверная часть VBA, называемая редактором VBA. Вам необходимо скопировать и вставить код в окно кода модуля VB Editor.
Вот как это сделать:
- Перейдите на вкладку Разработчик.
- Выберите вариант Visual Basic. Это откроет редактор VB в бэкэнде.
- На панели Project Explorer в редакторе VB щелкните правой кнопкой мыши любой объект книги, в которую вы хотите вставить код.Если вы не видите Project Explorer, перейдите на вкладку View и нажмите Project Explorer.
- Перейдите во вкладку «Вставить» и нажмите «Модуль». Это вставит объект модуля для вашей книги.
- Скопируйте и вставьте код в окно модуля.