【学習ログ】Geminiと読み解く『パーフェクトExcel VBA』 #26|第4章 フロー制御ステートメント⑤
今回はDo~Loopステートメントから、テキストを読んでいて文法はわかるけど、『これ、具体的にいつ使うの?』と思った部分をGeminiと学習していきます。『空っぽのデータへの対処法』という視点でみると、理解しやすかったので、記録しておきます。
1. 「何に使うの?」が繋がった瞬間
テキストを読んでいていつも思うのは、文法はわかるし、コードも読めるけど、『これ、具体的にいつ使うの?』ということ。Do~Loopの後判定は、ログイン画面で使いそうだな、とすぐにわかったけれども、Do~Loopの前判定って、何に使うのかしら??入力画面をずっと出しておく時とか?って聞いたら、「それは「イベント駆動(ボタンを押した時に動く仕組み)」で別の話!」って言われてしまいました。そこで、Geminiが出してくれた例が『空っぽのデータへの対処法』という視点。
最初から入れない(前判定)
途中でスキップする(GoToのワープ)
安全なデータだけ通す(Ifの囲い込み)
これで、Do~LoopからGoTo、If文までが一気に繋がることとなったのです!
2. 防衛戦その1:最初から空っぽなら「始めない」(前判定)
Do~Loopには、条件を先に確認する「前判定」と、後から確認する「後判定」があります。 例えば、エクセルの名簿を上から順番に処理していくマクロを作ったとします。
もし、「1行目からいきなりデータが空っぽ」だったらどうなるでしょうか? 処理するものが何もないのに、無理やり計算を始めようとしてエラーになってしまいますよね。
そこで活躍するのが「前判定(Do Until 〜 Loop など)」です。 これは、いわば「入り口の厳しい警備員」です。
' 1行目からチェックをスタートする
i = 1
' セルが空っぽになる「前」までループを続ける(前判定)
Do Until IsEmpty(Cells(i, 1).Value)
' メインの処理
i = i + 1
Loop処理を始める前に「データ入ってる?」と確認し、最初から空っぽなら「1回も中に入れない(処理を始めない)」という強力な防衛線を張ってくれます。これで無駄なエラーを防げるわけです。これで「何に使うの?」がスッキリしました。
3. 防衛戦その2:途中で空っぽが出たら「1回休み」にしたい!
さて、前判定のおかげで無事にループがスタートし、1行目、2行目と順調に処理が進んでいきました。しかし、ここで新たな問題が発生します。
「3行目のデータだけ、一部が空欄になっていて計算できない!」
マクロ全体をここで止めたくはありません。「この3行目だけ処理をスキップ(1回休み)して、そのまま4行目に進んでほしい」と思いますよね。
他のプログラミング言語なら、ここで Continue(今の回だけパスして次へ!)という便利なスキップボタンを押せば解決するそうです。 しかし、なんと、VBAにはこの「1回休み」のコマンドが存在しないのだとか!
4. 無いならどうする?実務における「2つの説」
1回休みのボタンがないVBAで、空っぽデータを華麗にスルーするにはどうすればいいのか?実務の世界では、大きく2つのアプローチ(説)が存在するそうです。
説A:先人たちの知恵と文化「GoTo Continue」
無いなら無理やり作ってしまえ!という力技です。ループの一番下(Nextの直前など)に「Continue:」という独自の看板を立てておきます。
For i = 1 To 5
' もし空っぽなら、一番下の看板までワープしてスキップ!
If IsEmpty(Cells(i, 1).Value) Then GoTo Continue
' --- メインの処理 ---
Continue: ' ワープ先の看板
Next i
「条件に合わないものをワープさせる」というこの書き方は、プログラマー界隈の「暗黙の了解」として定着した文化なのだそうです。
説B:現代の主流「If文で安全な部屋に囲う」
GoToによるワープは、多用するとコードがあちこちに飛んで解読不能になるいわゆるスパゲッティコードのリスクがあります。そこで「悪いデータをスキップする」のをやめて、発想を逆転させます。
For i = 1 To 5
' 空っぽ「ではない(Not)」時だけ、安全な部屋(If)に入れて処理する!
If Not IsEmpty(Cells(i, 1).Value) Then
' --- メインの処理 ---
End If ' 部屋の終わり
Next i
スキップするのではなく、「綺麗なデータだけをIf文で囲んで処理する」というアプローチです。Geminiによると、実務ではこちらが主流とのこと。 ただし、テキストにも「Ifブロックが長くなると可読性に影響が出るので注意」と書かれていました。どちらが絶対の正解というわけではなく、状況によって複数の説を使い分けるのがプロの視点なんですね。
5. おまけ:バグの「摘み取り」と「予防線」
最後に、今回の一連の学習を通じて、私の中で「エラーとの向き合い方」について気づいたことがあります。
今回学んだ、Do~Loopの前判定やGoToステートメント、 以前学んだ、If文、IsEmpty、IsError などを使って、事前に空っぽのデータを弾く処理。これは、「予測できるバグを事前に摘み取る仕掛け」です。
一方で、4章の後半で学ぶ On Error GoTo(エラーが起きたら別の処理に飛ばす)という構文。これは、中身をチェックするだけではどうしようもない「ファイルがロックされていた」などの、「予測しづらい不慮の事故(バグ)に対して予防線を張る仕掛け」なのだということ。
単にコードの書き方を学ぶだけでなく、「これはシステムを守るための、どのフェーズの防衛戦なのか?」と考えると、VBAの学習がまた一段と面白くなってきました。
次回からは5章に入ります。
