条件分岐(繰り返し処理)Do while Loopの基本的な構文やGoTo文やMod関数を使用したサンプル構文を詳細に解説していきます。
Do while Loop文の使い方
Do while Loop文は繰り返す条件に一致する間は処理を繰り返したい時に利用する条件分岐です。ほかの条件分岐とは違い繰り返しの条件判定を最初に持ってくるか、最後に持ってくるかの2通りがあります。
最初に条件を判定する書式
Sub test()
Dim x As Long
x = 1
Do While x <= 5 //①
Cells(x, 1).Value = x
x = x + 1 //➁
Loop //③
End Sub
白・・・コード
紫・・・コメント
青・・・プロシージャの宣言
その他・・・コードを見やすくするために使うかも
①ループの最初に処理を行う条件を判定しています。xが5以下であれば処理が実行されます。
➁ループが繰り返すたびに1を足していく。コレをしないと変数xは初期値の1のままとなり無限ループになってExcelがフリーズしてしまいます。
③ループの終点になります。ここに到達したら、最初の処理に戻ってループを継続するかの判定を行います。
最後の条件を判定する書式
Sub test()
Dim x As Long
x = 1
Do //①
Cells(x, 1).Value = x
x = x + 1
Loop While x <= 5 //②
End Sub
①条件判定に関係なく最初の処理を実行する。
➁条件判定を行う。条件に一致している場合は処理をループする
- Do while Loop文は条件に一致する限り処理を行う
- 条件判定するタイミングを指定できる(最初 or 最後)
- ループから抜けるための処理を必ず記述する必要がある
Do while Loop文(繰り返し処理)のサンプル
Do while Loop文のサンプル構文を紹介していきます。実際にツールなどを作成する際のヒントにしてもらえればと思います。
セルが空白になるまで処理を続ける
Sub test()
Dim i As Long
i = 1
Do While Cells(i, 1).Value <> ""
'繰り返す処理
i = i +1
Loop
End Sub
Do While Cells(i, 1).Value <> “”
指定したセルが空白でなければ処理を継続する記述になります。
多くのプログラミングでは””ダブルクォーテーションのみを記述した場合は空白であることを意味します。
また、演算子として利用している<>は否定(~ではない)を意味する演算子です。そのことから上記の記述は”セルが空白ではない”という意味になります。
指定したセルに何かしらの値が入力されている限りは処理を継続しセルの値がなくなると処理を停止する構文となります。
GotoとMod関数でループ処理を奇数でスキップする
変数の値が奇数の場合にスキップする構文です
Sub test()
Dim x As Integer
x = 1
Do While x < 5
continue1:
If x Mod 2 = 1 Then
x = x + 1
GoTo continue1
End If
Debug.Print x '2,4が出力される
x = x + 1
Loop
End Sub
条件式としては変数xが5以下での間は処理を継続するというシンプルなものです。これまで紹介してきた構文と異なる点は以下の3点です。
- If文の使用
- Mod関数で奇数を除外
- Go toを利用してスキップ
解説
Do While x < 5
continue1: 解説④
If x Mod 2 = 1 Then 解説①
x = x + 1 解説②
GoTo continue1 解説③
End If
Debug.Print x '2,4が出力される
x = x + 1
Loop
解説① x Mod 2 = 1
Mod関数を利用して割り算のあまりを計算しています。Mod関数の書式は以下の通りです。
元の数 Mod 割る数
Mod関数を使えば奇数のみや偶数のみ等、ループ処理を制御することができます。
上記の書式に当てはめて今回のサンプル構文では変数xが奇数であればIF文の条件に一致することになります。
奇数の判定をする構文
x Mod 2 = 1
偶数を判定する構文
x Mod 2 = 0
解説② x = x + 1
IF文の条件に一致すると文字出力後の x = x + 1は実行されないため、IF文内にも同じように記述をしないと無限ループとなりますので必ず記載するようにしましょう。
解説③ GoTo continue1
処理をスキップさせるための記述です。GoTo文を記述することで指定した位置に処理を移動させることができます。
GoTo文の書式は下記のとおりです。
GoTo ラベル名
GoToの後に処理を移動させたいラベル名を記述すると解説③の処理実行後に解説④で説明するラベルに処理がスキップされます。
ちなみにですがラベル名は任意の名前を指定することができます。今回私はcontinueとしていました。
解説④ continue1:
解説③実行後に処理が移動する場所になります。
ラベル名:
ラベル名の後には必ず”:”コロンを付けることに注意をしましょう
補足1 セルの位置を指定
プロパティ | 書式 | セル単体の指定 | 行の指定 | 列の指定 | 複数行の指定 | 複数列の指定 | 全セルを指定 |
Range | Range("列+行") | Range("A1") セルA1を指定 |
Range("1:1") 行1を指定 |
Range("A:A") 列Aを指定 |
Range("1:5") 行1~5を指定 |
Range("A:E") 列A~Eを指定 |
取得できない |
cells | Cells(行, 列) | Cells(1,2) セルB1を指定 |
取得できない | 取得できない | 取得できない | 取得できない | cells.select |