VBA Do Until Loop/Do Loop Until による繰り返し処理

 今回はこばとちゃんと一緒にぐるぐるね~。
 みんなでぐるぐるしながら、繰り返し処理 について学びましょ~。
 

Do Until ... Loop

 まずは Do Until ... Loop です。
 英語で until は「~まで」という意味ですね。
 Do Until ... Loopは「条件を満たすまでは処理を繰り返す」というステートメントです。サンプルコードで説明しますけど、自分で試してみたい人は次のデータをコピーして A1 セルに貼り付けてくださいな。

「武蔵野インターネット」
「剣とホイッスル」
「イメージの温泉宿」
「幕末板チョコ」
「妻の扉」

 それから一行開けて、次のデータは A7 セルに貼り付けてください。

「消滅するおはなし」
「世紀末果実」
「世界のアラビアンナイト」
「小さな王子」
「放課後の会話」

 ちなみに上のリストはこばとの「タイトルクリエーター」というソフトで作った架空の書籍の表題です。読みたくなっても本屋さんには売っていませんよ。そのうち「あらすじクリエーター」てのも作ってみたいとも思っているんですけど、なかなか時間がね ...... いえ、そんなことより、とにかくぺたっと貼り付けると下の図のようになっているはずです。

 VBA Do Until Loop 繰り返し処理①

 わざわざ一行空けておく理由は後でわかります。
 それではサンプルコードを見てみましょう。

 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

 このサンプルコードを実行すると、下図のように空白の手前までの文字が赤色に変わります。

VBA Do Until Loop 繰り返し処理②

 これは

Do Until Cells(y, 1).Value = ""

という文でセルのデータが "" になるまで、つまり空白になるまで処理を繰り返しなさいと命令しているからです。空白を見つけると、ぴたっと処理を止めてループから抜けるようになっているのです。さて、データの貼り方をちょっと変えて、A1 セルを空白にすると、このマクロを実行しても何も起こりません。

 VBA Do Until Loop 繰り返し処理③

 最初に空白を見つけてしまったので、そこで処理を止めてしまうからです。
 これが次の話の伏線になってます。
 

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 セルを空白にしたシートで実行すると ......

 VBA Do Loop Until 繰り返し処理④

 な、なんと! 全ての文字を赤くしてしまいましたよ~!
 いったい、どうしたことなのでしょうか~!?(← 大げさに羽根をパタパタしてる)
 実を言うと、Until キーワードが Loop の後ろにある場合、最低でも1回は処理を実行してから、そこで「条件を満たしているかどうか」を判定します。だから上のサンプルでは最初の空白部分は完全に無視されてしまうわけです。こういうことがあるので、Until を使った繰り返し処理では、うっかりしていると思わぬ事態が発生することもあるので要注意です。Loop は無限にぐるぐるしちゃうことがあるから本当に怖いです。そのまま PC がフリーズしちゃうこともあるしね。こばとも何度もバカをやりました。でも、こういうバカを繰り返してこそ、プログラミングは上達するのです(たぶん)。

 ≫ メニューに戻って他の記事も眺めていると暇つぶしになるかもしれませんよ。

Google広告
スポンサーリンク
スポンサードリンク
末尾大型広告
末尾大型広告

コメントをどうぞ

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください