VBAデバッグの鬼

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

これを実行するとこのようなエラーが出ます
f:id:vba-tokepi:20210327171606j:plain

オーバーフロー?!
VBAを学習し始めて、初めて見たエラーです。
デバッグの示す場所はここ。
f:id:vba-tokepi:20210327171711j:plain
そういうわけでメッセージボックスとオーバーフローの因果関係を突き止めるべく、メッセージボックスのソースをいじりたおしました。
vbLfを削除してみたり、中身を全部消して、aの中身だけ表示させようとしてみたり。

それでも、実行してみると「オーバーフローしました。」と、冷たくあしらわれます。

気を取り直して、コードをひとつひとつ見ていくことにしました。
F8でステップ実行開始。

そこでやっと気が付きました。

実際に問題のあった場所はここ
f:id:vba-tokepi:20210327172150j:plain

他のプロシージャで使いまわした変数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

こつこつF8実行で解決

オーバーフローというエラーを目にしたのが初めてであたふたしてしまいましたが、F8でプログラムを一行一行実行しながらおかしな箇所に気付けることが解消への道です。
それにしても、プロシージャや変数の使いまわしをするときは、使いまわし前に機能していた部分と、新しく機能させたい部分に矛盾が生じていないか、入念にチェックする必要があります。

自分で新たなVBAのプログラムを組むとき、GitHubやブログに載っているソースを使い回すこともあるはずです。その時に、オーバーフローなどのエラーが出たら、引き継いだ変数などに矛盾がないか、F8でひとつひとつ確認しましょう。