#はじめに
Excelのマクロを使ってなんやかんやデータの集計をしたりすることがあると思います。これが定型的な処理で日次とか週次で実行する、あるいはパラメーターを変更して大量のケースを機械的に行う必要がある、というような場合、いちいちExcelファイル開いてパラメーター変えてポチっとマクロのボタン押すってのも面倒なので、自動化したいですよね。
バッチファイルからExcelマクロを実行することができる、ってのが分かったので整理します。何かと応用が利いて便利だと思います。
#マクロを実行するVBScript
バッチから...と言いつつ、実はVBScriptです。というのも、VBScriptはよく分からないので、基本バッチを使ってバッチで出来ないところは他の仕組みで補うという方針なもので...
関連記事:
Windowsバッチまとめ
Windowsバッチまとめ 補足: バッチで出来ないことを他の仕組みで補う
以下のようなVBScriptを用意します。
'argument: <ExcelFile> <MacroName>
'ex: "c:\xxx\yyy\zzz.xlsm" Macro1
Dim obj
Set obj=WScript.CreateObject("Excel.Application")
obj.Visible=False
obj.Workbooks.Open WScript.Arguments(0)
obj.Application.Run WScript.Arguments(1)
第一引数にマクロを含むExcelファイル名、第二引数に実行したいマクロ名を指定して、上のVBScriptを実行すると、指定したマクロが実行されます。
次に、以下のような、Macro_Test01というマクロを含むExcelファイルtemplate.xlsmを用意します。
Sub Macro_Test01()
Dim env_Arg01
Dim env_Arg02
env_Arg01 = Environ("Arg01")
env_Arg02 = Environ("Arg02")
Range("A1").Value = env_Arg01
Range("B1").Value = env_Arg02
ThisWorkbook.Save
Application.Quit
End Sub
ポイントは以下です。
マクロ実行時に引数を直接渡すのは難しそうだったので、環境変数で値を受け渡しする想定にしています。VBAで環境変数の値を取得するには、Environ()を使います。
処理としては、Arg01, Arg02という環境変数の値を取得して、それぞれA1,B1セルに格納します(サンプルなのでやっている処理に意味は無いです)。本来は、ここに実際に処理したいコードを書きます。
最後に、ThisWorkbook.Saveでファイルを保存し、Application.Quitでアプリケーションを終了します。
このマクロを呼び出すバッチのサンプルを書いてみます。
@echo off
setlocal enabledelayedexpansion
cd %~dp0
copy template.xlsm test01.xlsm
set Arg01=aaa
set Arg02=111
runExcelMacro.vbs %~dp0\test01.xlsm Macro_Test01
まず、テンプレートとして作っておいたExcelファイル(マクロ付)をコピーして別名のファイル(test01.xlsm)を作ります。環境変数Arg01, Arg02を設定してから、新しく作ったファイルのマクロをVBScriptにて実行しています。
生成されたtest01.xlsmを開いてみると、指定したArg01, Arg02の値がA1,B1セルに格納されていることが確認できます。
ちなみに、Excelの設定によってはマクロを有効にしているとファイルを保存する際(ThisWorkbook.Saveの際)に、「プライバシーに関する注意: このドキュメントには、マクロ、ActiveX コントロール、XLM 拡張パックの情報、または Web コンポーネントが含まれています。」というようなポップアップが出て、確認を促される場合があります。そうすると「OK」ボタンを押すなどインタラクティブな操作が必要になって自動化の妨げになってしまいます。
このポップアップが出る場合は、以下の情報を参考に、ポップアップを抑止しておくとよいでしょう。
参考:
「プライバシーに関する注意: このドキュメントには、マクロ、ActiveX コントロール、XLM 拡張パックの情報、または Web コンポーネントが含まれています。」と表示される
Excelの"プライバシーに関する注意"の確認ダイアログを黙らせる