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のツボとコツがゼッタイにわかる本 プログラミング実践編 立山秀利
この本は、入門書を一通り読んだけど、まだ自分ではコードを書けない!という人に、ぜひ読んでほしい本です。
この本を読んで得られるメリット
- 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