1

2つのリストボックスと1つのボタンがあります。ユーザーがlstAvailでアイテムを選択してボタンを押すたびに、選択したアイテムがlstSelectedに追加されます。

次のコードは、ループが1ずつ減少する場合に正常に機能します。

Private Sub Form_Load()
Dim intX As Integer

    For intX = 0 To 5
        lstAvail.AddItem "Item #" & Format$(intX, "000")
    Next

End Sub

Private Sub Command1_Click()
Dim intListX As Integer

    For intListX = lstAvail.ListCount - 1 To 0 Step -1
        If (lstAvail.Selected(intListX)) Then
            lstSelected.AddItem lstAvail.List(intListX)
            lstAvail.RemoveItem intListX
        End If
    Next

End Sub

しかし、以下に示すように、0から(lstAvail.ListCount -1)まで増分すると、なぜ機能しないのですか?そのコードは、実行時エラー「無効なプロパティ配列インデックス」を発生させます。

Private Sub Command1_Click()
Dim intListX As Integer
For intListX = 0 To lstAvail.ListCount - 1
        If (lstAvail.Selected(intListX)) Then
            lstSelected.AddItem lstAvail.List(intListX)
            lstAvail.RemoveItem intListX
        End If
Next
End Sub
4

1 に答える 1

4

フォワードループ

これが機能しない理由は、<lstAvail>からアイテムを削除しているが、リストがそのまま残っているかのように0からインクリメントしているためです。

lstAvailのアイテム

  • 「アイテム000」
  • 「アイテム001」
  • 「アイテム002」
  • 「アイテム003」
  • 「アイテム004」
  • 「アイテム005」

リストの3番目の項目(ListIndex = 2)を選択し、ボタンをクリックしてCommand1_Click()をトリガーするとします。5に等しくなるまでintListXがインクリメントされます。以下は、Forループを通るトレースです。


intListX:0

lstAvail.Selected(intListX):False

lstAvail:

  • 「アイテム000」
  • 「アイテム001」
  • 「アイテム002」
  • 「アイテム003」
  • 「アイテム004」
  • 「アイテム005」

intListX:1

lstAvail.Selected(intListX):False

lstAvail:

  • 「アイテム000」
  • 「アイテム001」
  • 「アイテム002」
  • 「アイテム003」
  • 「アイテム004」
  • 「アイテム005」

intListX:2

lstAvail.Selected(intListX):True

!! 「アイテム002」を削除!!

lstAvail:

  • 「アイテム000」
  • 「アイテム001」
  • 「アイテム003」
  • 「アイテム004」
  • 「アイテム005」

intListX:3

lstAvail.Selected(intListX):False

lstAvail:

  • 「アイテム000」
  • 「アイテム001」
  • 「アイテム003」
  • 「アイテム004」
  • 「アイテム005」

intListX:4

lstAvail.Selected(intListX):False

lstAvail:

  • 「アイテム000」
  • 「アイテム001」
  • 「アイテム003」
  • 「アイテム004」
  • 「アイテム005」

intListX:5

lstAvail.Selected(intListX):<!!エラー!!>

ここにはインデックス5のアイテムはありません。

逆ループ

intListX:5

lstAvail.Selected(intListX):False

lstAvail:

  • 「アイテム000」
  • 「アイテム001」
  • 「アイテム002」
  • 「アイテム003」
  • 「アイテム004」
  • 「アイテム005」

intListX:4

lstAvail.Selected(intListX):False

lstAvail:

  • 「アイテム000」
  • 「アイテム001」
  • 「アイテム002」
  • 「アイテム003」
  • 「アイテム004」
  • 「アイテム005」

intListX:3

lstAvail.Selected(intListX):False

lstAvail:

  • 「アイテム000」
  • 「アイテム001」
  • 「アイテム002」
  • 「アイテム003」
  • 「アイテム004」
  • 「アイテム005」

intListX:2

lstAvail.Selected(intListX):True

!! 「アイテム002」を削除!!

lstAvail:

  • 「アイテム000」
  • 「アイテム001」
  • 「アイテム003」
  • 「アイテム004」
  • 「アイテム005」

intListX:1

lstAvail.Selected(intListX):False

lstAvail:

  • 「アイテム000」
  • 「アイテム001」
  • 「アイテム003」
  • 「アイテム004」
  • 「アイテム005」

intListX:0

lstAvail.Selected(intListX):False

lstAvail:

  • 「アイテム000」
  • 「アイテム001」
  • 「アイテム003」
  • 「アイテム004」
  • 「アイテム005」
于 2012-07-24T07:56:55.257 に答える