VB6.0のCollectionについて質問です。

VB初心者なんですが回りにあまり経験者がいないのと
サンプルになりそうなコードがないため一般的にこのような場合どう書けばいいのか教えてください。
以下のソースのようにCollectionの中の配列(実際のソースはプロパティクラスなんですが)の
ある項目にある値が含まれていればCollectionから削除という風に書きたいのです。
ただ今のソースだとループの中で削除しているのでCollectionのインデックスサイズが変わってエラーになります。
普通こういう場合どう書くのが一般的ですか?
強引に書けばいくらでもやりようがありますが一般的な方法が知りたくて質問しました。
そもそもループなど必要なかったりしてもイヤなので…。

Dim test As Collection
Dim str(2) As String
Dim val As Variant

Set test = New Collection

str(0) = "1"
str(1) = "2"
test.Add (str)

str(0) = "2"
str(1) = "3"
test.Add (str)

str(0) = "1"
str(1) = "4"
test.Add (str)


For i = 1 To test.Count
val = test.Item(i)
If (val(0)) = "1" Then
test.Remove (i)
End If
Next

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2006/10/13 11:07:13
  • 終了:2006/10/13 11:34:06

ベストアンサー

id:KirakiraHikaru No.3

KirakiraHikaru回答回数354ベストアンサー獲得回数682006/10/13 11:23:54

ポイント30pt

ループ内で削除する必要がある場合は、

Indexの影響を避けるために、逆方向でループしてください。


コレクションのループ処理

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja...

  size = colMsgs.Count
  For i = 1 to size
    Set objMsg = colMsgs.Item(size - i + 1)
    If objMsg.TimeExpired <= Now Then
      objMsg.Delete
    End If
  Next i

もしくは下記のようにマイナスステップ

For i = colMsgs.Count - 1 To 0 Step -1
id:matttsu

マイナスステップが一番簡単そうですね。

他の方もいろいろやり方を教えてもらいありがとうございます。

それぞれなるほどと思えて勉強になりました。

2006/10/13 11:33:11

その他の回答(2件)

id:taknt No.1

きゃづみぃ回答回数13539ベストアンサー獲得回数11982006/10/13 11:16:47

ポイント20pt

ループの中で やるとダメな場合は、ループの中で フラグをたてておいて

ループが 終わってから、そのフラグで判断して処理をしたらいいと思います。

一般的な方法は、エラーが出なければそれでいいと思います。

あと副作用もないやり方ですね。

http://q.hatena.ne.jp/list

id:TONTON3 No.2

TONTON3回答回数212ベストアンサー獲得回数42006/10/13 11:22:30

ポイント30pt

http://q.hatena.ne.jp/answer

現在のItem数が可変になる可能性があるので

こんな処理になるなぁ

i = 1

do

val = test.Item(i)

If (val(0)) = "1" Then

test.Remove (i)

i = 1

Else

i = i + 1

End If

if i < test.Count then

exit do

end if

loop

id:KirakiraHikaru No.3

KirakiraHikaru回答回数354ベストアンサー獲得回数682006/10/13 11:23:54ここでベストアンサー

ポイント30pt

ループ内で削除する必要がある場合は、

Indexの影響を避けるために、逆方向でループしてください。


コレクションのループ処理

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja...

  size = colMsgs.Count
  For i = 1 to size
    Set objMsg = colMsgs.Item(size - i + 1)
    If objMsg.TimeExpired <= Now Then
      objMsg.Delete
    End If
  Next i

もしくは下記のようにマイナスステップ

For i = colMsgs.Count - 1 To 0 Step -1
id:matttsu

マイナスステップが一番簡単そうですね。

他の方もいろいろやり方を教えてもらいありがとうございます。

それぞれなるほどと思えて勉強になりました。

2006/10/13 11:33:11

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません