2015-04-25 57 views
0

嘿傢伙我想從「變量(s)」列表框中選擇一些變量到「行」和/或「列」列表框。爲什麼不能在VBA中像這樣從列表框中選擇變量?

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 

I just don't understand why I cannot write the code like this?

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

謝謝你。

+0

發生運行時錯誤時,'irow'的值是什麼? –

+0

注意,你不需要做'If {bool} = True Then'。只要做'If {bool} Then'來代替。 –

+0

第二個代碼必須是一個for循環,從max到min或removeitem會使循環的下一步發生錯誤(listcount實際上會少1個,您嘗試讀取不存在的數據) –

回答

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 
相關問題