Excel

マクロ高速化 - 文字列型を返す関数

文字列関数に関する豆知識

結構簡単な修正を行うだけでもパフォーマンスを改善することは可能です。
Excel VBAの文字列操作関数Mid, Left, Rightなどを(他にもかなりある)、
Mid$, Left$, Right$のように変更するだけでも少しだけプログラムが速くなります。
$なしと、$ありでは何が違うのかというと、関数の返す型が異なります。

通常 Mid, Left, Right などは Variant 型という万能の型で値を返します。
Variant 型は柔軟なデータ型で、データ型とデータ格納部を持っており、
どのような値でも格納する事ができますが、他の型に比べ消費メモリが大きく、
型判定の処理が入るため、アクセス速度も若干遅くなってしまいます。
格納先の変数が String 型であると分かっている場合、
データ型の判定を行う必要はないので String 型で値を返してもらうのが理想的です。

そこで VBA で用意されている Mid$, Left$, Right$ を使用します。
これらの $ 付き関数は String 型の値を返すので、これらを使用することにより、
裏で行われている型判定の処理が省略され、若干の高速化が期待できるという訳です。
(文字列関数に限らず Variant 型の使用は可能な限り避けた方が良い。)

では、文字列関数の $ なしと $ ありの処理速度の差を計測してみましょう。

strSource = String(300, " ")
For i = 1 to 101
    lngTime = CLng(Timer * 1000)
    For i = 1 To 100000
        strLeft = Left(strSource, 100)
        strMid = Mid(strSource, 101, 100)
        strRight = Right(strSource, 100)
    Next i
    Debug.Print CLng(Timer * 1000) - lngTime
Next lngLoop

100,000 回の文字列切り取りを 100 回行い、平均時間を計測します。
1 回目は 2 回目以降と比べるとやや遅く、平均をとるのに邪魔なので計測対象外としています。
時間計測にはお手軽な Timer 関数を用いています。
1〜1000 まで文字列の長さを変えながら実行し、結果は次のようになりました。

  1文字 10文字 100文字 1000文字
$なし 0.072秒 0.075秒 0.077秒 0.345秒
$あり 0.052秒 0.057秒 0.057秒 0.330秒

僅かながら効果が確認できます。

実は今回挙げた事は、パフォーマンスチューニングを行う上でそれほど重要な要素ではありません。
ほんとに豆知識といった感じですが、こういった細かい事を実践し続けるという事が大事です。
一ヶ月、二ヶ月と短い期間では効果が実感できないかもしれませんが、
一年、二年と経過した時、確かな力が身についているはずです。