#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. Спасибо, чувак, сегодня я узнал кое-что новое.