1. オーバーフローエラーとは?
VBAのオーバーフローエラー(Run-time error '6': Overflow
)は、変数に格納できる範囲を超えた値を代入または計算したときに発生します。
VBAの各データ型には格納できる数値の範囲が決まっており、その範囲を超えるとエラーになります。
2. オーバーフローエラーが発生する例
<Integer
型の範囲を超えた場合>
VBAの Integer
型は -32,768 〜 32,767 の範囲の整数を扱えます。
Sub OverflowExample1()
Dim num As Integer
num = 40000 '32,767 を超えるためオーバーフロー
MsgBox num
End Sub
40000
は Integer
の上限 32,767
を超えているため、オーバーフローエラーが発生!
<計算結果が型の上限を超えた場合>
計算の途中で値が型の範囲を超えてもエラーになります。
Sub OverflowExample2()
Dim num As Integer
num = 30000 * 2 '60,000 は Integer の上限を超える
MsgBox num
End Sub
30000 × 2 = 60000
で 32,767 を超えるためオーバーフロー!
ポイント: VBAでは Integer * Integer
の結果も Integer
として評価されるため、エラーになる。
<Byte
型の範囲を超えた場合>
VBAの Byte
型は 0〜255 の範囲しか扱えません。
Sub OverflowExample3()
Dim num As Byte
num = 256 'Byte の範囲(0~255)を超える
MsgBox num
End Sub
256
は Byte
の最大値 255
を超えるためオーバーフロー!
<Long
型でも範囲を超える場合>
VBAの Long
型は -2,147,483,648 〜 2,147,483,647 の範囲を持ちますが、それを超えるとオーバーフローします。
Sub OverflowExample4()
Dim num As Long
num = 3000000000 'Long の範囲を超えるためオーバーフロー
MsgBox num
End Sub
3,000,000,000
は Long
の最大値 2,147,483,647
を超えているためオーバーフロー!
3. オーバーフローエラーの対処法
🔵Long
型を使う
Integer
の範囲(-32,768 ~ 32,767)を超える可能性がある場合は、Long
型(-2,147,483,648 ~ 2,147,483,647) を使う。
Sub FixOverflow1()
Dim num As Long
num = 40000 'Long 型ならOK
MsgBox num
End Sub
Long
は Integer
よりも大きな数値を扱えるのでオーバーフローを防げる!
🔵Double
型を使う(浮動小数点数が必要な場合)
整数だけでなく、小数も扱いたい場合は Double
型 を使う。
Sub FixOverflow2()
Dim num As Double
num = 30000 * 2 'Double ならOK
MsgBox num
End Sub
Double
は 非常に大きな数値(±1.79769313486231E+308) まで扱える!
🔵CLng
や CDbl
を使って型変換する
VBAは計算の途中で Integer
型として処理しようとする ため、Long
や Double
に変換するとエラーを回避できる。
Sub FixOverflow3()
Dim num As Long
num = CLng(30000) * 2 '明示的に Long に変換
MsgBox num
End Sub
CLng(30000) * 2
にすることで Integer
型の制限を回避!
🔵On Error Resume Next
でエラー処理を行う(最終手段)
エラーが発生してもプログラムが止まらないようにする方法もあるが、これは最後の手段として使用する。
Sub HandleOverflow()
On Error Resume Next
Dim num As Integer
num = 40000
If Err.Number <> 0 Then
MsgBox "オーバーフローエラーが発生しました。"
Err.Clear
End If
End Sub
On Error Resume Next
でエラーを回避できるが、根本的な解決ではないので注意!
4. まとめ
エラー原因 | 対処法 |
---|---|
Integer の範囲を超える数値 | Long を使う |
計算結果が Integer の範囲を超える | Long または Double を使う |
Byte の範囲を超える | Integer や Long に変更 |
Long の範囲を超える | Double を使う |
CLng() や CDbl() で型変換 | 型を明示的に Long や Double に変換 |
On Error Resume Next を使う | 最終手段(推奨しない) |
オーバーフローエラーを防ぐためには、扱うデータの範囲を考えて適切なデータ型を選ぶことが重要です!
コメント