VBAの「オーバーフローしました」の原因と対処法|実行時エラー6を初心者向けに解説

VBAの「オーバーフローしました」の原因と対処法|実行時エラー6を初心者向けに解説

本記事には広告(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型を使うケースが一般的です。

VBAで「実行時エラー6 オーバーフローしました」と表示された画面
変数の型に対して大きすぎる値を扱うと、「オーバーフローしました」エラーが発生します。

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

VBAでInteger型に50000を代入し、オーバーフローエラーで黄色停止した画面
Integer型の上限を超える値を代入すると、該当行で処理が停止します。

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
VBAで変数をLong型に変更し、50000を正常に代入できた画面
Integer型ではエラーになる値でも、Long型に変更すると正常に扱える場合があります。

Long型は、Integer型よりも大きな数値を扱えます。

-2147483648 ~ 2147483647

そのため、
Excel VBAではInteger型よりLong型を使うケースが一般的です。

特に以下のような処理では、
Long型を使うことが多くなります。

  • 行番号の管理
  • ループ処理のカウンタ
  • データ件数の取得
  • Rows.Count を使う処理

例えば、最終行を取得する処理では、
以下のようにLong型を使います。

Dim lastRow As Long

lastRow = Rows.Count
Excelの行数は100万行を超えるため、Integer型では範囲不足になります。

初心者のうちは、
「数値ならとりあえずInteger」
ではなく、

「Excel VBAでは基本的にLongを使う」

という感覚を持っておくと、
オーバーフローエラーを減らしやすくなります。


計算結果が大きすぎてもオーバーフローする

オーバーフローエラーは、
「大きな数値を直接代入したとき」だけで発生するわけではありません。

実は、
計算結果が変数の範囲を超えた場合にも発生します。

例えば、以下のコードです。

Sub OverflowCalc()

 Dim num As Integer

 num = 300 * 200

End Sub
VBAで300×200の計算結果をInteger型へ代入し、オーバーフローエラーが発生した画面
計算結果がInteger型の上限を超えると、オーバーフローエラーが発生します。

このコードでは、
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
VBAのループ処理で合計値が大きくなり、オーバーフローエラーが発生した画面
ループ処理で数値を加算し続けると、途中でオーバーフローが発生することがあります。

このコードでは、
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
VBAで変数をLong型に変更し、ループ処理を正常実行できた画面
合計値を扱う変数をLong型へ変更すると、オーバーフローを回避できる場合があります。

また、小数を含む大きな数値を扱う場合は、
Double型を使うケースもあります。

例えば、

  • 割り算の結果
  • 平均値
  • 売上計算
  • 比率計算

などです。

ただし、
初心者のうちは無理に使い分けを覚えようとせず、

  • 整数 → Long
  • 小数 → Double

くらいの感覚から始めれば十分です。


String型でもオーバーフローが起きるケース

「String型は文字列だから、安全なのでは?」

と思う方もいるかもしれません。

しかし実際には、
String型を使っていても、
内部で数値変換が行われるとオーバーフローが発生することがあります。

例えば、以下のコードです。

Sub OverflowString()

 Dim txt As String

 Dim num As Integer

 txt = "50000"

 num = CInt(txt)

End Sub
VBAでString型の「50000」をCInt関数で変換し、オーバーフローエラーが発生した画面
String型でも、Integer型へ変換した瞬間にオーバーフローが発生することがあります。

このコードでは、
最初は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型へ代入し、オーバーフローエラーが発生した画面
セルに大きな値が入っている場合、Integer型へ代入した時点でオーバーフローになることがあります。

A1セルに大きな数値が入っている場合、
Integer型へ代入したタイミングで
オーバーフローエラーになります。

このようなケースでは、
Long型へ変更することで解決できる場合が多くあります。

Sub OverflowRangeFix()

 Dim num As Long

 num = Range("A1").Value

End Sub
VBAで変数をLong型へ変更し、セルの値を正常に取得できた画面
Integer型では扱えない値でも、Long型へ変更すると正常に取得できる場合があります。

初心者のうちは、
「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でOption Explicitを設定し、未宣言変数でコンパイルエラーが表示された画面
Option Explicitを使うと、変数宣言漏れや入力ミスを早い段階で発見しやすくなります。

デバッグでエラー箇所を確認する方法

オーバーフローエラーが発生した場合は、
「どの行でエラーになったのか」を確認することが大切です。

特に初心者のうちは、

  • どこが原因かわからない
  • 数値が大きすぎる場所が見つからない
  • 変数の型を見落としている

といったケースがよくあります。

VBAでは、
エラーが発生すると、
問題のある行が黄色で表示されます。

例えば、

num = 50000

のような行が黄色になっている場合は、
その行でオーバーフローが発生している可能性があります。

まずは、

  • どの変数を使っているか
  • Integer型になっていないか
  • 計算結果が大きくなっていないか

を確認してみましょう。

また、
F8キーを使うと、
コードを1行ずつ実行できます。

これを「ステップイン実行」と呼びます。

ステップイン実行を使うと、

  • どのタイミングでエラーになるか
  • どの変数で止まるか
  • 計算結果がどう変化しているか

を確認しやすくなります。

さらに、
Debug.Print を使う方法も便利です。

例えば、以下のコードです。

Debug.Print total
Debug.Printで変数の値をイミディエイトウィンドウへ表示している画面
Debug.Printを使うと、変数の値や計算結果を確認しながらデバッグできます。

これを書くと、
現在の変数の値をイミディエイトウィンドウへ表示できます。

ループ処理や計算処理では、
数値が想定以上に大きくなっていないか確認するのに役立ちます。

なお、VBAのデバッグ方法については、
以下の記事でも詳しく解説しています。

オーバーフローエラーは、
「どの行で発生しているか」を確認するだけでも、
原因を特定しやすくなります。


イミディエイトウィンドウはどうやって表示する?

イミディエイトウィンドウは表示タブもしくはCtrl+Gキーで表示することができます。

VBAエディターの「表示」メニューからイミディエイトウィンドウを開く画面
イミディエイトウィンドウを使うと、Debug.Printの結果を確認できます。

エラー処理を入れて強制終了を防ぐ

オーバーフローエラーが発生すると、
VBAの処理は途中で停止します。

そのため、

  • 処理が中断される
  • データ更新が途中で止まる
  • 何が原因かわからなくなる

といったトラブルにつながることがあります。

そこで役立つのが、
VBAのエラー処理です。

例えば、以下のように書く方法があります。

Sub OverflowErrorHandle()

 On Error GoTo ErrHandler

 Dim num As Integer

 num = 50000

 Exit Sub

ErrHandler:

 MsgBox "オーバーフローエラーが発生しました。"

End Sub
VBAでOn Error GoToを使い、オーバーフロー時にメッセージを表示している画面
エラーハンドリングを使うと、エラー発生時に任意のメッセージを表示できます。

このコードでは、
エラーが発生した場合に、
メッセージを表示して処理を終了します。

初心者のうちは、
まずこのように

  • エラー時にメッセージを出す
  • どこで止まったか確認する

という流れを作るだけでも十分です。

一方で、
以下のようなコードには注意が必要です。

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型なのにオーバーフローするのはなぜですか?

    String型でも、
    CInt関数などで数値へ変換した瞬間に、
    Integer型の範囲を超えるとオーバーフローが発生します。

    VBAでオーバーフローエラーを無視しても大丈夫ですか?

    基本的にはおすすめできません。

    On Error Resume Next を使うと処理を継続できますが、
    数値がおかしくなったまま動作する可能性があります。

    まずは、
    変数の型や計算結果を確認することが大切です。


    VBAでオーバーフローエラーを防ぐ方法はありますか?

    以下の方法が効果的です。

    • Integer型よりLong型を使う
    • Debug.Printで値を確認する
    • Option Explicitで変数宣言を強制する
    • 計算結果が大きくなりすぎていないか確認する

    【関連記事】

    VBAの実行時エラーやデバッグ方法については、
    以下の記事でも詳しく解説しています。

    ※外部リンク※

     


      VBAの「オーバーフローしました」の原因と対処法|実行時エラー6を初心者向けに解説
      最新情報をチェックしよう!