VBAデバッグの鬼

VBA データの抽出、入力作業にFor~Nextを使うかDo~Loopを使うか

すっかりFor~Nextでやる癖がついてしまいました

今回の問題
エクセルの神髄-マクロ練習問題から【練習問題15】
excel-ubara.com

この問題について、私は次のような簡易フローチャートを描きました。

支店抽出→支店別に列を選ぶ→商品別に行を選ぶ→売り上げをセルに記入。

やってみると案外サクッとコードは書けてしまいました。
やたらFor~Nextを使って、Pythonのようにインデントするようなコーディングが私の癖です。

Sub 練習問題15()
Dim i As Long, j As Long, k As String
Dim brc As Long
Dim ws1 As Worksheet, ws2 As Worksheet

Set ws1 = Sheets("練習15")
Set ws2 = Sheets("練習15_回答")

ws2.Range("A1").CurrentRegion.Offset(1, 1).ClearContents

For brc = 2 To 5
    For i = 2 To ws1.Cells(Rows.Count, 1).End(xlUp).Row
        If ws1.Cells(i, 1) = ws2.Cells(1, brc) Then
            For j = 2 To ws2.Cells(Rows.Count, 1).End(xlUp).Row
                If ws1.Cells(i, 2) = ws2.Cells(j, 1) Then
                ws2.Cells(j, brc) = ws2.Cells(j, brc) + ws1.Cells(i, 3)
                End If
            Next
        End If
    Next
Next

End Sub

brcはbranchの略です。昨日プロゲートのJavaScriptコースで、変数にローマ字を当てるのは良くないとありました。branchはローマ字ではなく英単語ですがbrcにした方がプログラミング言語っぽいよな、ということでbrcです。

欲を出せばbrcの終わりの数は最終列を取得する文字列を入れたかったですが、最終行は出来ても、最終列については、まだ勉強不足であります。近々、最終列の取得の仕方も学習します。

さてさて、For〜Nextを3つもネストしてしまうことは、VBAのプログラミング的にはありなんでしょうか?練習問題15の解答を見ると、For〜NextではなくLoopを使っています。

しかし、このコードでも、見た目には問題なく動きます。

そもそも、なんでもFor~Nextで片付けるようになったのはこの書籍の影響が大きかったです。
図解! Excel VBAのツボとコツがゼッタイにわかる本 プログラミング実践編 立山秀利
図解!  Excel VBAのツボとコツがゼッタイにわかる本 プログラミング実践編

この本は、入門書を一通り読んだけど、まだ自分ではコードを書けない!という人に、ぜひ読んでほしい本です。

この本を読んで得られるメリット

  • RangeよりもCellsを使うことに慣れる。
  • For~Nextの使いこなしに強くなる。

For〜Nextを使ってセルの値を累計していく

この手法はエクセルの真髄-マクロ練習問題の練習問題12で出てきて覚えました。
excel-ubara.com


ws2.Cells(j, brc) = ws2.Cells(j, brc) + ws1.Cells(i, 3)

このように記述することで、空のws2.Cells(j,brc)にws1.Cells(i, 3)の数値を繰り返しのたびに入れてくれるのですね。
繰り返しで2回目、3回目と入れていくたびに、ws2.Cells(j, brc)の中に数値が累計されていきます。

Do~Loopを使う方法について

やはり、ソースを見比べてもFor~Nextのみで片付けるよりも、Do~Loopを使ったソースのほうがすっきりしています。
何も参照することなく、このようなコードがポンとかけるようになりたいです✨

【Do~Loopを使った際の簡易フローチャート
1.For~Nextでws1のリストの上から下までざ~~っとチェック

2.ws2の支店の行とws1の支店の列が一致するまで→(1 , ixC)= (i , 1)になるまで、ixCをひとつずつ増やしていく。

3.ws2の分類の列とws1の分類の列が一致するまで→(ixR , 1)= (i , 2)になるまで、ixRをひとつずつ増やしていく。

4.ws2の(ixR ,ixC)のセルの支店の列と分類の行がws1のi行のものと一致する。

5(ixR ,ixC)にws1のi行の売り上げをセルに入れる

1.に戻ってws1、i行のデータがなくなるまで繰り返し

程よい手ごたえ!頑張って続けていきます!

エクセルの神髄-マクロ練習問題を、日々解き進めていますが、入門書、中級の書籍を読んだあたりで、少し迷子になった私には程よい手ごたえです。
まずはスクレイピングができるようになるところまで頑張ります!^^v