VBAのオーバーフローエラー(Overflow)とその対処法

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 を使う最終手段(推奨しない)

オーバーフローエラーを防ぐためには、扱うデータの範囲を考えて適切なデータ型を選ぶことが重要です!

コメント

タイトルとURLをコピーしました