【VBA入門】「オーバーフロー」エラーが発生する原因・対処方法とは

皆さんは、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に移動せずにメッセージを表示することができます。ちょっとしたことで使い勝手が大きく変わるので、エラー処理を入れる癖をつけるのがおすすめです。エラー処理については以下でも詳しく解説しているので、気になる方は見てみてくださいね!

    まとめ

    今回は、「オーバーフローしました」のエラーが起きる原因・対処方法について解説しました。このエラーは、変数を使って処理を書くようになってくると起こりやすいエラーです。

    エラーが起きてしまったときは、この記事を見つつ対応してみてくださいね!

    この記事を書いた人

    北海道出身の30歳で、フリーランスエンジニア兼テックライターとして活動中。新卒入社したメーカー系のIT企業で、システムエンジニアとして約5年勤務。

    Webアプリ、業務アプリ開発において、要件定義 ~ 運用保守まで様々な経験あり。また3歳の娘がいる1児のパパで、日々娘との時間を確保するために仕事を頑張っています!
    侍エンジニアでは、【誰でもわかるレベルのわかりやすさ】を意識して、記事を執筆中。

    目次