Excelマクロで繰り返しの処理を行う際によくやるやりかたでFor~NextステートメントとDo~Loopステートメントというものがあります。
税理士業務におけるExcelマクロではどちらの書き方がよいのか個人的に考えていることを記事にしてみます。独断と偏見のどうでもイイナハシです。
Excelマクロで繰り返しの処理をするときのやりかた
今回の記事にあたり適当にExcelのデータを準備しました。A列とB列にランダムの数字が入力されています↓
ここでマクロを使ってC列にA列×B列の計算結果を表示させることにします。
まずは For~nextステートメントを使ってこの処理をする場合にはこんな感じになるかと思います。
Sub ForNext()
'■For~nextステートメントでの繰り返し処理
Dim i As Long
Dim lastrow As Long
lastrow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To lastrow
Range("c" & i).Value = Range("a" & i) * Range("b" & i)
Next i
End Sub
このマクロを実行するとこんな感じでC列に計算結果が表示されます↓
次にDo~Loopステートメントを使って同じ処理をする場合にはこんな感じになると思います。
Sub DoLoop()
'■Do~Loopステートメントでの繰り返し処理
Dim i As Long
i = 1
Do While Range("a" & i) <> ""
Range("c" & i).Value = Range("a" & i) * Range("b" & i)
i = i + 1
Loop
MsgBox "done"
End Sub
このマクロを実行するとこんな感じでC列に計算結果が表示されます↓
結果はどちらも同じになります。同じにならないとおかしいです。
For~nextステートメントの良いところ
For~nextステートメントの良いところは繰り返す回数を設定すれば無限ループの心配がないため
「間違えてしまってマクロが永遠に動作してしまったらどうしよう。」
という心理的はハードルが低いです。
最終データの取得することができれば割とやりやすいと感じます。
上のコードでいうところのこの部分↓
6行目と8行目の部分さえしっかり表現できればだいたい上手くいきます。
自分はよく変数宣言で変数「lastrow」を宣言しておいてデータの最終行を取得させ、これを For~nextステートメントの繰り返す回数とすることが多いです。
まさに6行目と8行目の部分になります。
おそらくですが税理士業務においてはこのやり方さえ知っておけばたいていのことは何とかなるのではないでしょうか。
Do~Loopステートメントの良いところ
個人的に For~nextステートメントをよく使うのでDo~Loopステートメントの良いところがパッっと思いつかなかったのですが、この記事を書いていて思ったのが For~nextステートメントは何回繰り返すかわからない場合には急に使いにくくなるなぁ。ということ。
そんな「何回繰り返すかわからない」けれども繰りかえしの処理をしたい場合にはDo~Loopステートメントが威力を発揮するように思います。
過去にはこんなとこで使ったりしています↓
あと変数の宣言も少なくてすみます。(今回の場合だけかもしれませんが。。。)
For~Nextステートメントの場合繰り返し回数を指定するためによく変数宣言をすることがあります。
今回の場合には変数「lastrow」を宣言してそこに繰り返す回数「14」を格納しています。
これに対してDo~Loopステートメントの場合は特に繰り返す回数を設定するための変数の宣言は必要ないです。
一方で Do~Loopステートメント を使用する場合には変数の定義をしっかりしないと無限ループに陥るリスクがでてきます。
今回上で紹介したマクロのコードの場合、変数「i」に1を足すという部分を書き忘れるとマクロが永遠に実行されてしまい、処理が終わりません。無限ループに陥ります。
上のコードでいうところの13行目の部分です↓
この「i=i+1」を書き忘れると無限ループに突入します。
このうっかり書き忘れるミスをしてしまった時のリスクは恐いです。
まとめ
Excelマクロで繰りかえしの処理を行うにはFor~NextステートメントとDo~Loopステートメントのどっちを使うほうが良いのか個人的な見解を記事にしました。
自分がこれまで経験してきたExcelマクロの業務においてFor~nextステートメントだけで何とかできることが多いので税理士業務においては極論DoLoopステートメントは必要ないのではと考えます。
無限ループに陥るのは嫌ですし、焦ります。
同じ作業結果が得られるのであれば自分はFor~nextステートメントが使いやすいです。
どうしてもFor~nextステートメントでは解決できない場合にぶち当たった時だけDo~Loopステートメントを使うようにしています。
【本日の近況報告】
運動すると筋肉痛が次の日ではなくて二日後にくるようになっています。
小学生の頃に親が同じことを言ってて「何わけわかんないこと言ってんの?」くらいに思っていましたが今まさに身をもって体験しています。
あと全然関係ないですが、2021年の税理士試験まであと少しですね。
受験される方が当日全力を尽くせることを陰ながら祈っています。
【本日の1曲】
EVISBEATS/いい時間
最近この曲を聴きまして、暑い夏の季節にぴったりの曲だなと思いすごく気に入っています。
はっぴいえんどの「夏なんです」を連想してしまいます。
チルアウトとはこういうことをいうんだろうなと勝手に思っています。
この曲をゴリゴリにダブ処理したremixを聴いてみたい。