VBA性能向上委員会VBA性能向上委員会VBAプログラミングの実行速度に関して、より速い性能を求めて徹底検証をします。ForEach文ForEach文VBAでは、For文と呼ばれる構文は2種類あります。『For文』と『ForEach文』です。For文とは、指定した数分だけループさせる構文です。ForEach文とは、配列の領域分だけループさせる構文です。ForEach文は他の言語でも存在しますが、VBA特有の使い方で検証してみたいと思います。ForEach文の基本的な記述方法を以下に示します。vこの例では、イミディエイトウインドウに、あいうと、表示されます。ForEach文は、配列だけでなくコレクション(オブジェクト)も指定することができるので、セルを指定してループすることもできます。cこの例では、イミディエイトウインドウに、セルA1の値セルB1の値セルC1の値が、表示されます。セル範囲のループは、VBAプログラムではよくあるロジックなのですが、工夫次第で性能が向上することはご存知でしょうか。今回の検証では、2つパターンを用意して、検証します。cただ単純に、A列をForEach文を使ってループさせるだけのサンプルです。セル範囲はRange型なので、Range型を各要素に割り当ててループをさせます。v2つ目のサンプルも、1つ目と同様に、A列をForEach文を使ってループさせています。違う点は、各要素に割り当てる変数の型がVariantであるところと、セル範囲の型をVariantに変換して(配列に詰め直して)ループさせているところです。上記2つのパターンについての実行結果は以下の通りです。0.036※単位は全て『秒』Variant型でループさせる方法が、Range型でループさせる方法より、62.15%速くなっています。これは、単純にVariant型とRange型の領域の差が出ているだけです。この例では、セル範囲を1列のみとしましたが、列を増やすとさらに性能に差が出ます。以下に、3列の場合と10列の場合の検証結果を示します。0.050※単位は全て『秒』3列の場合、39.56%速くなっています。0.0967※単位は全て『秒』10列の場合、26.68%速くなっています。これにより、列を増やせば増やすほど、Variant型がより速くなることがわかります。今回のケースが有効になるのは、セルの値を取得する処理くらいでしょう。Variant型の場合、値の参照しかできないので、Range型が持つさまざまなプロパティやメソッドは使えなくなります。『あるセル範囲の中で、特定の文字列を含む行を削除』なんてプログラムを組むのは難しくなります。『あるセル範囲(一覧)の値を、配列やクラス変数に詰める』などのような、局部的な処理で効力を発揮するでしょう。