この記事は 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 がフリーズしちゃうこともあるしね。こばとも何度もバカをやりました。でも、こういうバカを繰り返してこそ、プログラミングは上達するのです(たぶん)。
コメント