Удаление строк в foreach

#excel #vba

#excel #vba

Вопрос:

Я пытаюсь обновить лист с помощью импорта файла .CSV.. Я могу читать и обновлять всю информацию. После обновления я хочу удалить некоторые данные. Все строки с D пустыми должны быть удалены (целая строка).

Для этого у меня есть foreach, который проверяет D3:D486 (последняя строка). После запуска макроса некоторые строки удаляются, но не все строки.

     Dim rCell As Range
    Dim rRng As Range
    Debug.Print CStr(LastRow)

    Set rRng = Worksheets("sheet1").Range("D3:D"   CStr(LastRow))

    For Each rCell In rRng.Cells
        If Not IsEmpty(rCell) Then
            Debug.Print rCell.Row
        Else
            Debug.Print "Empty"
            Worksheets("sheet1").Rows(rCell.Row).Delete
        End If
    Next rCell
 

Я предполагаю, что есть проблема с for-each.. Например, если он удалит строку 100, в следующий раз он перейдет к строке 101.. Но это предыдущая строка 102..
Я могу сохранить ячейки, возможно, в массиве, но тогда это будет то же самое.
За исключением случаев, когда я иду другим путем (снизу вверх). Как я могу это решить?

Ответ №1:

я думаю, вы ответили на свой собственный вопрос: снизу вверх…

и вы можете попробовать range.Весь поток.Метод удаления тоже, что-то вроде приведенного ниже

 Dim rCell As Range
Dim lastRow, i
lastRow = 1000
For i = lastRow To 1 Step -1
    ' if condition met
    Worksheets("Sheet1").Range("D:"   i).EntireRow.Delete
Next
 

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

1. Я бы использовал amp; вместо , или, что более вероятно Worksheets("Sheet1").Cells(i, 4).EntireRow.Delete , — тогда не нужно манипулировать текстовыми строками и адресами диапазона.

Ответ №2:

Я бы сделал это так:

 Dim i As Integer
Dim rRng As Range
Debug.Print CStr(LastRow)

Set rRng = Worksheets("sheet1").Range("D3:D"   CStr(LastRow))

For i = 1 To rRng.Cells.Count
    If Not IsEmpty(Worksheets("Sheet1").Range("D:"   i).Value) Then
        Debug.Print rCell.Row
    Else
        Debug.Print "Empty"
        Worksheets("Sheet1").Range("D:"   i).EntireRow.Delete
        i = i - 1
    End If
Next
 

Ответ №3:

Ответ Rex правильный, если вы хотите выглядеть симпатично, вы также можете сделать это таким образом:

 Sub DeleteRowsWithCriteria()
Dim rng As Range, rngCell As Range, rngDelete As Range
Set rng = Worksheets("sheet1").UsedRange.Columns("D:D").Cells 'Watch out here, if columns A-C are not all used, this doesn't work
For Each rngCell In rng
    If rngCell.Value = "" Then
        If rngDelete Is Nothing Then
            Set rngDelete = rngCell
        Else
            Set rngDelete = Union(rngDelete, rngCell)
        End If
    End If
Next rngCell
rngDelete.EntireRow.Delete xlShiftUp
End Sub