『Excel VBA 表計算とプログラミング学習サイト』では、アフィリエイトプログラムを利用して商品を紹介しています。

【VBA】Do Until Loop, Do Loop Until

この記事は 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 繰り返し処理①
 
わざわざ一行空けておく理由は後でわかります。
それではサンプルコードを見てみましょう。

'[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() を実行すると、下図のように空白の手前までの文字が赤色に変わります。
 
VBA Do Until Loop 繰り返し処理②
 
これは

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

という文でセルのデータが “” になるまで、つまり空白になるまで処理を繰り返しなさいと命令しているからです。空白を見つけると、ぴたっと処理を止めてループから抜けるようになっているのです。さて、データの貼り方をちょっと変えて、A1 セルを空白にすると、このマクロを実行しても何も起こりません。
 
VBA Do Until Loop 繰り返し処理③
 
最初に空白を見つけてしまったので、そこで処理を止めてしまうからです。これが次の話の伏線になってます。

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

コメント