「あぁ、またマクロが砂時計のまま固まってる……。1万行の計算、いつ終わるんだろう。このままだとお昼休みが終わっちゃうよ……」
そんな風に、画面の前でため息をついたことはありませんか?
かつての私もそうでした。何でもかんでも「For〜Next」の繰り返し(ループ)で処理を書いて、実行ボタンを押した後に席を立って別の用事を済ませていたものです。
でも、実はExcelには「繰り返しをせずに、一気に計算を終わらせる方法」があるんです。
それが今回ご紹介するEvaluate(エバリュエート)メソッドです。
Evaluateメソッドとは?
専門用語で言うと「文字列を式として評価する」という意味ですが、これでは分かりにくいですよね。
例えるなら、「100枚のプリントに1人で1枚ずつ名前を書いていく(For〜Next)」のか、「特注の巨大なスタンプで100枚一気に名前を押す(Evaluate)」のかの違いです。
どちらが早いかは一目瞭然ですよね。
なぜEvaluateを使うと処理が速いの?
Excelの動作が遅くなる最大の原因は、実は「VBAとセルの間の往復回数」にあります。
1万行のループ処理を行うと、VBAは1万回もセルへアクセスすることになり、これが処理の渋滞を招くのです。
一方、Evaluateは「Excelのシートが持っている強力な計算エンジン」を直接呼び出します。
VBAの中から「この計算はシートの機能でまとめて処理しておいて!」と任せてしまうイメージになるため、無駄な往復が発生せず、一瞬で処理が終わります。
【実践】Evaluateを使ったコードを書いてみよう
それでは、具体的なコードを見ていきましょう。
今回は「A列の単価」と「B列の数量」を掛け算して、「C列に合計」を出力する処理を例にします。
Sub FastCalculation()
' 処理する行数を取得(例:10000行)
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
' --- Evaluateを使った1行 ---
Range("C1:C" & lastRow).Value = Evaluate("A1:A" & lastRow & "* B1:B" & lastRow)
MsgBox "処理が完了しました!"
End Sub
元・二重ループ職人の失敗談
まだ私が初心者だった頃、「3万行のデータ照合」をすべて二重ループで処理していました。
実行するたびにPCは唸りを上げ、Excelは「応答なし」の状態に。「このまま強制終了したらどうしよう……」といつも不安でいっぱいでした。
でもある日、Evaluateを知り、書き換えたところ……なんと3秒で終わりました。感動を通り越して、今までの心労は何だったんだと頭を抱えました(笑)。
みなさんも計算速度に困ったら、ぜひEvaluateを活用してみてください!

コメント