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でひとつひとつ確認しましょう。

このブログの説明

このブログをざっくり一言でいえば・・・

 

VBAを仕事にするための奮闘記

 

になります。

 

更新頻度は月に2回程度ですが、VBAで仕事ができるくらいのレベルになるまで、コツコツデバッグを繰り返し、その経過を記していきます。

 

想定する読者ターゲットは、VBAの入門書は読んだけれど、何をやっていいかわからない人向けです。使っている参考書なども紹介していきます。

 

とはいえ、個人的には

「とにかくVBAスペシャリストになるしかない!」

そんな気負いがありまして、そこにはこのような背景があります。

 

睡眠障害のため雇用で働かせてもらえない現実

 

私は現在45歳。高校一年生、15歳の時に睡眠障害を発症しました。

 

 この30年、実にいろんな苦難がありましたが、軒並み寝付くまでに、毎日4~6時間の時間が犠牲になっています。時には眠れないまま朝を迎えることもあります。30分くらいで毎日ことっと寝てしまう人には「4時間床についていても眠れない」ということがどれほどの苦痛を伴うものなのかピンとこないかもしれません。寝ようとウトウトしだすと針で刺されて延々と寝させてもらえない。そんな拷問のような時間を過ごしています。

 

眠れない苦痛は、実生活にかなりの差し障りをもたらします。

兎にも角にも、いつ不眠が起きるかわからないため、時間を守るということが不可能です。

一睡も出来なかった日は、寝不足のストレスからパニック発作を起こして意識が飛ぶこともたびたび。

 

友達と待ち合わせをして、朝まで眠れなかった日は、ドタキャンせざるを得ません。

ましては、雇用契約を結んで、毎日決まった時間に働くことをやです。 

 

それでも仕事がしたい!

 

2013年からフリーランスで仕事を取っていますが、なんの実績を積むこともできなかった私にやらせてもらえる仕事はほとんどなく、やっとみつけた仕事でも、せいぜい時給150円にしかならないということも。

 

3年前に一念発起して、プログラミングを身に着けて、単価の高い仕事を取ってやる!という目標を立てました。

 

 最初はPythonから手を付けましたが、基礎を一通りやり終えたところで学習迷子になりました。次にやるべきことがわからないのです。

 

なによりPythonはじめ、プログラミング言語は、それらを使用するための統合開発環境などの環境構築が大変です。

 

VBAとの出会い

友達が、業務で役に立つかもしれないからVBAを始めたという話を聞きました。

その時に、はっ!と気づきました。

VBAならExcelさえあれば統合開発環境なしで存分にプログラミングがやれる!

 

早速、私はアマゾンからVBAの入門書を取り寄せました。

 

入門書から始めて、プログラムを実行するとセルに反映されて、くるくる動いてくれる快感。

 

VBAは学習迷子になることもなく今も学習が続いています。

 

時にはVBAに限界を感じて、またPythonJavaScriptに戻ることもありました。

一通りのことが出来るようになると、仕事になるというスクレイピングAPI活用をやりたくなったのです。

 

しかし、VBAは実は奥が深くて、これらのこともやれてしまうということを知りました。

私をやる気にしてくれた記事がこちら

www.fastclassinfo.com

というわけで、とにかく、まずはVBAを極めます。

 

そしてVBAで仕事ができるようになるまで頑張る!

 

飽くなき挑戦は続きます。