「For〜Next」はもう古い?EvaluateメソッドでExcelマクロを爆速にするコード

【業務効率化】VBA
スポンサーリンク

「あぁ、またマクロが砂時計のまま固まってる……。1万行の計算、いつ終わるんだろう。このままだとお昼休みが終わっちゃうよ……」

そんな風に、画面の前でため息をついたことはありませんか?

かつての私もそうでした。何でもかんでも「For〜Next」の繰り返し(ループ)で処理を書いて、実行ボタンを押した後に席を立って別の用事を済ませていたものです。

でも、実はExcelには「繰り返しをせずに、一気に計算を終わらせる方法」があるんです。

それが今回ご紹介するEvaluate(エバリュエート)メソッドです。

【業務効率化】VBAの記事を見る 

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を活用してみてください!

【業務効率化】VBAの記事を見る 

この記事を書いた人
ぐー

手取り15万円の会社員でしたが、年間100万円以上節約していました。
株式投資で年間360万円以上投資し、iDeCoも併用しています。
総資産はアッパーマス層に到達しました。
資格は日商簿記3級を持っています。

このブログでは、私が実践してきた節約術やリアルな資産運用、生産性を高めるITスキルについて発信しています。

生活を豊かにするため、高配当株投資で年間配当金60万円をめざしています。
現在の年間配当金は30万円ほどです。

ゲーム・漫画・アニメなどが好きです。
一緒に資産形成をがんばりましょう!
よろしくお願いします!

ぐーをフォローする
【業務効率化】VBAITスキル
スポンサーリンク
ぐーをフォローする

コメント

タイトルとURLをコピーしました