Вставка диапазона со сдвигом ячеек вправо или вниз методом 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 |
В этом случае седьмой столбец окажется на месте третьего столбца.
In certain cases, you may need to automate the process of inserting a row (or several rows) in a worksheet. This is useful, for example, when you’re (i) manipulating or adding data entries, or (ii) formatting a worksheet that uses blank rows for organization purposes.
The information and examples in this VBA Tutorial should allow you to insert rows in a variety of circumstances.
This VBA Tutorial is accompanied by Excel workbooks containing the data and macros I use in the examples below. You can get immediate free access to these example workbooks by clicking the button below.
Use the following Table of Contents to navigate to the section you’re interested in.
Insert Rows in Excel
When working manually with Excel, you can insert rows in the following 2 steps:
- Select the row or rows above which to insert the row or rows.
- Do one of the following:
- Right-click and select Insert.
- Go to Home > Insert > Insert Sheet Rows.
- Use the “Ctrl + Shift + +” keyboard shortcut.
You can use the VBA constructs and structures I describe below to automate this process to achieve a variety of results.
Excel VBA Constructs to Insert Rows
Insert Rows with the Range.Insert Method
Purpose of Range.Insert
Use the Range.Insert method to insert a cell range into a worksheet. The 2 main characteristics of the Range.Insert method are the following:
- Range.Insert can insert a single cell or a cell range. For purposes of this VBA Tutorial, you’re interested in inserting entire rows.
- To make space for the newly-inserted cells, Range.Insert shifts other cells away.
Syntax of Range.Insert
expression.Insert(Shift, CopyOrigin)
“expression” is a Range object. Therefore, I simplify as follows:
Range.Insert(Shift, CopyOrigin)
Parameters of Range.Insert
- Parameter: Shift.
- Description: Specifies the direction in which cells are shifted away to make space for the newly-inserted row.
- Optional/Required: Optional.
- Data type: Variant.
- Values: Use a constant from the xlInsertShiftDirection Enumeration:
- xlShiftDown or -4121: Shifts cells down.
- xlShiftToRight or -4161: Shifts cells to the right.
- Default: Excel decides based on the range’s shape.
- Usage notes: When you insert a row: (i) use xlShiftDown or -4121, or (ii) omit parameter and rely on the default behavior.
- Parameter: CopyOrigin.
- Description: Specifies from where (the origin) is the format for the cells in the newly inserted row copied.
- Optional/Required: Optional.
- Data type: Variant.
- Values: A constant from the xlInsertFormatOrigin Enumeration:
- xlFormatFromLeftOrAbove or 0: Newly-inserted cells take formatting from cells above or to the left.
- xlFormatFromRightOrBelow or 1: Newly-inserted cells take formatting from cells below or to the right.
- Default: xlFormatFromLeftOrAbove or 0. Newly-inserted cells take the formatting from cells above or to the left.
How to Use Range.Insert to Insert Rows
Use the Range.Insert method to insert a row into a worksheet. Use a statement with the following structure:
Range.Insert Shift:=xlShiftDown CopyOrigin:=xlInsertFormatOriginConstant
For these purposes:
- Range: Range object representing an entire row. Use the Worksheet.Rows or Range.EntireRow properties to return a Range object that represents the entire row. Please refer to the sections about the Rows and EntireRow properties below.
- xlInsertFormatOriginConstant: xlFormatFromLeftOrAbove or xlFormatFromRightOrBelow. xlFormatFromLeftOrAbove is the default value. Therefore, when inserting rows with formatting from row above, you can usually omit the CopyOrigin parameter.
You can usually omit the Shift parameter. By default, VBA decides how to shift the cells based on the range’s shape. When inserting a row, this usually results in Excel shifting the cells down.
Specify Rows with the Worksheet.Rows Property
Purpose of Worksheet.Rows
Use the Worksheet.Rows property to return a Range object representing all the rows within the worksheet the property works with.
Worksheet.Rows is read-only.
Syntax of Worksheet.Rows
expression.Rows
“expression” is a Worksheet object. Therefore, I simplify as follows:
Worksheet.Rows
How to Use Worksheet.Rows to Insert Rows
Use the Worksheet.Rows property to specify the row or rows above which new rows are inserted.
To insert a row, use a statement with the following structure:
Worksheets.Rows(row#).Insert
“row#” is the number of the row above which the row is inserted.
To insert multiple rows, use a statement with the following structure:
Worksheet.Rows("firstRow#:lastRow#").Insert
“firstRow#” is the row above which the rows are inserted. The number of rows VBA inserts is calculated as follows:
lastRow# - firstRow# + 1
Specify the Active Cell with the Application.ActiveCell Property
Purpose of Application.ActiveCell
Use the Application.ActiveCell property to return a Range object representing the active cell.
Application.ActiveCell is read-only.
Syntax of Application.ActiveCell
expression.ActiveCell
“expression” is the Application object. Therefore, I simplify as follows:
Application.ActiveCell
How to Use Application.ActiveCell To Insert Rows
When you insert a row, use the Application.ActiveCell property to return the active cell. This allows you to use the active cell as reference for the row insertion operation.
Use the Range.Offset property to return a Range object a specific number of rows above or below the active cell. Use the Range.EntireRow property to return a Range object representing the entire row or rows above which to insert the new row. Please refer to the sections about the Offset and EntireRow properties below.
To insert a row above the active cell, use the following statement:
ActiveCell.EntireRow.Insert Shift:=xlShiftDown
To insert a row a specific number of rows above or below the active cell, use a statement with the following structure:
ActiveCell.Offset(RowOffset).EntireRow.Insert Shift:=xlShiftDown
Specify a Cell Range with the Worksheet.Range Property
Purpose of Worksheet.Range
Use the Worksheet.Range property to return a Range object representing a single cell or a cell range.
Syntax of Worksheet.Range
expression.Range(Cell1, Cell2)
“expression” is a Worksheet object. Therefore, I simplify as follows:
Worksheet.Range(Cell1, Cell2)
Parameters of Worksheet.Range
- Parameter: Cell1.
- Description:
- If you use Cell1 alone (omit Cell2), Cell1 specifies the cell range.
- If you use Cell1 and Cell2, Cell1 specifies the cell in the upper-left corner of the cell range.
- Required/Optional: Required.
- Data type: Variant.
- Values:
- If you use Cell1 alone (omit Cell2): (i) range address as an A1-style reference in language of macro, or (ii) range name.
- If you use Cell1 and Cell2: (i) Range object, (ii) range address, or (iii) range name.
- Description:
- Parameter: Cell2.
- Description: Cell in the lower-right corner of the cell range.
- Required/Optional: Optional.
- Data type: Variant.
- Values: (i) Range object, (ii) range address, or (iii) range name.
How to Use Worksheet.Range to Insert Rows
When you insert a row, use the Worksheet.Range property to return a cell or cell range. This allows you to use a specific cell or cell range as reference for the row insertion operation.
Use the Range.Offset property to return a Range object a specific number of rows above or below the cell or cell range. Use the Range.EntireRow property to return a Range object representing the entire row or rows above which to insert the new row or rows. Please refer to the sections about the Offset and EntireRow properties below.
To insert rows above the cell range specified by Worksheet.Range, use a statement with the following structure:
Worksheet.Range(Cell1, Cell2).EntireRow.Insert Shift:=xlShiftDown
To insert rows a specific number of rows above or below the cell range specified by Worksheet.Range use a statement with the following structure:
Worksheet.Range(Cell1, Cell2).Offset(RowOffset).EntireRow.Insert Shift:=xlShiftDown
If the cell range represented by the Worksheet.Range property spans more than 1 row, the Insert method inserts several rows. The number of rows inserted is calculated as follows:
lastRow# - firstRow# + 1
Please refer to the section about the Worksheet.Rows property above for further information about this calculation.
Specify a Cell with the Worksheet.Cells and Range.Item Properties
Purpose of Worksheet.Cells and Range.Item
Use the Worksheet.Cells property to return a Range object representing all the cells within a worksheet.
Once your macro has all the cells within the worksheet, use the Range.Item property to return a Range object representing one of those cells.
Syntax of Worksheet.Cells and Range.Item
Worksheet.Cells
expression.Cells
“expression” is a Worksheet object. Therefore, I simplify as follows:
Worksheet.Cells
Range.Item
expression.Item(RowIndex, ColumnIndex)
“expression” is a Range object. Therefore, I simplify as follows:
Range.Item(RowIndex, ColumnIndex)
Worksheet.Cells and Range.Item Together
Considering the above:
Worksheet.Cells.Item(RowIndex, ColumnIndex)
However, Item is the default property of the Range object. Therefore, you can generally omit the Item keyword before specifying the RowIndex and ColumnIndex arguments. I simplify as follows:
Worksheet.Cells(RowIndex, ColumnIndex)
Parameters of Worksheet.Cells and Range.Item
- Parameter: RowIndex.
- Description:
- If you use RowIndex alone (omit ColumnIndex), RowIndex specifies the index of the cell you work with. Cells are numbered from left-to-right and top-to-bottom.
- If you use RowIndex and ColumnIndex, RowIndex specifies the row number of the cell you work with.
- Required/Optional: Required.
- Data type: Variant.
- Values: You usually specify RowIndex as a value.
- Description:
- Parameter: ColumnIndex.
- Description: Column number or letter of the cell you work with.
- Required/Optional: Optional.
- Data type: Variant.
- Values: You usually specify ColumnIndex as a value (column number) or letter within quotations (“”).
How to use Worksheet.Cells and Range.Item to Insert Rows
When you insert a row, use the Worksheet.Cells and Range.Item properties to return a cell. This allows you to use a specific cell as reference for the row insertion operation.
Use the Range.Offset property to return a Range object a specific number of rows above or below the cell. Use the Range.EntireRow property to return a Range object representing the entire row above which to insert the row. Please refer to the sections about the Offset and EntireRow properties below.
To insert a row above the cell specified by Worksheet.Cells, use a statement with the following structure:
Worksheet.Cells(RowIndex, ColumnIndex).EntireRow.Insert Shift:=xlShiftDown
To insert a row a specific number of rows above or below the cell specified by Worksheet.Cells, use a statement with the following structure:
Worksheet.Cells(RowIndex, ColumnIndex).Offset(RowOffset).EntireRow.Insert Shift:=xlShiftDown
Specify a Cell Range a Specific Number of Rows Below or Above a Cell or Cell Range with the Range.Offset Property
Purpose of Range.Offset
Use the Range.Offset property to return a Range object representing a cell range located a number of rows or columns away from the range the property works with.
Syntax of Range.Offset
expression.Offset(RowOffset, ColumnOffset)
“expression” is a Range object. Therefore, I simplify as follows:
Range.Offset(RowOffset, ColumnOffset)
Parameters of Range.Offset
- Parameter: RowOffset.
- Description: Number of rows by which cell or cell range is offset.
- Required/Optional: Optional.
- Data type: Variant.
- Values:
- Positive number: Moves down the worksheet.
- Negative number: Moves up the worksheet.
- 0: Stays on the same row.
- Default: 0. Stays on the same row.
- Parameter: ColumnOffset.
- Description: Number of columns by which cell or cell range is offset.
- Required/Optional: Optional.
- Data type: Variant.
- Values:
- Positive number: Moves towards the right of the worksheet.
- Negative number: Moves towards the left of the worksheet.
- 0: Stays on the same column.
- Default: 0. Stays on the same column.
- Usage notes: When you insert a row, you can usually omit the ColumnOffset parameter. You’re generally interested in moving a number of rows (not columns) above or below.
How to Use Range.Offset to Insert Rows
When you insert a row, use the Range.Offset property to specify a cell or cell range located a specific number of rows below above another cell or cell range. This allows you to use this new cell or cell range as reference for the row insertion operation.
Use properties such as Application.ActiveCell, Worksheet.Range and Worksheet.Cells to specify the base range the Offset property works with. Please refer to the sections about the ActiveCell, Range and Cells properties above.
Specify Entire Row with the Range.EntireRow Property
Purpose of Range.EntireRow
Use the Range.EntireRow property to return a Range object representing the entire row or rows containing the cell range the property works with.
Range.EntireRow is read-only.
Syntax of Range.EntireRow
expression.EntireRow
“expression” is a Range object. Therefore, I simplify as follows:
Range.EntireRow
How to Use Range.EntireRow to Insert Rows
When you insert a row, use the Range.EntireRow property to return the entire row or rows above which the new row or rows are inserted.
Use properties such as Application.ActiveCell, Worksheet.Range and Worksheet.Cells to specify the range the EntireRow property works with. Please refer to the sections about the ActiveCell, Range and Cells properties above.
Clear Row Formatting with the Range.ClearFormats Method
Purpose of Range.ClearFormats
Use the Range.ClearFormats method to clear the formatting of a cell range.
Syntax of Range.ClearFormats
expression.ClearFormats
“expression” is a Range object. Therefore, I simplify as follows:
Range.ClearFormats
How to Use Range.ClearFormats to Insert Rows
The format of the newly-inserted row is specified by the CopyOrigin parameter of the Range.Insert method. Please refer to the description of Range.Insert and CopyOrigin above.
When you insert a row, use the Range.ClearFormats method to clear the formatting of the newly-inserted rows. Use a statement with the following structure after the statement that inserts the new row (whose formatting you want to clear):
Range.ClearFormats
“Range” is a Range object representing the newly-inserted row.
Use the Worksheet.Rows or Range.EntireRow properties to return a Range object that represents the newly-inserted row. Please refer to the sections about the Rows and EntireRow properties above.
Copy Rows with the Range.Copy Method
Purpose of Range.Copy
Use the Range.Copy method to copy a cell range to another cell range or the Clipboard.
Syntax of Range.Copy
expression.Copy(Destination)
“expression” is a Range object. Therefore, I simplify as follows:
Range.Copy(Destination)
Parameters of Range.Copy
- Parameter: Destination.
- Description: Specifies the destination cell range to which the copied cell range is copied.
- Required/Optional: Optional parameter.
- Data type: Variant.
- Values: You usually specify Destination as a Range object.
- Default: Cell range is copied to the Clipboard.
- Usage notes: When you insert a copied row, omit the Destination parameter to copy the row to the Clipboard.
How to Use Range.Copy to Insert Rows
Use the Range.Copy method to copy a row which you later insert.
Use a statement with the following structure before the statement that inserts the row:
Range.Copy
“Range” is a Range object representing an entire row.
Use the Worksheet.Rows or Range.EntireRow properties to return a Range object that represents a row. Please refer to the sections about the Rows and EntireRow properties above.
Related VBA and Macro Tutorials
- General VBA constructs and structures:
- Introduction to Excel VBA constructs and structures.
- The Excel VBA Object Model.
- How to declare variables in Excel VBA.
- Excel VBA data types.
- Practical VBA applications and macro examples:
- How to copy and paste with Excel VBA.
You can find additional VBA and Macro Tutorials in the Archives.
Example Workbooks
This VBA Tutorial is accompanied by Excel workbooks containing the data and macros I explain below. If you want to follow and practice, you can get immediate free access to these example workbooks by clicking the button below.
Each worksheet within the workbook contains a single data range. Most of the entries simply state “Data”.
Example #1: Excel VBA Insert Row
VBA Code to Insert Row
The following macro inserts a row below row 5 of the worksheet named “Insert row”.
Sub insertRow() 'Source: powerspreadsheets.com/ 'For further information: https://powerspreadsheets.com/excel-vba-insert-row/ Worksheets("Insert row").Rows(6).Insert Shift:=xlShiftDown End Sub
Process Followed by Macro
VBA Statement Explanation
Worksheets(“Insert row”).Rows(6).Insert Shift:=xlShiftDown
- Item: Worksheets(“Insert row”).
- VBA construct: Workbook.Worksheets property.
- Description: Returns a Worksheet object representing the “Insert row” worksheet.
- Item: Rows(6).
- VBA construct: Worksheets.Rows property.
- Description: Returns a Range object representing row 6 of the worksheet returned by item #1 above.
- Item: Insert.
- VBA construct: Range.Insert method.
- Description: Inserts a new row above the row returned by item #2 above.
- Item: Shift:=xlShiftDown.
- VBA construct: Shift parameter of Range.Insert method.
- Description:
- Shifts rows down (xlShiftDown) to make space for the row inserted by item #3 above.
- You can usually omit this parameter. By default, VBA decides how to shift the cells based on the range’s shape. When inserting a row, this usually results in Excel shifting the cells down.
Effects of Executing the Macro
The following GIF illustrates the results of executing this macro. As expected, VBA inserts a row below row 5 of the worksheet.
Example #2: Excel VBA Insert Multiple Rows
VBA Code to Insert Multiple Rows
The following macro inserts 5 rows below row 10 of the worksheet named “Insert row”.
Sub insertMultipleRows() 'Source: powerspreadsheets.com/ 'For further information: https://powerspreadsheets.com/excel-vba-insert-row/ Worksheets("Insert row").Rows("11:15").Insert Shift:=xlShiftDown End Sub
Process Followed by Macro
VBA Statement Explanation
Worksheets(“Insert row”).Rows(“11:15”).Insert Shift:=xlShiftDown
- Item: Worksheets(“Insert row”).
- VBA construct: Workbook.Worksheets property.
- Description: Returns a Worksheet object representing the “Insert row” worksheet.
- Item: Rows(“11:15”).
- VBA construct: Worksheet.Rows property.
- Description: Returns a Range object representing rows 11 to 15 of the worksheet returned by item #1 above.
- Item: Insert.
- VBA construct: Range.Insert method.
- Description:
- Inserts new rows above the rows returned by item #2 above.
- The number of inserted rows is equal to the number of rows returned by item #2 above. This is calculated as follows:
lastRow# - firstRow# + 1
In this example:
15 - 11 + 1 = 5
- Item: Shift:=xlShiftDown.
- VBA construct: Shift parameter of Range.Insert method.
- Description:
- Shifts rows down (xlShiftDown) to make space for the rows inserted by item #3 above.
- You can usually omit this parameter. By default, VBA decides how to shift the cells based on the range’s shape. When inserting a row, this usually results in Excel shifting the cells down.
Effects of Executing the Macro
The following GIF illustrates the results of executing this macro. As expected, VBA inserts 5 rows below row 10 of the worksheet.
Example #3: Excel VBA Insert Row with Same Format as Row Above
VBA Code to Insert Row with Same Format as Row Above
The following macro (i) inserts a row below row 20, and (ii) applies the formatting of row 20 to the newly-inserted row.
Sub insertRowFormatFromAbove() 'Source: powerspreadsheets.com/ 'For further information: https://powerspreadsheets.com/excel-vba-insert-row/ Worksheets("Insert row").Rows(21).Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromLeftOrAbove End Sub
Process Followed by Macro
VBA Statement Explanation
Worksheets(“Insert row”).Rows(21).Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromLeftOrAbove
- Item: Worksheets(“Insert row”).
- VBA construct: Workbook.Worksheets property.
- Description: Returns a Worksheet object representing the “Insert row” worksheet.
- Item: Rows(21).
- VBA construct: Worksheet.Rows property.
- Description: Returns a Range object representing row 21 of the worksheet returned by item #1 above.
- Item: Insert.
- VBA construct: Range.Insert method.
- Description: Inserts a new row above the row returned by item #2 above.
- Item: Shift:=xlShiftDown.
- VBA construct: Shift parameter of Range.Insert method.
- Description:
- Shifts rows down (xlShiftDown) to make space for the row inserted by item #3 above.
- You can usually omit this parameter. By default, VBA decides how to shift the cells based on the range’s shape. When inserting a row, this usually results in Excel shifting the cells down.
- Item: CopyOrigin:=xlFormatFromLeftOrAbove.
- VBA construct: CopyOrigin parameter of Range.Insert method.
- Description:
- Sets formatting of row inserted by item #3 above to be equal to that of row above (xlFormatFromLeftOrAbove).
- You can usually omit this parameter. xlFormatFromLeftOrAbove (or 0) is the default value of CopyOrigin.
Effects of Executing the Macro
The following GIF illustrates the results of executing this macro. As expected, VBA (i) inserts a row below row 20, and (ii) applies the formatting of row 20 to the newly-inserted row.
Example #4: Excel VBA Insert Row with Same Format as Row Below
VBA Code to Insert Row with Same Format as Row Below
The following macro (i) inserts a row below row 25, and (ii) applies the formatting of the row below to the newly-inserted row.
Sub insertRowFormatFromBelow() 'Source: powerspreadsheets.com/ 'For further information: https://powerspreadsheets.com/excel-vba-insert-row/ Worksheets("Insert row").Rows(26).Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromRightOrBelow End Sub
Process Followed by Macro
VBA Statement Explanation
Worksheets(“Insert row”).Rows(26).Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromRightOrBelow
- Item: Worksheets(“Insert row”).
- VBA construct: Workbook.Worksheets property.
- Description: Returns a Worksheet object representing the “Insert row” worksheet.
- Item: Rows(26).
- VBA construct: Worksheet.Rows property.
- Description: Returns a Range object representing row 26 of the worksheet returned by item #1 above.
- Item: Insert.
- VBA construct: Range.Insert method.
- Description: Inserts a new row above the row returned by item #2 above.
- Item: Shift:=xlShiftDown.
- VBA construct: Shift parameter of Range.Insert method.
- Description:
- Shifts rows down (xlShiftDown) to make space for the row inserted by item #3 above.
- You can usually omit this parameter. By default, VBA decides how to shift the cells based on the range’s shape. When inserting a row, this usually results in Excel shifting the cells down.
- Item: CopyOrigin:=xlFormatFromRightOrBelow.
- VBA construct: CopyOrigin parameter of Range.Insert method.
- Description: Sets formatting of row inserted by item #3 above to be equal to that of row below (xlFormatFromRightOrBelow).
Effects of Executing the Macro
The following GIF illustrates the results of executing this macro. As expected, VBA (i) inserts a row below row 25, and (ii) applies the formatting of the row below to the newly-inserted row.
Example #5: Excel VBA Insert Row without Formatting
VBA Code to Insert Row without Formatting
The following macro inserts a row below row 30 without applying the formatting from the rows above or below the newly- inserted row.
Sub insertRowWithoutFormat() 'Source: powerspreadsheets.com/ 'For further information: https://powerspreadsheets.com/excel-vba-insert-row/ Dim myNewRowNumber As Long myNewRowNumber = 31 With Worksheets("Insert row") .Rows(myNewRowNumber).Insert Shift:=xlShiftDown .Rows(myNewRowNumber).ClearFormats End With End Sub
Process Followed by Macro
VBA Statement Explanation
Lines #4 and #5: Dim myNewRowNumber As Long | myNewRowNumber = 31
- Item: Dim myNewRowNumber As Long.
- VBA construct: Dim statement.
- Description:
- Declares a new variable (myNewRowNumber) as of the Long data type.
- myNewRowNumber represents the number of the newly inserted row.
- Item: myNewRowNumber = 31.
- VBA construct: Assignment statement.
- Description: Assigns the value 31 to myNewRowNumber
Lines #6 and #9: With Worksheets(“Insert row”) | End With
- Item: With | End With.
- VBA construct: With… End With statement.
- Description: Statements within the With… End With statement (lines #7 and #8 below) are executed on the worksheet returned by item #2 below.
- Item: Worksheets(“Insert row”).
- VBA construct: Workbook.Worksheets property.
- Description: Returns a Worksheet object representing the “Insert row” worksheet.
Line #7: .Rows(myNewRowNumber).Insert Shift:=xlShiftDown
- Item: Rows(myNewRowNumber).
- VBA construct: Worksheet.Rows property.
- Description:
- Returns a Range object representing a row (whose number is represented by myNewRowNumber) of the worksheet in the opening statement of the With… End With statement (line #6 above).
- In this example, myNewRowNumber equals 31. Therefore, Worksheet.Rows returns row 31 prior to the insertion of the new row. This is a different row from that returned by Worksheet.Rows in line #8 below.
- This line #7 returns a row prior to the row insertion. This line is that above which the new row is inserted.
- Line #8 below returns a row after the row insertion. This line is the newly-inserted row.
- Item: Insert.
- VBA construct: Range.Insert method.
- Description: Inserts a new row above the row returned by item #1 above.
- Item: Shift:=xlShiftDown.
- VBA construct: Shift parameter of Range.Insert method.
- Description:
- Shifts rows down (xlShiftDown) to make space for the row inserted by item #2 above.
- You can usually omit this parameter. By default, VBA decides how to shift the cells based on the range’s shape. When inserting a row, this usually results in Excel shifting the cells down.
Line #8: .Rows(myNewRowNumber).ClearFormats
- Item: Rows(myNewRowNumber).
- VBA construct: Worksheet.Rows property.
- Description:
- Returns a Range object representing a row (whose number is represented by myNewRowNumber) of the worksheet in the opening statement of the With… End With statement (line #6 above).
- In this example, myNewRowNumber equals 31. Therefore, Worksheet.Rows returns row 31 after the insertion of the new row. This is a different row from that returned by Worksheet.Rows in line #7 above.
- This line #8 returns a row after the row insertion. This line is the newly-inserted row.
- Line #7 above returns a row prior to the row insertion. This line is that below the newly-inserted row.
- Item: ClearFormats.
- VBA construct: Range.ClearFormats method.
- Description: Clears the formatting of the row returned by item #1 above.
Effects of Executing the Macro
The following GIF illustrates the results of executing this macro. As expected, VBA inserts a row below row 30 without applying the formatting from the rows above or below the newly- inserted row.
Example #6: Excel VBA Insert Row Below Active Cell
VBA Code to Insert Row Below Active Cell
The following macro inserts a row below the active cell.
Sub insertRowBelowActiveCell() 'Source: powerspreadsheets.com/ 'For further information: https://powerspreadsheets.com/excel-vba-insert-row/ ActiveCell.Offset(1).EntireRow.Insert Shift:=xlShiftDown End Sub
Process Followed by Macro
VBA Statement Explanation
ActiveCell.Offset(1).EntireRow.Insert Shift:=xlShiftDown
- Item: ActiveCell.
- VBA construct: Application.ActiveCell property.
- Description: Returns a Range object representing the active cell.
- Item: Offset(1).
- VBA construct: Range.Offset property.
- Description:
- Returns a Range object representing the cell range 1 row below the cell returned by item #1 above.
- In this example, Range.Offset returns the cell immediately below the active cell.
- Item: EntireRow:
- VBA construct: Range.EntireRow property.
- Description: Returns a Range object representing the entire row containing the cell range returned by item #2 above.
- Item: Insert.
- VBA construct: Range.Insert method.
- Description: Inserts a new row above the row returned by item #3 above.
- Item: Shift:=xlShiftDown.
- VBA construct: Shift parameter of Range.Insert method.
- Description:
- Shifts rows down (xlShiftDown) to make space for the row inserted by item #4 above.
- You can usually omit this parameter. By default, VBA decides how to shift the cells based on the range’s shape. When inserting a row, this usually results in Excel shifting the cells down.
Effects of Executing the Macro
The following GIF illustrates the results of executing this macro. When I execute the macro, the active cell is B35. As expected, inserts a row below the active cell.
Example #7: Excel VBA Insert Copied Row
VBA Code to Insert Copied Row
The following macro (i) copies row 45, and (ii) inserts the copied row below row 40.
Sub insertCopiedRow() 'Source: powerspreadsheets.com/ 'For further information: https://powerspreadsheets.com/excel-vba-insert-row/ With Worksheets("Insert row") .Rows(45).Copy .Rows(41).Insert Shift:=xlShiftDown End With Application.CutCopyMode = False End Sub
Process Followed by Macro
VBA Statement Explanation
Lines #4 and #7: With Worksheets(“Insert row”) | End With
- Item: With | End With.
- VBA construct: With… End With statement.
- Description: Statements within the With… End With statement (lines #5 and #6 below) are executed on the worksheet returned by item #2 below.
- Item: Worksheets(“Insert row”).
- VBA construct: Workbook.Worksheets property.
- Description: Returns a Worksheet object representing the “Insert row” worksheet.
Line #5: .Rows(45).Copy
- Item: Rows(45).
- VBA construct: Worksheet.Rows property.
- Description: Returns a Range object representing row 45 of the worksheet in the opening statement of the With… End With statement (line #4 above).
- Item: Copy.
- VBA construct: Range.Copy method.
- Description: Copies the row returned by item #1 above to the Clipboard.
Line #6: .Rows(41).Insert Shift:=xlShiftDown
- Item: Rows(41).
- VBA construct: Worksheet.Rows property.
- Description: Returns a Range object representing row 41 of the worksheet in the opening statement of the With… End With statement (line #4 above).
- Item: Insert.
- VBA construct: Range.Insert method.
- Description:
- Inserts a new row above the row returned by item #1 above.
- The newly-inserted row isn’t blank. VBA inserts the row copied by line #5 above.
- Item: Shift:=xlShiftDown.
- VBA construct: Shift parameter of Range.Insert method.
- Description:
- Shifts rows down (xlShiftDown) to make space for the row inserted by item #2 above.
- You can usually omit this parameter. By default, VBA decides how to shift the cells based on the range’s shape. When inserting a row, this usually results in Excel shifting the cells down.
Line #8: Application.CutCopyMode = False
- Item: Application.CutCopyMode = False.
- VBA construct: Application.CutCopyMode property.
- Description: Cancels (False) the Cut or Copy mode and removes the moving border that accompanies this mode.
Effects of Executing the Macro
The following GIF illustrates the results of executing this macro. As expected, VBA (i) copies row 45, and (ii) inserts the copied row below row 40.
Example #8: Excel VBA Insert Blank Rows Between Rows in a Data Range
VBA Code to Insert Blank Rows Between Rows in a Data Range
The following macro inserts blank rows within the specified data range. This results in all rows within the data range being separated by a blank row.
Sub insertBlankRowsBetweenRows() 'Source: powerspreadsheets.com/ 'For further information: https://powerspreadsheets.com/excel-vba-insert-row/ Dim myFirstRow As Long Dim myLastRow As Long Dim myWorksheet As Worksheet Dim iCounter As Long myFirstRow = 5 Set myWorksheet = Worksheets("Insert blank rows") myLastRow = myWorksheet.Cells.Find( _ What:="*", _ LookIn:=xlFormulas, _ LookAt:=xlPart, _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious).Row For iCounter = myLastRow To (myFirstRow + 1) Step -1 myWorksheet.Rows(iCounter).Insert Shift:=xlShiftDown Next iCounter End Sub
Process Followed by Macro
VBA Statement Explanation
Lines #4 through #9: Dim myFirstRow As Long | Dim myLastRow As Long | Dim myWorksheet As Worksheet | Dim iCounter As Long | myFirstRow = 5 | Set myWorksheet = Worksheets(“Insert blank rows”)
- Item: Dim myFirstRow As Long.
- VBA construct: Dim statement.
- Description:
- Declares a new variable (myFirstRow) as of the Long data type.
- myFirstRow represents the number of the first row with data in the data range you work with.
- Item: Dim myLastRow As Long.
- VBA construct: Dim statement.
- Description:
- Declares a new variable (myLastRow) as of the Long data type.
- myLastRow represents the number of the last row with data in the data range you work with.
- Item: Dim myWorksheet As Worksheet.
- VBA construct: Dim statement.
- Description:
- Declares a new object variable (myWorksheet) to reference a Worksheet object.
- myWorksheet represents the worksheet you work with.
- Item: Dim iCounter As Long.
- VBA construct: Dim statement.
- Description:
- Declares a new variable (iCounter) as of the Long data type.
- iCounter represents a loop counter.
- Item: myFirstRow = 5.
- VBA construct: Assignment statement.
- Description: Assigns the value 5 to myFirstRow.
- Item: Set myWorksheet = Worksheets(“Insert blank rows”).
- VBA constructs:
- Set statement.
- Workbooks.Worksheets property.
- Description: Assigns the Worksheet object representing the “Insert blank rows” worksheet to myWorksheet.
- VBA constructs:
Lines #10 through #15: myLastRow = myWorksheet.Cells.Find( What:=”*”, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
- Item: myLastRow =.
- VBA construct: Assignment statement.
- Description: Assigns the value returned by items #2 through #9 below to myLastRow.
- Item: myWorksheet.Cells.
- VBA construct: Worksheet.Cells property.
- Description: Returns a Range object representing all cells on myWorksheet.
- Item: Find.
- VBA construct: Range.Find method.
- Description:
- Finds information in the cell range returned by item #2 above and returns a Range object representing the first cell where the information is found.
- In this example, the Range object Range.Find returns represents the last cell with data in last row with data in myWorksheet.
- Item: What:=”*”.
- VBA construct: What parameter of Range.Find method.
- Description: Specifies the data Range.Find searches for. The asterisk (*) is a wildcard and, therefore, Range.Find searches for any character sequence.
- Item: LookIn:=xlFormulas.
- VBA construct: LookIn parameter of Range.Find method.
- Description: Specifies that Range.Find looks in formulas (xlFormulas).
- Item: LookAt:=xlPart.
- VBA construct: LookAt parameter of Range.Find method.
- Description: Specifies that Range.Find looks at (and matches) a part (xlPart) of the search data.
- Item: SearchOrder:=xlByRows.
- VBA construct: SearchOrder parameter of Range.Find method.
- Description: Specifies that Range.Find searches by rows (xlByRows).
- Item: SearchDirection:=xlPrevious.
- VBA construct: SearchDirection parameter of Range.Find method.
- Description: Specifies that Range.Find searches for the previous match (xlPrevious).
- Item: Row.
- VBA construct: Range.Row property.
- Description:
- Returns the row number of the Range object returned by item #3 above.
- In this example, the number returned by Range.Row corresponds to the last row with data in myWorksheet.
Lines #16 and #18: For iCounter = myLastRow To (myFirstRow + 1) Step -1 | Next iCounter
- Item: For | Next iCounter.
- VBA construct: For… Next statement.
- Description:
- Repeats the statement inside the For… Next loop (line #17 below) a specific number of times.
- In this example:
- The macro starts on the last row of the data range as specified by item #2 below.
- Every iteration, the loop counter decreases by 1, as specified by item #4 below. Therefore, the macro moves to the previous row.
- The macro exits the loop after working with the second row in the data range (myFirstRow + 1), as specified by item #3 below.
- Item: iCounter = myLastRow.
- VBA construct: Counter and Start of For… Next statement.
- Description: Specifies myLastRow as the initial value of the loop counter (iCounter).
- Item: To (myFirstRow + 1).
- VBA construct: End of For… Next statement.
- Description: Specifies the value represented by myFirstRow plus 1 (myFirstRow + 1) as the final value of the loop counter.
- Item: Step -1.
- VBA construct: Step of For… Next statement.
- Description: Specifies that the loop counter (iCounter) decreases by 1 (-1) every loop iteration.
Line #17: myWorksheet.Rows(iCounter).Insert Shift:=xlShiftDown
- Item: myWorksheet.Rows(iCounter).
- VBA construct: Worksheet.Rows property.
- Description:
- Returns a Range object representing the row (whose number is represented by iCounter) of myWorksheet.
- Worksheet.Rows returns the row through which the macro is currently looping.
- Item: Insert.
- VBA construct: Range.Insert method.
- Description:
- Inserts a new row above the row returned by item #1 above.
- The macro loops through each line in the data range (excluding the first) as specified by lines #16 and #18 above. Therefore, Range.Insert inserts a row between all rows with data.
- Item: Shift:=xlShiftDown.
- VBA construct: Shift parameter of Range.Insert method.
- Description:
- Shifts rows down (xlShiftDown) to make space for the row inserted by item #2 above.
- You can usually omit this parameter. By default, VBA decides how to shift the cells based on the range’s shape. When inserting a row, this usually results in Excel shifting the cells down.
Effects of Executing the Macro
The following GIF illustrates the results of executing this macro. As expected, VBA inserts blank rows within the specified data range. This results in all rows within the data range being separated by a blank row.
Example #9: Excel VBA Insert a Number of Rows Every Number of Rows in a Data Range
VBA Code to Insert a Number of Rows Every Number of Rows in a Data Range
The following macro inserts 2 rows every 3 rows within the specified data range.
Sub insertMRowsEveryNRows() 'Source: powerspreadsheets.com/ 'For further information: https://powerspreadsheets.com/excel-vba-insert-row/ Dim myFirstRow As Long Dim myLastRow As Long Dim myNRows As Long Dim myRowsToInsert As Long Dim myWorksheet As Worksheet Dim iCounter As Long myFirstRow = 5 myNRows = 3 myRowsToInsert = 2 Set myWorksheet = Worksheets("Insert M rows every N rows") myLastRow = myWorksheet.Cells.Find( _ What:="*", _ LookIn:=xlFormulas, _ LookAt:=xlPart, _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious).Row For iCounter = myLastRow To (myFirstRow + myNRows) Step -1 If (iCounter - myFirstRow) Mod myNRows = 0 Then myWorksheet.Rows(iCounter & ":" & iCounter + myRowsToInsert - 1).Insert Shift:=xlShiftDown Next iCounter End Sub
Process Followed by Macro
VBA Statement Explanation
Lines #4 through 13: Dim myFirstRow As Long | Dim myLastRow As Long | Dim myNRows As Long | Dim myRowsToInsert As Long | Dim myWorksheet As Worksheet | Dim iCounter As Long | myFirstRow = 5 | myNRows = 3 | myRowsToInsert = 2 | Set myWorksheet = Worksheets(“Insert M rows every N rows”)
- Item: Dim myFirstRow As Long.
- VBA construct: Dim statement.
- Description:
- Declares a new variable (myFirstRow) as of the Long data type.
- myFirstRow represents the number of the first row with data in the data range you work with.
- Item: Dim myLastRow As Long.
- VBA construct: Dim statement.
- Description:
- Declares a new variable (myLastRow) as of the Long data type.
- myLastRow represents the number of the last row with data in the data range you work with.
- Item: Dim myNRows As Long.
- VBA construct: Dim statement.
- Description:
- Declares a new variable (myNRows) as of the Long data type.
- myNRows represents the number of rows per block. The macro doesn’t insert rows between these rows.
- Item: Dim myRowsToInsert As Long.
- VBA construct: Dim statement.
- Description:
- Declares a new variable (myRowsToInsert) as of the Long data type.
- myRowsToInsert represents the number of rows to insert.
- Item: Dim myWorksheet As Worksheet.
- VBA construct: Dim statement.
- Description:
- Declares a new object variable (myWorksheet) to reference a Worksheet object.
- myWorksheet represents the worksheet you work with.
- Item: Dim iCounter As Long.
- VBA construct: Dim statement.
- Description:
- Declares a new variable (iCounter) as of the Long data type.
- iCounter represents a loop counter.
- Item: myFirstRow = 5.
- VBA construct: Assignment statement.
- Description: Assigns the value 5 to myFirstRow.
- Item: myNRows = 3.
- VBA construct: Assignment statement.
- Description: Assigns the value 3 to myNRows.
- Item: myRowsToInsert = 2.
- VBA construct: Assignment statement.
- Description: Assigns the value 2 to myRowsToInsert.
- Item: Set myWorksheet = Worksheets(“Insert M rows every N rows”).
- VBA constructs:
- Set statement.
- Workbooks.Worksheets property.
- Description: Assigns the Worksheet object representing the “Insert M rows every N rows” worksheet to myWorksheet.
- VBA constructs:
Lines #14 through #19: myLastRow = myWorksheet.Cells.Find( What:=”*”, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
- Item: myLastRow =.
- VBA construct: Assignment statement.
- Description: Assigns the value returned by items #2 through #9 below to myLastRow.
- Item: myWorksheet.Cells.
- VBA construct: Worksheet.Cells property.
- Description: Returns a Range object representing all cells on myWorksheet.
- Item: Find.
- VBA construct: Range.Find method.
- Description:
- Finds information in the cell range returned by item #2 above and returns a Range object representing the first cell where the information is found.
- In this example, the Range object Range.Find returns represents the last cell with data in last row with data in myWorksheet.
- Item: What:=”*”.
- VBA construct: What parameter of Range.Find method.
- Description: Specifies the data Range.Find searches for. The asterisk (*) is a wildcard and, therefore, Range.Find searches for any character sequence.
- Item: LookIn:=xlFormulas.
- VBA construct: LookIn parameter of Range.Find method.
- Description: Specifies that Range.Find looks in formulas (xlFormulas).
- Item: LookAt:=xlPart.
- VBA construct: LookAt parameter of Range.Find method.
- Description: Specifies that Range.Find looks at (and matches) a part (xlPart) of the search data.
- Item: SearchOrder:=xlByRows.
- VBA construct: SearchOrder parameter of Range.Find method.
- Description: Specifies that Range.Find searches by rows (xlByRows).
- Item: SearchDirection:=xlPrevious.
- VBA construct: SearchDirection parameter of Range.Find method.
- Description: Specifies that Range.Find searches for the previous match (xlPrevious).
- Item: Row.
- VBA construct: Range.Row property.
- Description:
- Returns the row number of the Range object returned by item #3 above.
- In this example, the number returned by Range.Row corresponds to the last row with data in myWorksheet.
Lines #20 and #22: For iCounter = myLastRow To (myFirstRow + myNRows) Step -1 | Next iCounter
- Item: For | Next iCounter.
- VBA construct: For… Next statement.
- Description:
- Repeats the statement inside the For… Next loop (line #21 below) a specific number of times.
- In this example:
- The macro starts on the last row of the data range as specified by item #2 below.
- Every iteration, the loop counter decreases by 1, as specified by item #4 below. Therefore, the macro moves to the previous row.
- The macro exits the loop after working with the row below the first block of rows you want to keep, as specified by item #3 below. Each block of rows has a number of rows equal to myNRows.
- In this example, myNRows equals 3. Therefore, the macro exits the loop after working with the fourth row in the data range.
- Item: iCounter = myLastRow.
- VBA constructs: Counter and Start of For… Next statement.
- Description: Specifies myLastRow as the initial value of the loop counter (iCounter).
- Item: To (myFirstRow + myNRows).
- VBA construct: End of For… Next statement.
- Description: Specifies the value represented by myFirstRow plus myNRows (myFirstRow + myNRows) as the final value of the loop counter.
- Item: Step -1.
- VBA construct: Step of For… Next statement.
- Description: Specifies that the loop counter (iCounter) decreases by 1 (-1) every loop iteration.
Line #21: If (iCounter – myFirstRow) Mod myNRows = 0 Then myWorksheet.Rows(iCounter & “:” & iCounter + myRowsToInsert – 1).Insert Shift:=xlShiftDown
- Item: If | Then.
- VBA construct: If… Then… Else statement.
- Description: Conditionally executes the statement specified by items #3 and #4 below, subject to condition specified by item #2 below being met.
- Item: (iCounter – myFirstRow) Mod myNRows = 0.
- VBA constructs:
- Condition of If… Then… Else statement.
- Numeric expression with Mod operator.
- Description:
- The Mod operator (Mod) (i) divides one number (iCounter – myFirstRow) by a second number (myNRows), and (ii) returns the remainder of the division.
- The condition ((iCounter – myFirstRow) Mod myNRows = 0) is met (returns True) if the remainder returned by Mod is 0.
- The condition is met (returns True) every time the macro loops through a row above which blank rows should be added.
- iCounter represents the number of the row through which the macro is currently looping.
- (iCounter – myFirstRow) is the number of rows (in the data range) above the row through which the macro is currently looping.
- ((iCounter – myFirstRow) Mod myNRows) equals 0 when the number of rows returned by (iCounter – myFirstRow) is a multiple of myNRows. This ensures that the number of rows left above the row through which the macro is currently looping can be appropriately separated into blocks of myNRows. In this example, myNRows equals 3. Therefore, the condition is met every 3 rows.
- VBA constructs:
- Item: myWorksheet.Rows(iCounter & “:” & iCounter + myRowsToInsert – 1).
- VBA constructs:
- Statements executed if the condition specified by item #2 above is met.
- Worksheet.Rows property.
- Description:
- Returns an object representing several rows of myWorksheet. The first row is represented by iCounter. The last row is represented by (iCounter + myRowsToInsert – 1).
- The number of rows Worksheet.Rows returns equals the number of rows to insert (myRowsToInsert).
- iCounter represents the number of the row through which the macro is currently looping.
- (iCounter + myRowsToInsert – 1) returns a row located a number of rows (myRowsToInsert – 1) below the row through which the macro is currently looping. In this example, myRowsToInsert equals 2. Therefore, (iCounter + myRowsToInsert – 1) returns a row located 1 (2 – 1) rows below the row through which the macro is currently looping.
- VBA constructs:
- Item: Insert.
- VBA construct: Range.Insert method.
- Description:
- Inserts new rows above the rows returned by item #3 above.
- The number of inserted rows is equal to the value of myRowsToInsert. This is calculated as follows:
lastRow# - firstRow# + 1 (iCounter + myRowsToInsert - 1) - iCounter + 1 = myRowsToInsert
In this example, if the current value of iCounter is 8:
(8 + 2 - 1) - 8 + 1 9 - 8 + 1 = 2
- Item: Shift:=xlShiftDown.
- VBA construct: Shift parameter of Range.Insert method.
- Description:
- Shifts rows down (xlShiftDown) to make space for the rows inserted by item #4 above.
- You can usually omit this parameter. By default, VBA decides how to shift the cells based on the range’s shape. When inserting a row, this usually results in Excel shifting the cells down.
Effects of Executing the Macro
The following GIF illustrates the results of executing this macro. As expected, VBA inserts 2 rows every 3 rows within the specified data range.
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.
3 / 0 / 0 Регистрация: 29.09.2016 Сообщений: 2 |
|
1 |
|
Макрос — добавить данные в конец таблицы29.09.2016, 21:30. Показов 15127. Ответов 2
Друзья, нужна помощь. Существует ли макрос выполняющий следующую функцию:
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
29.09.2016, 21:30 |
2 |
Казанский 15136 / 6410 / 1730 Регистрация: 24.09.2011 Сообщений: 9,999 |
||||
30.09.2016, 01:42 |
2 |
|||
Сообщение было отмечено igolovin87 как решение Решение
Пробовал через запись макроса: определяю крайнюю заполненную ячейку, перемещаюсь ниже на пустую — вставляю, но как понимаете это не рабочий вариант Хорошо, что пытаетесь делать сами.
Для работы макроса необходимо, чтобы ячейка А1 была непустой.
1 |
3 / 0 / 0 Регистрация: 29.09.2016 Сообщений: 2 |
|
30.09.2016, 23:49 [ТС] |
3 |
Казанский, Огромное спасибо за помощь! Ваш вариант еще и на дубли сразу проверяет, что очень удобно!
0 |