VBA・PythonをWindowsタスクスケジューラで自動実行する
マクロやスクリプトを「毎朝9時に自動実行」したい場合、Windowsのタスクスケジューラを使えばPCを操作しなくても定期実行できます。社内SEやIT担当者が定期処理を管理する際に活用できる、VBAとPython、それぞれの設定方法を解説します。
タスクスケジューラとは
Windowsに標準搭載されている機能で、指定した日時や間隔でプログラムを自動実行できます。ショートカットキー Win + S で「タスクスケジューラ」と検索するか、「コントロールパネル」→「管理ツール」から開けます。
VBAを定期実行する
VBAはExcelが開いていないと動きません。タスクスケジューラと組み合わせるには「Excelを起動してマクロを実行して閉じる」という一連の流れを自動化します。
ステップ1:VBAマクロを保存する
まずマクロを含むExcelファイル(.xlsm)を決まったパスに保存します。
C:\Users\YourName\Documents\automate\monthly_report.xlsm
ステップ2:実行用のVBSファイルを作る
メモ帳を開いて以下の内容を書き、run_macro.vbs という名前で同じフォルダに保存します。
' run_macro.vbs
Dim xlApp, xlBook
Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = False ' Excelを非表示で起動
' Excelファイルを開く
Set xlBook = xlApp.Workbooks.Open("C:\Users\YourName\Documents\automate\monthly_report.xlsm")
' マクロを実行(モジュール名.プロシージャ名)
xlApp.Run "Module1.月次集計"
' 上書き保存して閉じる
xlBook.Save
xlBook.Close
xlApp.Quit
Set xlBook = Nothing
Set xlApp = Nothing
"Module1.月次集計" の部分は、実際のモジュール名とプロシージャ名に変更してください。
ステップ3:タスクスケジューラに登録する
- タスクスケジューラを開いて「タスクの作成」をクリック
- 「全般」タブ:タスクの名前を入力(例:「月次集計マクロ」)
- 「トリガー」タブ:「新規」→実行タイミングを設定(例:毎週月曜日 9:00)
- 「操作」タブ:「新規」→「プログラム/スクリプト」に
wscript.exeを入力、「引数の追加」に VBSファイルのフルパスを入力
プログラム: wscript.exe
引数: "C:\Users\YourName\Documents\automate\run_macro.vbs"
- 「OK」で保存
よくある問題と対処
マクロが実行されない:VBSファイル内のファイルパスとモジュール名・プロシージャ名を確認してください。スペルミスが多いです。
セキュリティ警告が出る:ExcelのマクロセキュリティがVBS経由の実行をブロックしている場合があります。「開発」→「マクロのセキュリティ」→「警告を表示してすべてのマクロを有効にする」を試してください。
PCがスリープ中に実行されない:タスクの「条件」タブで「コンピューターをスリープ解除してこのタスクを実行する」にチェックを入れます。
Pythonを定期実行する
Pythonスクリプトはコマンドプロンプトから実行できるため、VBAより設定がシンプルです。
ステップ1:スクリプトの動作を確認する
まずコマンドプロンプトで手動実行して、エラーなく動くことを確認します。
python C:\Users\YourName\Documents\automate\daily_summary.py
正常に動くことが確認できたら、タスクスケジューラに登録します。
ステップ2:タスクスケジューラに登録する
- タスクスケジューラを開いて「タスクの作成」
- 「操作」タブ:「新規」→以下を入力
プログラム/スクリプト: C:\Users\YourName\AppData\Local\Programs\Python\Python312\python.exe
引数の追加: C:\Users\YourName\Documents\automate\daily_summary.py
Pythonのパスは環境によって異なります。コマンドプロンプトで where python を実行すると確認できます。
よくある問題と対処
「Pythonが見つかりません」というエラー:Pythonのフルパスを指定してください。python.exe が PATH に登録されていない環境でもフルパスなら動きます。
ライブラリが読み込めない:タスクスケジューラはユーザーのPATH環境変数が引き継がれないことがあります。スクリプトの先頭にsys.pathを明示的に追加する方法が確実です。
import sys
sys.path.insert(0, r"C:\Users\YourName\AppData\Local\Programs\Python\Python312\Lib\site-packages")
ログが残らないので問題がわからない:スクリプトにログ出力を追加するか、タスクの「設定」タブで「タスクが既に実行中の場合は、次のルールを適用する」を確認し、バッチファイル経由で実行してログファイルに出力します。
@echo off
python C:\Users\YourName\Documents\automate\daily_summary.py >> C:\Users\YourName\Documents\automate\log.txt 2>&1
このバッチファイル(.bat)をタスクスケジューラに登録すると、標準出力とエラーの両方がログファイルに記録されます。
VBAとPython、どちらで定期実行するか
| 観点 | VBA | Python |
|---|---|---|
| 設定の難しさ | やや複雑(VBSファイルが必要) | シンプル |
| Excel依存 | Excelが必要 | 不要 |
| エラーの把握 | しにくい | ログファイルで確認しやすい |
| 向いている用途 | Excel操作を含む処理 | ファイル処理・API連携など |
Excelファイルの処理が中心であれば引き続きVBAで、そうでなければPythonに移行するほうが長期的に管理しやすくなります。
まとめ
Windowsタスクスケジューラを使えば、VBAマクロもPythonスクリプトも定期的に自動実行できます。VBAはVBSファイルを経由する手順が必要で、Pythonはより直接的に設定できます。どちらも本番登録前に手動実行で動作確認を行い、ログが残る仕組みを作っておくことで、問題が起きたときの調査が楽になります。