VBA Excel. Вставьте строку ниже в том же формате, включая границы и рамки.
Я хочу создать макрос, который вставляет строку под выбранной ячейкой в том же формате. Это код, который у меня есть до сих пор:
Public Sub insertRowBelow() ActiveCell.Offset(1).EntireRow.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromRightOrAbove End Sub
Проблема в том, что этот код только частично передает формат. Он использует тот же цвет фона для новой строки, но не использует границы / рамки для ячеек. Как я могу это достичь?
Самый простой вариант – использовать копию / вставку Excel.
Public Sub insertRowBelow() ActiveCell.Offset(1).EntireRow.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromRightOrAbove ActiveCell.EntireRow.Copy ActiveCell.Offset(1).EntireRow.PasteSpecial xlPasteFormats Application.CutCopyMode = False End Sub
Private Sub cmdInsertRow_Click() Dim lRow As Long Dim lRsp As Long On Error Resume Next lRow = Selection.Row() lRsp = MsgBox("Insert New row above " & lRow & "?", _ vbQuestion + vbYesNo) If lRsp <> vbYes Then Exit Sub Rows(lRow).Select Selection.Copy Rows(lRow + 1).Select Selection.Insert Shift:=xlDown Application.CutCopyMode = False 'Paste formulas and conditional formatting in new row created Rows(lRow).PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone End Sub
Это то, что я использую. Протестировано и работает,
Благодаря,
ну, используя запись Macro, и делаю это вручную, я закончил с этим кодом .. который, кажется, работает .. (хотя это не один лайнер, как ваш;)
lrow = Selection.Row() Rows(lrow).Select Selection.Copy Rows(lrow + 1).Select Selection.Insert Shift:=xlDown Application.CutCopyMode = False Selection.ClearContents
(Я поставил ClearContents там, потому что вы указали нужный формат, и я предполагаю, что вам не нужны данные;))
При вставке строки, независимо от CopyOrigin, Excel будет устанавливать вертикальные границы только на вставленные ячейки, если границы выше и ниже позиции вставки одинаковы.
Я столкнулся с аналогичной (но повернутой) ситуацией с вставкой столбцов, но Copy / Paste слишком медленна для моей книги (десятки тысяч строк, много столбцов и сложное форматирование).
Я нашел три обходных пути, которые не требуют копирования форматирования из строки источника:
-
Убедитесь, что вертикальные границы имеют одинаковый вес, цвет и рисунок выше и ниже позиции вставки, поэтому Excel будет воспроизводить их в новой строке. (Это «Мне больно, когда я это делаю», ответьте «Прекрати это делать!»).
-
Используйте условное форматирование для установки границы (с формулой «= ИСТИНА»). Условное форматирование будет скопировано в новую строку, так что вы все равно получите границу. Охватывает:
- Условные границы форматирования ограничены тонкотянутыми линиями.
- Лучше всего подходит для листов, где границы относительно последовательны, поэтому вам не нужно создавать кучу условных правил форматирования.
-
Установите границу на вставленную строку в VBA после вставки строки. Установка границы в диапазоне намного быстрее, чем копирование и вставка всего форматирования только для получения границы (предполагая, что вы знаете заранее, какова должна быть граница или может отбирать ее из строки выше, без потери производительности).