このページの内容について
このページは、VBAエキスパート(ExcelVBAベーシック)試験合格講座の第十回記事です。公式テキスト第7章「ステートメント」の内容について解説します。一部、スタンダードの内容を含みます。1時間の講義でお話する程度の分量です。講座受講者の復習での利用を想定しています。
プログラムの基本構成(繰り返し処理)
プログラムは3つの処理から成り立っています。ひとつは以前に説明した「順次処理」で、プログラムは必ず上から下に向かって実行されます。もうひとつはこの記事で解説をする「繰り返し処理」です。プログラムが「同じことの繰り返し処理」が得意だといわれるのはこの処理を簡単に実現することができるためです。VBAには繰り返し処理の方法が2つあります。
Do~Loopステートメント
条件指定による繰り返し
「Do~Loop」による繰り返しは、最も基本的で汎用的な繰り返し処理です。条件を指定して繰り返しの継続判断を行います。プログラミングにおける条件とは「True」か「False」かいずれかの値をとなる式または値のことを指します。
書式
Do [条件]
処理
Loop [条件]
条件による書き方の違い
「Do~Loop」の繰り返し処理において、条件は任意指定です。条件を書く場合も記述する場所は2か所あり、いずれかを選択できます。また、条件が「True」の時に繰り返しを終了するか、条件が「True」の時に繰り返しを継続するかの違いで2つの書き方があります。以上の組み合わせ5つの書き方をそれぞれ解説します。
Do While ~ Loop
指定条件が「True」の間繰り返す(条件前置き)
While句は条件が「True」の間「処理」を繰り返します。前置きなので、繰り返しの処理が始まる前に判定があり、条件によっては一度も繰り返しが行われないことがあります。
サンプルコード(クリックでコピー)
Private Sub Test_DoWhile_Loop()
Dim i As Long
i = 0 '①
Do While i < 10 '②
Debug.Print i '③
i = i + 1 '④
Loop '⑤
End Sub
処理の詳細
①変数「i」の初期化
②条件判定:「i < 10」が「True」の間繰り返しを継続する
③イミディエイトウィンドウに変数「i」に格納されている値を出力する
④変数「i」に格納されている値に1足したものを変数「i」に格納する
⑤繰り返し処理の終端
実行結果
上記のサンプルを実行すると、変数「i」を1ずつ増やしながらイミディエイトウィンドウに変数「i」に格納された値を出力します。
Do ~ Loop While
指定条件が「True」のとき繰り返しを終了する(条件前置き)
条件を前に置くか後に置くかのちがいだけで、後に置いても、While句は条件が「True」の間「処理」を繰り返します。後に置いているので、前置きと異なり、最低でも一度は繰り返し内の処理が実行されます。
サンプルコード(クリックでコピー)
Private Sub Test_Do_LoopWhile()
Dim i As Long
i = 0 '①
Do '②
Debug.Print i '③
i = i + 1 '④
Loop While i < 10 '⑤
End Sub
処理の詳細
①変数「i」の初期化
②繰り返しの開始位置、条件の記載がないため1回目の処理は無条件に実行される
③イミディエイトウィンドウに変数「i」に格納されている値を出力する
④変数「i」に格納されている値に1足したものを変数「i」に格納する
⑤条件判定:「i < 10」が「True」の間繰り返しを継続する
実行結果
上記のサンプルを実行すると、変数「i」を1ずつ増やしながらイミディエイトウィンドウに変数「i」に格納された値を出力します。
Do Until ~ Loop
指定条件が「True」の時、繰り返しを終了する(条件前置き)
Until句は条件が「True」の時、繰り返しを終了します。前置きなので、繰り返しの処理が始まる前に判定があり、条件によっては一度も繰り返しが行われないことがあります。
サンプルコード(クリックでコピー)
Private Sub Test_DoUntil_Loop()
Dim i As Long
i = 0 '①
Do Until i >= 10 '②
Debug.Print i '③
i = i + 1 '④
Loop '⑤
End Sub
処理の詳細
①変数「i」の初期化
②条件判定:「i >=10」が「True」の時、繰り返しを終了する
③イミディエイトウィンドウに変数「i」に格納されている値を出力する
④変数「i」に格納されている値に1足したものを変数「i」に格納する
⑤繰り返し処理の終端
実行結果
上記のサンプルを実行すると、変数「i」を1ずつ増やしながらイミディエイトウィンドウに変数「i」に格納された値を出力します。
Do ~ Loop Until
指定条件が「True」の時、繰り返しを終了する(条件後置き)
条件を前に置くか後に置くかのちがいだけで、後に置いても、While句は条件が「True」の時、繰り返しを終了します。後に置いているので、前置きと異なり、最低でも一度は繰り返し内の処理が実行されます。
サンプルコード(クリックでコピー)
Private Sub Test_Do_LoopUntil()
Dim i As Long
i = 0 '①
Do '②
Debug.Print i '③
i = i + 1 '④
Loop Until i >= 10 '⑤
End Sub
処理の詳細
①変数「i」の初期化
②繰り返しの開始位置、条件の記載がないため1回目の処理は無条件に実行される
③イミディエイトウィンドウに変数「i」に格納されている値を出力する
④変数「i」に格納されている値に1足したものを変数「i」に格納する
⑤条件判定:「i >= 10」が「True」の時、繰り返しを終了する
実行結果
上記のサンプルを実行すると、変数「i」を1ずつ増やしながらイミディエイトウィンドウに変数「i」に格納された値を出力します。
For~Nextステートメント
カウンタ変数
「Do ~ Loop」ステートメントで使用した変数「i」は1ずつ値を増分させながら繰り返しの制御に使用されていました。このような変数を「カウンタ変数」と呼び、一般に変数名を「i」とすることが多いです。
カウンタ変数を使用した繰り返し処理
「For ~ Next」による繰り返しは、カウンタ変数を「指定した範囲」の間「指定した値」を加算しながら繰り返します。
書式
For カウンタ変数 = 開始値 To 終了値 [Step 増分]
処理
Next [カウンタ変数]
サンプルコード(クリックでコピー)
Private Sub Test_ForNext()
Dim i As Long
For i = 0 To 9 Step 1 '①
Debug.Print i '②
Next i '③
End Sub
処理の詳細
①カウンタ変数「i」を0~9まで1ずつ増加させながら処理を繰り返す
②イミディエイトウィンドウに変数「i」に格納されている値を出力する
③ここで変数「i」を増分させる。
実行結果
上記サンプルの実行結果は「Do~Loop」で使用したサンプルコードと同じです。
いろいろな繰り返し処理
繰り返し処理でできることをいくつかサンプルコードを用いて紹介します。
セルに連続したデータを入力する(繰り返しの入れ子)
繰り返し処理の中に、さらに繰り返し処理を入れることが可能です。このようなマトリョーシカのような構造を「入れ子(ネスト)」構造と呼びます。
サンプルコード(クリックでコピー)
Private Sub Test_LoopCell()
Dim ws As Worksheet
Dim r As Long, c As Long
Set ws = ThisWorkbook.Worksheets(1) '①
For r = 1 To 9 Step 1 '②
For c = 1 To 9 Step 1 '③
ws.Cells(r, c).Value = r * c '④
Next c '⑤
Next r '⑥
End Sub
処理の詳細
①Worksheet型の変数にマクロを実行中のブックの一番目のシートのオブジェクトを格納
②カウンタ変数「r」を1~9まで1ずつ増加させながら繰り返す
③カウンタ変数「c」を1~9まで1ずつ増加させながら繰り返す
④r行目・c列目のセルに変数「r」と変数「c」の乗算結果を格納する
⑤変数「c」を増分させて④の処理へ戻る
⑥変数「r」を増分させて③の処理へ戻る
実行結果
上記サンプルを実行するとマクロが動作しているブックの1番目のシートのセル範囲「A1:I9」に九九を表示します。
セルのRowプロパティで繰り返し範囲を指定する
繰り返し処理を使用してツールを作るとき、繰り返し回数があらかじめ決まっていることは少ないです。ユーザーの入力数や、表の大きさなどに合わせて繰り返し回数・繰り返し範囲を調整する必要があります。
サンプルコード(クリックでコピー)
Private Sub Test_LoopLastRow()
Dim ws As Worksheet
Dim rng As Range
Dim r As Long
Set ws = ThisWorkbook.Worksheets(1) '①
Set rng = ws.Range("A1:D10") '②
rng.Value = "テスト" '③
Set rng = ws.Range("A1") '④
For r = rng.Row To rng.End(xlDown).Row Step 1 '⑤
ws.Cells(r, 1).NumberFormatLocal = "0.00" '⑥
ws.Cells(r, 1).Value = VBA.Rnd '⑦
Next r '⑧
End Sub
処理の詳細
①Worksheet型の変数にマクロを実行中のブックの一番目のシートのオブジェクトを格納
②Range型の変数にセル範囲「A1:D10」のオブジェクトを格納
③セル範囲「A1:D10」に値「テスト」を入力
④Range型の変数にセル「A1」のオブジェクトを格納
⑤セル「A1」の行番号から「Ctrl」+「↓」を押して移動した先の行番号の範囲をカウンタ変数「r」を1ずつ増やしながら繰り返す
⑥r行目1列目のセルの表示形式を「0.00」に設定する
⑦r行目1列目のセルにランダムな数値を入力する
⑧変数「r」を1増分させて⑥の処理へ戻る
実行結果
マクロが動作しているブックの1番目のシートのセル範囲「A1:D10」に値「テスト」を入力し、その後、繰り返し処理で1列目(A列)にランダムな数値が格納されます。
Comment