EXCELのVBAで計算をする場合、注意すべきことのひとつが「オーバーフロー」です。
本記事では、「VBAの数値計算時に注意すべきオーバーフローとその対策」について解説します。
1.EXCEL VBAの数値計算で起こるオーバーフローとは?
こんにちは。エクセルマン・ブリーダーのしもむぎ(@re_znd13)です。
まずはオーバーフローが起こるとどうなるのか、見ていきましょう。
VBAで扱う数値がオーバーフローしてしまったときに表示されるものです。
オーバーフローはどういうときに起こるのでしょう?
それは変数の型と関係があります。
例えば以下のVBAコードを実行してみると、結果は先ほどの画像のように、実行時エラー’6’となります。
Sub 掛け算()
Dim a As Byte
a = 16 * 16
End Sub
ここで変数aの型を見てみると、byte型ですね。byte型とは0~255ですので、答えが256となるこの数値計算ではオーバーフローとなってしまうのです。
負の数値となるような場合も同じくオーバーフローが起こります。
2.(対策1)変数の型を適切にする
オーバーフロー対策の基本は、扱う数値の大きさ、範囲に応じた適切な変数の型にすることです。
変数の型(整数の関連)と扱える数値の関係は以下のようになっています。
- byte型:0~255の整数
- integer型:-32768~32767の整数
- long型:-2147483648~2147483647の整数
3.(対策2)変数の型を変換する
次のVBAコードを実行数とどうなると思いますか?
Sub 掛け算2()
Dim b As Long
b = 500 * 500
End Sub
結果は、次の画像のようになります。
あれ?と思いませんか?
bという変数はlong型で、計算結果は250000と、扱える数値の範囲内のハズですよね。
これ、500がinteger型と判断されるから、なんです。
VBAでは、integer型とinteger型の数値計算の答えはinteger型で返そうとするんですね。
こういうケースでは、CLng(500)のように、計算する数値の型を変換する対策が必要です。
Sub 掛け算2b()
Dim b As Long
b = CLng(500) * 500
End Sub
4.(対策3)変数として扱う
前章の例では、数値をinteger型と判断されたため、その計算結果がinteger型だと見なされてしまうことが問題になっていました。
以下のように記述することでも対策することができます。
Sub 掛け算3()
Dim c1, c2 As Integer
Dim c3 As Long
c1 = 500
c2 = 500
c3 = c1 * c2
End Sub
計算自体は前章の例と同じく500×500ですが、c1、c2というinteger型の変数として扱うように記述しました。
この例ではオーバーフローが出ず、正常に計算させることができます。
5.まとめ
本記事では、「VBAの数値計算時に注意すべきオーバーフローとその対策」について解説しましたが、いかがでしたか?
掛け算や指数演算では答えが大きな数値になることが多いので、主に掛け算の例で解説しましたが、オーバーフローは、足し算や引き算、割り算でも起こりうる事象です。
今回取り上げた3つの方法で、しっかり対策しましょうね。