#18 | For〜NextとFor Each〜Nextを比較する | |||||
Accessには同じ種類のオブジェクトの集まりを表す「コレクション」という概念があります。例えば、データベースは複数のテーブルや複数のフォーム、複数のレポートなどから構成されています。1つのテーブルは複数のフィールドの集まりです。1つのフィールドはさまざまなプロパティ(属性)が集まることによってその特性が決められています。またフォームも複数のコントロールが集まって構成されていますし、1つ1つのコントロールもまたさまざまなプロパティの集合体です。 Dim dbs As Database
Dim tdf As TableDef Dim fld As Field Dim strFldName As String Dim intFldLoop As Integer Dim iintLoop As Integer Const clngTestCnt As Long = 1000 'テスト回数のループカウンタ Set dbs = CurrentDb Set tdf = dbs.TableDefs("tblFieldTest") ts_Watch "テスト開始", True For iintLoop = 1 To clngTestCnt For Each fld In tdf.Fields strFldName = fld.Name Next fld Next iintLoop ts_Watch "For Each〜Next" For iintLoop = 1 To clngTestCnt For intFldLoop = 0 To tdf.Fields.Count - 1 Set fld = tdf.Fields(intFldLoop) '添え字は0から始まる strFldName = fld.Name Next intFldLoop Next iintLoop ts_Watch "For〜Next" そして、テスト結果はつぎのようなものになりました。 コレクションの要素を扱う方法の例ではしばしば「For Each〜Next ステートメント」が出てきて、あたかもそれがお決まりの手法のように思っていましたのでこれは意外な結果でした。明らかに"コレクションに属する個々の要素を列挙する場合には「For〜Next ステートメント」の方が「For Each〜Next ステートメント」よりも高速である。"という結果になっています。 上記のテスト結果はあくまでも1000回ものテストの累積時間差です。実際には、あらゆるVBAのコードで For〜Next が使われる頻度に比べてコレクションを扱う頻度は極端に少ないでしょうし、コレクションを扱う場合にも要素数もそう多くないと思われます。そう考えると上記の結果は「コレクションでは For〜Next を使うべし」と言うほどではないでしょう。簡単なコードで済ませたい場合には For Each〜Next、ループの中でループカウンタ変数を要素の添え字以外にも使いたいような場合には For〜Next、と状況に応じて使い分ければいいと思います。 |
||||||
|
Copyright © T'sWare All rights reserved |