VBA エラー 6 オーバーフローしました。の原因と対処方法

VBAを実行するとVBA エラー 6「オーバーフローしました。」を見る機会はありませんか?

コードをみても誤った箇所がわからず途方に暮れる場合もあるかと思います。

そんな中で悩むことは、

・VBA エラー 6「オーバーフローしました。」の原因はなに?
・VBA エラー 6「オーバーフローしました。」の対処はどうすればよい?

ではないでしょうか?

今回は、
VBA エラー 6「オーバーフローしました。」の原因とサクっとできる対処方法について
まとめます!

VBA エラー 6「オーバーフローしました。」はどんなエラー?

エラー 6は関数に指定した引数に、範囲外の値を指定したときに発生するエラーになります。

エラー5の時と似ていますね。

エラー5と6の違いは

・エラー5はVBA関数の規定値以外の値だった場合
・エラー6は引数自体の制限値を超えてしまった場合

になります。

ちなみにオーバーフローとは

水があふれたというイメージです。

変数という枠の桶があり、データである水があふれた状態と思ってもらえばよいでしょう。

VBA エラー 6の原因「引数に設定できる値の許容範囲を超えたため」

上記の通り桶の許容量を超え水があふれいることが原因ということで、各変数の許容量を確認しましょう。

データ型 名称 メモリ 格納できる範囲
Integer 整数型 2バイト -32,768 ~ 32,767
Long 長整数型 4バイト -2,147,483,648 ~ 2,147,483,647
Single 単精度浮動小数点数型 4バイト -3.402823E38 ~
-1.401298E-45(負の値)
1.401298E-45 ~
3.402823E38(正の値)
Double 倍精度浮動小数点数型 8バイト -1.79769313486232E308 ~
-4.94065645841247E-324(負の値)
4.94065645841247E-324 ~
1.79769313486232E308(正の値)
Currency 通貨型 8 バイト -922,337,203,685,477.5808 ~
922,337,203,685,477.5807

それでは、Long型の変数を例にエラーを再現してみましょう。

最大値以上の数値を指定した場合

Long型の変数の最大値は「2,147,483,647」なので、それ以上の数値を指定するとエラー6が発生します。


Sub エラーテスト1a()
    Dim Num As Long
    Num = 12345678901
    MsgBox Num
End Sub

 

計算した結果がその型の範囲を超えた値である場合

計算結果がLong型の変数の最大値「2,147,483,647」を超えた場合にエラー6が発生します。


Sub エラーテスト1b()
    Dim Num As Long
    Num = 2147483647 + 1
    MsgBox Num
End Sub

 

計算する数値が整数型の許容範囲32767を超えた値である場合

こちらはちょっとややこしいのですが、

数値だけみるとLong型の範囲内に収まって問題ないですよね。

ただ、VBAの仕様で、整数の場合は勝手に整数型(Integer)を割り当ててしまうのです。

やめてくれーって感じですよね。

つまり計算する時の型は「整数型 × 整数型 = 整数型」で「32768」の制約が

計算結果にも及ぶということになります。


Sub エラーテスト1c()
    Dim Num As Long
    Num = 32767 + 1
    MsgBox Num
End Sub

はい、エラーがでますね。

VBA エラー 6の原因「引数に設定できる値の許容範囲を超えたため」の対処方法は引数に許容範囲内の値を設定する

VBA エラー 6の原因「引数に設定できる値の許容範囲を超えたため」の対処方法は

引数に許容範囲内の値を設定しましょう。

Long型であれば「2,147,483,647」、整数型(Integer)であれば「32768」を

計算結果を含め超えないようにしましょう。

なお、計算する数値が整数型の許容範囲32767を超えた値である場合の対応は、

CLng関数を使って、制限枠を広げるか、変数に直接計算するようにしましょう。

CLng関数は

引数に数や式を指定するとLong型(長整数型)に変換する関数です。

エラーサンプルでは、

Sub エラーテスト1c()
    Dim Num As Long
    Num = CLng(32767) + CLng(1)
    MsgBox Num
End Sub

もしくは、Long型の変数に直接計算する形にしても

Sub エラーテスト1c()
    Dim Num As Long
    Num = 32767
    Num = Num + 1
    
    MsgBox Num
End Sub

解消される形となります。

はい、できましたね。

なお、CLng関数は引数がLong型に変換できない場合はエラーとなり、

小数点以下は整数に丸められるので、計算結果にご注意ください。

さいごに

今回は、
VBA エラー 6「オーバーフローしました。」の原因とサクっとできる対処方法について
まとめました。

VBAのエラーはパターンを知っておくと発生した時に慌てず対応することができますので、

しっかりと対処方法を把握するようにしておきたいですね!



この記事の関連キーワード

こちらの記事の関連キーワード一覧です。クリックするとキーワードに関連する記事一覧が閲覧できます。








コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です