Добавить строку в таблицу, не влияя на условное форматирование - PullRequest
0 голосов
/ 06 июня 2019

Я использую этот код, который работает нормально, однако он портит условное форматирование в моей таблице. Есть ли способ вставить новую строку в таблицу через VBA без влияния на условное форматирование?

Public Sub insertRowBelow()
ActiveCell.Offset(1).EntireRow.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromRightOrBelow
ActiveCell.EntireRow.Copy
ActiveCell.Offset(1).EntireRow.PasteSpecial xlPasteFormats
Application.CutCopyMode = False
End Sub

Ответы [ 3 ]

1 голос
/ 06 июня 2019

Попробуйте:

Option Explicit

Sub test()

    'Change Sheet name if needed
    With ThisWorkbook.Worksheets("Sheet1").ListObjects("Table1")

        If Not Intersect(ActiveCell, .DataBodyRange) Is Nothing Then
            'Change table name if needed - Insert one row above active cell
            .ListRows.Add ((ActiveCell.Row - ActiveCell.ListObject.Range.Row))
            'Change table name if needed - Insert one row below active cell
            .ListRows.Add ((ActiveCell.Row - ActiveCell.ListObject.Range.Row + 1))
        End If

    End With

End Sub
1 голос
/ 06 июня 2019

Это будет работать:

Public Sub insertRowBelow()

ActiveCell.Offset(1).EntireRow.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
ActiveCell.EntireRow.Copy
ActiveCell.Offset(1).EntireRow.PasteSpecial xlPasteAllMergingConditionalFormats
ActiveCell.Offset(1).EntireRow.Clear
Application.CutCopyMode = False


End Sub
0 голосов
/ 06 июня 2019

Добавить строку только в пределах ListObject, а не в пределах всего листа (см. Руководство по VBA для таблиц ListObject Excel )

Option Explicit

Public Sub AddRowInListObject()
    Dim ActTable As ListObject
    On Error Resume Next 'next line throws error if ActiveCell is not in a table
        Set ActTable = ActiveCell.ListObject
    On Error GoTo 0 're-activate error reporting!

    If Not ActTable Is Nothing Then 'only add row if ActiveCell is within a table
        ActTable.ListRows.Add ActiveCell.Row - ActTable.Range.Row
    End If
End Sub

Обратите внимание, что существует две разные системы подсчета строк:

  1. ActiveCell.Row, который возвращает абсолютный номер строки листа
  2. ListRows.Add, который ожидает номер строки относительно начала ListObject

Так, например, если ListObject начинается в строке 5 рабочего листа, тогда номер строки 1 в ListObject является номером строки 5 рабочего листа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...