最初は「少し重いけど、動いてるしいいか」と思ってたんです。
でも、10万件のデータを相手にしたその日、マクロは動き出したまま帰宅時間を迎えました。
この記事は、そんな“耐えるだけのマクロ”から“動きにキレのあるマクロ”へ育てるための、処理高速化ロードマップです。
遅さに悩むすべてのVBAユーザーに向けて、「思考」と「テク」を一気に詰め込んでみました!
はじめに:処理が遅すぎて絶望したあの日
「とりあえず動いたからヨシ!」 VBAマクロを組んで、無事に処理が始まったその瞬間、私は思わずガッツポーズをしかけていました。
…しかしそれから10分、20分、1時間。 Excelの画面はうんともすんとも言わず、進捗バーすら見えないままフリーズしたように沈黙を保っていたのです。
「あれ?まだ終わらない?ていうか固まってる…?」
「今何行目まで進んだのかわからない…」
「…まさか、寝てる?」
結果、処理が終わったのは 6時間後。
もはやそれはマクロという名の長距離ランナー。
スタートだけ切って、私は一度も画面に拍手を送れませんでした。
なぜそんなに時間がかかるのか、最初は分かりませんでした
セルを1つずつ順番に読んで、判定して、結果を書き込む。
それが「普通の処理のしかた」だと思っていました。
でも、データ件数が10万行を超えると、“正しく動く”と“早く動く”の壁の高さを一気に突きつけられることになります。
本記事の目的:遅いマクロとお別れするための、最初の一歩
この経験を通して私が学んだことは──
「動くように書く」の先にある「速く動くように書く」考え方があるということ。
この記事では、
- VBAで処理が遅くなるよくある原因
- 配列への置き換えをはじめとする高速化の基本テクニック
- 実務シナリオに役立つサンプルと実践ヒント
を、“かつて遅さに泣いた私”と同じ思いをしている誰かのためにまとめていきます。
「正しく書けてるのに、なぜか遅い…」 そんなモヤモヤを抱えるVBAユーザーに、今日からできる処理速度改善のヒントをお届けします。
次章ではまず、VBAマクロが“遅くなる理由”を紐解いていきましょう!
まず押さえたい!VBAが遅くなる5つの原因
VBAのマクロを「動くように書けた!」と思ったのも束の間、 いざ大量データを処理してみると、なぜか異常に時間がかかる…。
それ、じつは“速度を下げるお決まりパターン”にハマっているかもしれません。
ここでは、マクロが遅くなる代表的な原因を5つに絞ってご紹介します。
Application系の設定が初期のまま(=重たい世界)
マクロ実行中に「画面描画」や「セルの再計算」などが起きていると、 それだけで処理は劇的に遅くなります。
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
- ScreenUpdating:セルが書き変わるたびに画面が描画されている
- Calculation:毎回シートの関数が再計算されている
- EnableEvents:他のマクロやイベントが勝手に呼ばれるかも?
→ この3つを止めるだけで、体感で3~10倍速くなることもザラにあります。
セルを1つずつ読んで・書いて・また読んで…(=ループ地獄)
For i = 2 To 100000
If Cells(i, 1).Value = "完了" Then
Cells(i, 2).Value = "済"
End If
Next i
これ、めちゃくちゃ重くなります。 なぜなら、1回の.Cells()参照でワークシートと通信が発生しているから。
処理すべきデータは一括で配列に取り込んで、メモリ上で処理するのが爆速のコツです(詳細はこの先の章で!)
ワークシート関数をマクロで多用(=再計算の罠)
Cells(i, 3).Formula = "=A" & i & "+B" & i
関数を直接セルに書き込む or .Evaluateなどで再計算を多発させると、全体のパフォーマンスが激減します。
大量の処理は VBAの中で完結できるなら計算も内製した方が速いです!
検索や判定が非効率(=ループの中にループがいる)
For i = 2 To 100000
For j = 2 To 1000
If Cells(i, 1).Value = Cells(j, 5).Value Then
' なにかする
End If
Next j
Next i
──こうした “ネスト構造”の処理は爆弾級に遅くなることがあります。
検索や照合には、DictionaryやCollectionなどの高速アクセス構造を活用すると、数秒で終わるようになります。
進捗も出ず、固まって見える(=“見えない不安”が遅さを倍増)
長時間かかる処理こそ、「どこまで終わったのか」が見えないと不安になりますよね。
- 時々 DoEvents を挟む(ただし乱用注意)
- ステータスバーやログを表示して「今ここ」を伝える
- Timer関数などで進捗の可視化
などを入れると、「遅いけど不安じゃないマクロ」になります。 精神的な高速化、意外と侮れません。
小まとめ:「速くなるヒント」は、すでにあなたの中にある
「動かすだけ」で満足していたあの頃。
でも、“なぜ遅いか”を知るだけで、一気に改善のチャンスが広がります。
次章では、いよいよ「マクロを爆速に変える」最初の習慣=Application設定で環境を整える方法を具体的にご紹介していきます。 まずは“無駄な足かせ”を外すことから始めましょう!
秒速への近道!処理高速化の基本セット
「処理が遅い…」と感じたとき、まず最初に見直してほしいのがマクロ実行中の環境設定です。
じつは、Excelのマクロは「余計なお世話」をたくさんしてくれていて、その結果、時間がかかっていることがよくあります。
Application設定を止める、それだけで爆速に
以下のコードは、重たい処理をする前に“魔法の3行”としてセットしておきたいお約束です
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
⬇それぞれの意味と効果
設定 | 何をしているか | なぜ速くなる? |
---|---|---|
ScreenUpdating = False | セル変更ごとに画面描画するのをストップ | 画面更新の負荷を大幅カットできる |
Calculation = Manual | 数式再計算を手動に切り替え | 数式を含むワークシートの再計算が止まる |
EnableEvents = False | 他のイベント(シート変更マクロなど)を一時停止 | 別のマクロが自動で動き出すのを防げる |
これらは、処理が終わったあとに元に戻すのがマナーです。
処理後はこちら
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
※元に戻し忘れると、Excel全体が「無表情モード」になって不安になるので要注意。
Timer関数で処理時間を“見える化”してみよう!
マクロのどこに時間がかかっているかを知るには、まず「どれくらいかかってるのか」を測ることが第一歩。
Dim 開始 As Double
開始 = Timer
' --- ここに処理を書く ---
MsgBox "処理時間:" & Format(Timer - 開始, "0.00") & "秒"
こうすることで、「処理を変えたら本当に速くなったか?」が数字で確認できるようになります。
特に高速化テスト中は、Before/AfterでTimerチェックを入れておくと改善の達成感も倍増です。
高速化おまけTips:処理中の“今ここ”を見せる工夫
処理に時間がかかる場合でも、画面が何も変わらないと「止まってる?」と不安になるのが人間の心理です。
ちょっとした工夫で安心感が変わります。
ステータスバーに進捗を表示
Application.StatusBar = i & "件目を処理中です..."
※処理後に Application.StatusBar = False で元に戻しましょう
複数ループ時にDoEventsで応答性を保つ
If i Mod 1000 = 0 Then DoEvents
※ただし使いすぎると逆に遅くなることもあるのでバランスが大事
小まとめ:環境を整えるだけで、マクロはぐんと軽くなる
「高速化」というと、難しいロジックや高度なアルゴリズムが必要に思えるかもしれませんが、 まずはExcelが自動でやってしまう“おせっかい”を止めるだけでも十分な改善になります。
ここまでの内容は、いわば“マクロ界のストレッチ”です。
この準備が整っていれば、次に学ぶ配列処理や検索高速化の効果も最大化されますよ。
超重要:配列に置き換えるだけで爆速になる理由
「マクロが遅い理由の8割は、セルを1つずつ触っているから」 これは、VBA界でよく囁かれる“真理”のひとつです。
Excelのセルって、見た目はただの表でも、裏では1つ1つが別世界。
マクロが .Cells(i, j) でアクセスするたびに、いちいちExcelと通信してると思ってください。
それを 一発で読み込んで、メモリ上(配列)で処理しよう!というのが高速化のカギです。
そもそも「配列」ってどう使うの?
Excel上の表データ(例:A1:T100000)を、一気にメモリに読み込むには以下のように書きます
Dim data As Variant
data = Range("A1:T100000").Value
これで、行列データがまるっと2次元配列として「data」に入るんです!
- data(行番号, 列番号) の形でアクセス可能(1始まり)
- 値だけがメモリ上にあるので、何万行でもサクサク走れる
- 処理後は、同じようにシートへ一括で戻せます
Range("A1").Resize(UBound(data, 1), UBound(data, 2)).Value = data
Before / After:セル処理 vs 配列処理
セルを直接処理(遅い)
For i = 2 To 100000
If Cells(i, 5).Value = "完了" Then
Cells(i, 6).Value = "済"
End If
Next i
ループ10万回 × 読み取り&書き込み各1回 = 20万回セル通信!
配列で処理(爆速)
Dim data As Variant
data = Range("E2:F100000").Value
Dim i As Long
For i = 1 To UBound(data, 1)
If data(i, 1) = "完了" Then
data(i, 2) = "済"
End If
Next i
Range("F2").Resize(UBound(data, 1), 2).Value = data
結果:たった3ステップで処理完了! 読み取り1回 → 処理 → 書き戻し1回。超エコな動きです。
配列処理のときに気をつけること
- 1行目はヘッダー? → ループは2行目以降(=配列の1から)で処理
- セルの参照は(i, j)で1始まり(ワークシートとずれる場合あり)
- 文字列の比較・空白のチェックも配列内で完結させる
配列処理の応用アイディア
処理内容 | 配列でのやり方 |
---|---|
IF条件で分類 | 条件に応じて別の配列に値を振り分け |
検索・重複チェック | Dictionaryと組み合わせて爆速処理(次章で解説) |
並び替えや抽出 | 条件に合う行だけを新しい配列に入れて書き戻す |
小まとめ:「まとめて読む → まとめて書く」が鉄則
配列処理は、VBAをワンランク上に引き上げてくれる魔法のスキルです。
慣れないうちはちょっと面倒に見えるかもしれませんが、一度書けるようになると処理速度も可読性も段違い。
「1セルずつやってた頃の私、早くこれ教えてあげたかった…」と思えるはずです。
次章では、検索や照合などループが重くなりがちな処理を爆速にするテクニックを紹介します。
実戦テク1:10万件のデータを配列で加工して出力する例
前章でご紹介した「配列処理の考え方」は、まさに高速化の生命線。
ここではその実力を、実際に10万件のデータを加工・出力する例で体感してみましょう。
この記事を読んでくださっているあなたも、きっと似たような処理をどこかで書いたことがあるはずです。
Before:1行ずつ処理する“重たマクロ”
Dim i As Long
For i = 2 To 100001
If Cells(i, 5).Value = "未処理" Then
Cells(i, 6).Value = "処理対象"
End If
Next i
10万行 × 読み取り&書き込み = 約20万回のセルアクセス
条件がシンプルでも、これではマクロが深夜帰宅コースへ…
After:配列にして処理したら一瞬で終わった
Sub 配列で高速処理()
Dim data As Variant
Dim i As Long
Dim lastRow As Long
lastRow = Cells(Rows.Count, 5).End(xlUp).Row ' データ末尾を取得
data = Range("E2:F" & lastRow).Value ' E列・F列を2次元配列に読み込み
For i = 1 To UBound(data, 1)
If data(i, 1) = "未処理" Then
data(i, 2) = "処理対象"
End If
Next i
Range("F2").Resize(UBound(data, 1), 2).Value = data
MsgBox "完了!配列で処理しました"
End Sub
解説:どこが速くなったポイント?
工夫ポイント | 効果 |
---|---|
.Valueで範囲を丸ごと読み込む | 読み込み回数を1回に! |
配列内で処理 | セルにアクセスせずメモリ内だけで完結 |
.Resize().Valueで一括出力 | 書き込みも1回で終了! |
結果:10万行でも2〜3秒で処理完了。比較にならないくらい軽い!
実務応用アイデア
シナリオ | 配列処理でできること |
---|---|
未処理データの抽出 | 対象フラグを書き込んで分類処理に使える |
数値に応じた評価ラベル | 点数 → A/B/C判定なども高速化できる |
別配列への振り分け | 条件に応じて「別配列→別シート」へ転記も自由自在 |
Before / Afterの処理時間比較(体感)
パターン | 処理時間(目安) | コメント |
---|---|---|
セル1つずつ処理 | 約6〜10分 | フリーズしてるように見える |
配列処理+一括出力 | 約2〜3秒 | 「え、もう終わったの?」感動 |
※実環境やPC性能により差はありますが、桁違いに速くなるのは確かです!
小まとめ:「配列化 × 条件処理」は最強の組み合わせ
配列にして一括処理するだけで、マクロの表情がガラッと変わります。
まるで「ひとり手作業してたのが、100人のチームで一気に処理してくれる」ようなイメージです。
この配列テクは、重複チェックや分類処理とも抜群に相性が良いんです。
ということで次章では、VBA高速化の裏エースこと Dictionary を使った検索テクをご紹介します!
実戦テク2:検索・重複チェックを高速化する工夫
大量データを処理するうえで、実は「検索」と「重複チェック」が処理時間の黒幕になっていることがあります。
- 「1件ずつチェック表と照らし合わせて分類」
- 「すでに出てきた値かどうかで処理を分けたい」
- 「同じIDが2回出たらカウントする」
…などなど、これらは人間なら一瞬で判断できるけど、VBAにとっては激重処理なのです。
よくあるパターン:ループの中にループが住んでいる
For i = 2 To 100000
For j = 2 To 5000
If Cells(i, 1).Value = Cells(j, 5).Value Then
Cells(i, 2).Value = "一致"
End If
Next j
Next i
このコード、10万件 × 5千件チェック = 5億回の比較になります。 Excelが泣いてます。
解決策:Dictionaryを使えば“1回で検索できる脳”が手に入る
Dictionaryは、「この値はもう見た?」「このID、あったっけ?」を超高速で判定できるパワーツール。 まるでVBAに脳みそを搭載するような感覚です。
基本の使い方:重複チェック用Dictionaryサンプル
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
Dim i As Long
For i = 2 To 100001
Dim key As String
key = Cells(i, 1).Value
If Not dict.exists(key) Then
dict.Add key, True
Cells(i, 2).Value = "初出"
Else
Cells(i, 2).Value = "重複"
End If
Next i
- exists() で瞬時に「登録済かどうか」を判定できる
- .Addで記録しておけば、次からは一瞬で判別
- 重複カウント、初出チェック、ラベル振り分けなどに最適!
検索・分類処理の応用アイデア
処理したいこと | Dictionaryを使うと… |
---|---|
名簿と照合して一致を検出 | 「チェック表」にある名前を1発で判別可 |
同じ顧客IDが何件あるか数える | .Item(key) = .Item(key) + 1 で集計可能 |
一意の値だけ取り出したい | Dictionaryに入れた時点で重複排除される |
A列→B列に変換マスタで置換する | dict(“A001”) = “東京” → 一括マッピング |
配列×Dictionaryで、ネストループとは永遠にさよなら
配列でデータを一括で読み込み → Dictionaryで高速検索。
この組み合わせは、検索/判定系の処理を秒速でこなす最強タッグです。
data = Range("A2:B100001").Value
For i = 1 To UBound(data)
If dict.exists(data(i, 1)) Then
data(i, 2) = "OK"
Else
data(i, 2) = "NG"
End If
Next
Range("B2").Resize(UBound(data), 1).Value = Application.Index(data, 0, 2)
処理時間は、比べ物にならないレベルで短くなります。
小まとめ:検索や照合も“工夫次第で爆速化できる”
- ネストループ=時間泥棒。今すぐDictionaryで置き換えよう
- 配列×Dictionaryの思考ができるようになると、10万件でもサクサク
- 一度書いてみれば「なんで今まで知らなかったんだ…!」ってなります
次章では、それでも遅い場合に見直したい“追加のチューニング&デバッグ術”をご紹介します!
「動いてるけど、もっと速く」「途中で落ちるけど原因不明…」そんなケースに役立つTipsをまとめていきますよ。
それでも遅い?チューニングの考え方とデバッグ術
ここまでの章で学んできた高速化テクニック(配列、Application設定、Dictionaryなど)を取り入れても、 「なんだかまだ遅い」「途中で止まったように見える」
──そんなとき、ありませんか?
この章では、「処理が遅い or 不安定なとき」に見直しておきたいチェックポイントと、改善のヒントをお届けします。
ループの中に“重い処理”が潜んでないか確認
たとえばループの中で以下のような処理をしていませんか?
- .Activate や .Select を繰り返し使っている
- 他のシートやブックを毎回アクティブ化している
- FindやMatchなど、毎回ワークシート関数を走らせている
解決策:
- 極力セルを触らず配列内で処理を完結させましょう。
- 処理対象データは最初に一括で読み込んでおくのが基本です。
どこで止まったか分からない→ログ or ステータスバー活用!
処理が長時間かかるとき、「今どこ?」が見えないととても不安になります。
そんなときは、進捗表示やログ出力を入れて、処理の生存確認をしてあげましょう。
Application.StatusBar = "処理中:" & i & "/" & UBound(data)
If i Mod 1000 = 0 Then DoEvents
- StatusBarで進捗を見せる
- DoEventsで画面が固まらないように(頻度は制御!)
- 必要に応じて Debug.Print やログファイルへの出力も◎
「止まったように見える」現象は、見える化でストレス軽減できます!
データの量や構造を見直す
- 本当に10万件すべてを毎回処理する必要がある?
- 「変更があった行だけ」「空白でない行だけ」など、対象を絞れないか?
- 処理の途中で不要な列・行を一時的に除外して軽くできるか?
高速化においては「何を処理するかを減らす」こともとても重要な技術です。
処理を分割するという考え方もアリ
一度で全部やろうとせず、「1万件ずつ処理」「ファイルごとに分割」など、 “小分けにして処理する”ことで安定性とスピードを両立できる場合もあります。
- 大量ファイルの一括処理 → 1ファイルずつループ構造で分割
- 巨大シート → 10,000件単位のループ処理に変更
- 処理対象が複数シート → 必要なシートだけ走らせる
処理を“見える単位”に分けると、原因切り分け・デバッグのしやすさも段違いです!
小まとめ:「高速化のその先」は、安定性と工夫の積み重ね
爆速マクロを目指すうえで大事なのは、ただ早くするだけじゃありません。
- どこで重いのか?
- どんな工夫で軽くできるのか?
- 見えない処理をどう伝えるか?
こうした「マクロを書く側の思いやり」と「読ませない工夫」が積み重なることで、 あなたのマクロはただ動くだけじゃない、“安心して任せられる道具”になっていきます。
次章では、ここまで学んだ高速化のすべてを振り返りながら、 「マクロを使う人に優しいコードとは何か?」という視点でまとめていきましょう!
まとめ:早さは技術、安心は思いやり
時間フリーズしたあの日から始まった、マクロ高速化の旅。
配列処理やApplication設定、Dictionaryとの出会いによって、あのころ“重たかった世界”が少しずつ変わってきた気がしませんか?
「速さ」は、ちゃんとした“技術”です
- 配列でデータを一括処理する
- 画面更新や再計算を止めて処理に集中させる
- 検索や照合にDictionaryを使って爆速化する
こうした工夫は、「自分が書けること」以上に、「読み手や使い手を思いやれること」につながっています。
爆速マクロとは、「人に優しいマクロ」である
あなたのマクロは、たしかに速くなった。
でもそれ以上に、「ユーザーに安心感を与える道具」になっていく――。
- 進捗が見える
- フリーズせず、止まらず、落ちない
- 誰でも動かせる、カスタマイズしやすい
そんな“やさしさ”こそが、本当に使われるマクロの共通点です。
あの頃の自分に、今のあなたのマクロを届けてあげたい
もしVBA初心者のあなたがこの記事にたどり着いてくれたなら、 「どうしてこんなに遅いの?」と苦しんだあの日の私が、 今のあなたのように「速さは手に入るんだ」と救われていたら嬉しいです。
ここから先の一歩へ
- まずは“1行ずつ処理”を卒業する
- 次に「データをどう持って、どう処理するか?」という設計を磨いていく
- 最終的には「この処理、本当に必要?」という視点をもてるように
高速化の旅は、効率を上げるだけでなく、自分の技術と思考の幅を広げてくれる旅でもあるのです。
おわりに:この記事を読んでくれたあなたへ
あなたのマクロが、誰かの作業を少しでも楽にしてくれますように。
その速さとやさしさが、Excelという道具をもっと頼れる存在にしてくれますように。
爆速マクロ、つくっていきましょう!!

「動いてはいるけど、遅すぎて困ってる」 「自分で作ったマクロが、逆に自分の作業時間を奪っている」 そんな日々を、私自身もしっかり通ってきました。
処理に6時間かかったあの日のことを、私はきっと忘れません。 でもそこから「どうすれば速くなるんだろう?」と向き合い、 試して、調べて、やってみた先に、“ほんの数秒で終わるマクロ”が生まれました。
この記事が、今まさに同じ悩みと向き合っているあなたの助けになれたなら、これ以上の嬉しさはありません。
コメント