Sub Sample1()
Dim N As Integer
N = 32768
End Sub
オーバーフローとは、定められた許容範囲を超えたときに発生するエラーです。上のコードで、変数Nは整数型(Integer)で宣言しています。整数型の変数には、-32,768から32,767までの整数しか入れられません。その許容範囲を超えて32768を入れようとしたためにエラーが起こりました。
注意しなければならないのは、次のようなケースです。今度は変数Nを長整数型(Long)で宣言しました。
長整数型は、-2,147,483,648から2,147,483,647までの整数を格納できる型です。十分な大きさですね。しかし、次のコードはエラーになります。
Sub Sample2()
Dim N As Long
N = 330 * 100
End Sub
330 × 100 は 33000 です。長整数型の許容範囲からすれば、余裕の数値です。でもエラーです。ところが、次のコードはエラーになりません。
Sub Sample3() Dim N As Long N = 35000 * 100 End Sub
「=」演算子で、右辺を左辺に代入するとき、VBAはまず右辺の計算結果を確定させます。エラーになったSample2で、右辺の「330」と「100」は、どちらも整数型(Integer)の許容範囲内の数値です。つまり「整数型 × 整数型」という式ですね。こんなときVBAは「整数型 × 整数型」の計算結果を、まず同じ整数型に入れようとします。整数型の許容範囲は32767までです。330 × 100 = 33000 は、整数型の許容範囲を超えているので、右辺の計算過程において「オーバーフローしました」ということです。
一方、エラーにならないSample3では、右辺で「35000 × 100」を計算しています。「35000」は整数型の許容範囲を超えています。いわばこれは、長整数型の数値です。右辺の計算式は「長整数型 × 整数型」となります。このときVBAは、大きい方の長整数型に、計算結果を入れようとします。計算結果は3500000で、長整数型の許容範囲内です。それを、左辺の変数N(長整数型)に入れるのですから、何も問題はありません。
まぁ、めったにあることではありませんが、VBAにはこのような特徴があります。ちなみに、Sample2のエラーを解決するには「整数型 × 整数型」を「長整数型 × 整数型」にしてやればいいです。こんなときに使うのがCLng関数です。
Sub Sample2() Dim N As Long N = CLng(330) * 100 End Sub