Коллекции объектов хотят, чтобы был повторен с циклом For Each
. ListObject.ListRows
является одной из таких коллекций объектов.
У цикла очень высокая вероятность выброса индекса за границы * Ошибка 1008 *: вы выполняете итерацию на основе ListRows.Count
, но основным драйвером является ListBoxDisplay
.
Используя цикл For Each
, вы избегаете проблем, вызванных изменением коллекции во время ее итерации, поскольку коллекция не будет переоцениваться на каждой итерации. С другой стороны, с помощью цикла For
вы удаляете строки в i
, но при этом смещаются строки внизу, и в результате удаляются строки ... чего не должно было быть. Но это игнорирует, что коллекции объектов начинаются с индекса 1, а не с 0: если ListBoxDisplay.Selected(0)
истинно, ожидайте ошибку 1004 в .ListRows(i)
.
Один из способов исправить это - разделить проблемы , зная, какие строки удалять и удаляя строки, которые нужно удалить :
Dim toDelete As Collection
Set toDelete = New Collection
Dim currentRow As ListRow
For Each currentRow In table.ListRows
If ListBoxDisplay.Selected(currentRow.Index - 1) Then
toDelete.Add currentRow
End If
Next
For Each currentRow In toDelete
currentRow.Delete
Next