• ベストアンサー

For Each ~ Next の動作

コレクションの操作をするときなどに、 For tmp in testCol   List1.Add tmp Next ってな感じでFor Each文をつかいますよね。 あれって、 For i = 0 To testCol.Count   List1.Add testCol.Item(i) Next i と書くのに比べ、びっくりするほど処理が速いですよね。 いったい、どんな違いがあるのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • ARC
  • ベストアンサー率46% (643/1383)
回答No.1

データ構造のせいだと思います。 コレクションの中に、「このデータの次のデータは何番地から、前のデータは何番地から」って、メモリ上のアドレスの情報が入っているのでしょう。 FOR EACHでは、この情報を参照して高速に次のデータのアドレスを取得しているのだと思います。 それに対して、testCol(i)の方は、データのアドレスを知るのに「コレクションのi番目のデータのアドレスを検索すれ~」って命令をいちいち発しているんだと思います。 以上、単なる推測ですが、多分こんな感じだと思います。

関連するQ&A

  • セルに対してFor Each~In~Nextを使う

    セルに対してFor Each~In~Nextを使う事は出来ない? シートやブックに対してループする時は Sub aaa() Dim w As Worksheet For Each w In Worksheets MsgBox w.Name Next End Sub 等を使いますが、 A1に「あ」 A2に「い」 A3に「う」 が入っている場合、 Sub bbb() Dim i As Long For i = 1 To Range("a65536").End(xlUp).Row MsgBox Cells(i, 1) Next End Sub で、全ての値を取得できますが、 For~to~nextではなく セルに対してFor Each~In~Nextを使う方法があれば教えてください。 上記のように Dim w As Worksheetは宣言できますが Dim c As Workcellとはできませんでした。 なぜわざわざFor~to~nextでできる事をFor Each~In~Nextでやりたいかと言うと、 シートやブックはFor~to~nextでできるのに、セルはFor~to~nextができない理由を知りたいからです。 ご回答よろしくお願いします。

  • for each で扱えるコレクションの実装

    こんにちは。 プログラムの保守を請け負っているのですが、独自に実装されているリストクラスがありまして、 それをfor eachで操作できるようにとの指示がありました。 処理系はC++です。 CFooArrayというクラスだとしまして、内部にCFooDataというクラスをdequeで持っています。 要望としては CFooArray arrayFoo ; for each( CFooData fooData in arrayFoo ) { } とできるようにしてほしいとのことですが、そもそもfor eachで扱えるコレクションクラスを どう実装していいのかが分かりません。またdequeを外に出すのはナシと言われました。 どなたかご存じの方がいらっしゃいましたら教えていただけないでしょうか。 参考サイトでも紹介していただければ幸いです。

  • 【VBA】for each文でListbox値取得

    VBA7.1でfor each文を使い、Listbox(Lst1)の全ての値を 取得したいと思っています。 For Each 変数 In コレクションや配列 のコレクションや配列には何を指定したらよいでしょうか。 よろしくお願いいたします

  • Excel VBA のFor Each ・・・ Next について

    配列に数字(特段数字でなくても)入れたいのですが、以下のように書きました。 Sub test() Dim x As Variant Dim m(1 To 10) As Integer For Each x In m x.Value = 100 Next Stop End Sub Stopでとめてmを確認するとすべて0です。どうしてなのでしょうか。 配列ではなく Sub test() Dim x As Variant For Each x In range("a1:a10") x.Value = 100 Next End Sub とするとA1:A10には100が入ります。 この差がいまいちわからなくて、 もちろんFor ・・・ Nextで簡単に入れられるのは承知しています。 補足ですが また最初はx.valueの.valueをつけていなかったのでセルにも反映されませんでしたが.valueをつけると入りました。

  • ユーザーフォーム上でFor Each~Next?

    Excelユーザーフォームでマルチページを使用しているのですが テキストボックスに文字(パスワード的なもの)を入力したら マルチページ内の特定ページのコントロールをenabled=trueにしたいのです(通常はenebledがtrue・falseの混合ページです) 先日よりFor Each~Next構文を使い始めたのですが勉強不足『オブジェクト・コレクション』の概念がいまいち理解できません。よろしくお願いします。 ネット上で調べてコピペしたのですがこのままだと他のページ、ページ外のコントロールまで影響するので良い方法をアドバイスしていただけますか?やはりコントロール個別にコードを書くしかないのでしょうか? Private Sub TextPASS_Change() If TextPASS.Value = "aaaa" Then For Each Control In Controls 省略(enabled=true) Next Else For Each Control In Controls 省略(enabled=false) Next End If End Sub

  • For Each文内でのコレクションの変更について

    VB.Net/C# .NET Framework2.0で開発しております。 下記コード例のように、イテレータループ内(For Each文)でのコレクションの変更(要素の削除)ができないため、苦肉の策として下のように削除する予定のものを格納するバッファ(removeList)に一度登録し、その後もう一度ループをまわして実際に削除する、というコードを書いておりますが、分量も多くなり、一時変数なども出てくるため、あまりよいコードとは言えないと思います。 コレクションから特定の条件を満たした要素を削除するための、もうすこしスマートな書き方はないものでしょうか? 宜しくお願いいたします。 Dim removeList as new List(Of TestClass) For Each e as TestClass in targetList If e.IsDummy Then '直接targetList.Remove(o) とはできない removeList.Add(o) End If End For For Each e as TestClass in removeList targetList.Remove(e) End For

  • 配列 シャッフルの高速化をするには?

    お世話になります。 私は今10万個の数字を配列に格納し シャッフルしていく問題を抱えております。 下記のプログラムだと 時間がかかりすぎて実用にたえません。 速くするにはどうすればよろしいでしょうか? Dim colBefore As Collection Dim colAfter As Collection Dim i As Long Set colBefore = New Collection Set colAfter = New Collection For i = 1 To 13 colBefore.Add CStr(i) Next Do Until colBefore.Count = 0 i = Int(Rnd(1) * (colBefore.Count - 1)) + 1 colAfter.Add colBefore.Item(i) colBefore.Remove i Loop For i = 1 To 13 Debug.Print colAfter.Item(i) Next

  • For ~ Next の使い方

    for ~ next 構文の途中でカウンターを進めることはできますか。 For I=1 to 10 処理 if ~ then next 処理 next このようにすると、エラーになります。 仕方なく次のようにしていますが、もっと良い方法はありますか。 For I=1 to 10 処理 if ~ then goto 次の行へ 処理 次の行へ: next

  • For Next がうまくいきません。

    VBを勉強中の初心者です。 For i = 2 To 8 For n = 3 To m Cells(4, i) = Sheets("1").Cells(3, n) Next n Next i 上記のようにつくってはみましたが、うまくいきません。 Forのうえにはmを求める式が入っています。 自分がやりたいのは、 4,2 3,3  |  | 4,8 3,9 --------- 4,3 3,3  |  | 4,8 3,8 --------- 4,4 3,3  |  | 4,8 3,7 --------- 4,5 3,3  |  | 4,8 3,6 --------- 4,6 3,3  |  | 4,8 3,5 --------- 4,7 3,3 4,8 3,4 --------- 4,8 3,3 --------- 上記のようにしたかったのですが、 どうしてもうまくいきません。 どなたか宜しくお願します。

  • コレクションクラスに対してFor Eachを使えるようにするには

    コレクションクラスの持つアイテムを For Each ・・・ Next でぶん回す方法を教えてください。 昔、本に載っていたのを見たのですが、 どーーーーーしても思い出せません! たしか、プロパティを1こ追加して、 object.[_Enum]のような行を追加していたような・・・ よろしくお願いします!