Sample Macro  フロー制御 Previous Next

1) If...Then...Else このページのトップへ もくじへ 使用可能なExcelのバージョン
'---------------------------------------------------------------------------------
Sub IfThenElseで条件に応じて処理する()
    If Range("E9") = 4 Then                     '※2 4月なら
        月別処理4                               '※3
    ElseIf Range("E9") = 5 Then                 '※2 5月なら
        月別処理5
    ElseIf Range("E9") = 6 Then                 '※2 6月なら
        月別処理6
    Else                                        'その他なら
        月別処理その他
    End If
End Sub
'---------------------------------------------------------------------------------
<コメント>
※1 この例では、If~Then~Elseを使って月を調べているが、月以外のいろいろな項目にも使える
※2 E9には月が指定されているセルを記入する
※3 「月別処理4」などはサププロシージャの名前で、別途作成して月に応じた処理を記述する


2) Select Case このページのトップへ もくじへ 使用可能なExcelのバージョン
'---------------------------------------------------------------------------------
Sub SelectCaseでケースに応じて処理する()
    変数 = Application.Version                  '変数に値をセットする
    Select Case 変数                            '変数の値に応じて処理する
        Case "10.0"                             '変数の値が 10.0 の場合
            msg = "Excel 2002"                  'ここで必要な処理を行う ※2
        Case "9.0"                              '9.0 の場合
            msg = "Excel 2000"
        Case "8.0d", "8.0"                      '8.0d または 8.0 の場合 ※3
            msg = "Excel 97"
        Case Else                               '変数の値が上記以外の場合
            msg = "不明"
    End Select
    MsgBox msg & " です", vbInformation, "バージョン情報"
End Sub
'---------------------------------------------------------------------------------
<コメント>
※1 キーワード To または Is を使って範囲指定できる
※2 ここでの処理は、いろいろ行える
※3 値を複数指定するときは、カンマ (,) で区切る


3) On...GoTo このページのトップへ もくじへ 使用可能なExcelのバージョン
'---------------------------------------------------------------------------------
Sub OnGotoで条件に応じて処理する()
    値 = Range("E9").Value                      '※1 セルの値を取り出す
    On 値 GoTo 処理他, 処理他, 処理他, 処理4, 処理5, 処理6, 処理7 '※2
    GoTo 処理他                                 '※3 上のリスト以外の値の場合のジャンプ先

処理4:                                          '行ラベル
    Range("H13:J13").Copy                       '※4
    GoTo 共通処理

処理5:
    Range("H14:J14").Copy                       '※4
    GoTo 共通処理

処理6:
    Range("H15:J15").Copy                       '※4
    GoTo 共通処理

処理7:
    Range("H16:J16").Copy                       '※4
    GoTo 共通処理

共通処理:
    Range("H9").PasteSpecial Paste:=xlValues    '※4
    Exit Sub

処理他:
    MsgBox 値 & " は無効な値です", vbCritical, "サンプルマクロ"
End Sub
'---------------------------------------------------------------------------------
<コメント>
※1 E9には調べる値が入っているセル番号を記入する
※2 「処理他」~「処理7」は行ラベルのリストで、値(左から1、2、3、…)に対応するジャンプ先
※3 「行ラベルのリスト以外の値」の許容範囲は解説シートを参照
※4 ここでの処理は、いろいろ行える
サンプルブックのダウンロードは ここをクリック (YNxv214_OnGoto.xls 40KB)
※ 一旦、ブックをハードディスクに保存し、開き直してから実行してください。


4) On...GoSub このページのトップへ もくじへ 使用可能なExcelのバージョン
'---------------------------------------------------------------------------------
Sub OnGoSubを使ったフロー制御()
    値 = Range("E9").Value                      '※1 セルの値を取り出す
    On 値 GoSub 処理他, 処理他, 処理他, 処理4, 処理5, 処理6 '※2、3

    ActiveSheet.Unprotect                       'シート保護を解除する
    Range("H9").Value = 値                      '計算後の値をセットする
    Range("H9").Interior.ColorIndex = xlNone    'セルの色をなしにする
    剰余 = 値 Mod 3 + 1                         '値を3で割って余りを求める
    On 剰余 GoSub 赤色, 黄色, 緑色

    ActiveSheet.Protect
    MsgBox "結果は正しいですか", vbQuestion, "すぐマク"
    Exit Sub

処理4:                                          '行ラベル
    値 = 値 + 41                                '※4
    Return                                      '分岐した行の次の行へ戻る
処理5:
    値 = 値 + 50                                '※4
    Return
処理6:
    値 = 値 + 62                                '※4
    Return
処理他:
    Return

赤色:
    Range("H9").Interior.Color = RGB(255, 0, 0) '※4 セルの色を赤にする
    Return
黄色:
    Range("H9").Interior.Color = RGB(255, 255, 0) '※4 セルの色を黄にする
    Return
緑色:
    Range("H9").Interior.Color = RGB(0, 255, 0) '※4 セルの色を緑にする
    Return
End Sub
'---------------------------------------------------------------------------------
<コメント>
※1 E9には調べる値が入っているセル番号を記入する
※2 「処理他」~「処理6」は行ラベルのリストで、値(左から1、2、3、…)に対応するジャンプ先
※3 値が256以上かマイナス値の場合はエラーになる、0の場合は次行のステートメントが実行される
※4 ここでの処理は、いろいろ行える
サンプルブックのダウンロードは ここをクリック (YNxv214_OnGoSub.xls 34KB)
※ 一旦、ブックをハードディスクに保存し、開き直してから実行してください。


5) For...Next このページのトップへ もくじへ 使用可能なExcelのバージョン
'=================================================================================
Sub 行方向にForNextする()
    Worksheets("SSS").Activate                  'ワークシートをアクティブにする ※1
        Cells.Clear                             '全てのセルをクリアする
    開始 = 1                                    '反復回数の始めをセットする ※2
    終了 = 5                                    '   〃  終りを  〃  ※2
    For カウント = 開始 To 終了                   '※3
        Cells(カウント, 1) = カウント             'セルに値をセットする ※4
    Next                                        '次を処理するために For に戻る
End Sub
'---------------------------------------------------------------------------------
Sub 列方向にForNextする()
    Worksheets("SSS").Activate
        Cells.Clear
    開始 = 1
    終了 = 5
    For カウント = 開始 To 終了
        Cells(1, カウント) = カウント
    Next
End Sub
'---------------------------------------------------------------------------------
Sub 行列方向にForNextする()
    Worksheets("SSS").Activate                  'ワークシートをアクティブにする ※1
        Cells.Clear                             '全てのセルをクリアする
    列開始 = 2                                  '反復処理を開始する列番号をセットする ※2
    列終了 = 4                                  '  〃  終了     〃      ※2
    行開始 = 1                                  '反復処理を開始する行番号をセットする ※2
    行終了 = 5                                  '  〃  終了     〃      ※2
    For 列 = 列開始 To 列終了                    '※5
        For 行 = 行開始 To 行終了                '※6
            Cells(行, 列) = 列 * 10 + 行        'セルに値をセットする ※4
        Next                                   '次を処理するために直前の For に戻る
    Next                                       '次を処理するために直前の Forの前の For に戻る
End Sub
'---------------------------------------------------------------------------------
Sub 一定間隔で行方向にForNextする()
    Worksheets("SSS").Activate
        Cells.Clear
    開始 = 1
    終了 = 5
    間隔 = 2                                    '間隔をセットする
    For カウント = 開始 To 終了 Step 間隔         '※7
        Cells(カウント, 1) = カウント             'セルに値をセットする ※4
    Next
End Sub
'---------------------------------------------------------------------------------
Sub アルファベットでForNextする()		       '※9
    For カウント = Asc("A") To Asc("F")         'AからFになるまで繰り返す ※8
        MsgBox Chr(カウント) & " " & カウント     'メッセージボックスを表示する ※4
    Next
End Sub
'=================================================================================
<コメント>
※1 SSS または SS2 にはシート名を記入
※2 変数の開始・終了 または 列開始・列終了・行開始・行終了 には任意の値をセットする
※3 変数「開始」の値を「カウント」にセットしてから Next までの処理を実行し「カウント」の値を
   1 上げる。「カウント」の値が「終了」の値より小さいか等しいなら反復処理する
※4 ここで必要な処理を行う
※5 変数「列開始」の値を「列」にセットしてから Next までの処理を実行し「列」の値を 1 上げる。
   「列」の値が「列終了」の値より小さいか等しいなら反復処理する
※6 ※5と同様で、列が行に変わる
※7 ※3と同様に For Nextするが、変数「カウント」の値が「間隔」で指定した値ずつ上がる
※8 "A"、"F"には任意のアルファベットを記入
※9 くわしい解説は、「For~Next文をアルファベット列名で書くには」を参照
サンプルブックのダウンロードは ここをクリック (YNxv214_ForNext.xls 36KB)
※ 一旦、ブックをハードディスクに保存し、開き直してから実行してください。


6) For Each...Next このページのトップへ もくじへ 使用可能なExcelのバージョン
'=================================================================================
Sub ForEachNext_アクティブセル領域で一字でも一致するセルに着色する()
    Worksheets("SS2").Activate                  'ワークシートをアクティブにする ※1
    Range("A1").CurrentRegion.Select            'アクティブセル領域を選択する
    Selection.Interior.ColorIndex = xlNone      '選択された領域のセルの色をなしにする

    For Each セル In Selection                  '選択領域の各セルに対して繰り返す
        If セル.Text Like "*京*" Then           'もしテキストに「京」が含まれているなら ※2
            セル.Interior.ColorIndex = 6        'セルを黄色に着色する
            MsgBox セル, vbInformation, "すぐマク" 'メッセージボックスを表示する
        End If
    Next                                        '次を処理するために直前の For に戻る

    Range("A1").Select                          'カーソルを左上端へ
    MsgBox "終わります", vbInformation, "すぐマク"
    Worksheets("Title").Activate
End Sub
'---------------------------------------------------------------------------------
Sub ForEachNext_アクティブセル領域で値が一致するセルに着色する()
    Worksheets("SS3").Activate                  '※1
    Range("A1").CurrentRegion.Select
    Selection.Interior.ColorIndex = xlNone

    For Each セル In Selection
        If セル.Text = "土" Then                'もしセルのテキストが「土」なら
            セル.Interior.ColorIndex = 8        'シアン色
        ElseIf セル.Text = "日" Then
            セル.Interior.ColorIndex = 3        '赤色
        End If
    Next

    Range("A1").Select
    MsgBox "終わります", vbInformation, "すぐマク"
    Worksheets("Title").Activate
End Sub
'=================================================================================
<コメント>
※1 SS2 または SS3 にはシート名を記入
※2 *京* の 京 には任意の文字を記入、
   * は like演算子のマッチングパターンで任意の数の文字を意味する
※3 For Each から Next までの間で、必要な処理を行う
サンプルブックのダウンロードは ここをクリック (YNxv214_ForEachNext.xls 45KB)
※ 一旦、ブックをハードディスクに保存し、開き直してから実行してください。


7) タイマーを使った制御 このページのトップへ もくじへ 使用可能なExcelのバージョン
'=================================================================================
Sub 指定時刻にマクロを実行する()
    指定時刻 = TimeValue("HH:MM:SS")        '指定時刻 ※1
    待ち時間 = TimeValue("HH:MM:SS") '指定時刻に他プロシージャが実行中の場合の待ち時間 ※2
    Application.OnTime TimeValue(指定時刻), _
        "指定時刻に実行するマクロ名", _
        TimeValue(待ち時間)
End Sub
'---------------------------------------------------------------------------------
Sub 指定時刻に実行するマクロ名()
                                           'ここへマクロを記入
End Sub
'=================================================================================
Sub 現在より一定時間後にマクロを実行する()
    指定時刻 = Now + TimeValue("HH:MM:SS")  '現在時刻より何分後 ※2
    待ち時間 = TimeValue("HH:MM:SS") '指定時刻に他プロシージャが実行中の場合の待ち時間 ※2
    Application.OnTime TimeValue(指定時刻), _
        "一定時間後に実行するマクロ名", _
        TimeValue(待ち時間)
End Sub
Sub 一定時間後に実行するマクロ名()
                                           'ここへマクロを記入
End Sub
'=================================================================================
Sub 実行中のマクロを指定時刻まで一時中断して再開する()
    指定時刻 = Now + TimeValue("HH:MM:SS")  '現在時刻より何分後 ※2
    Application.Wait (指定時刻)             'マクロ実行を指定時刻まで中断する
                                           'ここへ再開後に処理するマクロを記入
End Sub
'=================================================================================
Sub 一定の時間間隔でマクロを実行する()
    進捗状況を示すために準備する
    指定時刻 = Now + TimeValue("0時00分05秒")   '5秒後
    待ち時間 = TimeValue("0時00分01秒")
    Application.OnTime TimeValue(指定時刻), "実行マクロ1", TimeValue(待ち時間)
End Sub
'---------------------------------------------------------------------------------
Sub 実行マクロ1()                               '指定された時刻に実行するマクロ
    Range("A2").Value = Now & " 指定時刻1の作業"
    指定時刻 = Now + TimeValue("0時00分05秒")   '5秒後
    待ち時間 = TimeValue("0時00分01秒")
    Application.OnTime TimeValue(指定時刻), "実行マクロ2", TimeValue(待ち時間)
End Sub
'---------------------------------------------------------------------------------
Sub 実行マクロ2()
    Range("A3").Value = Now & " 指定時刻2の作業"
    指定時刻 = Now + TimeValue("0時00分05秒")   '5秒後
    待ち時間 = TimeValue("0時00分01秒")
    Application.OnTime TimeValue(指定時刻), "実行マクロ3", TimeValue(待ち時間)
End Sub
'---------------------------------------------------------------------------------
Sub 実行マクロ3()
    Range("A4").Value = Now & " 終了"
End Sub
'---------------------------------------------------------------------------------
Private Sub 進捗状況を示すために準備する()
    Cells.Clear
    Columns("A:A").NumberFormatLocal = "yyyy/m/d h:mm:ss"
    Range("A1").Select
    ActiveCell.Value = Now & " 開始       "
    Columns("A:A").EntireColumn.AutoFit
End Sub
'=================================================================================
Option Explicit
Dim 開始時刻, 終了時刻, インターバル, 反復時刻
'---------------------------------------------------------------------------------
Sub 開始時刻から終了時刻まで一定間隔でマクロを実行する()
    開始時刻 = TimeValue("09:00:00")
    終了時刻 = TimeValue("17:00:00")
    インターバル = TimeValue("00:20:00")
    Application.OnTime 開始時刻, "一定間隔で実行するマクロ"
End Sub
'---------------------------------------------------------------------------------
Sub 一定間隔で実行するマクロ()
    If TimeValue(Now) >= 終了時刻 Then          '終了時刻になったら終わる
        MsgBox "終了時刻になりました。"
        Exit Sub
    End If
    Call 必要な作業を行うマクロ
    反復時刻 = TimeValue(Now) + インターバル
    Application.OnTime 反復時刻, "一定間隔で実行するマクロ"
End Sub
'---------------------------------------------------------------------------------
Sub 必要な作業を行うマクロ()

End Sub
'=================================================================================
<コメント>
※1 HH:MM:SSには任意の時刻を記入する (例) 9時5分なら 09:05:00
※2 HH:MM:SSには任意の時間を記入する (例) 3分後なら 00:03:00
【関連ページ】 ・タイマーを使ってマクロの動きを制御するには?
        ・開始時刻から終了時刻まで一定間隔でマクロを実行するには?
サンプルブックのダウンロードは ここをクリック (YNxv214_OnTime.xls 35KB)
※ 一旦、ブックをハードディスクに保存し、開き直してから実行してください。


8) 所要時間を計測する このページのトップへ もくじへ 使用可能なExcelのバージョン
'=================================================================================
Sub 所要時間を計測する()
    開始時刻 = Time                             '開始時刻を取り出す
        作業1を実行する                          'ここで必要な処理を行う(この場合は作業1)
    終了時刻 = Time                             '終了時刻を取り出す
    所要時間 = (終了時刻 - 開始時刻) * 24 * 60 * 60 '所要時間を秒に換算する
End Sub
'---------------------------------------------------------------------------------
Private Sub 作業1を実行する()
                                           	'ここへマクロを記入
End Sub
'=================================================================================
サンプルブックのダウンロードは ここをクリック (YNxv212_syoyou.xls 35KB)
※ 一旦、ブックをハードディスクに保存し、開き直してから実行してください。

Excel VBA Macro