エラー内容
エラー6(オーバーフローしました)は、数値型が許容できる桁の上限または下限を超えてしまうことを指します。
エラー原因
エラー6は以下の変数の型の設定可能範囲を超える値が設定された場合に発生します。
データ型の設定可能範囲とエラー発生サンプルコード
以下はエラー6が発生するデータ型の一覧です。ここに書かれていないデータ型(Boolean、Object、Variant)はエラー6が発生しません。
データ型 | 設定可能範囲 | エラー発生サンプルコード | ||
---|---|---|---|---|
Byte(バイト型) | 0~255 |
|
||
Integer(整数型) | -32,768~32,767 |
|
||
Long(長整数型) | -2,147,483,648~2,147,483,647 |
|
||
Single(単精度浮動小数点数型) | 負数:-3.402823E38~-1.401298E-45 正数:1.401298E-45~3.402823E38 |
|
||
Double(倍精度浮動小数点数型) | 負数:-1.79769313486231E308~-4.94065645841247E-324 正数:4.94065645841247E-324~1.79769313486232E308 |
|
||
Currency(通貨型) | -922,337,203,685,477.5808~922,337,203,685,477.5807 |
|
||
Date(日付型) | 西暦100年1月1日~西暦9999年12月31日 |
|
なお、Booleanがエラー6を発生しない理由は、値の解釈の仕方が他のデータ型と違うためです。
BooleanはFalseとTrueを持ちますが、0以下の場合はFalse、1以上の場合はTrueと解釈されるため代入時にエラーになることがありません。Val(10000)*10000などの演算している場合も同様でエラーになりません。
演算結果でエラーになる場合
上記のデータ型の範囲にあるのにエラー6が発生することがあります。
それは、演算が行われている場合です。
1 2 3 4 |
Sub Err6IntegerCalCTest() Dim i As Long i = 400 * 400 End Sub |
400×400の160000はLong型の範囲に入っていますがエラー6が発生します。
その理由は、VBAでは右辺の演算は各数値の型同士で演算され、その型が保持されるためです。
右辺の400 * 400は、Integer×Integerと解釈されます。そのため、その演算結果もIntegerと判定され、演算結果がIntegerの範囲外になるためエラーになります。
以下のようにCLng関数でLong型に変換するとエラーが回避できます。なお、3行目のように演算結果をCLng関数で変換しても変換前の時点でInteger型×Integer型と解釈されるためエラーになります。
1 2 3 4 5 |
Sub Err6IntegerCalCTest2() Dim i As Long ' i = CLng(400 * 400) i = CLng(400) * 400 End Sub |
エラー対応方法
エラー6の対応方法は、データ型の範囲外の値を設定しないようにするか、データ型をより範囲の広い型に変更します。
簡単なのは変数の型をVariant型もしくは型を省略(省略するとVariantと解釈される)することです。