本記事には広告(PR)が含まれます。
くわしくは プライバシーポリシー をご確認ください。
Excel VBAでマクロを実行したときに、
「実行時エラー ‘6’:
オーバーフローしました」
と表示されて困ったことはありませんか?
突然エラーが表示されると、
「何が原因なの?」
「コードは間違っていないはずなのに…」
「Long型にすれば直る?」
と悩んでしまいますよね。
VBAの「オーバーフローしました」は、
変数に入れられる範囲を超えた値を扱ったときに発生するエラーです。
特に初心者のうちは、
- Integer型に大きな数値を入れてしまう
- 計算結果が想定以上に大きくなる
- セルの値を数値変換した瞬間にエラーになる
といったケースで発生しやすい傾向があります。
また、
「String型なのにオーバーフロー?」
「Rangeを使っただけなのに?」
と感じるケースもあり、原因が分かりにくいことも少なくありません。
この記事では、
VBAの「オーバーフローしました(実行時エラー6)」について、
- エラーが発生する原因
- Integer・Long・Doubleの違い
- よくあるコード例
- エラーを防ぐ方法
を、初心者向けにわかりやすく解説します。
この記事でわかること
VBAで「オーバーフローしました(実行時エラー6)」が出る原因
オーバーフローとは?初心者向けに簡単解説
VBAの「オーバーフロー」とは、
簡単にいうと「変数に入れられる範囲を超えてしまった状態」のことです。
例えば、VBAのInteger型には、
扱える数値の範囲が決まっています。
-32768 ~ 32767
つまり、Integer型には
「32767まで」しか入れられません。
そのため、以下のように大きすぎる数値を代入すると、オーバーフローエラーになります。
Sub OverflowSample()
Dim num As Integer
num = 50000
End Sub
この場合、
Integer型の上限を超えているため、
「実行時エラー ‘6’:
オーバーフローしました」
が発生します。
特に初心者のうちは、
- Integer型とLong型の違いを意識していない
- 小さい数しか扱わないと思っていた
- 計算結果が大きくなることを想定していなかった
といった理由で発生しやすいエラーです。
なお、Excel VBAでは行番号やデータ件数を扱うことも多いため、
実務ではIntegerよりLong型を使うケースが一般的です。

エラー画面のデバッグボタンを押すことで、エラーが発生した箇所を確認することができます。

Integer型に大きな数値を入れると発生する
VBAのオーバーフローエラーで特に多いのが、
Integer型に大きすぎる数値を代入してしまうケースです。
Integer型で扱える範囲は以下の通りです。
-32768 ~ 32767
そのため、32767を超える数値を入れると、
「オーバーフローしました」が発生します。
例えば、以下のコードです。
Sub OverflowInteger()
Dim num As Integer
num = 50000
End Sub
このコードでは、
Integer型の変数 num に 50000 を代入しています。
しかし、50000はInteger型の上限を超えているため、
実行時エラー6が発生します。
一方で、Long型に変更すると正常に動作します。
Sub OverflowLong()
Dim num As Long
num = 50000
End Sub

Long型は、Integer型よりも大きな数値を扱えます。
-2147483648 ~ 2147483647
そのため、
Excel VBAではInteger型よりLong型を使うケースが一般的です。
特に以下のような処理では、
Long型を使うことが多くなります。
- 行番号の管理
- ループ処理のカウンタ
- データ件数の取得
- Rows.Count を使う処理
例えば、最終行を取得する処理では、
以下のようにLong型を使います。
Dim lastRow As Long
lastRow = Rows.Count
初心者のうちは、
「数値ならとりあえずInteger」
ではなく、
「Excel VBAでは基本的にLongを使う」
という感覚を持っておくと、
オーバーフローエラーを減らしやすくなります。
計算結果が大きすぎてもオーバーフローする
オーバーフローエラーは、
「大きな数値を直接代入したとき」だけで発生するわけではありません。
実は、
計算結果が変数の範囲を超えた場合にも発生します。
例えば、以下のコードです。
Sub OverflowCalc()
Dim num As Integer
num = 300 * 200
End Sub

このコードでは、
300 × 200 の計算結果が 60000 になります。
しかし、Integer型で扱える最大値は 32767 までです。
そのため、計算結果を代入したタイミングで
「オーバーフローしました」が発生します。
特に初心者のうちは、
- 掛け算
- 累乗計算
- ループ内の加算
- セルの合計値
などで、知らないうちに数値が大きくなっていることがあります。
例えば、以下のようなループ処理でも注意が必要です。
Sub OverflowLoop()
Dim total As Integer
Dim i As Long
For i = 1 To 1000
total = total + 100
Next i
End Sub

このコードでは、
100を1000回加算するため、
最終的な値は100000になります。
しかし、Integer型では扱いきれないため、
途中でオーバーフローエラーになります。
このような場合は、
Long型へ変更することで解決できます。
Sub OverflowLoopFix()
Dim total As Long
Dim i As Long
For i = 1 To 1000
total = total + 100
Next i
End Sub

また、小数を含む大きな数値を扱う場合は、
Double型を使うケースもあります。
例えば、
- 割り算の結果
- 平均値
- 売上計算
- 比率計算
などです。
ただし、
初心者のうちは無理に使い分けを覚えようとせず、
- 整数 → Long
- 小数 → Double
くらいの感覚から始めれば十分です。
String型でもオーバーフローが起きるケース
「String型は文字列だから、安全なのでは?」
と思う方もいるかもしれません。
しかし実際には、
String型を使っていても、
内部で数値変換が行われるとオーバーフローが発生することがあります。
例えば、以下のコードです。
Sub OverflowString()
Dim txt As String
Dim num As Integer
txt = "50000"
num = CInt(txt)
End Sub

このコードでは、
最初はString型として「50000」を扱っています。
しかし、
CInt 関数でInteger型へ変換した瞬間に、
オーバーフローエラーが発生します。
これは、
50000 が Integer型の上限(32767)を超えているためです。
特に以下のようなケースでは注意が必要です。
- セルの値を数値変換する
- CSVデータを読み込む
- InputBoxで入力された値を変換する
- Val関数やCInt関数を使う
例えば、セルの値を取得する処理でも発生することがあります。
Sub OverflowRange()
Dim num As Integer
num = Range("A1").Value
End Sub

A1セルに大きな数値が入っている場合、
Integer型へ代入したタイミングで
オーバーフローエラーになります。
このようなケースでは、
Long型へ変更することで解決できる場合が多くあります。
Sub OverflowRangeFix()
Dim num As Long
num = Range("A1").Value
End Sub

初心者のうちは、
「Stringだから安全」
ではなく、
「最終的にどの型へ変換されるか」
を意識することが大切です。
VBAのオーバーフローエラーを防ぐ対策
基本はIntegerよりLongを使う
VBAでオーバーフローエラーを防ぎたい場合、
まず意識したいのが「IntegerよりLongを使う」ということです。
初心者向けのサンプルコードでは、
Integer型が紹介されることもあります。
しかし、実際のExcel VBAでは、
Long型を使うケースのほうが一般的です。
理由は、
Excelで扱うデータ量が大きくなりやすいためです。
例えば、
- 行番号
- データ件数
- ループ回数
- セル番号
などは、簡単にInteger型の上限を超える可能性があります。
特にExcelは、
100万行以上を扱えるため、
行番号をInteger型で管理するのは危険です。
例えば、以下のコードです。
Dim i As Integer
For i = 1 To Rows.Count
' 繰り返したい処理
Next i
このコードでは、
Rows.Count の値がInteger型の範囲を超えるため、
環境によってはオーバーフローの原因になります。
サンプルコードの処理について
1行目から最終行まで処理を繰り返しています。
i は現在の行番号を管理する変数です。
そのため、実務では以下のように
Long型を使うケースが一般的です。
Dim i As Long
For i = 1 To Rows.Count
' 繰り返したい処理
Next i
また、初心者のうちは
- Integer → 小さい数専用
- Long → VBAでよく使う整数型
くらいの感覚で覚えておけば十分です。
特に理由がない限り、
整数を扱う変数はLong型を使うほうが安全です。
ただし、
「全部Longにすれば絶対安全」
というわけではありません。
次の章では、
必要以上に大きな型を使う場合の注意点について解説します。
必要以上に大きい型を使えばよいわけではない?
ここまで読むと、
「だったら最初から全部Long型やDouble型にすればいいのでは?」
と思うかもしれません。
確かに、Integer型よりLong型のほうが、
オーバーフローは起きにくくなります。
ただし、
必要以上に大きな型ばかり使うのも、
あまりおすすめではありません。
VBAでは、
変数の型ごとに使用するメモリ量が異なります。
例えば、
- Integer型 → 小さい
- Long型 → やや大きい
- Double型 → さらに大きい
- Variant型 → 特に大きい
という違いがあります。
そのため、
大量のデータを扱う処理では、
必要以上に大きな型を使うと、
処理効率へ影響する場合があります。
Microsoft公式でも、
用途に応じて適切なデータ型を選ぶことが推奨されています。
▶データ型を効率的に使用する | Microsoft Learn
ただし、初心者のうちは、
そこまで神経質になる必要はありません。
実際のExcel VBAでは、
- 行番号
- ループ回数
- データ件数
などを扱うことが多いため、
整数はLong型を使うケースが一般的です。
まずは、
- 整数 → Long
- 小数 → Double
- 文字列 → String
を基本として覚えておけば十分です。
慣れてきたら、
用途に応じて最適な型を選べるようになると、
より効率的なコードを書きやすくなります。
変数の型を確認するクセをつける
オーバーフローエラーを防ぐためには、
「どの型を使っているか」を意識することが大切です。
特に初心者のうちは、
- Integer型になっていた
- 想定より大きな数値が入っていた
- 型を意識せずに変数を作っていた
というケースがよくあります。
例えば、以下のコードです。
Dim num As Integer
この場合、
num は Integer型として扱われます。
そのため、
32767を超える値を入れると、
オーバーフローエラーになります。
一方、以下のようにLong型へ変更すると、
より大きな数値を扱えるようになります。
Dim num As Long
また、変数宣言を書かずに使ってしまうケースにも注意が必要です。
例えば、以下のコードです。
num = 50000
この場合、
num は Variant型として扱われます。
Variant型は便利ですが、
- 意図しない型変換
- 処理速度の低下
- バグの原因
につながることがあります。
そのため、VBAでは
変数を明示的に宣言することが推奨されています。
特におすすめなのが、
Option Explicit を使う方法です。
Option Explicit
これをコードの先頭に書くことで、
変数宣言を強制できます。
例えば、
- 変数名の打ち間違い
- 宣言漏れ
- 想定外のVariant化
などを防ぎやすくなります。
初心者のうちは、
- 変数を必ずDimで宣言する
- 型を意識する
- IntegerかLongか確認する
というクセをつけるだけでも、
オーバーフローエラーを減らしやすくなります。

デバッグでエラー箇所を確認する方法
オーバーフローエラーが発生した場合は、
「どの行でエラーになったのか」を確認することが大切です。
特に初心者のうちは、
- どこが原因かわからない
- 数値が大きすぎる場所が見つからない
- 変数の型を見落としている
といったケースがよくあります。
VBAでは、
エラーが発生すると、
問題のある行が黄色で表示されます。
例えば、
num = 50000
のような行が黄色になっている場合は、
その行でオーバーフローが発生している可能性があります。
まずは、
- どの変数を使っているか
- Integer型になっていないか
- 計算結果が大きくなっていないか
を確認してみましょう。
また、
F8キーを使うと、
コードを1行ずつ実行できます。
これを「ステップイン実行」と呼びます。
ステップイン実行を使うと、
- どのタイミングでエラーになるか
- どの変数で止まるか
- 計算結果がどう変化しているか
を確認しやすくなります。
さらに、
Debug.Print を使う方法も便利です。
例えば、以下のコードです。
Debug.Print total

これを書くと、
現在の変数の値をイミディエイトウィンドウへ表示できます。
ループ処理や計算処理では、
数値が想定以上に大きくなっていないか確認するのに役立ちます。
なお、VBAのデバッグ方法については、
以下の記事でも詳しく解説しています。
オーバーフローエラーは、
「どの行で発生しているか」を確認するだけでも、
原因を特定しやすくなります。
イミディエイトウィンドウはどうやって表示する?
イミディエイトウィンドウは表示タブもしくはCtrl+Gキーで表示することができます。

エラー処理を入れて強制終了を防ぐ
オーバーフローエラーが発生すると、
VBAの処理は途中で停止します。
そのため、
- 処理が中断される
- データ更新が途中で止まる
- 何が原因かわからなくなる
といったトラブルにつながることがあります。
そこで役立つのが、
VBAのエラー処理です。
例えば、以下のように書く方法があります。
Sub OverflowErrorHandle()
On Error GoTo ErrHandler
Dim num As Integer
num = 50000
Exit Sub
ErrHandler:
MsgBox "オーバーフローエラーが発生しました。"
End Sub

このコードでは、
エラーが発生した場合に、
メッセージを表示して処理を終了します。
初心者のうちは、
まずこのように
- エラー時にメッセージを出す
- どこで止まったか確認する
という流れを作るだけでも十分です。
一方で、
以下のようなコードには注意が必要です。
On Error Resume Next
これは、
エラーが発生しても無視して処理を続ける命令です。
便利に見える反面、
- エラーに気づけない
- 想定外の動作になる
- 原因調査が難しくなる
といった問題につながることがあります。
特にオーバーフローエラーの場合は、
数値がおかしくなっている可能性があるため、
無理にエラーを無視するのはおすすめできません。
まずは、
- どこでエラーになったか確認する
- 変数の型を見直す
- Integer型になっていないか確認する
ことを優先しましょう。
なお、VBAのエラー処理については、
以下の記事でも詳しく解説しています。
VBAエラーでつまずいた方へ
「型の違いが難しい…」
「エラーの原因がなかなかわからない…」
そんなときは、
VBAの基本的な学び方を整理しておくと、
エラー対応もしやすくなります。
特に初心者のうちは、
- 変数
- ループ処理
- デバッグ
- エラー処理
を順番に学ぶだけでも、
VBAへの苦手意識を減らしやすくなります。
以下の記事では、
VBAを独学で学ぶ手順や、
初心者向けの勉強方法についてわかりやすくまとめています。
まとめ
VBAの「オーバーフローしました(実行時エラー6)」は、
変数の型に対して、
大きすぎる数値を扱ったときに発生するエラーです。
特に初心者のうちは、
- Integer型へ大きな数値を代入した
- 計算結果が想定以上に大きくなった
- セルの値をInteger型へ入れていた
- String型を数値変換した
といったケースで発生しやすい傾向があります。
オーバーフローを防ぐためには、
まず「どの型を使っているか」を確認することが大切です。
特にExcel VBAでは、
- 行番号
- データ件数
- ループ処理
などを扱う機会が多いため、
Integer型よりLong型を使うケースが一般的です。
また、
- F8キーでステップ実行する
- Debug.Printで値を確認する
- Option Explicitを使う
といったデバッグ方法を覚えておくと、
原因を特定しやすくなります。
まずは、
- Integer型になっていないか
- 数値が大きくなりすぎていないか
を確認するだけでも、
オーバーフローエラーは解決しやすくなります。
よくある質問(FAQ)
VBAで「オーバーフローしました」と表示される原因は?
変数の型に対して、大きすぎる数値を扱った場合に発生します。
特にInteger型は扱える範囲が小さいため、
大きな数値や計算結果を代入するとエラーになりやすくなります。
VBAのオーバーフローエラーはLong型にすれば直りますか?
Integer型が原因の場合は、
Long型へ変更すると解決するケースが多くあります。
ただし、非常に大きな数値や小数を扱う場合は、
Double型など別の型が必要になることもあります。
String型なのにオーバーフローするのはなぜですか?
CInt関数などで数値へ変換した瞬間に、
Integer型の範囲を超えるとオーバーフローが発生します。
VBAでオーバーフローエラーを無視しても大丈夫ですか?
基本的にはおすすめできません。
On Error Resume Next を使うと処理を継続できますが、
数値がおかしくなったまま動作する可能性があります。
まずは、
変数の型や計算結果を確認することが大切です。
VBAでオーバーフローエラーを防ぐ方法はありますか?
以下の方法が効果的です。
- Integer型よりLong型を使う
- Debug.Printで値を確認する
- Option Explicitで変数宣言を強制する
- 計算結果が大きくなりすぎていないか確認する
【関連記事】
VBAの実行時エラーやデバッグ方法については、
以下の記事でも詳しく解説しています。
- VBAの実行時エラーとは?原因と対処法まとめ|よくあるエラー一覧も解説
- Excel VBAの実行時エラー13「型が一致しません」の原因と対処法|初心者向けに解説
- マクロのステップインとは?初心者でもわかるVBAのデバッグ基本操作を解説
- Excel VBAのエラー処理とは?On Errorの使い方とエラーハンドリングの基本を解説
※外部リンク※
※参考書籍 (PR)※
- 【Excel VBAのエラーを直す本 なぜ、あなたのVBAはスムーズに動かないのか?】(Amazon)
- 【実務で使えるExcel VBAプログラミング作法 ~「動けばOK」から卒業しよう! 生産性が上がるコードの書き方】(Amazon)
※本ボックスにはアフィリエイトリンク(PR)が含まれます。
くわしくは プライバシーポリシー へ。
