VBA 「オーバーフローしました」エラーの原因と対策を徹底解説!

和田 康宏

開発エンジニア/新卒6期/ボールド歴2年10ヶ月

VBAのコーディング作業中、「オーバーフローしました」というエラーに直面したことはありませんでしょうか。このエラーは、データ型ごとに扱える数値の範囲を超えてしまったときに発生するエラーです。つまり、「データ型」と「数値の範囲」に着目すれば、エラーを回避することが可能です。詳しく解説します。

就活生向け特設ページ

1.「オーバーフローしました」エラーの原因

1-1.原因はデータ型ごとに扱える数値の範囲を超えたこと

「オーバーフローしました」というエラーが表示される原因はただ1つ、データ型ごとに扱える数値の範囲を超えてしまったことです。例えば、以下のソースを見てください。

Sub Sample1()
Dim a As Integer

a = 1000000

Debug.Print (a)

End Sub

実行結果

このソースは、aという変数をInteger型で定義し、1000000という数値を格納しています。ところが、Integer型は-32,76832,767の整数しか扱えないため、オーバーフローとなります。

今度は、aLong型で定義すると実行結果は下記のようになります。

Sub Sample2()
Dim a As Long 

a = 1000000

Debug.Print (a)

End Sub

実行結果

今度はaに格納した1000000がイミディエイトウィンドウに出力されました。これは、Long型が-2,147,483,6482,147,483,647の整数を扱えるので、1000000aに格納することができます。このように、データ型が扱える数値の範囲を超えてしまうとオーバーフローが発生します。


2.「オーバーフローしました」エラーの対策

2-1.数値は直接入力せず、変数に格納する

オーバーフローを発生させないようにするには、数値をなるべく変数に格納することがおすすめです。

例えば、下記のソースを見てください。

Sub Sample2()
Dim a As Long

a = 30000 + 5000

Debug.Print (a)

End Sub

実行結果

これは、変数aLong型で定義し、30000 + 5000、つまり35000を格納しています。これはLong型で扱える範囲に含まれています。それにも関わらず、実行結果はオーバーフローとなってしまっています。これは、「a = 30000 + 5000」のように直接入力された数値の計算結果を格納する場合、300005000Integer型の範囲内であるため、Integer型と判断されてしまうからです。従って、計算結果の35000Integer型となり、扱える数値の範囲を超えてしまいます。一方、下記のように書き換えればオーバーフローを防ぐことができます。

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の計算を直接変数に格納するのではなく、30000Long型の変数aに、5000Long型の変数bに格納し、a + bの計算結果をLong型の変数cに格納しています。これは、計算に使う数値をLong型の変数に格納しており、a + bの結果である35000Long型とみなされるので、オーバーフローを防ぐことができます。このように、あらかじめ数値を意図するデータ型の変数に格納することが、オーバーフローの対策になります。

2-2.データ型を変換してオーバーフローを回避する

オーバーフローを回避するために、データ型を変換するという方法もあります。例えば、下記のソースをご覧ください。

Sub Sample4()
Dim a As Long

a = CLng(30000) + 5000

Debug.Print (a)

End Sub

実行結果

注目すべきは「a = CLng(30000) + 5000」の部分です。30000CLngという関数を用いてLong型に変換しています。このようにすることで、30000Long型になります。従って、Long型の30000Integer型の5000の計算になりますが、異なるデータ型同士の計算は扱える数値の範囲が大きいデータ型として扱われるので、計算結果の35000Long型となります。このように、関数を用いてデータ型の変換をすることでオーバーフローを回避することが可能です。


3.まとめ

VBAにおける「オーバーフローしました」エラーの原因と対策について解説しました。繰り返しになりますが、データ型毎に扱える数値の範囲を超えた時に「オーバーフロー」が発生します。従って、その数値の範囲を超えないように気を付けてコーディングをする必要があります。本記事に載せた内容がエラー解決の一助になれば幸いです。

私たちは、全てのエンジニアに市場価値を高め自身の望む理想のキャリアを歩んでいただきたいと考えています。もし、今あなたが転職を検討しているのであればこちらの記事をご一読ください。理想のキャリアを実現するためのヒントが見つかるはずです。

『技術力』と『人間力』を高め定年まで働けるエンジニアを目指しませんか?

私たちは「技術力」だけでなく「人間力」の向上をもって、エンジニアとしてだけでなくビジネスパーソンとして高い水準を目指し、社会や顧客に必要とされることで、関わる人々に感動を与える集団であろうと思っています。

  • 定年までIT業界で働くためのスキルが身につく「感動大学」と「技術勉強会」!
  • 「給与が上がらない」を解消する6ヶ月に1度の明確な「人事評価制度」!
  • 理想のエンジニア像に近づくためのよきアドバイザー「専任コーチ制度」!
  • 稼動確認の徹底により実現できる平均残業時間17時間の働きやすい環境!

現在、株式会社ボールドでは「キャリア採用」のエントリーを受付中です。

まずは以下のボタンより弊社の紹介をご覧いただき、あなたの望むキャリアビジョンをエントリーフォームより詳しくお聞かせください。

コメント

文系IT未経験歓迎!株式会社ボールドの 採用エントリー を受付中!
文系IT未経験歓迎!
株式会社ボールドの 採用エントリー を受付中!