为什么不能在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