【実行時エラー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