为什么不能在VBA中像这样从列表框中selectvariables?
嘿家伙,我想select“variables”列表框中的“行”和/或“列”列表框中的一些variables。
我知道我应该这样写:
For irow = lbxVar.ListCount To 1 Step -1 If lbxVar.Selected(irow - 1) = True Then lbxColumn.AddItem lbxVar.List(irow - 1) lbxVar.RemoveItem (irow - 1) End If Next irow
我只是不明白为什么我不能写这样的代码?
If lbxVar.ListIndex > -1 Then For irow = 0 To lbxVar.ListCount - 1 If lbxVar.Selected(irow) = True Then lbxColumn.AddItem lbxVar.List(irow) lbxVar.RemoveItem (irow) End If Next irow End If
它显示错误:
谢谢。
您必须向后循环集合的原因是因为当您从列表中删除项目时, lbxVar.ListCount
变小。
但是,在For循环中,迭代次数在开始执行之后是固定的 – expression式lbxVar.ListCount - 1
只被计算一次。 发生什么事情是,如果有任何项目被删除,你超越了lbxVar.Selected
的界限。
当你向后循环时,你不会有这个问题,因为它只会改变你已经迭代的项目的索引。 如果将它们添加到第二个Listbox的顺序是通过向前而不是向后遍历索引来保留的,则必须两次循环所选项目 – 一次复制到另一个Listbox,一次删除它们:
If lbxVar.ListIndex > -1 Then 'Add pass: For irow = 0 To lbxVar.ListCount - 1 If lbxVar.Selected(irow) Then lbxColumn.AddItem lbxVar.List(irow) End If Next irow 'Remove pass: For irow = lbxVar.ListCount To 1 Step -1 If lbxVar.Selected(irow - 1) Then lbxVar.RemoveItem (irow - 1) End If Next irow End If