この記事は VBA の Do Until…Loop と Do…Loop Until による繰り返し処理について解説します。
【VBA】Do Until…Loop
まずは Do Until…Loop の構文です。英語で until は「~まで」という意味です。VBA の Do Until…Loop は「条件を満たすまでは処理を繰り返す」というステートメントです。サンプルコードで説明しますけど、自分で試してみたい人は次のデータをコピーして A1 セルに貼り付けてくださいな。
「武蔵野インターネット」
「剣とホイッスル」
「イメージの温泉宿」
「幕末板チョコ」
「妻の扉」
それから一行開けて、次のデータは A7 セルに貼り付けてください。
「消滅するおはなし」
「世紀末果実」
「世界のアラビアンナイト」
「小さな王子」
「放課後の会話」
ちなみに上のリストはこばとの「タイトルクリエーター」というソフトで作った架空の書籍の表題です。読みたくなっても本屋さんには売っていませんよ。そのうち「あらすじクリエーター」てのも作ってみたいとも思っているんですけど、なかなか時間がね … いえ、そんなことより、とにかくぺたっと貼り付けると下の図のようになっているはずです。
わざわざ一行空けておく理由は後でわかります。
それではサンプルコードを見てみましょう。
'[VBA] Do Until ... Loop 構文 Sub Red_Loop_1() Dim y As Long y = 1 '空白セルが現れるまでループさせます Do Until Cells(y, 1).Value = "" '文字の色を赤に変えます Cells(y, 1).Font.Color = vbRed y = y + 1 Loop End Sub
Red_Loop_1() を実行すると、下図のように空白の手前までの文字が赤色に変わります。
これは
Do Until Cells(y, 1).Value = ""
という文でセルのデータが “” になるまで、つまり空白になるまで処理を繰り返しなさいと命令しているからです。空白を見つけると、ぴたっと処理を止めてループから抜けるようになっているのです。さて、データの貼り方をちょっと変えて、A1 セルを空白にすると、このマクロを実行しても何も起こりません。
最初に空白を見つけてしまったので、そこで処理を止めてしまうからです。これが次の話の伏線になってます。
【VBA】Do…Loop Until
次に紹介するのは Do … Loop Until です。さきほどの Do Until … Loop と同じく「条件を満たすまで処理を繰り返す」というステートメントなんですが、処理の仕方が微妙に違っているので、注意が必要です。Red_Loop_1() とほとんど同じコードを、Do … Loop Until で書いてみます。
'[VBA] Do ... Loop Until 構文 Sub Red_Loop_2() Dim y As Long y = 1 Do Cells(y, 1).Font.Color = vbRed y = y + 1 Loop Until Cells(y, 1).Value = "" End Sub
Red_Loop_2() を A1 セルを空白にしたシートで実行すると …
全ての文字が赤くなりましたね。
実を言うと、Until キーワードが Loop の後ろにある場合、最低でも1回は処理を実行してから、そこで「条件を満たしているかどうか」を判定します。だから上のサンプルでは最初の空白部分は完全に無視されてしまうわけです。こういうことがあるので、Until を使った繰り返し処理では、うっかりしていると思わぬ事態が発生することもあるので要注意です。Loop は無限にぐるぐるしちゃうことがあるから本当に怖いです。そのまま PC がフリーズしちゃうこともあるしね。こばとも何度もバカをやりました。でも、こういうバカを繰り返してこそ、プログラミングは上達するのです(たぶん)。
コメント
ChatGPT が解説! VBA の Do Until Loop
生徒: こんにちは!前回のDo Loop Whileの説明、とても分かりやすかったです。今度はDo Until Loopについて教えていただけますか?Do WhileとDo Untilの違いや使い方が知りたいです。
講師: こんにちは!もちろんです、Do Until Loopについてお教えしましょう。Do Until Loopは、特定の条件が満たされるまでループを続ける構文です。条件が真になるまで繰り返し処理を行います。楽しい例で説明しましょうか?
生徒: はい、お願いします!前回の宝探しゲームみたいな面白い例があると嬉しいです。
講師: 分かりました!では、数当てゲームのプログラムを考えてみましょう。コンピュータがランダムな数を選び、プレイヤーがそれを当てるゲームです。
生徒: それは楽しそうです!どのように作るんですか?
講師: まず、コンピュータがランダムな数を生成するためにRnd関数を使います。そして、Do Untilループを使って、プレイヤーが正しい数を当てるまで繰り返し処理を行います。
この例では、targetNumber変数にランダムな数を生成しています(1から100の範囲で)。プレイヤーはplayerGuess変数を使って数を入力します。ループは、playerGuessがtargetNumberと等しくなるまで続きます。プレイヤーが数を入力するたびに、条件式がチェックされ、正解でない場合はヒントを表示します。正解したら「正解です!おめでとうございます!」というメッセージを表示します。
生徒: なるほど、プレイヤーが正しい数を当てるまでループが続くんですね!楽しい数当てゲームです。
講師: そうです、正解です!Do Until Loopを使うと、特定の条件が満たされるまで繰り返し処理を行うことができます。ゲームや条件の逆転など、様々なシナリオで活用できます。もし他にも疑問や興味があることがあれば、何でも聞いてください!
生徒: ありがとうございます!分かりやすい説明と楽しい例、とても勉強になりました。VBAのループはとても面白いですね!
ChatGPT が解説! VBA の Do Loop Until
生徒: こんにちは!前回のDo Until Loopの説明、とても分かりやすかったです。今度はDo Loop Untilについて教えていただけますか?Do Untilとの違いや具体的な使い方が知りたいです。
講師: こんにちは!もちろんです、Do Loop Untilについてお教えしましょう。Do Loop Untilもループを続けるための構文ですが、Do Untilとは条件の評価が逆です。つまり、Do Untilでは条件が真の間は繰り返し処理が行われますが、Do Loop Untilでは条件が偽の間は繰り返し処理が行われます。
生徒: なるほど、Do Loop Untilは条件が偽の間ループが続くんですね。具体的な例を教えていただけますか?
講師: もちろんです!例として、1から10までの数値を合計するプログラムを作成してみましょう。
この例では、sumという変数を用意して0で初期化し、iという変数を1で初期化しています。ループ内のコードは、sumにiの値を加え、iを1増やしています。ループは、iが10を超える(つまりi > 10が真になる)まで続きます。つまり、1から10までの数値を合計するために、ループが10回繰り返されます。
生徒: 分かりました!Do Loop Untilは条件が偽の間繰り返し処理が行われるんですね。とてもシンプルな例で理解しやすいです。
講師: そうです、正解です!Do Loop Untilは、特定の条件が偽になるまで繰り返し処理を行うので、逆転した条件の評価が必要な場合に便利です。他にもDo Loop Untilを使った面白いプログラムや応用例があれば、いつでも教えてください!