Код Excel продолжает падать, но нет ошибок в коде, в приложении или в объекте - PullRequest
0 голосов
/ 10 июня 2019

Я пишу пользовательскую форму, в которой у меня есть список, когда пользователь выбирает и элемент в списке, он переходит к диапазону строк в таблице данных и удаляет его из таблицы (объект списка, называемый данными). Проблема в том, что я продолжаю получать ошибку во время выполнения для выделенной строки кода. Я прочитал онлайн, но не уверен, как решить проблему, ошибка говорит об ошибке приложения или объекта.

Я пытался изменить способ ссылки на таблицу, но он все равно не работает

Private Sub Delete_Click()
Dim i As Integer
Dim tabl As ListObject
Set tabl = ShNewDAt.ListObjects("Data")

 For i = 0 To tabl.ListRows.Count
    If ListBoxDisplay.Selected(i) Then
        tabl.ListRows(i).Delete         ' THIS LINE GIVES AN ERROR
    End If
 Next i

End Sub

Закомментированная строка выдает ошибку

1 Ответ

1 голос
/ 10 июня 2019

Коллекции объектов хотят, чтобы был повторен с циклом 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...