为什么不能在VBA中从列表框中选择变量?

时间:2015-04-25 18:55:27

标签: excel vba excel-vba for-loop listbox

嘿伙计们我想从"变量中选择一些变量"列表框到"行"和/或"列"列表框。

enter image description here

我知道我应该这样写:

   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

显示错误: enter image description here

谢谢你。

1 个答案:

答案 0 :(得分:3)

您必须向后循环集合的原因是,当您从列表中删除项目时,lbxVar.ListCount会变小。

但是,在For循环中,迭代次数在开始执行后是固定的 - 表达式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