この記事でできること
024の記事でApplication.OnTimeを使って毎朝の生産数量集計を自動化した。Excelを開いておけば指定時刻にマクロが走る。便利だった——Excelを開きっぱなしにしている間は。
問題は、PCをシャットダウンして帰ると翌朝動かないことだ。出勤して最初にやることが「Excelを開いてOnTimeをセットする」。自動化したはずなのに、毎朝手動でセットしている。 本末転倒だった。
この記事のVBAを使えば、Excelを閉じた状態でも指定時刻にマクロが自動実行されます。Windowsのタスクスケジューラが時刻になるとVBScriptを起動→VBScriptがExcelを開いてマクロを実行→処理完了後にExcelを閉じる。PCの電源さえ入っていれば、自分がいなくても毎朝集計が終わっている。これが本当の自動化だと思った。
- 対象:Excelを閉じたままマクロを自動実行したい人。VBAを知らなくてOK
- 所要時間:コード貼り付け + タスクスケジューラ設定で約15分
どんな場面で使う?
- 品質管理: 毎朝出勤前に生産数量の集計が自動で終わっているようにしたい
- 事務: 退勤後にバックアップマクロを無人で走らせたい
- 経理: 毎月1日の朝に月次レポートが自動生成されているようにしたい
- どんな職種でも: 「OnTimeだとExcelを開きっぱなしにしないと動かない」と不便に感じたら、この方法
—
Application.OnTimeとの違い(比較表)
まず「どっちを使えばいいか」を整理する。
| 比較項目 | Application.OnTime(024) | タスクスケジューラ+VBScript(この記事) |
|---|---|---|
| Excelを開いている必要 | あり(閉じると止まる) | なし(閉じていてもOK) |
| 設定場所 | VBAコード内 | Windowsタスクスケジューラ |
| 実行条件 | Excelが起動中 | PCの電源が入っている |
| 難易度 | 簡単(VBAだけ) | やや手間(VBS+タスクスケジューラ) |
| 向いている場面 | Excel作業中の定期更新 | 出勤前・退勤後の無人実行 |
結論: Excelを開いている間だけ動かせればよいなら 指定時刻にマクロを自動実行する方法(Application.OnTime) が簡単。Excelを閉じていても動かしたいなら、この記事のタスクスケジューラ方式を使う。
—
完成イメージ(Before / After)
Before(Application.OnTimeで毎朝実行しようとした場合):

| 状況 | 結果 |
|---|---|
| 出勤前にExcelを開いてOnTimeをセット | 出勤が遅れるとバックアップが走らない |
| Excelを開きっぱなしで退勤 | 翌朝まで開きっぱなし。メモリ消費 |
| PCがスリープに入った | OnTimeも止まる |
After(タスクスケジューラ+VBScript):

| 状況 | 結果 |
|---|---|
| PCの電源が入っている | 指定時刻にExcelが自動起動→マクロ実行→自動で閉じる |
| 自分がPCの前にいなくてもOK | 出勤したらもう処理が終わっている |
| ログファイルで実行結果を確認 | 成功/失敗が一目でわかる |
—
以前は毎朝8時にバックアップマクロを動かしたくて、出勤前にExcelを開いてApplication.OnTimeをセットしていた。でも出勤が遅れた日はバックアップが走らない。Excelを閉じ忘れて帰った日は翌朝まで開きっぱなし。正直めんどくさかった。タスクスケジューラ+VBScriptにしてからは、PCの電源さえ入っていれば自分がいなくてもバックアップが毎朝走るようになった。出勤したらもう終わっている。Application.OnTimeで不便を感じている人に、この記事でExcelを閉じたままの定時実行を体験してほしい。
—
全体の仕組み
処理の流れは3ステップ。
① タスクスケジューラ(指定時刻に起動)
↓
② VBScript(.vbs)がExcelを起動してマクロを呼び出す
↓
③ VBAマクロが処理を実行 → Excelを閉じる
必要なファイルは2つ:
- Excelファイル(.xlsm): VBAマクロが入ったブック
- VBScriptファイル(.vbs): Excelを起動してマクロを呼び出すスクリプト
—
実行前の準備
バックアップを取る
VBScriptからExcelを操作するため、マクロの内容によってはファイルが変更される。 必ずExcelファイルのコピーを別フォルダに保存してから始める。
バックアップの自動化は フォルダ内のファイルを日付フォルダに自動バックアップ を参照。
Excelをマクロ有効ブック(.xlsm)で保存する
拡張子が .xlsx のままだとマクロが保存できない。
- 「ファイル」→「名前を付けて保存」
- ファイルの種類を「Excelマクロ有効ブック (*.xlsm)」に変更
- 保存
フォルダ構成を決める
以下のフォルダ構成を前提とする(パスは自分の環境に合わせて変更):
C:\VBA自動実行\
├── 処理対象.xlsm ← VBAマクロが入ったExcelファイル
├── 実行スクリプト.vbs ← VBScriptファイル
└── log\ ← ログ出力先(実務版で使用)
—
手順1:VBAコードを準備する
まずExcelファイルにマクロを作成する。
VBE(コードを書く画面)を開く
- Excelで
Alt + F11を押す
標準モジュールを挿入する
- VBEのメニュー →「挿入」→「標準モジュール」
コードを貼り付ける
- コードウィンドウに、下の「VBAコード」をそのままコピペする
Ctrl + Sで保存(.xlsm形式)
ボタンに割り当てて手動テストもできる。方法は マクロをボタン1つで実行する方法 を参照。
—
手順2:VBScriptファイルを作成する
- メモ帳を開く(Windowsキー →「メモ帳」で検索)
- 下の「VBScriptコード」をそのままコピペする
- 「ファイル」→「名前を付けて保存」
- ファイル名を
実行スクリプト.vbsにする(拡張子を.vbsにする) - 文字コード(エンコード)は ANSI を選択
- 保存
注意: メモ帳で保存するとき、ファイルの種類を「すべてのファイル」にしないと .vbs.txt になってしまう。必ず「すべてのファイル」を選んでから .vbs で保存する。
—
手順3:タスクスケジューラに登録する
- Windowsキーを押して「タスクスケジューラ」と入力 → 起動
- 右側の「基本タスクの作成」をクリック
- 名前: 「Excel定時実行」など分かりやすい名前を入力 →「次へ」
- トリガー: 「毎日」を選択 →「次へ」
- 開始日時: 実行したい時刻を指定(例:08:00:00) →「次へ」
- 操作: 「プログラムの開始」を選択 →「次へ」
- プログラム/スクリプト:
wscript.exeと入力 - 引数の追加:
"C:\VBA自動実行\実行スクリプト.vbs"と入力(パスをダブルクォートで囲む) - 開始(オプション):
C:\VBA自動実行と入力(VBScriptがあるフォルダ) - 「次へ」→「完了」
手動テスト
登録したタスクを右クリック →「実行」で手動実行できる。まずはこれで動作確認する。
—
コード(最小版)
VBAコード(.xlsmに貼り付ける)
タスクスケジューラから呼び出されるマクロ。ここではサンプルとしてセルに実行日時を書き込む処理を使う。
'============================================================
' ■ 定時実行されるマクロ(最小版)
' → タスクスケジューラ+VBScriptから呼び出される
' → 標準モジュールに貼り付ける
'============================================================
Sub TimerTask()
'--- ★書き換えポイント:ここに定時実行したい処理を書く ---
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)
'--- 実行日時をA列の最終行+1に記録
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
ws.Cells(lastRow, 1).Value = Now
ws.Cells(lastRow, 2).Value = "定時実行完了"
'--- ★ここまで ---
'--- ブックを保存
ThisWorkbook.Save
End Sub
VBScriptコード(.vbsファイルとして保存)
'============================================================
' ■ Excelマクロ定時実行スクリプト(最小版)
' → メモ帳で作成し、拡張子 .vbs で保存
' → タスクスケジューラから呼び出す
'============================================================
'--- ★書き換えポイント ---
Dim xlFilePath
xlFilePath = "C:\VBA自動実行\処理対象.xlsm" '← Excelファイルのフルパス
Dim macroName
macroName = "TimerTask" '← 実行するマクロ名
'--- ★ここまで ---
'--- Excelを起動
Dim xlApp
Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = False '← 画面表示なし
xlApp.DisplayAlerts = False '← 確認ダイアログを非表示
'--- ブックを開いてマクロを実行
Dim wb
Set wb = xlApp.Workbooks.Open(xlFilePath)
xlApp.Run macroName
'--- ブックを閉じてExcelを終了
wb.Close SaveChanges:=True
xlApp.Quit
'--- オブジェクトを解放
Set wb = Nothing
Set xlApp = Nothing
書き換えポイント
| 変数 | ファイル | 説明 | 初期値 |
|---|---|---|---|
xlFilePath |
.vbs | Excelファイルのフルパス | "C:\VBA自動実行\処理対象.xlsm" |
macroName |
.vbs | 実行するマクロ名(Sub名) | "TimerTask" |
| 処理内容 | .xlsm | TimerTask 内の処理 |
セルに実行日時を記録 |
—
コード(実務版)– エラー処理+ログ出力付き
無人実行では「成功したか・失敗したか」を確認する手段が必要。実務版はVBScriptにエラー処理とログ出力を追加してある。
実務版のログ出力を入れてからは、出勤後にログファイルを見るだけで「今朝のバックアップは正常に完了した」と確認できるようになった。安心感が全然違う。
VBAコード(実務版)
実務例として、毎朝のバックアップ処理を想定したコードを示す。
'============================================================
' ■ 定時実行されるマクロ(実務版)
' → エラー処理付き
' → 標準モジュールに貼り付ける
'============================================================
Sub TimerTask()
On Error GoTo ErrHandler
'--- ★書き換えポイント ---
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)
'--- 実行日時を記録
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
ws.Cells(lastRow, 1).Value = Now
ws.Cells(lastRow, 2).Value = "定時実行完了"
'--- ★ここに定時実行したい処理を追加 ---
' 例:バックアップ処理、レポート集計、PDF出力など
' Call BackupFiles '← バックアップマクロを呼ぶ場合
' Call CreateReport '← レポート集計マクロを呼ぶ場合
'--- ★ここまで ---
'--- ブックを保存
ThisWorkbook.Save
Exit Sub
ErrHandler:
'--- エラー情報を記録
Dim errRow As Long
errRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
ws.Cells(errRow, 1).Value = Now
ws.Cells(errRow, 2).Value = "エラー: " & Err.Description
ThisWorkbook.Save
End Sub
エラー処理の詳しい解説は エラー処理(On Error)で止まらないマクロを作る方法 を参照。
VBScriptコード(実務版 — エラー処理+ログ出力付き)
'============================================================
' ■ Excelマクロ定時実行スクリプト(実務版)
' → エラー処理+ログ出力付き
' → メモ帳で作成し、拡張子 .vbs で保存
' → タスクスケジューラから呼び出す
'============================================================
On Error Resume Next
'--- ★書き換えポイント ---
Dim xlFilePath
xlFilePath = "C:\VBA自動実行\処理対象.xlsm" '← Excelファイルのフルパス
Dim macroName
macroName = "TimerTask" '← 実行するマクロ名
Dim logFolder
logFolder = "C:\VBA自動実行\log\" '← ログ出力先フォルダ
'--- ★ここまで ---
'--- ログファイルのパスを生成(日付ごと)
Dim logFile
logFile = logFolder & "log_" & Year(Now) & Right("0" & Month(Now), 2) & Right("0" & Day(Now), 2) & ".txt"
'--- ログ書き込み用関数
Sub WriteLog(msg)
Dim fso, f
Set fso = CreateObject("Scripting.FileSystemObject")
'--- logフォルダがなければ作成
If Not fso.FolderExists(logFolder) Then
fso.CreateFolder logFolder
End If
Set f = fso.OpenTextFile(logFile, 8, True) '← 8=追記モード
f.WriteLine Now & " | " & msg
f.Close
Set f = Nothing
Set fso = Nothing
End Sub
'--- 処理開始
Call WriteLog("===== 処理開始 =====")
'--- Excelを起動
Dim xlApp
Set xlApp = CreateObject("Excel.Application")
If Err.Number <> 0 Then
Call WriteLog("エラー: Excel起動失敗 - " & Err.Description)
WScript.Quit
End If
xlApp.Visible = False
xlApp.DisplayAlerts = False
Call WriteLog("Excel起動OK")
'--- ブックを開く
Dim wb
Set wb = xlApp.Workbooks.Open(xlFilePath)
If Err.Number <> 0 Then
Call WriteLog("エラー: ブック オープン失敗 - " & Err.Description)
xlApp.Quit
Set xlApp = Nothing
WScript.Quit
End If
Call WriteLog("ブック オープンOK: " & xlFilePath)
'--- マクロを実行
Err.Clear
xlApp.Run macroName
If Err.Number <> 0 Then
Call WriteLog("エラー: マクロ実行失敗 - " & Err.Description)
Else
Call WriteLog("マクロ実行OK: " & macroName)
End If
'--- ブックを閉じてExcelを終了
wb.Close SaveChanges:=True
xlApp.Quit
Call WriteLog("Excel終了OK")
Call WriteLog("===== 処理完了 =====")
'--- オブジェクトを解放
Set wb = Nothing
Set xlApp = Nothing
書き換えポイント(実務版)
| 変数 | 説明 | 初期値 |
|---|---|---|
xlFilePath |
Excelファイルのフルパス | "C:\VBA自動実行\処理対象.xlsm" |
macroName |
実行するマクロ名 | "TimerTask" |
logFolder |
ログ出力先フォルダ | "C:\VBA自動実行\log\" |
ログ出力の例
2026/03/14 08:00:01 | ===== 処理開始 =====
2026/03/14 08:00:02 | Excel起動OK
2026/03/14 08:00:03 | ブック オープンOK: C:\VBA自動実行\処理対象.xlsm
2026/03/14 08:00:05 | マクロ実行OK: TimerTask
2026/03/14 08:00:06 | Excel終了OK
2026/03/14 08:00:06 | ===== 処理完了 =====
毎朝のバックアップを定時実行するなら、VBA側に フォルダ内のファイルを日付フォルダに自動バックアップ のコードを組み込めばよい。定時にPDF出力したい場合は ExcelファイルをPDFに一括変換 のコードも応用できる。
—
よくある落とし穴5選
1. VBScriptのファイルパスにスペースが入っていてエラー
自分も最初これでハマった。C:\My Documents\処理対象.xlsm のようにパスにスペースがあると、VBScript内で正しく認識されない。原因に気づくまで30分溶かした。
対策: VBScript内のパスはダブルクォートで囲む。タスクスケジューラの「引数の追加」欄でもダブルクォートで囲む。そもそもスペースを含まないフォルダ名にするのが一番確実。
2. PCがスリープ/シャットダウンだとタスクが動かない
原因: タスクスケジューラはPCの電源が入っていないと実行できない。スリープ中も既定では実行されない。
対策: タスクのプロパティ →「条件」タブ →「タスクを実行するためにスリープを解除する」にチェック。またはWindowsの電源設定でスリープを無効にする。
3. メモ帳で保存したら拡張子が .vbs.txt になった
原因: メモ帳の「名前を付けて保存」でファイルの種類が「テキスト文書 (*.txt)」のまま保存すると、.vbs.txt になる。
対策: 保存時にファイルの種類を「すべてのファイル」に変更してから、ファイル名を スクリプト名.vbs で保存する。
4. マクロのセキュリティ設定でマクロがブロックされる
原因: Excelのマクロセキュリティが「警告を表示してマクロを無効にする」以上だと、VBScriptから開いたときにマクロが実行されない。
対策: Excelの「ファイル」→「オプション」→「トラストセンター」→「トラストセンターの設定」→「信頼できる場所」に、Excelファイルがあるフォルダを追加する。
5. 既にExcelが開いていると同じファイルがロックされる
原因: VBScriptは CreateObject で新しいExcelインスタンスを起動する。そのとき同じファイルが既に別のExcelで開かれていると、読み取り専用になるか、エラーになる。
対策: 定時実行するExcelファイルは、手動で開いたまま放置しない。実務版のVBScriptにはエラー処理を入れてあるので、ロック時はログにエラーが記録される。
VBAのタスクスケジューラ実行でマクロが動かないときの対処法
「タスクスケジューラから実行したのにマクロが動かない」という場合、原因はExcelのマクロセキュリティ設定でマクロがブロックされていることが多い。トラストセンターの「信頼できる場所」にExcelファイルのフォルダを追加すれば、マクロが自動で有効になる。
VBScriptでExcelが起動しないときの対処法
「VBScriptをダブルクリックしてもExcelが起動しない」という場合、原因は拡張子が .vbs.txt になっていることか、パスにスペースが含まれていることだ。エクスプローラーで拡張子を表示して .vbs であることを確認し、パスはダブルクォートで囲むこと。
—
FAQ
Q1: Application.OnTimeとタスクスケジューラ方式はどう使い分ける?
| 状況 | 推奨 |
|---|---|
| Excel作業中に定期的にデータを更新したい | Application.OnTime(024) |
| 出勤前・退勤後に無人でマクロを実行したい | タスクスケジューラ+VBScript(この記事) |
| Excelを閉じたらマクロも止めたい | Application.OnTime(024) |
| PCの電源が入っていれば自動で動かしたい | タスクスケジューラ+VBScript(この記事) |
Q2: PCがスリープ状態でもタスクは実行される?
既定では実行されない。タスクのプロパティ →「条件」タブ →「タスクを実行するためにスリープを解除する」にチェックを入れる。ただし、PCがシャットダウンされている場合は実行できない。
Q3: VBScriptの代わりにPowerShellは使える?
使える。ただしVBScriptのほうがExcelのCOM操作との親和性が高く、コードがシンプル。VBScript未経験でも、この記事のコードをコピペすればそのまま動く。
Q4: 実行時にExcelの画面は表示される?
xlApp.Visible = False にしているため、画面には表示されない。バックグラウンドで処理が完了する。
Q5: マクロの中でMsgBoxを使っていると無人実行が止まる?
止まる。MsgBoxは人間の応答を待つため、無人実行では永久に待機状態になる。定時実行するマクロではMsgBoxの代わりに、セルへの書き込みやログファイルへの出力を使う。
Q6: 複数のマクロを順番に実行したい場合は?
VBA側で1つのSubプロシージャから複数のSubを呼ぶのが簡単:
Sub TimerTask()
Call BackupFiles '← 1つ目の処理
Call CreateReport '← 2つ目の処理
Call SendMail '← 3つ目の処理
End Sub
Q7: タスクを一時的に無効にしたい場合は?
タスクスケジューラでタスクを右クリック →「無効」。再開するときは「有効」に戻す。タスクを完全に削除したい場合は「削除」。
—
まとめ
- Application.OnTime: Excelが開いている間だけ有効。閉じると止まる
- タスクスケジューラ+VBScript: Excelを閉じていても、PCの電源が入っていれば指定時刻に自動実行
- VBScript: Excelを起動→マクロを呼び出す→Excelを閉じる、の橋渡し役
- 実務版: エラー処理+ログ出力で無人実行の結果を確認できる
関連記事
- 指定時刻にマクロを自動実行する方法(Application.OnTime) — Excelを開いている間だけ定時実行する場合はこちら
- フォルダ内のファイルを日付フォルダに自動バックアップ — バックアップマクロを定時実行で呼び出す実務例
- エラー処理(On Error)で止まらないマクロを作る方法 — 実務版コードのエラー処理の詳しい解説
—
次にやりたくなること
- フォルダ内のファイルを日付フォルダに自動バックアップ: 毎朝のバックアップを定時実行で完全自動化したい場合に
- ExcelファイルをPDFに一括変換: 毎日17時に報告書を自動でPDF出力する仕組みを作りたい場合に
- エラー処理(On Error)で止まらないマクロを作る方法: 無人実行でエラーが出ても止まらないマクロにしたい場合
- 指定時刻にマクロを自動実行する方法(Application.OnTime): Excelを開いている間だけの定時実行ならこちらが簡単


コメント