ExcelVBA(マクロ)で条件をつけて同じ処理を繰り返す方法/Do Loopステートメントの使い方

wire-o IT

Excelで繰り返し処理を行う場合、For Nextステートメントで回数を指定して行う方法と、Do Loopステートメントで条件をつけて行う方法があります。。

Advertisements

Do Loopステートメントの使い方

doloop1
Do Loopステートメントは画像のような構文となります。DoLoopの間の処理が繰り返し実行されます。
繰り返し処理は条件をつけないと無限ループになるので、Do Loopステートメントを使用する時はかならずUntil(~まで)かWhile(~になっている間)で条件を指定します。

Untilでの条件指定

条件を満たすまで同じ処理を繰り返す
Do Until 条件
(繰り返す処理)
Loop
doloop2
条件として、Do Until ActiveCell.Value = “”を指定します。処理はアクティブセルの値が空白になるまで何度でも実行されるので、セルを移動するかアクティブセルの値を変更する処理が必須となります。
doloop3
今回はデータ内容のあるセルに対してColorIndexプロパティで背景を赤くし、Offsetプロパティでひとつ下のセルを選択する(アクティブセルをひとつ下にズラす)、というコードを処理として記述します。
doloop4
これをこの表に対し、A1を選択した状態で実行すると、
doloop5
数字を入力したセルはすべて背景色が塗られ、A6のデータがないセルを選択した状態で処理が終了します。

Whileでの条件指定

条件を満たしている間同じ処理を繰り返す
Do While 条件
(繰り返す処理)
Loop
doloop6
今度は条件としてDo While ActiveCell.Previous > 0を指定します。
PreviousプロパティはOffsetプロパティでいうと(0,-1)で、左隣のセルを意味します。これが0より大きい数字の間は処理が実行されます。
doloop7
処理はアクティブセルに「○」を追加し、そのたびに左の数字を1減らす、というものにします。
つまり左の数字の数だけ○が増えることになります。
doloop8
左の数字が「5」のセルに対して処理を実行すると、
doloop9
左の数字は0になり、その代わりアクティブセルの○が5個増えました。

Exit Doの使い方(繰り返しの強制終了)

Do Loopステートメントの途中で終了
Exit Do
exitdo1
とりあえず、こういう「アクティブセルの値をふたつ右にコピーして、ひとつ下に移動する。アクティブセルが空白になるまでそれを繰り返す」という処理があるとします。
exitdo2
処理自体はちゃんと動きましたが、意図しないデータが含まれていました。数字以外のデータがあった場合は、繰り返しを中断したいと思います。
exitdo3
その場合Whileで指定した条件とは別に、Do Loopステートメントを抜け出す出口が必要になります。
数字かどうかの判定はIsNumeric関数で行い、数字の場合は普通に処理を行います。
exitdo4
数字以外のデータがあった場合は警告メッセージを表示し、Exit Doを実行することでそれ以降の繰り返し処理を全てキャンセルすることが可能です。
exitdo5
この状態でマクロをもう一度実行してみると、
exitdo6
数字以外のデータが見つかった時点でメッセージが表示され、
exitdo7
Exit Doが実行されたため、繰り返しが中断されます。
' vba
Do Until ActiveCell.Value = ""
If IsNumeric(ActiveCell) Then ' 数字の場合処理実行
' アクティブセルの値をふたつ右にコピー
ActiveCell.Offset(0, 2) = ActiveCell.Value
ActiveCell.Offset(1, 0).Select
Else
MsgBox ("不正な値が入力されています")
Exit Do ' 繰り返し中断
End If
Loop
やりたいことから方法を探すエクセルExcel操作・関数・VBA(マクロ)逆引きまとめ
逆引き(やりたいことから探す)Excel記事まとめ
関数・演算子・メソッド・プロパティ名から探すExcel/VBA(マクロ)使い方・組み合わせ方まとめ
こちらはExcelやメソッドの諸機能を、機能の名称から探せるまとめ記事です。

コメント