EXCELのVBAの掛け算等で要注意!オーバーフロー対策3選

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つの方法で、しっかり対策しましょうね。