エラー内容
VBA実行時に、実行時エラー6「オーバーフローしました。」と表示される。
原因と解決方法
3つの原因と、その解決方法が考えられます。
原因1. 変数に大きすぎる値を格納
解説
VBAの型にはそれぞれ、格納できる値の範囲があります。
例えばInteger型の場合、格納できる値の範囲は-32,768~32,767です。
なので、Integer型の変数に、40,000など大きすぎる値を格納しようとするとエラーが発生します。
1 2 3 4 5 6 |
Sub errRuntime6() Dim i As Integer i = 40000 End Sub |
解決方法
変数の型を、格納したい値に対応した型に修正します。
サンプルソースの場合、40,000が格納できるLong型(-2,147,483,648~2,147,483,647)に修正します。
1 2 3 4 5 6 |
Sub errRuntime6() Dim i As Long i = 40000 End Sub |
原因2. 計算結果が、計算元の型より大きい
解説
VBAではかけ算などの計算を行う時、計算対象の数値の中で1番大きい型に一度計算結果を格納します。
たとえばInteger型とLong型のかけ算の場合、計算結果をLong型に格納しようとします。
サンプルソースでは、400と100どちらもInteger型なので、VBAは計算結果を一度Integer型に格納しようとします。
でも、計算結果の40,000はInter型の最大値より大きいので、オーバーフローとなってしまいます。
1 2 3 4 5 |
Sub errRuntime6_2() MsgBox 400 * 100 End Sub |
解決方法
計算に使う数値の中で1番大きい型にVBAは計算結果を格納するので、今回のサンプルソースの場合は、400か100どちらかをCLng関数でLong型に変換します。
そうすると計算結果はLong型に格納されるので、エラーは発生しません。
1 2 3 4 5 |
Sub errRuntime6_2() MsgBox 400 * CLng(100) End Sub |
このエラーは原因知らないと「なんで???」となっちゃいます。
ソース見る限り、まったく間違いを見つけられないので・・・
解決方法を見て、「計算結果をLong型の変数に格納すればいいじゃん!」と思うかもしれません。
でも、VBAは計算した時点でいったん計算結果を格納するので、次のプログラムのように計算結果をLong型に格納しようとしてもエラーが発生します。
1 2 3 4 5 6 |
Sub errRuntime6_2() Dim Kekka As Long Kekka = 400 * 100 End Sub |
なので、この場合も右辺の計算の時点で、400か100どちらかをCLng関数でLong型に変換しないといけません。
原因3. 型変換の数値が大きすぎる
解説
数値の型変換を行った時に変換後の数値が、変換後の型の最大値より大きい時に発生します。
サンプルソースでは、Integer型の最大値より大きな値40000をInteger型に変換しようとしているからです。
1 2 3 4 5 |
Sub errRuntime6_3() MsgBox CInt(40000) End Sub |
解決方法
変換後の数値に対応した型変換に修正します。
サンプルソースの場合は、Cint関数をClng関数に修正すれば、40000を問題なく数値に変換できます。
1 2 3 4 5 |
Sub errRuntime6_3() MsgBox CLng(40000) End Sub |