Excel代码不断崩溃,但没有代码错误,应用程序定义错误或对象定义错误

时间:2019-06-10 17:03:49

标签: excel vba excel-2013

我正在编写一个用户窗体,其中有一个列表框,当用户选择列表框中的项目时,它将转到数据表中的行范围,并将其从表中删除(称为数据的列表对象)。问题是我不断收到高亮显示的代码行的运行时错误。我已经在线阅读,但是不确定如何解决该问题,该错误表示应用程序定义的错误或对象定义的错误。

我试图更改引用表的方式,但仍然无法正常工作

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 个答案:

答案 0 :(得分:1)

要通过For Each循环进行迭代的对象集合 ListObject.ListRows是这样的对象集合之一。

循环很有可能抛出 index超出范围错误:您正在基于ListRows.Count进行迭代,但是主要驱动程序是ListBoxDisplay。 / p>

通过使用For Each循环,可以避免在迭代时修改集合引起的问题,因为不会在每次迭代时对集合进行重新评估。另一方面,通过For循环,您将删除i处的行,但是这样做将抵消下面的行,并导致行被删除……不应该这样。但这忽略了对象集合从索引1开始而不是0:如果ListBoxDisplay.Selected(0)为true,则在.ListRows(i)处会出现错误1004。

解决此问题的一种方法是,将知道要删除的行删除需要删除的行的关注点分开:

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