マクロの自動実行 - Excel 97

自動マクロ
Excel
VBA
VBScript
Tips to run automatic macro using Excel VBA.
本文を折り畳む 本文を開く

はじめに

Excel の起動時に自動実行されるマクロを用意すれば、 Excel VBA で作成したマクロをバッチプログラムとして無人運転することができます。今回は Excel の起動と終了に関係する話題を扱います。

実例

ThisWorkbook のイベントを利用した自動マクロ

  1. Excel 97 以降と 95 以前の最も大きな違いは、event driven code の強化です。 95 以前では Auto_Open マクロを利用していたものが、 Excel 97 以降では、Workbook や Worksheet ごとにイベントプロシジャを割り当てる方式で、自動マクロを記述できます。Workbook を開いた時に自動実行するマクロの制御は ThisWorkbook にイベントプロシジャを割り当てて行います。
  2. Workbook の Open イベントにコードを割り当てることで、 Workbook を開いたときに自動実行されるマクロを指定します。ここでは、 main という名称のマクロが標準モジュールに定義されているものとし、それを自動実行対象とします。メンテナンス上、自動実行の可否を制御する必要があるため、定数 AUTORUNNER で定義されているファイルの存在をチェックし、これが見つかる時だけ自動マクロが走るようにします。
  3. マクロの終了時に自分自身の Book を閉じるために、 main の最後には ThisWorkbook.Close の記述を行います。ここで注意するのは、起動時のイベントで自動実行されているマクロからは Application.Quit は打てないということです。そのためファイルを閉じるにとどめ、その先は新たなイベントプロシジャに引き継ぎます。
      ThisWorkbook.Close SaveChanges:=False
    
  4. Book を閉じた時に、 Excel を自動で終了するために、 Workbook の BeforeClose イベントを利用します。開いている Workbook の数を数えて、他の Book が無いようなら、Excel を終了させます。
  5. 実際のコードは次のようになります。
    Const AUTORUNNER = "C:\batch\XL1\AutoRun"          ' 自動実行指定ファイル
    
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
    ' 他のブックが無ければ、Excel そのものを閉じる。
        If Workbooks.Count > 1 Then Exit Sub
        Application.Quit
    End Sub
    
    Private Sub Workbook_Open()
    ' 指定ファイルがあれば、起動時に自動実行
        If Len(Dir(AUTORUNNER)) = 0 Then Exit Sub
        main
    End Sub
    
  6. Excel の標準設定では、マクロを含むファイルを開く時には、マクロを有効にするか無効にするかを訊ねるダイアログが表示されます。これは自動化のさまたげになりますので、自動実行を行う端末では、「ツール → オプション → 全般タブ」で、「マクロウィルスから保護する」のチェックボックスを外しておく必要があります。運用上の都合で、この設定が変更できない場合には、自動ジョブの動く瞬間だけチェックを無効にするようなスクリプトを作って制御するという方法が考えられます。
    [HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Excel\Microsoft Excel]
    ダイアログが出る状態    "Options6"=dword:00000008
    ダイアログが出ない状態  "Options6"=dword:00000000
    
    Excel 97 では、HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Excel\Microsoft Excel\Options6 の第 4 ビットが、マクロウィルスから保護するダイアログの制御をしています。次のような VBScript で、これを制御しながら、 Excel Book を開くことができます。
    Set WshShell = WScript.CreateObject("WScript.Shell")
    rKey = _
      "HKCU\Software\Microsoft\Office\8.0\Excel\Microsoft Excel\Options6"
    rSave = WshShell.RegRead(rKey)
    WshShell.RegWrite rKey, 0, "REG_DWORD"
    WshShell.Run _
      "C:\usr\local\bin\msoffice\office\excel.exe SAMPLE1.xls", 1, TRUE
    WshShell.RegWrite rKey, rSave, "REG_DWORD"
    
    レジストリの設定内容は、使用するバージョンや個々の端末の設定に依存して異なります。上のようなコードを実行する前に必ず、レジストリエディタで実際の設定を確認して、端末に応じて必要な修正を行ってください。こういった調整を自分で行えない場合は、レジストリを変更するアプリケーションを実行すべきではありません。

外部 Script でマクロを制御する

  1. 外部で Script を組むつもりなら、自動実行マクロに頼らず、マクロの制御が可能です。
    runXLmacro "C:\batch\XL1\MyBook1.xls", "main"
    
    Function runXLmacro(BookName, MacroName)
        Dim XL
        Set XL = CreateObject("Excel.Application")
        XL.Visible = True
        XL.Workbooks.Open BookName
        XL.Run XL.ActiveWorkbook.Name & "!" & MacroName
        XL.ActiveWorkbook.Close False
        XL.Quit
        Set XL = Nothing
    End Function
    
    上の VBScript コードは、MyBook1.xls を開いて、マクロ main を実行します。このように、 VBA の Workbooks.Open メソッドでワークブックを開く場合には、「マクロウィルスから保護する」機能は抑止されるので、設定を気にする必要はありません。また、 Excel の終了等も外部から制御するため、マクロ中に、 Excel を終了させる仕組みを用意する必要もありません。

実行中のマクロを止める

  1. 一度動き始めたマクロは、正常に終了するか、実行時エラーが発生するまで、止めることはできません。暴走したマクロをどうしても止めたい場合には、タスクマネージャー等を使って、 Excel ごと強制終了するしかありません。
  2. 自動実行マクロの場合には、様々な理由で、マクロを上手に中断させる仕組みが必要になります。
    1. 開発中のチェックのために、マクロ終了時に Book が閉じないようにしたい。
    2. 実行中にネットワークの切断等の事故が発生し、緊急停止したい。
  3. 次のようなアイドリング用関数を用意し、マクロの要所要所から呼ぶことにより、 Excel とは完全に独立した手段で、Excel マクロの緊急停止を行うことができます。
    Const STOPMACRO = "C:\batch\XL1\StopMacro"   ' 緊急停止指定ファイル
    
    Function xlSleep(iSec As Long) As Boolean
    ' 指定秒数だけ待つ。
        If Len(Dir(STOPMACRO)) > 0 Then
            Application.Visible = True
            Stop
        End If
        xlSleep = False
        Application.Wait Now() + iSec / 24 / 3600
        xlSleep = True
    End Function
    

History

2002/3/24
URL移転
2001/4/8
初版
本文を折り畳む back to home index of VBA