wrote :: 2005.01.18

トップページ > Excel > VBA > 高速化テクニック > 個別に呼ぶな!


個別に呼ぶな!

マクロをマスターするには、オブジェクトやプロパティなどVBAの概念や知識を学ばなければなりませんが、それ以外にもプログラムの制御構文をマスターする必要があります。
制御構文とはプログラムの実行順序や回数を指定する命令で、一般的なプログラミング言語ではよく似た制御構文が用意されています。たとえば、IfステートメントやSelect Caseステートメントで条件分岐したり、For NextステートメントやDo Loopステーメントでは繰り返し処理を制御できます。そうした制御構文の中で、繰り返し処理の定番と言えばFor Nextステートメントです。たいていの入門書でも丁寧に解説されています。もっとも、ExcelのVBAにはもうひとつFor Eachステートメントという便利な命令もあるのです。

 Test1Test2%
1回目00:3600:3494.4%
2回目00:3400:34100.0%
3回目00:3500:3394.3%
4回目00:3400:34100.0%
5回目00:3500:3291.4%
6回目00:3500:3291.4%
7回目00:3500:3497.1%
8回目00:3300:3297.0%
9回目00:3300:33100.0%
10回目00:3400:3397.1%
平均00:3400:3396.2%
For NextステートメントとFor Eachステートメントで速度の違いを意識することは少ないと思います。マクロの実行速度を向上するために、無理をしてFor Eachステートメントを使うような方も少ないでしょう。しかし、特にビギナーの方はFor Eachステートメントをもっと活用した方がいいです。カウンタ変数を使うFor Nextステートメントと違い、オブジェクト変数の使い方は少し分かりづらいかもしれませんが、仕組みを理解すればきっと使いこなせるようになると思います。

Sub Test1()
    Dim i As Integer
    For i = 1 To 1000
        Cells(i, 1).Value = "tanaka"
    Next i
End Sub

Sub Test2()
    Dim c As Variant
    For Each c In Range("A1:A1000")
        c.Value = "tanaka"
    Next c
End Sub

For Eachステートメントの構文は、 [For Each 変数名 In グループ名] です。[グループ名]には、セルの範囲や、複数シートのグループなど、構成要素が複数あるような集まりを指定します。ちなみに、VBAではこのような集まりを コレクション と呼びます。
[変数名]は各構成要素を受け取る入れものです。バリアント型または、コレクションを構成する要素と同じオブジェクト型で宣言します。たとえば、WorksheetsコレクションをFor Eachステートメントで操作する場合、変数はバリアント型(Variant)またはワークシート型(Worksheet)で宣言します。

特に明確な決まりはありませんが、繰り返しの回数を指定するFor Nextステートメントは、操作するコレクション内の要素数が容易に判断できる場合に便利です。一方のFor Eachステートメントは、コレクション内の要素数にかかわらず全ての要素を取り出して処理できますので、要素数が不明だったり、実行するたびに要素数が異なる場合に使うといいでしょう。


[何度も同じこと言わせるな!]戻る← | →進む[タイプを指定しろ!]