2016-09-27 128 views
0

ランタイムエラー35600「範囲外のインデックス」に関して助けを求めます。ListViewから項目を削除するときのVBAランタイムエラー35600

Multicolumn-ListViewからCombobox-Valueと一致しないすべてのアイテムを削除しようとしています。 しかし、削除プロセス中、私のコードは、listitems-indexが選択された項目のインデックスより小さいPointに達したようです。

どのように私はそれを解決することができます知っていますか?ここでの私の感想は次のとおりです。

Private Sub ComboBox1_Change() 

Dim i As Integer 
Dim strSearch As String 

strSearch = Me.ComboBox1 

For i = 1 To ListView1.listItems.Count 
    If Me.ListView1.listItems(i).SubItems(3) = strSearch Then 
     Me.ListView1.listItems(i).Checked = True 
    End If 
Next i 
For i = 1 To ListView1.listItems.Count 
    If ListView1.listItems(i).Checked = False Then 
     Me.ListView1.listItems.Remove (ListView1.selectedItem.Index) 
    End If 
Next i 

End Sub 

enter image description here

答えて

2

あなたは(これだけ第二のループのために)逆の順序でそれらを削除してみてください。リスト項目の数よりも(多くのおそらくカウンタは、すべてのループの後に再評価されていないため、高すぎる数の原因要素の数よりも高くなる

For i = ListView1.listItems.Count To 0 Step -1 

:私は基本的に、それがどのように見えると思いますその結果、インデックスの範囲外の例外が発生する)。

+0

返信いただきありがとうございます。今はエラーなしで動作します。 – InternInNeed

+0

残念ながら、あなたのコードを使用すると、関数は最初のlistview-itemを無視します。これを私のコードでどのように修正するか考えていますか? – InternInNeed

+0

おそらくインデックス0になります(私にとっては、基本はずっと前です) –

0
'Removing part 
With ListView1 
    For i = .ListItems.Count To 1 Step -1 
     If Not .ListItems(i).Checked Then 
      .ListItems.Remove i 
     End If 
    Next 
End With 
+0

あなたは 'li'を何と定義しますか? – InternInNeed

+0

これを回避した後、コードを使用するとランタイムエラー438が生成されます - オブジェクトは 'li.remove li.index'でメソッドをサポートしません – InternInNeed

+1

私の編集を参照してください。 ListItemsコレクションは最初の削除時に更新されるため、 'for each'は使用できません。私の悪い – Marco

関連する問題