#excel #vba
#excel #vba
Вопрос:
Я не очень хорош в циклах.
Я пытаюсь использовать VBA для перебора столбца в поисках любого значения, а затем удалить всю строку, если она ничего не находит (по сути, это способ удаления строк данных, которые я пометил (или не пометил в данном случае)).
Я пробовал разные вещи. Моя последняя попытка приведена ниже, но она просто удаляет каждую строку, независимо от того, имеет ли эта ячейка значение или нет. Есть предложения?
Dim i as Long
For i = 1 To 50
If Cells(i, 1).Value = "" Then
Selection.EntireRow.Delete
Else
i = i 1
End If
Next i
End Sub
Комментарии:
1. Вы удаляете выбранную строку, а не ячейки (i, 1) строка
2. Вы должны выполнить итерацию в обратном направлении или использовать новый диапазон, который будет удален в конце сразу, созданный с помощью
Union
. Этот последний вариант будет самым быстрым. Но разница будет видна в очень большом диапазоне…
Ответ №1:
Здесь есть несколько проблем:
-
При удалении строк в цикле работайте в обратном направлении, если продвигаться вперед, номер вашей строки изменяется при удалении.
-
Нет необходимости увеличивать переменную «i» next i уже делает это
-
Используйте объект Worksheet для удаления строки, а не выделения
Я бы переписал так:
Sub delete()
Dim i As Long
For i = 50 To 1 Step -1
If Cells(i, 1).Value = "" Then
Worksheets("Sheet1").Rows(i).EntireRow.delete
End If
Next i
End Sub
Комментарии:
1.
Rows(i)
было бы достаточно. Я имею в виду, вместоRows(i amp; ":" amp; i)
…2. Спасибо! Ваше объяснение имеет смысл. Я понял, что тоже ссылался не на тот столбец, но это работает отлично. Спасибо 🙂