【エクセルVBA入門】Do While~Loopで条件を満たす間繰り返し

★気に入ったらシェアをお願いします!


みなさん、こんにちは!
週末というのにエクセル漬けのタカハシ(@ntakahashi0505)です。

エクセルVBAを使ってバラバラの経費精算書のデータをデータベースに集約するを目標に始まりました新シリーズの第2回です。

前回の記事はこちら。

【エクセルVBA入門】バラバラの経費精算書をデータにまとめる
エクセルVBAの入門編として集めた経費精算書を一つのデータベースに自動で蓄積するというプログラムを目標にします。初回は基本、Worksheetオブジェクトの取り扱いとセルの転記について解説をします。

Worksheetオブジェクトの扱い方とセルの値のコピー&ペーストという基本的かつ重要な内容となっております。

今回はその続き。Do While~Loopを使って複数行の経費データをコピペできるようにしていきたいと思います。

どうぞよろしくお願いいたします!

スポンサーリンク

前回のおさらい:一行だけコピーする

まず「経費精算書」シートがありまして

経費精算書ひな形

これを「経費データ」というシートに

経費データフォーマット

一行だけコピペするというプログラムを作りました。

この例では経費データは5行ありますので、繰り返し処理を入れて全てのデータ行をコピーしたいと思います。

Do While~Loopによる繰り返し

コンピュータは繰り返しが得意です。VBAでも繰り返しのための構文がいくつか用意されていまして、今回はDo While~Loopを習得していきたいと思います。

書き方はこちら。

Do While 条件文

(繰り返したい処理)

Loop

けっこうシンプルですね。条件文が満たされている間だけ繰り返しを行います。逆に言うと、条件文が満たさなくなったら繰り返しは終了します。

今回の例の場合ですが、経費精算書をよく見ると

経費精算書のデータ終わり

最後のデータ行の次は空ですから「日付データが空だったら終了」として良さそうですね。

その場合の条件文はこう書きます。

「<>」は「等しくない」という意味です。「=」の逆ですね。

また、“”は空っぽの状態を表しています。

つまり、現在の行数の1列目(日付の列)が空っぽでない間は繰り返してねという意味になります。

行を移動させながら繰り返しをする

Do While~Loopを使う場合は「行を移動する」という処理も繰り返しの中に仕込んであげる必要があります。

と言いますのも、例えば

などと書いてあるプログラムを実行するとどうなりますか?

経費精算書の(12,1)には「2015/7/10」という値が入っていて、当然空っぽではありませんので、繰り返しがなされますが、いつになったら繰り返しが終わるでしょうか?

恐ろしいことに永久にループをすることになります…!

ということを避けるために、行を移動させながら繰り返しをするように仕込む必要があります。

自前のカウント用変数としてiを用意して

とします。

iは最初は0ですが、Do While~Loopの中の処理を1回行ったらプラス1します。セルの行指定にiの値を使えば、セルの位置もプラス1されるという形ですね。

これで永久ループは避けられますね。

For~NextとDo While~Loopの違いは?

繰り返しでいいますとFor~Nextという代表的な構文もりまして以下の記事で紹介しています。

【初心者向けエクセルVBA】For~Next文で簡潔にプログラムを書く
エクセルVBAではコピー&ペーストを自動化するという処理がよく活用されますが、その際に活用する繰り返し処理用の命令であるFor~Next文を徹底的に解説し、請求書の自動作成プログラムを簡略化していきます。

どのように使い分けたら良いでしょうか?

For~Nextはカウント用変数が最終値に到達したら繰り返しが終わりますので、繰り返しの回数が明確なときに使いやすい場合が多いです。

一方でDo While~Loopは繰り返し回数が明確でないときに別の条件で終わらせたいときに使いやすい場合が多いですね。

また前述で説明したように、Do While~Loopは条件文を満たす限り永遠にループをします。きちんと条件文が満たさなくなるときが来るように設計しないといけません。

さらに経費精算書を作った経費太郎さんが、うっかり途中の行なのに日付の入力を忘れ
ていたらどうなりますか?

その行でDo While~Loopから抜け出してしまうので、それ以降の行にデータがあったとしても転記がされません。

などといった、業務フロー上のエラーなども有り得ます。

For~Nextでもこういったケースが全くないわけではありませんが、総合してDo While~Loopのほうが少し上級者向けかも知れませんね。

Do While~Loopを使ったデータ転記のプログラム

これまでをまとめますとプログラムは

となりまして、これを実行すると

経費精算書の転記の結果

と全ての行について転記することができました。

まとめ

今回はDo While~Loopについてガッツリ紹介しました。

繰り返し処理はコンピュータの最も得意とするところ、うまく活用するとお仕事を劇的に効率化できるプログラムが組めますね。

For~Nextとうまく使い分けながら活用していきましょう!

次回はWithを使ってプログラムをスッキリ書く方法を解説しています。

【エクセルVBA入門】Withでプログラムをスッキリわかりやすく書く
エクセルVBAを使ってバラバラの経費精算書のデータをデータベースに集約するの第3回です。今回はWithというステートメントを使って、オブジェクト名を省略してプログラムをスッキリ書く方法をお伝えします。

引き続きお楽しみくださいね!

連載目次:経費精算書のデータをデータベースに集約する

  1. 【エクセルVBA入門】バラバラの経費精算書をデータにまとめる
  2. 【エクセルVBA入門】Do While~Loopで条件を満たす間繰り返し
  3. 【エクセルVBA入門】Withでプログラムをスッキリわかりやすく書く
  4. 【エクセルVBA入門】他のワークブックをWithで開く&保存せずに閉じる
  5. 【エクセルVBA入門】For Each~Nextでフォルダ内のブック全てを参照する
  6. 【エクセルVBA入門】人為的なミスを回避する方法その1~ファイル名を活用する
  7. 【エクセルVBA入門】人為的なミスを回避する方法その2~マスタを利用
  8. 【エクセルVBA入門】データの重複を防ぐSubプロシージャの作成