Вставка диапазона со сдвигом ячеек вправо или вниз методом 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 |
В этом случае седьмой столбец окажется на месте третьего столбца.
|
paff Пользователь Сообщений: 69 |
Здравствуйте! Изменено: paff — 03.11.2018 01:04:27 |
|
paff Пользователь Сообщений: 69 |
#2 02.11.2018 13:02:24 Нашел макросы
2 который добавляет последнюю строку
Подскажите пожалуйста, как их объединить и чтобы удалял 1 раз, а добавлял сколько угодно раз. Изменено: paff — 02.11.2018 13:48:22 |
||||
|
paff Пользователь Сообщений: 69 |
#3 02.11.2018 13:11:22 Запутался совсем. Тут меня осенило, что эта и есть та строка куда мне надо добавить строки и я вместо delete «написал» вставить и получился такой код, но он не работает:
Изменено: paff — 02.11.2018 13:48:08 |
||
|
ivanok_v2 Пользователь Сообщений: 712 |
#4 02.11.2018 13:12:44 как вариант.
|
||
|
paff Пользователь Сообщений: 69 |
Спасибо!! Сейчас попробую. Но файл эксель выгружается из программы и всегда может быть разной «длины». Изменено: paff — 02.11.2018 13:15:22 |
|
ivanok_v2 Пользователь Сообщений: 712 |
#6 02.11.2018 13:19:16
ето учтено, стартовоя строка всегда одна и таже |
||
|
paff Пользователь Сообщений: 69 |
#7 02.11.2018 13:24:08 Спасибо ! Получается! Сейчас пробую цифры разные вставлять в диапазон
Потому что плохо в этом бум-бум!) Изменено: paff — 02.11.2018 13:43:06 |
||
|
ivanok_v2 Пользователь Сообщений: 712 |
paff, зачем повторяете в сообщении код? Изменено: ivanok_v2 — 02.11.2018 13:27:44 |
|
paff Пользователь Сообщений: 69 |
Выделил цветом, где меняю значения. Потому что не пойму сам что делаю и если не там меняю может вы подскажите, где нужно. |
|
ivanok_v2 Пользователь Сообщений: 712 |
#10 02.11.2018 13:39:55
на сообщении |
||
|
paff Пользователь Сообщений: 69 |
Поправил. Спасибо. Хоть что то получилось)) Изменено: paff — 02.11.2018 13:56:18 |
|
paff Пользователь Сообщений: 69 |
#12 02.11.2018 13:53:01 Подскажите, как добавить не последнюю строку, а предпоследнюю строку из этого кода??
Изменено: paff — 02.11.2018 13:55:42 |
||
|
ivanok_v2 Пользователь Сообщений: 712 |
paff, Изменено: ivanok_v2 — 02.11.2018 13:56:24 |
|
paff Пользователь Сообщений: 69 |
#14 02.11.2018 13:57:53 я слишком туп для вашего кода(( Вот этот код мне подходит, но он копирует последнюю строку, а мне надо предпоследнюю строку копировать
Изменено: paff — 02.11.2018 13:58:17 |
||
|
ivanok_v2 Пользователь Сообщений: 712 |
#15 02.11.2018 14:09:49
Изменено: ivanok_v2 — 02.11.2018 14:10:11 |
||
|
paff Пользователь Сообщений: 69 |
Спасибо Вам!! Все работает!, но упирается в объединенную ячейку которую надо все таки удалить!! Млин |
|
paff Пользователь Сообщений: 69 |
#17 02.11.2018 14:26:32 Все таки пытаюсь совместить Ваш код, с кодом который Вы мне отредактировали получается ерунда(
Изменено: paff — 02.11.2018 14:27:16 |
||
|
ivanok_v2 Пользователь Сообщений: 712 |
#18 02.11.2018 14:27:40
тогда используйте мой код,что дал вам выше |
||
|
paff Пользователь Сообщений: 69 |
Ваш я хочу использовать, но мое интеллектуальное развитие не может понять, что мне нужно вставить в те места, где вы сказали |
|
paff Пользователь Сообщений: 69 |
Начало поиска у меня ячейка А3, а стартовая строка — я не пойму что это |
|
ivanok_v2 Пользователь Сообщений: 712 |
#21 02.11.2018 14:35:03
попробуйте так Изменено: ivanok_v2 — 02.11.2018 14:35:21 |
||
|
paff Пользователь Сообщений: 69 |
Уже лучше!! Он добавляет строки, но самую последнюю (объединенную так и не удаляет(( |
|
ivanok_v2 Пользователь Сообщений: 712 |
#23 02.11.2018 14:40:57
вы говорили про добавление, про удаление ни слова не было. |
||
|
paff Пользователь Сообщений: 69 |
АА кстати, Вы в сотый раз правы!!! Она съезжает вниз!! И ее можно не трогать!! Тогда можно ли добавляет строки с форматом как в таблице?? туплю уже жестко((= Изменено: paff — 02.11.2018 14:42:43 |
|
ivanok_v2 Пользователь Сообщений: 712 |
#25 02.11.2018 14:58:59
ну так так формат сохраняется. |
||
|
paff Пользователь Сообщений: 69 |
Добавляет пустые строки, без формата. Хотя в коде понял что за это отвечает строчка CopyOrigin:=xlFormatFromLeftOrAbove |
|
ivanok_v2 Пользователь Сообщений: 712 |
#27 02.11.2018 15:09:24
замените на
|
||||
|
paff Пользователь Сообщений: 69 |
Теперь перед предпоследней строкой добавляет строчки , но с нужным форматом!! сейчас поиграюсь с этим -1 |
|
paff Пользователь Сообщений: 69 |
Если ставить -2, то вставляет строки перед двумя нижними строками |
|
ivanok_v2 Пользователь Сообщений: 712 |
#30 02.11.2018 15:22:33 paff, |
|
Добавление последней строки кнопкой (макрос) |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
If you have no data below the table, you can just assign values to the rows immediately after the table. The table will automatically expand to encompass the new rows, as long as at least one cell in each row, has well defined data.
' Insert 3 new rows into the listoject
' We assume the ListObject already contains data
Public Sub Test(Lob As ListObject)
Dim Sht As Worksheet
Dim StartRow As Long, StartCol As Long, NumCols As Long
Dim Lst As Variant
Dim Rng As Range
' Allocate 3 new rows
NumCols = Lob.ListColumns.Count
ReDim Lst(1 to 3, 1 to NumCols)
' Get the first column of and the first row following the list table
StartCol = Lob.Range.Column
StartRow = Lob.Range.row + Lob.Range.Rows.Count
' Create a range big enough to hold the data, immediately under the last row of the table.
Set Sht = Lob.Parent
Set Rng = Sht.Cells(StartRow, StartCol).Resize(UBound(Lst), UBound(Lst, 2))
' Add some data to the new rows
Lst(1, 1) = "Test1"
Lst(2, 1) = "Test2"
Lst(3, 1) = "Test3"
' Copy data to the destination
Rng = Lst
End Sub
If the list object does not contain data, ie Lob.ListRows.Count = 0, then write data after the header otherwise write it after the last rows.
There are some mistakes in your code:
- «Range(x , y)» will cause an error, when x and y are integers. If you want to refer to a cell. Try Cells(x, y). Or Range(Cells(x1, y1), Cells(x2, y2)) to refer to more cells.
- And Resize() takes two arguments, and returns a range — it does not affect anything on the sheet.
See also how to insert rows if you want:
Excel Range.Insert:
Example from the doc:
With Range("B2:E5")
.Insert xlShiftDown
' Optionally clear formats, which you do not want, if you add to
' a table with well defined data and formats.
.ClearFormats
End With
The number of the rows inserted, will equal the number of rows in the range we call Insert on.
Содержание
- Таблицы и объекты VBA
В этом руководстве будет показано, как работать с таблицами и объектами ListObject в VBA.
Таблицы — одна из самых полезных и мощных функций Excel. В этом руководстве мы рассмотрим, как использовать VBA для создания таблицы, добавления простой сортировки в таблицу, фильтрации таблицы и выполнения других задач, связанных с таблицами.
Создать таблицу с VBA
Метод ListObjects.Add может добавлять таблицу на лист на основе диапазона на этом листе. У нас есть диапазон, показанный в ($ A $ 1: $ B $ 
Следующий код добавит на ваш рабочий лист таблицу с именем Table1 в зависимости от диапазона ($ A $ 1: $ B $ 
| 123456 | Подложка CreateTableInExcel ()ActiveWorkbook.Sheets («Sheet1»). ListObjects.Add (xlSrcRange, Range («$ A $ 1: $ B $ 8»),, xlYes) .Name = _»Таблица 1″Конец подписки |
Результат:
Вставка столбца в конец таблицы с помощью VBA
Вы можете использовать метод ListColumns.Add, чтобы добавить столбец в конец вашей таблицы. У нас есть таблица под названием Table1, показанная ниже.
Вы можете добавить столбец в свою таблицу, используя следующий код, который всегда будет добавлять столбец в конец таблицы:
| 12345 | Sub AddColumnToTheEndOfTheTable ()ActiveWorkbook.Sheets («Sheet1»). ListObjects («Table1»). ListColumns.AddКонец подписки |
Результат:
Вставка строки внизу таблицы с помощью VBA
Вы можете использовать метод ListRows.Add, чтобы добавить строку в конец таблицы. У нас есть таблица под названием Table1, показанная ниже.
Следующий код всегда будет добавлять строку в конец таблицы.
| 12345 | Подложка AddRowToTheBottomOfTheTable ()ActiveSheet.ListObjects («Таблица1»). ListRows.AddКонец подписки |
Результат:
Добавление простой сортировки с помощью VBA
Вы можете отсортировать таблицу с помощью VBA. У нас есть таблица с именем Table1, показанная ниже, и мы можем использовать VBA для сортировки столбца продаж от самого низкого до самого высокого.
Следующий код отсортирует столбец «Продажи» в порядке возрастания.
| 12345678910111213141516171819 | Sub SimpleSortOnTheTable ()Диапазон («Таблица1 [[# заголовков], [Продажи]]»). ВыберитеActiveWorkbook.Worksheets («Sheet1»). ListObjects («Table1»). Sort.SortFields.ClearActiveWorkbook.Worksheets («Sheet1»). ListObjects («Table1»). Sort.SortFields.Add _Ключ: = Диапазон («Таблица1 [[# Все], [Продажи]]»), SortOn: = xlSortOnValues, Order: = _xlAscending, DataOption: = xlSortNormalС ActiveWorkbook.Worksheets («Sheet1»). ListObjects («Table1»). Sort.Header = xlYes.MatchCase = Ложь.Orientation = xlTopToBottom.SortMethod = xlPinYin.Подать заявлениеКонец сКонец подписки |
Результат:
Фильтрация таблицы с помощью VBA
Вы также можете фильтровать таблицу Excel с помощью VBA. У нас есть таблица с именем Table1, и мы хотели бы отфильтровать ее, чтобы отображались только продажи, превышающие 1500.
Мы можем использовать метод автофильтра, который имеет пять необязательных параметров. Поскольку мы хотим отфильтровать столбец «Продажи», который является вторым столбцом, мы устанавливаем для поля значение 2 и используем параметр оператора xlAnd, который используется для дат и чисел.
| 123456 | Подложка SimpleFilter ()ActiveWorkbook.Sheets («Sheet1»). ListObjects («Table1″). Range.AutoFilter Field: = 2, Criteria1: = _»> 1500″, оператор: = xlAndКонец подписки |
Результат:
Очистите фильтр с помощью метода ShowAllData в VBA
Вы можете получить доступ к методу ShowAllData класса Worksheet, чтобы очистить фильтр. Если вы хотите очистить фильтр (-ы) таблицы, вам сначала нужно выбрать ячейку в таблице, что вы можете сделать в VBA.
Метод ShowAllData сгенерирует ошибку, если не использовать условную логику, чтобы проверить, был ли применен фильтр на листе. В следующем коде показано, как это сделать:
| 123456789 | Sub ClearingTheFilter ()Диапазон («Таблица1 [[# заголовков], [Продажи]]»). ВыберитеЕсли ActiveWorkbook.Worksheets («Sheet1»). FilterMode = True, тоActiveSheet.ShowAllDataКонец, еслиКонец подписки |
Очистить все фильтры из таблицы Excel
Вы можете получить доступ к методу ShowAllData класса ListObject, не выбирая сначала ячейку в таблице. В следующем коде показано, как это сделать:
| 123 | Подложка ClearAllTableFilters ()ActiveWorkbook.Worksheets («Sheet1»). ListObjects («Table1»). AutoFilter.ShowAllDataКонец подписки |
Удаление строки с помощью VBA
Вы можете удалить строку в базе данных вашей таблицы с помощью метода ListRows.Delete. Вы должны указать, какая строка используется по номеру строки. У нас есть следующая таблица под названием Table1.
Допустим, вы хотите удалить вторую строку в базе данных вашей таблицы, следующий код позволит вам это сделать:
| 12345 | Sub DeleteARow ()ActiveWorkbook.Worksheets («Sheet1»). ListObjects («Table1»). ListRows (2) .DeleteКонец подписки |
Результат:
Удаление столбца с помощью VBA
Вы можете удалить столбец из таблицы с помощью метода ListColumns.Delete. У нас есть следующая таблица под названием Table1, показанная ниже:
Чтобы удалить первый столбец, вы должны использовать следующий код:
| 12345 | Подраздел DeleteAColumn ()ActiveWorkbook.Worksheets («Sheet1»). ListObjects («Table1»). ListColumns (1) .DeleteКонец подписки |
Результат:
Преобразование таблицы обратно в диапазон в VBA
Вы можете преобразовать таблицу обратно в нормальный диапазон с помощью VBA. В следующем коде показано, как преобразовать таблицу с именем Table1 обратно в диапазон:
| 12345 | Sub ConvertingATableBackToANormalRange ()ActiveWorkbook.Sheets («Sheet1»). ListObjects («Table1»). UnlistКонец подписки |
Добавление чередующихся столбцов и форматирование ко всем таблицам на листе с помощью VBA
Вы можете получить доступ ко всем таблицам на вашем листе с помощью коллекции ListObjects. На приведенном ниже листе у нас есть две таблицы, и мы хотели бы добавить столбец с чередованием к обеим таблицам сразу и изменить шрифт раздела данных обеих таблиц на полужирный, используя VBA.
| 12345678910111213 | Sub AddingBandedColumns ()Dim tbl As ListObjectТусклый лист как рабочий листУстановить sht = ThisWorkbook.ActiveSheetДля каждой табл. В шт.ListObjectstbl.ShowTableStyleColumnStripes = Истинаtbl.DataBodyRange.Font.Bold = ИстинаСледующая таблицаКонец подписки |
Результат:
Создание таблицы в Access в VBA с использованием DoCmd.RunSQL
Одним из основных способов создания таблицы в Access в VBA является использование метода DoCmd.RunSQL для выполнения запроса действия с оператором SQL.
У нас есть кнопка в нашем образце формы, и когда мы нажимаем на кнопку, мы хотим создать таблицу с именем ProductsTable с двумя полями или столбцами, одно будет полем первичного ключа с именем ProductsID, а другое будет полем с именем Sales.
Чтобы создать эту таблицу, мы будем использовать следующий код:
| 123456 | Частная подпрограмма cmdCreateProductsTable_Click ()DoCmd.RunSQL «СОЗДАТЬ ТАБЛИЦУ ProductsTable» _& «(ProductID INTEGER PRIMARY KEY, целое число продаж);»Конец подписки |
Результат:
Фильтрация таблицы в доступе с помощью VBA
Вы также можете фильтровать таблицу в Access с помощью метода DoCmd.ApplyFilter. У нас есть наша простая таблица, показанная ниже в Access, которая называется ProductsTable.
Мы хотели бы нажать эту кнопку в нашей форме, и тогда мы увидим только продажи, превышающие 1500.
Итак, мы бы использовали следующий код для этого:
| 1234567 | Частная подпрограмма cmdFilter_Click ()DoCmd.OpenTable «ProductsTable»DoCmd.ApplyFilter, «[Продажи]> 1500»Конец подписки |
Результат:
















