スライドショー

【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型に変えるとエラーがでなくなります。このように、型そのものを桁数の多い型に変えるだけで簡単に対処することができます。ちなみに、変数の型・桁数・使い方については以下記事で詳しく解説しているので、気になる方は見てみてくださいね!

    【VBA入門】変数をDimで宣言し、 Asでデータ型を定義する方法
    更新日 : 2019年10月1日

    計算結果でエラーになったときの対処方法

    計算した結果を変数に代入する場合、変数の型の範囲内にもかかわらずエラーが起きてしまうときがあります。

    エラーサンプルコード:

    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関数の使い方は以下でもまとめているので、気になる方は見てみてくださいね!

    【ExcelVBA入門】処理時間を計測するためのTimer関数の使い方とは
    更新日 : 2019年5月3日

    補足:エラー時にデバッグ画面に移動しない方法

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

    【VBA入門】エラーを処理する方法(On Error、Resume、GoTo)
    更新日 : 2019年4月21日

    まとめ

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

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

    LINEで送る
    Pocket

    無料でSEからWebエンジニアへ転職しませんか?



    侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

    • システムエンジニアという職業だけどコードが書けない
    • 事務作業が多くスキルがないため将来が不安
    • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
    という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

    弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

    既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

    まずは無料体験レッスンを予約する

    書いた人

    Sanshiro Wakizaka

    Sanshiro Wakizaka

    フリーランスエンジニア兼ライターのワキザカ サンシロウです。
    ExcelVBAの自動化ツール開発、WEB開発をメインにエンジニア業務をこなしつつ、サムライエンジニアにてライター業務をしております。

    プログラミングをこれからやってみたい方に向けて、ためになる記事を全力で書いていきますので宜しくお願い致します!

    おすすめコンテンツ

    あなたにぴったりなプログラミング学習プランを無料で診断!

    プログラミング学習の効率を劇的に上げる学習メソッドを解説