自動でマクロを実行する際のメンテナンスについて

自動でマクロを実行する際に、コードの修正やテストを行いたい場合が多々ありますが、Excelファイルを開く度にマクロが実行されてしまうと都合がよくありません。
そこで、メンテナンス性を良くするための「仕込み」をしておくと便利です。
ここでは、テキストファイル(設定ファイル)に実行条件を記載することで判断しています。

「コンテンツの有効化」によってブロックされないようにしておかないと自動でマクロが実行されないので注意してください。
Excel VBAを動作させる際に、ブロックされないようにする

時間がきたら起動するには、Windows標準では、タスクスケジューラを使用します。
Excel マクロを自動で起動できるようにする


【設定ファイルの例】
Excelマクロのファイルが置いてある場所に、Excelマクロと同じファイル名のテキストファイルを作成します。
関数では、「ファイル名が未指定の場合は、同じファイル名で拡張子が.txtのファイルを探す」ようにしているので、関数を呼び出す際にファイル名を指定することも可能です。

Mode = 1

----------------------------------
最初の行しか読まない。
動作条件を以下の設定から指定する。
Stop:0
Auto:1
Debug:2

設定ファイル : Mode=0 → 自動起動の場合:実行しない、手動起動の場合:実行しない
設定ファイル : Mode=1 → 自動起動の場合:実行する、手動起動の場合:実行する
設定ファイル : Mode=2 → 自動起動の場合:実行しない、手動起動の場合:実行する

【サンプルプログラム】

起動時の処理 ThisWorkbook に記載 (Excel を開いたら自動でマクロを実行する 参照)

Private Sub Workbook_Open()
    ' Excel 起動時に実行する処理(1=自動起動)
    AutoProc 1
End Sub

標準モジュール(Module1など)に記載します。
ボタンを追加して、AutoProc_Click 関数を作成したものを、手動実行の処理とします。

【手動実行処理】
引数に2を渡して、自動実行処理を呼ぶだけです。

' ------------------------------------------------------------
' 説明:手動実行する処理
' -----------------------------------------------------------
Sub AutoProc_Click()
    ' 手動で実行する処理(2=手動起動)
    AutoProc 2
End Sub

【自動実行処理】
ここが、実行したいメインの処理になります。
最初に引数と設定ファイルを確認して、実行するか判断します。
その下に実行した処理を記載します。

' ------------------------------------------------------------
' 説明:自動実行する処理
' 引数:1:起動体系  1=自動起動, 2=手動起動
' ------------------------------------------------------------
Sub AutoProc(startup_mode As Integer)
    ' マクロを実行するか判断
    If StartUpTextRead(startup_mode) = False Then
        ' 実行しない
        Exit Sub
    End If

    ' 以降に自動実行の処理を記載します
    MsgBox "起動したよ"

End Sub

【関数化】

' ------------------------------------------------------------
' 説明:テキストファイルを読んでマクロを実行するか判断する
' 引数:1:起動体系  1=自動起動, 2=手動起動
'       2:読み込むファイル名 指定しない場合はマクロファイルと同じ名前のテキストファイルを使用する
' 戻値:実行する(True), 実行しない(False)
' ------------------------------------------------------------
Function StartUpTextRead(ByVal startup_mode As Integer, Optional ByVal filename As String = "") As Boolean

    Dim str_buf As String
    Dim ifile As Integer
    Dim fso As Object
    Dim BaseName As String
    
    ' FileSystem の オブジェクトの作成
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    ' ファイル名が未指定の場合は、同じファイル名で拡張子が.txtのファイルを探す
    If filename = "" Then
        ' 拡張子の無いファイル名を取得
        BaseName = fso.GetBaseName(ThisWorkbook.Name)
        ' ファイルパス+拡張子の無いファイル名 + 新しい拡張子を返す
        filename = ThisWorkbook.Path & "\" & BaseName & ".txt"
    End If
    
    ' ファイルの有無を確認
    If fso.FileExists(filename) = False Then
        Set fso = Nothing
        ' ファイルが無い場合は、自動起動
        StartUpTextRead = False
        Exit Function
    End If
    Set fso = Nothing
    
    ' 空いているファイル番号を取得
    ifile = FreeFile

    'ファイルを開く
    Open filename For Input As #ifile
    
    ' 先頭行のみ読み込む
    Line Input #ifile, str_buf

    Close #ifile
    
    ' 小文字に変換
    str_buf = LCase(str_buf)
    ' 半角スペースを除去
    str_buf = Replace(str_buf, " ", "")
    
    If str_buf = "mode=0" Then
        ' 自動も手動も、マクロは実行しない
        StartUpTextRead = False
    ElseIf str_buf = "mode=1" Then
        ' 自動起動
        StartUpTextRead = True
    ElseIf str_buf = "mode=2" Then
        ' 自動起動はしないが手動での実行はする
        If startup_mode = 2 Then
            ' 手動での実行はする
            StartUpTextRead = True
        Else
            ' 自動起動はしない
            StartUpTextRead = False
        End If
    Else
        ' 該当しない場合は、自動起動
        StartUpTextRead = True
    End If

End Function

コメント

  1. 甘栗 より:

    このページはさっぱりわかりませんでした。あのほんの少し書いてくれるとわかりやすくてありがたいです。
    わからなかった点。

    (1)【設定ファイルの例】を Excelマクロのファイル名と同じファイル名を付けて、Excelマクロのファイルと同じフォルダに置く、という意味なのか? そうであれば、そう書いてほしい。

    (2)「標準モジュールに記載」は標準モジュールのどこに記載すれば良いのか? Modhule1の中に書くのか? そうだとして、その中のどこに書くのか? 冒頭に書くのであれば、そう書いてほしいです。

    • toro-no-sashimi より:

      甘栗さま

      コメントありがとうございます。
      ご指摘いただいた、分かりにくい点について見直しを行いました。

      具体的な指摘でしたので至らぬ点も見え助かりました。
      今後ともよろしくお願いいたします。