皆さんは、VBAで「オーバーフローしました」というエラーを見たことがありますか?「オーバーフローしました」のエラーは、変数を使って処理を書いているときにおこりやすいエラーです。
そこで今回は、
といった基礎的なことから、応用的な方法まで、徹底的に解説します!
「オーバーフローしました」エラーが出る原因・対処方法とは
はじめに、「実行時エラー’6’ オーバーフローしました」のエラーが起こる原因について簡単に解説します。
「実行時エラー’6’ オーバーフローしました」のエラーは、型ごとに決まっている桁数を超えた値を入れてしまった場合に起こるエラーです。例えば、数値を入れるInteger型の桁範囲は「-32,768 ~ 32,767」です。そのため、-32,768よりも小さく、32,767よりも大きい数値を入れた場合はエラーになります。
エラーサンプルコード:
Sub Test() Dim intCost As Integer intCost = 50000 Debug.Print intCost End Sub
実行結果:
このエラーは、桁数が多い型に変えるだけで簡単に対処することができます。
エラー対処後のコード:
Sub Test() Dim lngCost As Long lngCost = 50000 Debug.Print lngCost End Sub
実行結果:
50000
整数を使う場合はInteger型からLong型、小数を使う場合はSingle型からDouble型に変えるとエラーがでなくなります。このように、型そのものを桁数の多い型に変えるだけで簡単に対処することができます。ちなみに、変数の型・桁数・使い方については以下記事で詳しく解説しているので、気になる方は見てみてくださいね!
計算結果でエラーになったときの対処方法
計算した結果を変数に代入する場合、変数の型の範囲内にもかかわらずエラーが起きてしまうときがあります。
エラーサンプルコード:
Sub Test() Dim lngTotal As Long lngTotal = 5000 * 10 Debug.Print "合計金額:" & lngTotal End Sub
実行結果:
「5000 * 10 = 50000」はLong型の数値範囲「-2,147,483,648 ~ 2,147,483,647」の範囲内になっているのに、なぜエラーになるんだろう?と思った方も多いのではないでしょうか。数値を直接入力した場合でも数値ごとに型が割り当てられるため「5000 * 10」は、「Integer型の数値(5000) と Integer型の数値(10)」をかけて計算している意味になります。
そのため、計算結果がInteger型の数値範囲「-32,768 ~ 32,767」を超えた50000になっているため、エラーになるわけですね。このエラーは計算に使っている数値を事前にLong型にすればOKなので、以下のどちらかでエラー回避できます。
修正後のサンプルコード1:
Sub Test() Dim lngTotal As Long lngTotal = CLng(5000) * 10 Debug.Print "合計金額:" & lngTotal End Sub
修正後のサンプルコード2:
Sub Test() Dim lngTotal As Long Dim lngCost As Long Dim lngNum As Integer lngCost = 5000 lngNum = 10 intTotal = lngCost * lngNum Debug.Print "合計金額:" & intTotal End Sub
サンプル1はCLng関数を使ってLong型を指定した数値を使い、サンプル2は計算に使う値をLong型の変数で計算することでエラーを回避しています。
数値が変更になることも考えるとサンプル2がおすすめですが、ぱぱっと処理を進めたいときはサンプル1の方が作りやすいので、用途に応じて使い分ければOKです!
【よくある間違い】桁数の多い型のみ使えばいいのでは?
ここまで聞くと、桁数の多い型を最初から使えばいいと思う方もいるかもしれません。確かに、桁数の多い型を使えばオーバーフローのエラーは起こりづらくなります。
ただ、変数はパソコンのメモリ領域を使ってしまうため、無駄に桁数の多い型を使いすぎると処理の速度にも影響が出てしまいます。そのため、変数に入れる値の範囲にあった型を設定するのがおすすめです!ちなみに、処理の速度はTimer関数を使って簡単に調べることができます。
Timer関数の使い方は以下でもまとめているので、気になる方は見てみてくださいね!
補足:エラー時にデバッグ画面に移動しない方法
エラーが発生したときにVBEの画面に移動してしまうとVBAを知らない人がツールを使っていた場合はびっくりしてしまいますよね。自分で使うだけであればそこまで気にしなくてもいいかもしれませんが、ツールを使うことに対しての不信感にもつながってしまうので、エラー処理を入れておくのがおすすめです!
サンプルコード:
'メインの処理 Sub Main() Dim resultMessage As String resultMessage = Test If resultMessage <> "" Then MsgBox resultMessage, vbCritical Else MsgBox "処理成功", vbInformation End If End Sub 'オーバーフローが発生するエラーサンプル Function Test() As String On Error GoTo Test_Err Test = "" Dim lngCost As Long lngCost = 5000 * 10 MsgBox lngCost Exit Function Test_Err: 'エラー時にエラー情報を返す Test = "【処理エラー】" & vbCrLf & _ "エラー番号:" & Err.Number & vbCrLf & _ "エラーメッセージ:" & Err.Description End Function
実行結果:
メッセージの内容はほとんど同じですが、VBEに移動せずにメッセージを表示することができます。ちょっとしたことで使い勝手が大きく変わるので、エラー処理を入れる癖をつけるのがおすすめです。エラー処理については以下でも詳しく解説しているので、気になる方は見てみてくださいね!
まとめ
今回は、「オーバーフローしました」のエラーが起きる原因・対処方法について解説しました。このエラーは、変数を使って処理を書くようになってくると起こりやすいエラーです。
エラーが起きてしまったときは、この記事を見つつ対応してみてくださいね!