VBAテクニック集 VBA一覧 デバッグ・エラー処理 実行時エラー

【VBA】オーバーフローエラーの原因と対処法を完全解説【実行時エラー対策】

Excel VBAでマクロを実行していると、ある日突然
「オーバーフローしました」
というエラーに遭遇することがあります。

特に、
・計算処理を追加した
・データ量が増えた
・型を意識せずに修正した
といったタイミングで発生しやすく、原因が分からず悩む方も多いのではないでしょうか。

このエラーは、VBA初心者だけでなく、
ある程度書けるようになった人ほどハマりやすい実行時エラーです。
しかも、コード自体は一見正しそうに見えるため、
「なぜ今まで動いていたのに止まるのか」が分かりにくいのが特徴です。

この記事では、
VBAの「オーバーフローしました」エラーがなぜ起きるのか、
どんな場面で発生し、どう防ぐべきか
を、
実務目線で体系的に解説します。

✅ 「オーバーフローしました」とは何が起きている状態か

「オーバーフローしました」というエラーは、
VBAの内部で 数値の上限を超えた 場合に発生する実行時エラーです。

このエラーの本質を理解しないまま対処しようとすると、
場当たり的な修正になり、再発を繰り返すことになります。
重要なのは、Excelが悪いのでも、処理速度の問題でもないという点です。
VBAが持つ「データ型のルール」に違反した結果として、
正しくエラーが出ている状態だと理解する必要があります。
まずは、オーバーフローの基本的な意味から整理しましょう。

・オーバーフローの基本的な意味

オーバーフローとは、
変数に格納できる最大値を超えた値を代入しようとした状態です。

たとえば、

Dim i As Integer
i = 40000

このコードは、
Integer 型の上限(約32,767)を超えているため、
実行時に「オーバーフローしました」が発生します。


✅ VBAのデータ型と「上限値」の考え方

オーバーフローを理解するうえで、
データ型ごとの上限値を把握することは避けて通れません。

・代表的な数値型と上限

  • Integer:-32,768 ~ 32,767
  • Long:-2,147,483,648 ~ 2,147,483,647
  • Double:非常に大きい数値まで対応(小数あり)

多くの実務エラーは、
Integerで十分だと思い込んでいることが原因です。


✅ オーバーフローが起きやすい典型パターン

オーバーフローは、特定の場面で頻発します。
ここでは、実務で特に多いパターンを整理します。

・ループカウンタにIntegerを使っている

Dim i As Integer
For i = 1 To 50000
    ' 処理
Next i

このコードは、
ループ中に上限を超えた瞬間にエラーになります。

👉 ループ変数は原則 Long が安全です。


・セルの値をそのまま数値変数に代入している

Dim total As Integer
total = Cells(1, 1).Value

セルの値が想定より大きかった場合、
即オーバーフローが発生します。


・計算結果が想定以上に膨らむ

Dim result As Integer
result = 1000 * 1000

このように、
途中計算の結果で上限を超えるケースも非常に多いです。


✅ なぜ「急に」オーバーフローが起きるのか

このエラーが厄介なのは、
昨日まで動いていたコードが突然止まることです。

・データ量の増加

  • 行数が増えた
  • 数値の桁が増えた
  • 集計対象が拡張された

このような変化があると、
これまで問題なかった型でも限界を超えます。


・仕様変更・後付け修正の影響

後から処理を追加した結果、
意図せず計算量が増え、
オーバーフローが発生するケースも非常に多いです。


✅ オーバーフローを防ぐ基本対策【最重要】

・数値変数は原則 Long を使う

Dim i As Long

これだけで、
実務のオーバーフローの大半は防げます。

・計算結果を意識する

途中計算も含めて、
「この変数に入る最大値はいくつか」を考える癖をつけましょう。


✅ 型変換が原因で起きるオーバーフロー

暗黙的な型変換も、
オーバーフローの原因になります。

Dim i As Integer
i = CLng(Cells(1, 1).Value)

この場合、
CLng で変換しても、
最終的に Integer に代入されるためエラーになります。


✅ 配列・集計処理での注意点

・配列のインデックスは Long 前提

Dim i As Long
Dim arr(1 To 100000) As Long

配列処理では、
Longを使わない理由がありません。

参考:【VBA】ExcelVBAの配列の要素数とは|基本から実務設計まで徹底解説


✅ エラーメッセージが示す「正しい警告」

「オーバーフローしました」は、
VBAが正しく異常を検知してくれている状態です。

無理に回避するのではなく、
設計が間違っていないかを見直すサインとして受け取りましょう。


✅ On Error Resume Nextで誤魔化してはいけない理由

On Error Resume Next

この記述でエラーを無視すると、
処理結果が壊れたまま進行する危険があります。

オーバーフローは、
必ず原因を潰すべきエラーです。

参考:【VBA】On Error Resume Nextでエラーを無視してエラーの制御|危険な理由


✅ 実務で使えるチェックリスト

  • ループ変数は Long か
  • 集計値の最大桁数を想定しているか
  • セルの値を直接 Integer に入れていないか
  • 計算途中の値を考慮しているか

これを確認するだけで、
再発率は大きく下がります。


✅ (補足)既存マクロでオーバーフローが多発する場合

既存コードでは、

  • Integer が多用されている
  • 型宣言が曖昧
  • Variant 任せになっている

ケースがほとんどです。

👉 まずは Integer → Long に置き換える
これが最短ルートです。


 

✅ まとめ:オーバーフローは「型設計ミス」のサイン

  • オーバーフローは数値上限超過が原因
  • Integerの使いすぎが最大の要因
  • Longを使うだけで大半は防げる
  • データ増加を前提に設計する
  • エラーは潰して理解する

「オーバーフローしました」は、
VBAが設計を見直せと教えてくれているメッセージです。
エラーを恐れず、
正しく理解して、壊れにくいコードを書いていきましょう。

    -VBAテクニック集, VBA一覧, デバッグ・エラー処理, 実行時エラー