今回はこばとちゃんと一緒にぐるぐるね~。
みんなでぐるぐるしながら、繰り返し処理 について学びましょ~。
[VBA] Do Until ... Loop によるループ処理
まずは Do Until ... Loop の構文です。
英語で until は「~まで」という意味ですね。
Do Until ... Loop は「条件を満たすまでは処理を繰り返す」というステートメントです。サンプルコードで説明しますけど、自分で試してみたい人は次のデータをコピーして A1 セルに貼り付けてくださいな。
「武蔵野インターネット」
「剣とホイッスル」
「イメージの温泉宿」
「幕末板チョコ」
「妻の扉」
それから一行開けて、次のデータは A7 セルに貼り付けてください。
「消滅するおはなし」
「世紀末果実」
「世界のアラビアンナイト」
「小さな王子」
「放課後の会話」
ちなみに上のリストはこばとの「タイトルクリエーター」というソフトで作った架空の書籍の表題です。読みたくなっても本屋さんには売っていませんよ。そのうち「あらすじクリエーター」てのも作ってみたいとも思っているんですけど、なかなか時間がね ...... いえ、そんなことより、とにかくぺたっと貼り付けると下の図のようになっているはずです。
わざわざ一行空けておく理由は後でわかります。
それではサンプルコードを見てみましょう。
Sub RedLoop1()
Dim y As Long
y = 1
'空白セルが現れるまでループさせます
Do Until Cells(y, 1).Value = ""
'文字の色を赤に変えます
Cells(y, 1).Font.Color = vbRed
y = y + 1
Loop
End Sub
このサンプルコードを実行すると、下図のように空白の手前までの文字が赤色に変わります。
これは
という文でセルのデータが "" になるまで、つまり空白になるまで処理を繰り返しなさいと命令しているからです。空白を見つけると、ぴたっと処理を止めてループから抜けるようになっているのです。さて、データの貼り方をちょっと変えて、A1 セルを空白にすると、このマクロを実行しても何も起こりません。
最初に空白を見つけてしまったので、そこで処理を止めてしまうからです。
これが次の話の伏線になってます。
[VBA] Do ... Loop Until によるループ処理
次に紹介するのは Do ... Loop Until です。さきほどの Do Until ... Loop と同じく「条件を満たすまで処理を繰り返す」というステートメントなんですが、処理の仕方が微妙に違っているのです。RedLoop1 とほとんど同じコードを、Do ... Loop Until で書いてみます。
Sub RedLoop2()
Dim y As Long
y = 1
Do
Cells(y, 1).Font.Color = vbRed
y = y + 1
Loop Until Cells(y, 1).Value = ""
End Sub
このマクロを A1 セルを空白にしたシートで実行すると ......
な、なんと! 全ての文字を赤くしてしまいましたよ~!
いったい、どうしたことなのでしょうか~!?(← 大げさに羽根をパタパタしてる)
実を言うと、Until キーワードが Loop の後ろにある場合、最低でも1回は処理を実行してから、そこで「条件を満たしているかどうか」を判定します。だから上のサンプルでは最初の空白部分は完全に無視されてしまうわけです。こういうことがあるので、Until を使った繰り返し処理では、うっかりしていると思わぬ事態が発生することもあるので要注意です。Loop は無限にぐるぐるしちゃうことがあるから本当に怖いです。そのまま PC がフリーズしちゃうこともあるしね。こばとも何度もバカをやりました。でも、こういうバカを繰り返してこそ、プログラミングは上達するのです(たぶん)。