Excel VBAでDo Whileの中に複数のDo WhileやForループ、さらにセルへの書き込みが重なっている処理は、データ件数が増えると極端に遅くなることがあります。本記事では、構造的に遅くなりやすい原因と、実務レベルで効果のある高速化の考え方について整理します。
VBAが遅くなる最大の原因は「セル直接アクセスの多重ループ」
今回のようなコードでは、ループのたびにWorksheetsのCellsへアクセスしています。
Excelのセル操作はVBAの中でも特に重い処理であり、数千件×多重ループになると処理時間が指数的に増加します。
特にWorkbooks(“A”).Sheets(…).Cells(…)のような参照が繰り返されると、それだけで大きなオーバーヘッドになります。
最優先の改善:シートアクセス回数を減らす
最も効果が高い改善は、セルを直接読みに行くのではなく、一度配列に格納することです。
配列化することでメモリ上で処理できるため、セルアクセスの遅延をほぼ排除できます。
例えば「Sheets(“A”).Range(…).Value」をVariant配列に入れてから処理するだけで速度は大きく改善します。
ループ構造の見直し(Do Whileの多重ネスト削減)
現在の構造は「一致するまで探す」処理が複数のDo Whileで繰り返されています。
これは実質的に二重・三重の線形探索になっており、データ量に比例して遅くなる典型構造です。
可能であればDictionaryを使い、キー検索に置き換えることでO(n²)構造をO(n)に近づけることができます。
書き込み処理の最適化(まとめて出力する)
Cells(fugo, tenki).Valueのような書き込みも1回ずつ行うと非常に遅くなります。
まず配列に結果を溜めておき、最後に一括でRangeへ書き戻す方式に変更するのが定石です。
これだけでも体感速度が数倍〜数十倍変わるケースがあります。
Application設定による基本的な高速化
構造改善と合わせて必ず行うべきなのがExcelの描画・計算の停止です。
Application.ScreenUpdating = False、Application.Calculation = xlCalculationManualなどを適切に設定することで無駄な再計算や描画を抑えられます。
処理終了後に必ず元に戻すことも重要です。
まとめ
今回のような多重Do While+セル直接アクセス構造は、Excel VBAの中でも最も遅くなりやすい典型パターンです。
改善の優先順位は「配列化」「Dictionary化」「書き込みの一括化」「Excel設定最適化」の順で考えると効果が大きくなります。
ロジック自体を変えずとも、データの持ち方とアクセス方法を変えるだけで大幅な高速化が可能です。


コメント