VBAエラー オーバーフローしました に、初めて対処してみた
今回の問題
プログラムを書いて実行すると、オーバーフローエラーが出た
まずはデバッグ事始め
VBAを始めて約1年半。
ざっと基礎をやって中級の参考書のソースをざっと理解したところで、VBAを放置してほかの言語に浮気をしていました。
基礎の欠落に気が付いたのは、このサイトの問題にとりかかるようになってからです。
マクロVBA練習問題|エクセルの神髄
入門書から中級の問題集に進んだけれど、バリバリコードを書くまでに至っていない方は、ここの問題をすべて解いてみてください。入門書から学んでいく過程で抜け落ちていた部分を補うことができますよ。
このサイトを解いていく過程で生じたデバッグ作業をことごとく記事にしていきます。
今回は第一回目のデバッグ。
この問題を解いているときに遭遇したエラーをデバッグしてみました。
excel-ubara.com
初めてのオーバーフロー
私が書いてみたコードがこちら。
Sub 練習問題7_1() Dim i As Long, a As Long, total As Long a = 0 total = 0 For i = 2 To total Cells(i, 4) = Cells(i, 2) * Cells(i, 3) a = a + Cells(i, 4) total = total + 1 Next MsgBox "合計は" & a & vbLf & "平均は" & a / total, vbOKOnly, "結果" End Sub
これを実行するとこのようなエラーが出ます
オーバーフロー?!
VBAを学習し始めて、初めて見たエラーです。
デバッグの示す場所はここ。
そういうわけでメッセージボックスとオーバーフローの因果関係を突き止めるべく、メッセージボックスのソースをいじりたおしました。
vbLfを削除してみたり、中身を全部消して、aの中身だけ表示させようとしてみたり。
それでも、実行してみると「オーバーフローしました。」と、冷たくあしらわれます。
気を取り直して、コードをひとつひとつ見ていくことにしました。
F8でステップ実行開始。
そこでやっと気が付きました。
実際に問題のあった場所はここ
他のプロシージャで使いまわした変数totalがおかしなことになっていたんですね。
totalは繰り返しの中で、一つ一つ数を増やしていくために設定されている変数です。
前のプロシージャでは、最終行を取得する変数として使っていたのを、そのままにしてしまっていたのです。
これで動きます
Sub 練習問題7_1() Dim i As Long, a As Long, total As Long a = 0 total = 0 For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row Cells(i, 4) = Cells(i, 2) * Cells(i, 3) a = a + Cells(i, 4) total = total + 1 Next MsgBox "合計は" & a & vbLf & "平均は" & a / total, vbOKOnly, "結果" End Sub