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 (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
Регистрация: 09.02.2015

Из программы в которой приходится работать некорректно выгружается табличка. Данные которые должны быть в одной строки разбросаны в 2 строки. Нужен макрос который собирет разбросанное в 2 строки в 1 строку.
Прикрепил образец. Слева табличка как выгружается изначально, а с права, то как должно получится после использования макроса.

Такое возможно?

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

#2

13.07.2015 21:05:06

Код
Sub jjj()
    [A1].CurrentRegion.SpecialCells(xlCellTypeBlanks).Delete (xlShiftUp)
End Sub

Прикрепленные файлы

  • образец.xlsb (16.99 КБ)

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

7even

Пользователь

Сообщений: 85
Регистрация: 09.02.2015

JayBhagavan,
Спасибо. то, что надо!

 

7even

Пользователь

Сообщений: 85
Регистрация: 09.02.2015

JayBhagavan, к сожалению, с таблицей в 20000 строк макрос не работает. ничего не происходит. Или же удаляется вся таблица. возможно ли это поправить?

Изменено: SevenZZ14.07.2015 10:51:27

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

#5

14.07.2015 11:49:45

JayBhagavan, если данные в какой-то из ячеек будут отсутствовать, получится нехорошее смещение (я понял так: не удалять пустоты, а объединить две строки в одну).

Код
Sub UniteLines()
Dim ArrData
Dim i As Long, k As Long
    ArrData = ActiveSheet.UsedRange.Value

    For i = 1 To UBound(ArrData) Step 2
        k = k + 1
        ArrData(k, 1) = ArrData(i, 1)
        ArrData(k, 2) = ArrData(i + 1, 2)
        ArrData(k, 3) = ArrData(i, 3)
        ArrData(k, 4) = ArrData(i + 1, 4)
        ArrData(k, 5) = ArrData(i + 1, 5)
    Next i
    
'    ActiveSheet.UsedRange.Delete
'    Cells(1, 1).Resize(k, 5).Value = ArrData
    Cells(1, 9).Resize(k, 5).Value = ArrData
End Sub

Код сработает на активном листе. Обработка всего массива данных, т.е. если на листе есть данные, которые изменять  не нужно, необходимо подправить код
Если данные нужно заменить на месте — раскомментировать строки 15 и 16, закомментировать строку 17
(удалить только данные — строку 15 заменить на ActiveSheet.UsedRange.ClearContents)

Аккуратнее с кнопкой! Можно и несколько раз нажать, но строк станет меньше :)

Прикрепленные файлы

  • объединить.xlsm (15.46 КБ)

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

Попробуйте такой вариант. Если на 20 000 строк будет медленно, то можно сделать на массивах.

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

А вот и вариант на массивах.

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

vikttur, каков пример — таков ответ.

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

SevenZZ

Пользователь

Сообщений: 85
Регистрация: 09.02.2015

завтра на работе опробую все предложенные варианты. спасибо всем кто отозвался помочь.
Единствееное заметил, что макрос(ы) работает только с 5 колонками. Можно ли сделать, чтобы работал с неограниченным числом колонок, и, чтобы корректная таблица создавалась не справа, а на 2 листе или чтобы сразу в нее преобразовывалась?

Изменено: SevenZZ14.07.2015 22:25:07

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

#10

14.07.2015 22:34:57

Цитата
SevenZZ написал:
чтобы корректная таблица создавалась не справа, а на 2 листе или чтобы сразу в нее преобразовывалась

Так КАК всё же нужно?

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

 

SevenZZ

Пользователь

Сообщений: 85
Регистрация: 09.02.2015

#12

15.07.2015 07:13:24

Цитата
Юрий М написал: Так КАК всё же нужно?

не принципиально как.

Цитата
Юрий М написал: Вот на второй лист.

спасибо сегодня опробую. Только вот если в таблице 7 колонок, а не 5, то 2 последние на добавляются на 2 лист.
В моих рабочих таблицах всегда разное кол-во столбцов и очень большое ко-во срок. Или может мне в макросе нужно в ручную что-то редактировать, чтобы он работал например с 7 колонками, или когда мне надо с 15 и т.д.?

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

Файл из сообщения 11: если перенести значение С9 в С10, последняя строка игнорируется.
Вопрос больше к автору темы, а не к автору макроса.

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

#14

15.07.2015 13:16:40

Цитата
SevenZZ написал:
Только вот если в таблице 7 колонок, а не 5, то 2 последние на добавляются на 2 лист.

Мой недочёт… Исправил файл — скачайте его заново. Количество столбцов определяется автоматически.

 

SevenZZ

Пользователь

Сообщений: 85
Регистрация: 09.02.2015

#15

15.07.2015 22:22:40

Цитата
Юрий М написал: Количество столбцов определяется автоматически.

Спасибо, всё работает как надо.
всем кто отозвался, спасибо, извиняюсь, если изъяснялся не ясно.

53 / 3 / 0

Регистрация: 08.10.2011

Сообщений: 200

1

Копирование данных из одной ячейки в другую

25.10.2011, 21:51. Показов 15903. Ответов 18


Студворк — интернет-сервис помощи студентам

Добрый вечер. С данным заданием, как и с Visual Basic сталкиваюсь впервые, но мне очень важно решить это задание. Помогите, пжлста!
Заранее спасибо
Программу надо написать на Visual Basic в excel.
Напишите программу, которая выполняет следующие действия. Программу написать в двух вариантах: с оператороми циклов for и do.
В ячейках А1:В10 находится 20 чисел. Составить программу, которая копирует данные числа в колонну С(ячейки с С1 до С20) следующим образом:
-числа из ячейки А1 надо скопировать в ячейку С1;
-числа из ячейки B1 надо скопировать в ячейку С2;
-числа из ячейки А2 надо скопировать в ячейку С3;
-числа из ячейки B2 надо скопировать в ячейку С4;
-числа из ячейки А3 надо скопировать в ячейку С5;
И так далее (числа из колонны А надо скопировать в ряды, с нечетными номерами колонны С, а числа из колонны В, надо скопировать в ряды с четными номерами колонны С).



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

25.10.2011, 21:51

18

Апострофф

Заблокирован

25.10.2011, 22:01

2

С циклом For

Visual Basic
1
2
3
For i = 1 To Range("A1:B10").Count
  Cells(i, 3) = Range("A1:B10")(i)
Next i



0



53 / 3 / 0

Регистрация: 08.10.2011

Сообщений: 200

25.10.2011, 22:08

 [ТС]

3

а это только часть кода? просто я в вижуал не разбираюсь, я учу си, паскаль. Для этого кода надо еще основную программку писать? если да, киньте, пжлста линк какой-нить как это все должно выглядить, спасибо!



0



Апострофф

Заблокирован

25.10.2011, 22:18

4

Эту процедуру вставляешь в модуль листа или в общий модуль.

Visual Basic
1
2
3
4
5
6
Sub Макрос1()
Dim I As Long
For I = 1 To Range("A1:B10").Count
  Cells(I, 3) = Range("A1:B10")(I)
Next I
End Sub

Запускаем по [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

Цитата
Сообщение от FRANZEE
Посмотреть сообщение

Объясните пожалуйста как работает алгоритм)

Visual Basic
1
2
3
4
5
For I = 1 To Range("A1:B10").Count 'перебираем все ячейки указанного диапазона
  Cells(I, 3) = Range("A1:B10")(I) ' _
  Cells(I, 3) - ячейка в i-ой строке 3-го столбца активного листа. _
  Range("A1:B10")(I) - если в диапазоне указана одна координата, счет идет слева направо, затем сверху вниз.
Next I



0



letnjaja

53 / 3 / 0

Регистрация: 08.10.2011

Сообщений: 200

25.10.2011, 23:19

 [ТС]

8

А что значит Dim?

Добавлено через 32 минуты
c do циклом может выглядеть как-то так?:

Visual Basic
1
2
3
4
5
6
7
Sub macros2( ) 
Dim I As Long
i=1
Do while i<Range("A1:B10").Count
Cells(I, 3) = Range("A1:B10")(I)
Next I
End Sub



0



15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

25.10.2011, 23:29

9

Цитата
Сообщение от letnjaja
Посмотреть сообщение

А что значит Dim?

Ставим курсор в это слово, жмем F1.
Если с аглицким туго, спросите у Яндекса vba dim. Проделайте то же с Do.



0



letnjaja

53 / 3 / 0

Регистрация: 08.10.2011

Сообщений: 200

26.10.2011, 19:31

 [ТС]

10

Visual Basic
1
2
3
4
5
6
7
8
Sub macros2( ) 
Dim I As Long
i=1
Do while i<Range("A1:B10").Count
Cells(I, 3) = Range("A1:B10")(I)
Next I
Loop
End Sub

полистала нет, добавила loop,скажите, что не так?



0



1508 / 478 / 56

Регистрация: 10.04.2009

Сообщений: 8,008

26.10.2011, 20:16

11

6 строку пробуем в мусорку



0



Апострофф

Заблокирован

26.10.2011, 20:23

12

Visual Basic
1
2
3
4
5
i=1
Do while i<=Range("A1:B10").Count 'а не < 
Cells(I, 3) = Range("A1:B10")(I)
i=i+1'а не Next I
Loop



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

Visual Basic
1
Cells(I, 3) = Range("A1:B10")(I)

почему после 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)
Метод Cells может приподнести сюрприз Запустите этот код на чистом листе:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub TestRangeIndex()
Dim i&, r As Range
Set r = [E7:G11]
r.Interior.ColorIndex = 6
MsgBox "Нумеруем ячейки диапазона " & r.Address(0, 0)
For i = 1 To r.Count
    r(i) = i
Next
If MsgBox("Готовы пойти дальше?", vbYesNo) <> vbYes Then Exit Sub
For i = i To r.Count * 2
    r(i) = i
Next
If MsgBox("Постарайтесь угадать, где находятся ячейки с ОТРИЦАТЕЛЬНЫМИ номерами." & vbLf & _
    "Продолжить?", vbYesNo) <> vbYes Then Exit Sub
For i = -r.Count To 0
    r(i) = i
Next
MsgBox "Ну как, угадали? ;)"
End Sub



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



Всю ячейку перенести в другую ячейку, но как текст с заменой

Yar4i

Дата: Вторник, 05.09.2017, 10:10 |
Сообщение № 1

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 137


Репутация:

1

±

Замечаний:
0% ±


Excel 2010

Приветствую вас дамы и господа :D
Возможно на форуме есть решение данной задачи, но я не знаю как правильно сформулировать то, что необходимо.
Мне проще на примере:
Ячейка A1 содержит «777» или «5»
Ячейка B1 содержит «А-5-В-NNN 25 ЛМ» или «NNN 25 ЛМ»
Нужно 777 вставить вместо NNN, чтоб получилось «А-5-В-777 25 ЛМ» или соответственно «5 25 ЛМ»
При этом в ячейке B1 всегда есть NNN, а остальные символы могут меняться.

К сообщению приложен файл:

555555.xlsx
(8.7 Kb)

 

Ответить

Yar4i

Дата: Вторник, 05.09.2017, 10:39 |
Сообщение № 2

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 137


Репутация:

1

±

Замечаний:
0% ±


Excel 2010

[vba]

Код

Range(«B1:B1»).Replace «NNN», [A1], xlPart

[/vba]
Уряя. Я сам hands

Сообщение отредактировал Yar4iВторник, 05.09.2017, 10:40

 

Ответить

_Boroda_

Дата: Вторник, 05.09.2017, 10:40 |
Сообщение № 3

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

Если нужно макросом, то не совсем ясно — по какому событию все это делать, как появляются данные в А и В, ну и вообще зачем все это
Формулой можно так

Код

=ПОДСТАВИТЬ(B1;»NNN»;A1)


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

Yar4i

Дата: Вторник, 05.09.2017, 11:03 |
Сообщение № 4

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 137


Репутация:

1

±

Замечаний:
0% ±


Excel 2010


Спасибо за формулу.
Это нужно для присвоения порядкового номера очередному отчёту, где NNN уже имелось в теле макроса и изменять механизм не хотелось.
А порядковый номер (самое ужасное) берётся так:
Есть папка «П» в ней куча Excel файлов сложенных по алфавитному порядку. И первому Excel файлу я должен присвоить NNN=1, второму Excel Excel NNN=2 и так далее.
Местоположение папки я могу поменять, конечно (допустим диск D:/П/), но… я не верю,.. что это можно макросом нумерацию поменять?
Мне наверное другую тему лучше создать…
Короче, я думал делать так: Открываю отчёт и в пустую ячейку А1 вставляю порядковый номер. Далее запускаю макрос и он из А1 присваивает этот номер и внутри файла и в наименование.

Сообщение отредактировал Yar4iВторник, 05.09.2017, 11:06

 

Ответить

_Boroda_

Дата: Вторник, 05.09.2017, 11:07 |
Сообщение № 5

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS


Да это ж почти Ваша строка макроса. Только Range(«B1:B1») можно написать Range(«B1»)
А по присвоению файлам — да, новую тему и объяснение не совсем ясно. Что значит

первому Excel файлу я должен присвоить NNN=1

?


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

Yar4i

Дата: Вторник, 05.09.2017, 11:27 |
Сообщение № 6

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 137


Репутация:

1

±

Замечаний:
0% ±


Excel 2010

 

Ответить

Содержание

  • Выбор ячейки / диапазона в 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.

Вот как это сделать:

  1. Перейдите на вкладку Разработчик.
  2. Выберите вариант Visual Basic. Это откроет редактор VB в бэкэнде.
  3. На панели Project Explorer в редакторе VB щелкните правой кнопкой мыши любой объект книги, в которую вы хотите вставить код.Если вы не видите Project Explorer, перейдите на вкладку View и нажмите Project Explorer.
  4. Перейдите во вкладку «Вставить» и нажмите «Модуль». Это вставит объект модуля для вашей книги.
  5. Скопируйте и вставьте код в окно модуля.

Понравилась статья? Поделить с друзьями:
  • Vba excel перенос на новую строку
  • Vba excel перенос на другую строку
  • Vba excel перенос данных с одного листа на другой
  • Vba excel перенос данных с листа на лист в excel
  • Vba excel перенос в одной ячейке