我正在编写一个用户窗体,其中有一个列表框,当用户选择列表框中的项目时,它将转到数据表中的行范围,并将其从表中删除(称为数据的列表对象)。问题是我不断收到高亮显示的代码行的运行时错误。我已经在线阅读,但是不确定如何解决该问题,该错误表示应用程序定义的错误或对象定义的错误。
我试图更改引用表的方式,但仍然无法正常工作
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
注释行显示错误
答案 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