VBA Как добавить пустые строки в таблицу

#excel #vba #loops #rows #add

#excel #vba #циклы #строки #Добавить

Вопрос:

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

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

 Sub AddBlnkRow()

Dim Tbl As ListObject, TblID As Range, c As Range

Set Tbl = ActiveSheet.ListObjects("TblState")
Set TblID = Tbl.ListColumns(1).DataBodyRange


For Each c In TblID        'Step -1

   If c = 200 Or c = 300 Or c = 400 Then Tbl.ListRows.Add (c.Row - 2)

Next


End Sub
  

введите описание изображения здесь

Приветствуется любая помощь

Ник.

Комментарии:

1. Из любопытства, зачем вы это делаете? Следует стремиться не добавлять пустые строки в данные. Если вам нужно визуальное разделение, есть альтернативы, такие как форматирование и даже увеличение высоты строки и т. Д

2. Это всего лишь выдуманный пример того, что у меня есть. Таблица поступает из PQ, и мой старый босс не очень хорошо видит, поэтому он попросил меня как-то ее разделить. Я сказал, что нет проблем, а затем оказалось, что это было сложнее, чем я думал.

Ответ №1:

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

 Sub AddBlnkRow()
    Dim Tbl As ListObject
    Dim i As Long
    
    Set Tbl = ActiveSheet.ListObjects("TblState")
    
    With Tbl.ListColumns(1).DataBodyRange
        
        '* Count down to 2 as you don't want a blank line
        '* in the first row
        For i = .Rows.Count To 2 Step -1
            
            '* Use Mod to check if value is multiple of 100
            If .Cells(i, 1) Mod 100 = 0 And Len(.Cells(i, 1)) > 0 Then
                Tbl.ListRows.Add i
            End If
        Next i
    End With
End Sub
  

Ответ №2:

Быстрый обходной путь (добавлен skipRow для обхода ячеек, в которые ранее уже была добавлена пустая строка):

 Sub AddBlnkRow()

    Dim Tbl As ListObject, TblID As Range, c As Range
    Dim skipRow As Boolean

    Set Tbl = ActiveSheet.ListObjects("TblState")
    Set TblID = Tbl.ListColumns(1).DataBodyRange
        
    For Each c In TblID
    
            If (c = 200 Or c = 300 Or c = 400) And skipRow = False Then
                Tbl.ListRows.Add (c.Row - 2)
                skipRow = True
            Else
                skipRow = False
            End If
    
    Next

End Sub
  

Комментарии:

1. Спасибо, приятель, это именно то, что я искал, не мог бы ты, пожалуйста, вкратце объяснить, как работает этот skipRow, я никогда раньше им не пользовался.

2. Это просто логическая переменная (действующая здесь как флаг). Это вычисляется во время каждой итерации цикла for each (добавляется к условию, определяющему, добавлять строку или нет). Если строка уже была добавлена над текущей ячейкой, она пропускает эту ячейку, а также сбрасывает ее значение в False. Просто попробуйте отладить это, и вы очень легко с этим познакомитесь.

3. Привет, Томаш, мне потребовалось некоторое время, чтобы разобраться, я просмотрел каждую строку с помощью F8 и, кажется, я вижу, что здесь происходит. Итак, он перебирает список и, когда находит идентификатор 200, добавляет строку, в следующем цикле он снова находит идентификатор 200, но на этот раз он ничего не делает, поскольку значение SkipRow изменилось. Я думал, что когда цикл запускается и находит идентификатор 200, при следующем цикле он находит идентификатор 201, но это было не так, каким-то образом, когда вы добавляете строку, это как бы отбрасывает цикл на шаг назад. Я думаю, именно поэтому у меня получилось бесконечное количество строк от 102 до 200. Спасибо, чувак, сегодня я узнал кое-что новое.