EB000010_VBAエキスパート(ExcelVBAベーシック)合格講座/第十回:繰り返し処理

VBAエキスパート(ExcelVBAベーシック)合格講座/第十回:繰り返し処理 ExcelVBA Basic

このページの内容について

このページは、VBAエキスパート(ExcelVBAベーシック)試験合格講座の第十回記事です。公式テキスト第7章「ステートメント」の内容について解説します。一部、スタンダードの内容を含みます。1時間の講義でお話する程度の分量です。講座受講者の復習での利用を想定しています。

プログラムの基本構成(繰り返し処理)

プログラムは3つの処理から成り立っています。ひとつは以前に説明した「順次処理」で、プログラムは必ず上から下に向かって実行されます。もうひとつはこの記事で解説をする「繰り返し処理」です。プログラムが「同じことの繰り返し処理」が得意だといわれるのはこの処理を簡単に実現することができるためです。VBAには繰り返し処理の方法が2つあります。

Do~Loopステートメント

条件指定による繰り返し

「Do~Loop」による繰り返しは、最も基本的で汎用的な繰り返し処理です。条件を指定して繰り返しの継続判断を行います。プログラミングにおける条件とは「True」か「False」かいずれかの値をとなる式または値のことを指します。

お断り:「Do~Loop」による繰り返しはスタンダードの試験範囲です。しかしプログラミングを学習する上での初めての繰り返し処理は「Do~Loop」処理であるべき・・という私の信念に基づき、先に解説をします。

書式

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

上記のサンプルでは繰り返し処理が始まる前に条件を記述しました。この場合、繰り返し処理の終端であるLoopには条件を記述することはできません。Do~Loopで使用できる条件は最大1つまでです。

処理の詳細

①変数「i」の初期化
②条件判定:「i < 10」が「True」の間繰り返しを継続する
③イミディエイトウィンドウに変数「i」に格納されている値を出力する
④変数「i」に格納されている値に1足したものを変数「i」に格納する
⑤繰り返し処理の終端

実行結果

上記のサンプルを実行すると、変数「i」を1ずつ増やしながらイミディエイトウィンドウに変数「i」に格納された値を出力します。

④の、変数「i」の増分の記述を忘れると、この繰り返しはいつまでたっても繰り返し継続条件が「False」とならず、処理を継続し続けます。マクロは特段の指定をしなければ実行中に処理を受け付けしませんので、Excelが固まってしまい強制終了するしかなくなります。このような終了条件のない繰り返しを「無限ループ」と呼びます。

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」で使用したサンプルコードと同じです。

「Do~Loop」による繰り返し処理の利点は、条件にカウンタ変数以外の値も設定することができることです。自由度が高いため、あらゆる状況で使用することができます。対してカウンタ変数を使用して繰り返し処理をする場合に「For~Next」で記述すると可読性が向上します。

いろいろな繰り返し処理

繰り返し処理でできることをいくつかサンプルコードを用いて紹介します。

セルに連続したデータを入力する(繰り返しの入れ子)

繰り返し処理の中に、さらに繰り返し処理を入れることが可能です。このようなマトリョーシカのような構造を「入れ子(ネスト)」構造と呼びます。

サンプルコード(クリックでコピー)

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

カウンタ変数には「i」を使うことが多いと説明しましたが、行や列の操作を目的とする場合は、行(Row)「r」/列(Colmun)「c」を使うとわかりやすいです。

処理の詳細

①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列)にランダムな数値が格納されます。

VBAエキスパート試験対策記事

当サイトでは、オデッセイコミュニケーションズ社が運営する試験であるVBAエキスパートExcel VBA ベーシックExcel VBA スタンダード)の出題範囲をベースに用語や各種関数の解説などを行っています。試験合格に向けて必須と言われる公式テキストに沿って解説をしています。受験をするか悩んでいる方、テキストとは別視点の解説を見てみたい方、受験はしないがExcelVBA(マクロ)に興味がある方へ向けた記事です。

Comment