【実行時エラー6】オーバーフローしました。

エラー表示

このエラーが発生すると、実行時に次のエラーが表示されます。
実行時 エラー '6'

オーバーフローしました。

エラーの発生理由について

エラーの原因は 変数の最大値を超えて値を格納しようとしたためです。
このエラーは最終行を取得したときに発生することが多いでしょう。
変数の型の格納可能な範囲については、このリンクをクリックしてください。

Microsoft公式の解答

Microsoft公式のリファレンスには、下記のようにあります。

割り当て先の制限を超える割り当てを試行したときにオーバーフローが発生します。 このエラーの原因と解決策を以下に示します。
(以下略)

Integer型で最終行を取得した

下のマクロは、A列で使用されている最終行を取得します。ここで注目して欲しいのが、最終行をInteger型で取得しています。
Integer型の最大値は「32,767」、エクセルの最終行は「1,048,576行」のため、このエラーが発生します(xls形式の最終行は65,536行)。
このエラーの怖いところは、初めのうちは問題が出ず、後から突然エラーになるのが怖い点です。具体的には、運用初期のデータ件数が少ない時は発生せず、運用開始後の時間が経過した時(データが32,768行目以降になった時)に不具合が生じます。

' A列の最終使用行が32,768行目の場合にエラーとなる
Sub TestFunc1_Error()
    Dim rowEnd As Integer
    ' 入力されている最終行を取得(データが多いとエラー)
    rowEnd = Cells(Rows.Count, 1).End(xlUp).Row
End Sub

この場合の解決方法は下記ページ内リンクから!
【解決方法】Integer型で最終行を取得した

Integer型で、Do ~ Loop 等のループをカウントした

Integer型でループのカウントを行うとエラーが生じやすいです。
先の「Integer型で最終行を取得した」で述べた通り、Integer型の最大値は「32,767」、エクセルの最終行は「1,048,576行」です(xls形式の最終行は65,536行)。

なお、Do ~ Loopを使用時、ループの継続条件の設定をミスして、ループから抜けられない時もこのエラーが発生します。

Sub TestFunc2_1_Error()
    Dim cnt As Integer
    cnt = 10
    Do While Cells(cnt, 2) = ""
        cnt = cnt + 1
    Loop
End Sub

この場合の解決方法は下記ページ内リンクから!
【解決方法】Integer型で、Do ~ Loop 等のループをカウントした

右辺の計算結果が格納可能範囲を超えた

計算結果が格納可能な値を超えたときに本エラーが発生することはお伝えした通りですが、右辺の計算結果が規定値を超えてもエラーが発生します。下の例をご覧ください。

Sub TestFunc3_1_Error()
    Dim num1 As Integer
    Dim num2 As Long
    ' Range("A1") は「50」が入力済とします
    num1 = Range("A1")
    num2 = num1 * 1000  ' ←ここでエラー
End Sub

num1 * 1000 は、50000です。num2がLong型なので、問題がないように見えます。
しかし、オーバーフローのエラーが発生します。プログラムの裏側の処理として、右辺側で使用されている最も大きいサイズ型を検出し、見えない変数を作っています。その作成した変数へ計算結果を代入してから左辺の変数(もしくはセル等)に格納します。
num1 は Integer型で、1000 もInteger型であるため※、プログラムはInteger型の変数を勝手に作り、50000を入れようとします。その結果、不具合が生じます。
 ※整数は、最小のサイズで格納できる型となります。
次の例だと分かりやすいかもしれません。

Sub TestFunc3_2_Error()
    Dim num As Long
    num = 50 * 1000   '←ここでエラー
End Sub

50 * 1000 は、50000です。numがLong型なので、これもパッと見では問題がないように見えます。
右辺の 50 , 1000 ともに 格納可能でメモリが最小の型は、Integer型です。プログラムが裏側でInteger型の変数を勝手に作成して、計算結果50000をその自動的に作成されたInteger型の変数に格納しようとするためエラーが発生します。
なお『num = 50 * 60000』なら、60000 が Long型になるため、プログラムが勝手に作成する変数もLong型となり、エラー無く実行することが出来ます。

この場合の解決方法は下記ページ内リンクから!
【解決方法】右辺の計算結果が格納可能範囲を超えた

解決方法は?

先述の通り、変数の最大値を超えて値を格納しようとしたため発生したエラーです。
基本的には、Long型(やDouble型)等の大きい型に変更することによって、このエラーは解消できます。
変数の型の格納可能な範囲については、このリンクをクリックしてください。

【解決方法】Integer型で最終行を取得した

最終行を取得する場合は、必ずLong型を使用しましょう。
昨今のPCなら大量のデータを扱わない限りメモリ不足になりません。整数ならLong型を使用してください。

Sub TestFunc1_Good()
    Dim rowEnd As Long
    ' 入力されている最終行を取得
    rowEnd = Cells(Rows.Count, 1).End(xlUp).Row
End Sub

【解決方法】Integer型で、Do ~ Loop 等のループをカウントした

行数のデータを扱う変数は、必ずLong型を使用しましょう。 昨今のPCなら大量のデータを扱わない限りメモリ不足になりません。整数ならLong型を使用してください。

Sub TestFunc2_1_Error()
    Dim cnt As Long
    cnt = 10
    Do While Cells(cnt, 2) = ""
        cnt = cnt + 1
    Loop
End Sub

【解決方法】右辺の計算結果が格納可能範囲を超えた

原因は、右辺の各値がInteger型だからエラーでした。
これを逆手に取って、右辺をどれかをLong型に変換するか、素直に変数num1をLong型で宣言しましょう。

Sub TestFunc3_1_Good()
    Dim num1 As Integer  ' num1をLong型にすれば↓で型の変換せずに済む
    Dim num2 As Long
    num1 = 50
    'CLng関数で一時的にLong型に変換する
    num2 = CLng(num1) * 1000
End Sub

整数に「&」をつけると、Long型に変換できます。

Sub TestFunc3_2_Good()
    Dim num As Long
    '整数50(Integer型)を、&を付けることで、Long型に変換する
    num = 50& * 1000   'CLng(50) * 1000 や、50 * 1000& もOK
End Sub

ページの先頭へ