Excel макрос на вставку строки

Вставка диапазона со сдвигом ячеек вправо или вниз методом Insert объекта Range. Вставка и перемещение строк и столбцов из кода VBA Excel. Примеры.

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

Синтаксис

Expression.Insert(Shift, CopyOrigin)

Expression – выражение (переменная), возвращающее объект Range.

Параметры

Параметр Описание Значения
Shift Необязательный параметр. Определяет направление сдвига ячеек. Если параметр Shift опущен, направление выбирается в зависимости от формы* диапазона. xlShiftDown (-4121) – ячейки сдвигаются вниз;
xlShiftToRight (-4161) – ячейки сдвигаются вправо.
CopyOrigin Необязательный параметр. Определяет: из каких ячеек копировать формат. По умолчанию формат копируется из ячеек сверху или слева. xlFormatFromLeftOrAbove (0) – формат копируется из ячеек сверху или слева;
xlFormatFromRightOrBelow (1) – формат копируется из ячеек снизу или справа.

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

Примеры

Простая вставка диапазона

Вставка диапазона ячеек в диапазон «F5:K9» со сдвигом исходных ячеек вправо:

Range(«F5:K9»).Insert Shift:=xlShiftToRight

Если бы параметр Shift не был указан, сдвиг ячеек, по умолчанию, произошел бы вниз, так как диапазон горизонтальный.

Вставка вырезанного диапазона

Вставка диапазона, вырезанного в буфер обмена методом Range.Cut, из буфера обмена со сдвигом ячеек по умолчанию:

Range(«A1:B6»).Cut

Range(«D2»).Insert

Обратите внимание, что при использовании метода Range.Cut, точка вставки (в примере: Range("D2")) не может находится внутри вырезанного диапазона, а также в строке или столбце левой верхней ячейки вырезанного диапазона вне вырезанного диапазона (в примере: строка 1 и столбец «A»).

Вставка скопированного диапазона

Вставка диапазона, скопированного в буфер обмена методом Range.Copy, из буфера обмена со сдвигом ячеек по умолчанию:

Range(«B2:D10»).Copy

Range(«F2»).Insert

Обратите внимание, что при использовании метода Range.Copy, точка вставки (в примере: Range("F2")) не может находится внутри скопированного диапазона, но в строке или столбце левой верхней ячейки скопированного диапазона вне скопированного диапазона находится может.

Вставка и перемещение строк

Вставка одной строки на место пятой строки со сдвигом исходной строки вниз:


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


Вставка строк с использованием переменных, указывающих над какой строкой осуществить вставку и количество вставляемых строк:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

Sub Primer1()

Dim n As Long, k As Long, s As String

‘Номер строки, над которой необходимо вставить строки

n = 8

‘Количесто вставляемых строк

k = 4

‘Указываем адрес диапазона строк

s = n & «:» & (n + k 1)

‘Вставляем строки

Rows(s).Insert

End Sub

‘или то же самое с помощью цикла

Sub Primer2()

Dim n As Long, k As Long, i As Long

n = 8

k = 4

    For i = 1 To k

        Rows(n).Insert

    Next

End Sub


Перемещение второй строки на место шестой строки:

Rows(2).Cut

Rows(6).Insert

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


Перемещение шестой строки на место второй строки:

Rows(6).Cut

Rows(2).Insert

В этом случае шестая строка окажется на месте второй строки.

Вставка и перемещение столбцов

Вставка одного столбца на место четвертого столбца со сдвигом исходного столбца вправо:


Вставка трех столбцов на место четвертого-шестого столбцов со сдвигом исходных столбцов вправо:


Перемещение третьего столбца на место седьмого столбца:

Columns(3).Cut

Columns(7).Insert

Третий столбец окажется на месте шестого столбца, так как четвертый столбец заместит вырезанный третий столбец, пятый встанет на место четвертого и т.д.


Перемещение седьмого столбца на место третьего столбца:

Columns(7).Cut

Columns(3).Insert

В этом случае седьмой столбец окажется на месте третьего столбца.


 

brunokaz

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

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

Господа.

Есть таблица. Юзер должен только заполнять данные в таблице и добавлять строки (по необходимости) макросом. Заголовок таблицы и расчет итогов защищен

1) Написал простейший макрос добавления строк
2) Чтобы сохранить стиль оформления, формата выпадающего списка, ничего не смог придумать, как прописать копирования с аналогичной таблицы и вставку в целевую таблицу
3) Чтобы итоговая сумма считалась при добавлении строк, прописал сумму через ДВССЫЛ

Теперь столкнулся с проблемой. Выше этой таблицы есть области где юзер может добавить строки сам, вручную. Если он там добавляет, то у меня смещается диапазон вставки (так как он прописан конкретно в макросе), а также нарушается и итоговое суммирование (начальная ячейка прописана в ДВССЫЛ).

Как быть? Эту таблицу можете посмотреть в примере.

Буду благодарен за помощь

 

Владимир

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

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

Пускай вставляет. Какие проблемы?
=СУММ(ДВССЫЛ(«Y6:Y»&СТРОКА()-2))

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

brunokaz

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

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

Владимир,Спасибо за подсказку по сумме. Что будет если сверху добавить сверху таблицы строку?

1) Вставка будет осуществляться в 6 строку, которая уже сместиться на заголовок таблицы
2) Y6 который вы прописали в ДВССЫЛ будет уже ячейка заголовка таблицы…

Понимаете?

 

Владимир

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

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

Тогда нужно через ПОИСКПОЗ привязаться к слову «рыночная».
=СУММ(ДВССЫЛ(«Y» & ПОИСКПОЗ(«рыночная»;Y1:Y100;0)+1&»:Y»&СТРОКА()-2))

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

Nordheim

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

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

#5

16.08.2017 11:19:15

Аналог вашего макроса!

Код
Sub Vstavka()
Rows("6:6").Insert Shift:=xlDown
Range("b7:an6").FillUp
Range("b6:an7").ClearContents
End Sub

Изменено: Nordheim16.08.2017 11:21:40

«Все гениальное просто, а все простое гениально!!!»

 

brunokaz

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

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

Владимир,принято. Благодарю. Попробую. Только у меня строк надо ставить 5000 и главное чтобы никто больше не прописал слово рыночная в этом дипазоне :)

Скажите, а по вставке строк макросом нет идей? )

 

Владимир

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

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

#7

16.08.2017 11:31:46

Цитата
brunokaz написал:
..макросом нет идей

Тут нужны Ваши пояснения, что хотите получить на выходе? Копировать нужно с листа 2 одну строку или то, что заполнено и т.д. в этом духе.

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

brunokaz

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

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

Nordheim,
Ваш код макроса:
1) Удаляет уже заполненные строки (если я заполнил и понял, что мне еще нужна строка)
2) Вставляет по несколько строк, при добавлении множества строк
3) в случае добавления строк выше таблицы, начнется чорти чо. Проблема не решается получается

Изменено: brunokaz16.08.2017 11:49:44

 

brunokaz

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

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

Владимир, тогда по примеру с адресами пройдусь:

1) Я заполнил таблицу, все данные в ней, и понял, что у меня есть еще 1 объект, данные по которому необходимо внести в эту таблицу. Я нажимаю кнопку — строка добавляется выше сроки заполненной мною ранее (становится первой в этой таблице). При этом, сохраняются форматирования, оформление и выпадающий список новой добавленной строки.я заполняю данные по второму объекту.
2) В процессе работы, я добавляю несколько строк выше таблицы. и вспоминаю, что мне нужно внести данные по третьему объекту. Тут то и возникает проблема с моим макросом: в нем прописаны конкретные диапазоны: вставок номера строк и пр…Но нумерация строк таблицы сместится же на количество добавленных выше таблицы строк. Вот этого и надо избежать, как бы привязать макрос строго к этой таблице, вне зависимости от добавленных/удаленных строк выше самой таблицы.

Как-то так. Эта таблица большого заключения, под которой и над которой будет вестись работа по заполнению данных…

Изменено: brunokaz16.08.2017 11:51:17

 

Nordheim

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

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

#10

16.08.2017 11:49:45

Файл без данных поэтому не отследил, ничего заполненного не должен удалять.

Код
Sub Vstavka()
Rows("6:6").Insert Shift:=xlDown
Range("b7:an6").FillUp
Range("b6:an6").ClearContents
End 

Subbrunokaz написал: 2) Вставляет по несколько строк

всегда вставляет только 1 строку

brunokaz написал: 3) в случае добавления строк выше таблицы, начнется чорти чо. Проблема не решается получается

Как может макрос вставит строку выше таблицы? Вы планируете смещать таблицу?

Изменено: Nordheim16.08.2017 11:51:30

«Все гениальное просто, а все простое гениально!!!»

 

Владимир

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

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

А почему Вы не хотите просто защитить первые три строки от вставки строк, редактирования?

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

brunokaz

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

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

#12

16.08.2017 11:54:56

Nordheim, Мы привязаны к строке 6. Если я добавлю строку выше таблицы, это же станет строкой заголовка и начнуться проблемы

Код
Rows("6:6").Insert Shift:=xlDown 

Изменено: brunokaz16.08.2017 11:55:25

 

Nordheim

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

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

#13

16.08.2017 12:02:54

Я не пойму как вы добавите строку выше таблицы, в коде зашита вставка в 6 строку, и дальнейшее форматирование конкретно 6 сроки.

Код
Sub Vstavka()
' втавляем пустую строку в строку №6
Rows("6:6").Insert Shift:=xlDown
' Копируем данные и формат с 7 строки
Range("b7:an6").FillUp
' очищаем 6 строку
Range("b6:an6").ClearContents
End

Вроде код примитивный до невозможности и все понятно.

«Все гениальное просто, а все простое гениально!!!»

 

Nordheim

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

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

#14

16.08.2017 12:03:54

Цитата
brunokaz написал:
Если я добавлю строку выше таблицы

Каким образом?

«Все гениальное просто, а все простое гениально!!!»

 

brunokaz

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

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

Nordheim, в моем примере выделите строку два и вручную добавьте строку, а потом добавьте строку в таблицу при помощи написанного Вами макроса.

Получится так, что строка 6 (Rows(«6:6»).Insert Shift:=xlDown) это уже строка заголовка таблицы …..

Код простой, может я не верно объясняю, за что и извиняюсь, если это так.

Изменено: brunokaz16.08.2017 12:18:40

 

Nordheim

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

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

#16

16.08.2017 12:27:19

Цитата
Nordheim написал:
brunokaz написал: 3) в случае добавления строк выше таблицы, начнется чорти чо. Проблема не решается получаетсяКак может макрос вставит строку выше таблицы? Вы планируете смещать таблицу?

Я и спросил разве таблица будет смещаться?
Мой макрос повторяет с точностью ваш, разница в том , что не нужно ничего ниоткуда копировать вот собственно и все.

Цитата
brunokaz написал:
Nordheim , в моем примере выделите строку два и вручную добавьте строку, а потом добавьте строку в таблицу при помощи написанного Вами макроса.

проделайте манипуляции с вашим макросом результат идентичный будет.
Я одного не пойму зачем пользователь вставит строки вручную если на листе кнопка вставки строк присутствует?

«Все гениальное просто, а все простое гениально!!!»

 

brunokaz

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

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

#17

16.08.2017 12:39:57

Цитата
Nordheim написал:
Я и спросил разве таблица будет смещаться?

Не понял фразу сначала по смещению….

Цитата
Nordheim написал:
Мой макрос повторяет с точностью ваш, разница в том , что не нужно ничего ниоткуда копировать вот собственно и все.

Согласен

Цитата
Nordheim написал:
Я одного не пойму зачем пользователь вставит строки вручную если на листе кнопка вставки строк присутствует?

Этот лист состоит из десятков таблиц. Таблицы и их форму изменять нельзя — это утвержденная форма заключения, но в некоторых местах строки добавлять можно (например под таблицами), с целью отражения комментариев к изложенным в таблицах данным и изложением доп инфы по данным из таблицы.

Изменено: brunokaz16.08.2017 12:40:19

 

Владимир

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

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

Попробуйте добавить строки выше табличной формы..

Изменено: Владимир16.08.2017 13:54:52

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

brunokaz

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

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

#19

16.08.2017 15:09:04

Цитата
Владимир написал:
Попробуйте добавить строки выше табличной формы..

Лист защищен….

 

brunokaz

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

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

Если эту проблему не решить или трудно решаема, прошу подтвердить кто может. Тогда я буду думать что делать…

 

Nordheim

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

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

#21

17.08.2017 08:39:47

Код
Sub Vstavka()
ActiveSheet.Unprotect "12345"
Rows(6).Insert
Rows("7:6").FillUp
Rows(6).ClearContents
ActiveSheet.Protect "12345", DrawingObjects:=False, Contents:=True, Scenarios:= _
        False, AllowFormattingCells:=True, AllowFormattingColumns:=True, _
        AllowFormattingRows:=True, AllowInsertingColumns:=True, _
        AllowInsertingHyperlinks:=True, AllowDeletingColumns:=True, _
        AllowDeletingRows:=True, AllowSorting:=True, AllowFiltering:=True, _
        AllowUsingPivotTables:=True
End Sub

«Все гениальное просто, а все простое гениально!!!»

 

brunokaz

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

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

Nordheim, к сожалению это не решает вопрос с возможным смещением таблицы. Если только весь лист не защищать по вставке строк, что я не могу сделать

Изменено: brunokaz17.08.2017 09:16:32

 

Nordheim

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

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

#23

17.08.2017 09:22:28

Цитата
brunokaz написал:
к сожалению это не решает вопрос с возможным смещением таблицы

Почему же?, Строки вставляются благополучно макросом. Пользователь вставить строки не может. как в таком случае сместится таблица?

«Все гениальное просто, а все простое гениально!!!»

 

brunokaz

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

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

Nordheim, ладно…придется запрещать пользователям вставлять строки. Спасибо Вам за помощь

 

Nordheim

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

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

Попробуйте сделать обходной вариант. Вставление строк в любое место кроме шапки таблицы, с использованием InputBox.

«Все гениальное просто, а все простое гениально!!!»

 

brunokaz

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

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

 

Kcuxa_xa

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

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

Подскажите, а что нужно поменять в макросе, что бы он добавлял новую строку не в начало таблицы, а в конец?

Изменено: Kcuxa_xa07.01.2019 22:26:50

 

Nordheim

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

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

Kcuxa_xa, А в чем смысл? Вам нужно вставить пустую строку перед последней заполненной в таблице?

«Все гениальное просто, а все простое гениально!!!»

 

Kcuxa_xa

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

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

#29

07.01.2019 23:16:38

Цитата
Nordheim написал:
А в чем смысл?

да Вы правы это в принципе не критично. А не подскажите как в таком случае сделать, что бы новая строка автоматом нумеровалась по порядку?

 

Nordheim

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

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

#30

07.01.2019 23:29:58

Файл пример покажите.
Можно так

Код
Sub test()
    Dim lrow&
    lrow = Range("a" & Rows.Count).End(xlUp).Row
    If lrow = 1 Then Exit Sub
    Range("a" & lrow + 1).Value = Range("a" & lrow).Value + 1
End Sub

Изменено: Nordheim07.01.2019 23:34:39

«Все гениальное просто, а все простое гениально!!!»

0 / 0 / 0

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

Сообщений: 15

1

23.12.2012, 00:31. Показов 40216. Ответов 85


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

Здравствуйте!

Прошу вас помочь, сам я точно не справлюсь!!

В таблице, скажем, из 4-х столбцов (A,B,C,D) необходимо добавить строку снизу. При этом по столбцу A происходит автоматическая пере-нумерация. а последняя строка Итого: не удаляется. если можно

Прикрепил файл, содержащий таблицу. В силу своих возможностей в ней сделал макросы для Удаления строк. А со Вставками большой ступор. Смог только частично написать вставку снизу, но как сделать автоматическую нумерацию и формулу не знаю.

Заранее благодарен!



0



Alex77755

11482 / 3773 / 677

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

Сообщений: 11,145

23.12.2012, 13:07

2

Только откажись от объединения ячеек

Visual Basic
1
2
3
4
5
6
7
8
9
Sub Макрос1()
Dim L
L = 12
Do While Cells(L, 1) <> Empty
L = L + 1
Loop
Rows(L & ":" & L).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Cells(L, 1) = Cells(L - 1, 1) + 1
End Sub

Добавлено через 1 минуту
Искать циклом последнюю строку пришлось из-за того, что ниже таблицы строки заняты



1



Hugo121

6875 / 2807 / 533

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

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

23.12.2012, 13:39

3

Можно не убирать объединение, и без цикла:

Visual Basic
1
2
3
4
5
6
Sub tt()
Dim l
l = Range("A12").End(xlDown).Row
Rows(l & ":" & l).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Cells(l, 1) = Cells(l - 1, 1) + 1
End Sub

Там только рамка пропадает — ну это можно ещё пару строк дописать — форматировать Cells(l, 1)



1



0 / 0 / 0

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

Сообщений: 15

23.12.2012, 13:46

 [ТС]

4

Ребят вы не могли бы скинуть документ который вы сделали…я даже не знаю куда это надо ввести…пожалуйста помогите…..заранее благодарен



0



11482 / 3773 / 677

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

Сообщений: 11,145

23.12.2012, 13:52

5

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

Можно не убирать объединение, и без цикла:

Можно, наверное.
Только долго крутить скрол в поисках вставленой строки

Миниатюры

Макросы вставки строки снизу в таблице Excel
 



0



11482 / 3773 / 677

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

Сообщений: 11,145

23.12.2012, 13:54

6

Я к тому, что делал не на отвлечённой книге, а на конкретной

Миниатюры

Макросы вставки строки снизу в таблице Excel
 



0



0 / 0 / 0

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

Сообщений: 15

23.12.2012, 14:02

 [ТС]

7

это надо просто вставить туда,…..



0



11482 / 3773 / 677

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

Сообщений: 11,145

23.12.2012, 14:05

8

В силу своих возможностей в ней сделал макросы для Удаления строк

А где ж ты их делал раньше?



0



0 / 0 / 0

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

Сообщений: 15

23.12.2012, 14:06

 [ТС]

9

я просто вставил кнопки и назначал макросы…а как вы, я не умею



0



6875 / 2807 / 533

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

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

23.12.2012, 14:06

10

Алексей, я тоже делал на конкретной. Мистика…



0



0 / 0 / 0

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

Сообщений: 15

23.12.2012, 14:13

 [ТС]

11

если можешь скинь мне готовый файл,… пожалуйста

Добавлено через 5 минут
кроме строки итого: можно сделать макрос для удаление строк



0



6875 / 2807 / 533

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

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

23.12.2012, 14:14

12

См. первую страницу, в 15:06

Добавлено через 41 секунду
Удаления каких строк? Вообще конечно можно….



0



0 / 0 / 0

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

Сообщений: 15

23.12.2012, 14:15

 [ТС]

13

кроме строки итого:



0



11482 / 3773 / 677

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

Сообщений: 11,145

23.12.2012, 14:16

14

Мистика не иначе!

Кликните здесь для просмотра всего текста

Я Александр



0



0 / 0 / 0

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

Сообщений: 15

23.12.2012, 14:21

 [ТС]

15

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



0



11482 / 3773 / 677

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

Сообщений: 11,145

23.12.2012, 14:22

16

Позор на мою седую голову: не в тот лист макрос вставил
так я кнопкам не назначал



0



0 / 0 / 0

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

Сообщений: 15

23.12.2012, 14:22

 [ТС]

17

в смысле



0



6875 / 2807 / 533

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

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

23.12.2012, 14:23

18

tt & ttt



0



6875 / 2807 / 533

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

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

23.12.2012, 14:24

19

Упс, Александр, извиняюсь



0



0 / 0 / 0

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

Сообщений: 15

23.12.2012, 14:25

 [ТС]

20

Hugo121, а по одной строки удалить получиться,…



0



Skip to content

Как вставить пустые строки в диапазон

На чтение 3 мин. Просмотров 3.6k.

Что делает макрос: Иногда бывает нужно добавить строки в наборе данных. Этот макрос позволяет вставить пустые строки в диапазоне.

Содержание

  1. Как макрос работает
  2. Код макроса
  3. Как этот код работает
  4. Как использовать

Как макрос работает

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

Код макроса

Sub VstavitPustieStrokiVDiapazon()
'Шаг 1: Объявляем переменные
Dim MyRange As Range
Dim iCounter As Long
'Шаг 2: Определяем целевой диапазон
Set MyRange = Range("C6:D17")
'Шаг 3: Запуск обратного цикла
For iCounter = MyRange.Rows.Count To 2 Step -1
'Шаг 4: Вставляем 2 пустые строки
MyRange.Rows(iCounter).EntireRow.Insert
MyRange.Rows(iCounter).EntireRow.Insert
'Шаг 5: Увеличиваем счетчик
Next iCounter
End Sub

Как этот код работает

  1. Сначала мы объявляем две переменные. Первая переменная является переменной объекта под названием MyRange. Это переменная объекта, которая определяет целевой диапазон. Другая переменная является переменной Long Integer называется iCounter. Эта переменная служит инкрементному счетчику.
  2. На шаге 2 макрос заполняет переменную MyRange с целевым диапазоном. В этом примере мы используем Range («C6:D17»). Если ваш целевой диапазон является именованным, можно просто ввести его название — Range («MyNamedRange»).
  3. На этом этапе макрос устанавливает параметры для инкрементного счетчика, чтобы начать на максимальном 1 для диапазона (MyRange.Rows.Count) и заканчивается в 2 (второй ряд от выбранного диапазона). Обратите внимание, что мы используем Шаг-1 классификатор. Поскольку мы указываем шаг -1, Excel знает, что мы будем увеличивать счетчик в обратном направлении, двигаясь назад один шаг на каждой итерации. В целом, Шаг 3 говорит Excel, чтобы начать в последней строке выбранного диапазона, двигаясь назад, пока он не дойдет до второй строки диапазона. При работе с диапазоном, вы можете явно вызвать какую-либо конкретную строку в диапазоне, передавая номер индекса строки к коллекции Rows диапазона. Например, диапазон («D6: D17»). Ряд (5) указывает на пятой строке в диапазоне D6: D17.
  4. На шаге 4, макрос использует переменную iCounter как номер индекса для коллекции Строки MyRange. Это помогает точно определить какой именно макрос работает в текущем цикле. Макрос использует метод EntireRow.Insert, чтобы вставить новую пустую строку. Так как мы хотим две пустые строки, мы делаем это дважды.
  5. На шаге 5, макрос возвращается к началу цикла увеличивать счетчик вниз.

Как использовать

Для реализации этого макроса, вы можете скопировать и вставить его в стандартный модуль:

  1. Активируйте редактор Visual Basic, нажав ALT + F11.
  2. Щелкните правой кнопкой мыши имя проекта / рабочей книги в окне проекта.
  3. Выберите Insert➜Module.
  4. Введите или вставьте код.

В данном практическом примере приведен код макроса для умной вставки пустых строк между ячейками. Пошаговая инструкция как вставлять строки между объединенными и необъединенными ячейками одновременно для любой таблицы.

Макрос для вставки строк с определенной высотой

В таблице отчета по продажам в розничных точках содержаться объединенные ячейки, как показано ниже на рисунке:

Исходная таблица.

Необходимо экспонировать группы ячеек для каждого штата. Для этого мы добавим по одной пустой строке между каждой группой розничных точек. При этом не имеет значение будет ли содержать группа объединенные ячейки или нет. Ведь некоторые группы состоят из одной строки. А также дополнительно уменьшим высоту этих пустых строк, чтобы внешний вид таблицы был стильным. Выполнить вручную все эти действия: выделение отдельных групп ячеек, вставка между ними пустых строк, а потом изменение высоты для этих же строк – это не рационально использование сил и времени. Особенно если таблица имеет десятки тысяч строк. Лучше написать свой макрос, который сам автоматически и молниеносно выполнит эту рутинную работу за Вас.

Перейдите в режим редактора макросов Visual Basic (ALT+F11):

Basic.

Создайте в нем новый модуль с помощью инструмента: «Insert»-«Module». А потом запишите в него VBA-код самого макроса:

Sub VstavkaStrok()
Dim i As Long
Dim pustroka As Long
For i = Selection.Rows.Count To 2 Step -1
pustroka = Selection(i, 1).Row + 1
ActiveSheet.Rows(pustroka).Insert xlShiftDown
ActiveSheet.Rows(pustroka).RowHeight = 7
ActiveSheet.Rows(pustroka).Borders(xlInsideVertical). _
LineStyle = xlLineStyleNone
ActiveSheet.Rows(pustroka).Borders(xlEdgeLeft). _
LineStyle = xlLineStyleNone
ActiveSheet.Rows(pustroka).Borders(xlEdgeRight). _
LineStyle = xlLineStyleNone
ActiveSheet.Rows(pustroka).Interior. _
ColorIndex = xlColorIndexNone
i = i - Selection(i, 1).MergeArea.Rows.Count + 1
Next
End Sub

VBA code.

Теперь если мы хотим вставить по одной пустой строке между каждой объединенной и необъединенной ячейкой, которые находиться в столбце A? Тогда а в таблице отчета по продажам выделяем диапазон ячеек A:D18 и запускаем наш макрос выбрав инструмент: «РАЗРАБОТЧИК»-«Код»-«Макросы»-«VstavkaStrok»-«Выполнить». После запуска макроса таблица будет выглядеть как показано на рисунке:

Пример.

Сначала в коде объявлены две переменные:

  1. i – переменная выполняет роль счетчика в цикле.
  2. pustroka – переменная будет хранить в себе очередной номер для каждой строки выделенного диапазона.

В макросе находиться цикл, который запускает целый ряд инструкций для каждой строки в выделенном диапазоне ячеек. Направление цикла идет с нижней строки выделения к верхней.

  1. В первой инструкции мы присваиваем для переменной pustroka номер строки которая находиться под текущей строкой.
  2. Следующая инструкция добавляет пустую строку с высотой в 7 пикселей.
  3. Удаляются в добавленной строке все вертикальные границы, а также заливка.
  4. Уменьшается значение переменной i на количество строк, которые охватывает текущая объединенная ячейка, находящаяся в первом столбце выделенного диапазона.



Умная вставка строк с помощью макроса

Если же мы хотим экспонировать только самые большие группы. Допустим Вы желаете сделать так, чтобы макросом были вставлены пустые строки только после объединенных ячеек в столбце A, которые охватывают много строк. И не вставлять пустые строки после необъединенных ячеек или тех объединенных ячеек, которые охватывают не более 1-ой строки. Тогда после строки в коде макроса где описано начало цикла добавляем строку кода с условной инструкцией:

If Selection(i, 1).MergeArea.Rows.Count <> 1 Then

Также перед инструкцией конца цикла Next следует вставить инструкцию конца условия – End If.

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

Такая модификация кода макроса внутри цикла будет следить за тем применять ли ряд инструкций к текущей строке или игнорировать их на данном этапе прохода по срокам. Если же текущая строка не содержит необъединенной ячейки или объединенная ячейка охватывает более чем 1-ну строку, тогда для нее применяться все инструкции форматирования. Полная версия модифицированного года выглядит так:

Sub VstavkaStrok1()
Dim i As Long
Dim pustroka As Long
For i = Selection.Rows.Count To 2 Step -1
  If Selection(i, 1).MergeArea.Rows.Count <> 1 Then
  pustroka = Selection(i, 1).Row + 1
  ActiveSheet.Rows(pustroka).Insert xlShiftDown
  ActiveSheet.Rows(pustroka).RowHeight = 7
  ActiveSheet.Rows(pustroka).Borders(xlInsideVertical). _
  LineStyle = xlLineStyleNone
  ActiveSheet.Rows(pustroka).Borders(xlEdgeLeft). _
  LineStyle = xlLineStyleNone
  ActiveSheet.Rows(pustroka).Borders(xlEdgeRight). _
  LineStyle = xlLineStyleNone
  ActiveSheet.Rows(pustroka).Interior. _
  ColorIndex = xlColorIndexNone
  i = i - Selection(i, 1).MergeArea.Rows.Count + 1
  End If
Next
End Sub

Результат автоматического форматирования таблицы отчета с учетом новых условий в коде макроса:

Умная вставка.

Как видите с помощью макросов таблицы любых объемов данных можно форматировать в один клик мышкой.

Понравилась статья? Поделить с друзьями:
  • Excel макрос массив столбцов
  • Excel макрос копируем ячейку
  • Excel макрос копировать только значения в excel
  • Excel макрос копировать строку
  • Excel макрос копировать строки