#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