2020年6月4日木曜日

[VBA] 03. 条件分岐とループ

条件分岐とループ文の記述についてまとめています。



条件分岐 : If 文
If 条件式1 Then
    処理1
ElseIf 条件式2-1 And 条件式2-2 Then
    処理2
ElseIf 条件式3-1 Or 条件式3-2 Then
    処理3
Else
    処理4
End If

IIF関数を使えば三項演算子のような処理もできる。
代入先変数 = IIf(条件式, True時の値, False時の値)
Dim a As Long
a = 100

'数値?
Debug.Print IIf(IsNumeric(a), "数値です", "数値ではありません")
実行結果
数値です


条件分岐 : Select Case 文
Select Case 変数
    Case 値1
        処理1
    Case 値2
        処理2
    Case Else
        処理3
End Select

値の範囲指定や複数条件指定も可能。
Select Case temp
    Case 1 To 3            '1~3
        Debug.Print "1-3"
    Case 4 To 6, Is >= 10  '4~6 または 10以上
        Debug.Print "4-6, over 10"
    Case Else              'その他
        Debug.Print "others"
End Select


ループ : For - Next 文
Dim i As Long

For i = 1 To 10
    Cells(i, 1) = i * 10
    ...
Next

カウンタ用変数 i の間隔を指定する場合は Step を使用する。
Dim i As Long

For i = 10 To 1 Step -1
    Rows(i).Insert  '行を挿入
    ...
Next


ループ : For Each - Next 文

配列を処理したいときによく使う。
Dim list As Variant, temp As Variant

temp = Array("aaa", "bbb", "ccc")

For Each list In temp
    Debug.Print list
Next
Dim rng As Range

For Each rng In Range("A1:A5")
    ...
Next


ループ : Do - Loop 文

条件を満たす間ループする。While を Until にすると条件が偽の間ループとなるらしい。
Dim i As Long

'i >= 5 になったら抜ける
Do While i < 5
    i = i + 1
    Debug.Print i
Loop

必ず一度実行させたい場合は以下のように記述する。
Dim i As Long

'i >= 5 になったら抜ける(1回は必ず実行)
Do
    i = i + 1
    Debug.Print i
Loop While i > 5



ループ : 飛ばす/抜ける

次のループに飛ばす記述は無いらしい。(他言語の continue や next 相当)
GoTo ステートメントを使用してそれらしく動かすしかないと思う。(GoTo ステートメントは同じプロシージャ内へしかジャンプできない)
Dim i As Long

For i = 1 To 10
    'i=5 の時は Continue まで飛ばす
    If i  = 5 Then
      GoTo Continue
    End If

    Cells(i, 1) = i * 10
    Debug.Print i

Continue:
Next

For - Next ループから抜ける場合は Exit For を使用。Do - Loop から抜ける場合は Exit Do を使う。下記の例では i = 5 を検出したら抜ける。
Dim i As Long

For i = 1 To 10
    'i=5 の時はループから抜ける
    If i = 5 Then
        Exit For
    End If
Next


おまけ
ループでよく使う最終行/最終列を取得する記述を以下にメモしておく。
Dim columnEnd As Long  '最終列
Dim rowEnd    As Long  '最終行

columnEnd = Cells(4, Columns.Count).End(xlToLeft).Column  '4行目の最終列を取得
rowEnd = Cells(Rows.Count, 2).End(xlUp).Row               'B列目の最終行を取得



0 件のコメント:

コメントを投稿