Do~Loopを使って繰り返し作業を自動化するExcelマクロの作成

この記事には広告を含む場合があります。

記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。

Excelでマクロを作成する目的の1つとして「単調な繰り返しの作業を自動化すること」が挙げられると思います。

doloop_0

例えば、複数のシートからさまざまな情報を1枚のシートに集約し新しいシートを作成するときなど、複数のシートを行き来している間に思わぬミスをしてしまうことがあります。

今回は、そのような繰り返し処理のミスを防ぐマクロを作成するためのVBAの「DoLoop」について記載します。

同じく繰り返し処理を記述することができる「ForNext」については後日、記載いたします。


Do~Loopの基本

DoLoopの間に記述されたプログラムを繰り返すという構文となります。

次のように、Excelでシートを作成しました。

doloop_1

DoLoopを使って、「A列に入力されている数値をC列に転記する」という記述をしてみました。

doloop_7

DoLoopの間に繰り返し実行したい処理を記述しますが、その処理をどのぐらい繰り返すのかという条件を記述する必要があります。上記の緑色の枠囲みの部分です。

今回は、A列の2行目から10行目までを転記するという処理になりますので、繰り返しの条件は、「2行目から10行目まで」となります。

繰り返しを管理するため、lonYaという変数を設定しました。

まず、DoLoopの直前で変数lonYaに「2」を代入します。

Doの後の「While」以降の記述が条件となり、とりあえず、「lonYa <11」と記述しました。

lonYaが11未満であれば、DoLoopの間の処理を実行することになります。

DoLoopの間には次の記述がしてあります。

□ テストシートのC列のセルにA列のセルの数値を転記する(※1)

□ lonYaに「その時点のlonYaに1を加算した数値」を代入する

lonYaは一回処理が終わるごとに数値が「1」ずつ増加します。

11未満という条件に一致している間は、処理を繰り返すことになります。

※1 セルの指定について

セルの指定については、Cellsと変数lonYaを使って次のように記述しました。

doloop_8

Do〜Loop構文のいろいろな条件

DoLoopは条件をうまく設定しないと失敗します。

永遠に繰り返したり、まったく処理を実行しなくなります。

次のような条件文を記述してみました。

doloop_3

上記の赤い枠囲みは、「lonYaが11だったら処理をする」という条件になります。その直前でlonYaに「2」を代入していますのでDoLoopの間の処理は全く実行せず、その後の緑色の枠囲みの記述を実行します。

実行すると次のように、数字の「2(初期値のlonYa)」が表示されます。

doloop_4

私は、DoLoopを記述する場合、IfThenを使って条件を記載することが多いですが、基本は、WhileUntilで記述する方法のようですので、整理して記載しておきます。

 

① While・・・(・・・だったら)

Whileの後に条件を記述すると、その条件になるまでDoLoopの間の記述を繰り返すことになります。

先ほどの誤った記述「While lonYa = 11」を「A列の2行目から10行目までをC列に転記する」という処理目的を達成できるように書き直すと、次のような記述になります。

□ Do While lonYa < 11(最初の記述と一緒)

□ Do While lonYa <= 10

どちらの条件でも実行すると次のような画面になります。

doloop_6

※2 Loopの後に条件を記述する場合

条件をDoの直後に記述する場合は、DoLoopの間に記述された処理を実行する前に条件に一致しているかどうか判断しますが、Loopの後に条件を記述する方法もあります。

この場合は、繰り返し処理を実行するまえに条件の記述がないことになり、必ず一度は、DoLoopの間の処理を実行することになります。

ためしに、Loopの後に「While lonYa = 11」を記述すると次の画面が表示されます。

doloop_5

DoLoopの間の記述を一度、実行していますので、変数lonYaの値が初期値の「2」に「1」を加算した「3」の状態で条件に一致するかどうかを判断します。

「11」ではないために、DoLoopの処理を終了し、その次に記述されているプログラム(MsgBox lonYa)を実行することになります。

 

② Until・・・(・・・まで)

Untilの後に条件を記述すると、その条件になるまでDoLoopの間の記述を繰り返すことになります。

先ほどの誤った記述「While lonYa = 11」を「A列の2行目から10行目までをC列に転記する」という処理目的を達成できるように書き直すと次のような記述になります。

□ Do Until lonYa = 11


■□◆◇ 編集後記 ◇◆□■

昨日は、スーツを購入しました。スーツは消耗品ですね。(経理事務の話ではないです。)おしゃれには程遠い私は、一昔前に流行った三つボタンのスーツを気に入って着ていましたが、今は、ほとんど三つボタンのデザインのスーツはないようで、二つボタンのノータックのスーツを購入しました。