Help us understand the problem. What is going on with this article?

Excelマクロをバッチから実行する

More than 3 years have passed since last update.

はじめに

Excelのマクロを使ってなんやかんやデータの集計をしたりすることがあると思います。これが定型的な処理で日次とか週次で実行する、あるいはパラメーターを変更して大量のケースを機械的に行う必要がある、というような場合、いちいちExcelファイル開いてパラメーター変えてポチっとマクロのボタン押すってのも面倒なので、自動化したいですよね。
バッチファイルからExcelマクロを実行することができる、ってのが分かったので整理します。何かと応用が利いて便利だと思います。

マクロを実行するVBScript

バッチから...と言いつつ、実はVBScriptです。というのも、VBScriptはよく分からないので、基本バッチを使ってバッチで出来ないところは他の仕組みで補うという方針なもので...

関連記事:
Windowsバッチまとめ
Windowsバッチまとめ 補足: バッチで出来ないことを他の仕組みで補う

以下のようなVBScriptを用意します。

runExcelMacro.vbs
'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でアプリケーションを終了します。

このマクロを呼び出すバッチのサンプルを書いてみます。

macro_test.bat
@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の"プライバシーに関する注意"の確認ダイアログを黙らせる

tomotagwork
*おことわり* このサイトの掲載内容は私自身の見解であり、必ずしも所属会社の立場、戦略、意見を代表するものではありません。 記事は執筆時点の情報を元に書いているため、必ずしも最新情報であるとはかぎりません。 記事の内容の正確性には責任を負いません。自己責任で実行してください。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした