VBA で「オーバーフローしました」と表示された場合の原因と対処法
VBAのコーディング作業中、「オーバーフローしました」というエラーに直面したことはありませんでしょうか。このエラーは、データ型ごとに扱える数値の範囲を超えてしまったときに発生するエラーです。つまり、「データ型」と「数値の範囲」に着目すれば、エラーを回避することが可能です。詳しく解説します。
目次
1.「オーバーフローしました」エラーの原因
1-1.原因はデータ型ごとに扱える数値の範囲を超えたこと
「オーバーフローしました」というエラーが表示される原因はただ1つ、データ型ごとに扱える数値の範囲を超えてしまったことです。例えば、以下のソースを見てください。
Sub Sample1() Dim a As Integer a = 1000000 Debug.Print (a) End Sub
実行結果
このソースは、aという変数をInteger型で定義し、1000000という数値を格納しています。ところが、Integer型は-32,768~32,767の整数しか扱えないため、オーバーフローとなります。
今度は、aをLong型で定義すると実行結果は下記のようになります。
Sub Sample2() Dim a As Long a = 1000000 Debug.Print (a) End Sub
実行結果
今度はaに格納した1000000がイミディエイトウィンドウに出力されました。これは、Long型が-2,147,483,648~2,147,483,647の整数を扱えるので、1000000をaに格納することができます。このように、データ型が扱える数値の範囲を超えてしまうとオーバーフローが発生します。
2.「オーバーフローしました」エラーの対策
2-1.数値は直接入力せず、変数に格納する
オーバーフローを発生させないようにするには、数値をなるべく変数に格納することがおすすめです。
例えば、下記のソースを見てください。
Sub Sample2() Dim a As Long a = 30000 + 5000 Debug.Print (a) End Sub
実行結果
これは、変数aをLong型で定義し、30000 + 5000、つまり35000を格納しています。これはLong型で扱える範囲に含まれています。それにも関わらず、実行結果はオーバーフローとなってしまっています。これは、「a = 30000 + 5000」のように直接入力された数値の計算結果を格納する場合、30000と5000がInteger型の範囲内であるため、Integer型と判断されてしまうからです。従って、計算結果の35000もInteger型となり、扱える数値の範囲を超えてしまいます。一方、下記のように書き換えればオーバーフローを防ぐことができます。
Sub Sample3() Dim a As Long Dim b As Long Dim c As Long a = 30000 b = 5000 c = a + b Debug.Print (c) End Sub
実行結果
今度は30000 + 5000の計算を直接変数に格納するのではなく、30000をLong型の変数aに、5000をLong型の変数bに格納し、a + bの計算結果をLong型の変数cに格納しています。これは、計算に使う数値をLong型の変数に格納しており、a + bの結果である35000もLong型とみなされるので、オーバーフローを防ぐことができます。このように、あらかじめ数値を意図するデータ型の変数に格納することが、オーバーフローの対策になります。
2-2.データ型を変換してオーバーフローを回避する
オーバーフローを回避するために、データ型を変換するという方法もあります。例えば、下記のソースをご覧ください。
Sub Sample4() Dim a As Long a = CLng(30000) + 5000 Debug.Print (a) End Sub
実行結果
注目すべきは「a = CLng(30000) + 5000」の部分です。30000をCLngという関数を用いてLong型に変換しています。このようにすることで、30000がLong型になります。従って、Long型の30000とInteger型の5000の計算になりますが、異なるデータ型同士の計算は扱える数値の範囲が大きいデータ型として扱われるので、計算結果の35000はLong型となります。このように、関数を用いてデータ型の変換をすることでオーバーフローを回避することが可能です。
3.まとめ
VBAにおける「オーバーフローしました」エラーの原因と対策について解説しました。繰り返しになりますが、データ型毎に扱える数値の範囲を超えた時に「オーバーフロー」が発生します。従って、その数値の範囲を超えないように気を付けてコーディングをする必要があります。本記事に載せた内容がエラー解決の一助になれば幸いです。
コメント