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:タスクスケジューラに登録する

  1. タスクスケジューラを開いて「タスクの作成」をクリック
  2. 「全般」タブ:タスクの名前を入力(例:「月次集計マクロ」)
  3. 「トリガー」タブ:「新規」→実行タイミングを設定(例:毎週月曜日 9:00)
  4. 「操作」タブ:「新規」→「プログラム/スクリプト」に wscript.exe を入力、「引数の追加」に VBSファイルのフルパスを入力
プログラム: wscript.exe
引数: "C:\Users\YourName\Documents\automate\run_macro.vbs"
  1. 「OK」で保存

よくある問題と対処

マクロが実行されない:VBSファイル内のファイルパスとモジュール名・プロシージャ名を確認してください。スペルミスが多いです。

セキュリティ警告が出る:ExcelのマクロセキュリティがVBS経由の実行をブロックしている場合があります。「開発」→「マクロのセキュリティ」→「警告を表示してすべてのマクロを有効にする」を試してください。

PCがスリープ中に実行されない:タスクの「条件」タブで「コンピューターをスリープ解除してこのタスクを実行する」にチェックを入れます。

Pythonを定期実行する

Pythonスクリプトはコマンドプロンプトから実行できるため、VBAより設定がシンプルです。

ステップ1:スクリプトの動作を確認する

まずコマンドプロンプトで手動実行して、エラーなく動くことを確認します。

python C:\Users\YourName\Documents\automate\daily_summary.py

正常に動くことが確認できたら、タスクスケジューラに登録します。

ステップ2:タスクスケジューラに登録する

  1. タスクスケジューラを開いて「タスクの作成」
  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.exePATH に登録されていない環境でもフルパスなら動きます。

ライブラリが読み込めない:タスクスケジューラはユーザーの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はより直接的に設定できます。どちらも本番登録前に手動実行で動作確認を行い、ログが残る仕組みを作っておくことで、問題が起きたときの調査が楽になります。