【VBA】Excelを閉じていてもマクロを定時実行する方法(コピペOK)

VBA
スポンサーリンク
スポンサーリンク
  1. この記事でできること
    1. どんな場面で使う?
  2. Application.OnTimeとの違い(比較表)
  3. 完成イメージ(Before / After)
  4. 全体の仕組み
  5. 実行前の準備
    1. バックアップを取る
    2. Excelをマクロ有効ブック(.xlsm)で保存する
    3. フォルダ構成を決める
  6. 手順1:VBAコードを準備する
    1. VBE(コードを書く画面)を開く
    2. 標準モジュールを挿入する
    3. コードを貼り付ける
  7. 手順2:VBScriptファイルを作成する
  8. 手順3:タスクスケジューラに登録する
    1. 手動テスト
  9. コード(最小版)
    1. VBAコード(.xlsmに貼り付ける)
    2. VBScriptコード(.vbsファイルとして保存)
    3. 書き換えポイント
  10. コード(実務版)– エラー処理+ログ出力付き
    1. VBAコード(実務版)
    2. VBScriptコード(実務版 — エラー処理+ログ出力付き)
    3. 書き換えポイント(実務版)
    4. ログ出力の例
  11. よくある落とし穴5選
    1. 1. VBScriptのファイルパスにスペースが入っていてエラー
    2. 2. PCがスリープ/シャットダウンだとタスクが動かない
    3. 3. メモ帳で保存したら拡張子が .vbs.txt になった
    4. 4. マクロのセキュリティ設定でマクロがブロックされる
    5. 5. 既にExcelが開いていると同じファイルがロックされる
    6. VBAのタスクスケジューラ実行でマクロが動かないときの対処法
    7. VBScriptでExcelが起動しないときの対処法
  12. FAQ
    1. Q1: Application.OnTimeとタスクスケジューラ方式はどう使い分ける?
    2. Q2: PCがスリープ状態でもタスクは実行される?
    3. Q3: VBScriptの代わりにPowerShellは使える?
    4. Q4: 実行時にExcelの画面は表示される?
    5. Q5: マクロの中でMsgBoxを使っていると無人実行が止まる?
    6. Q6: 複数のマクロを順番に実行したい場合は?
    7. Q7: タスクを一時的に無効にしたい場合は?
  13. まとめ
    1. 関連記事
  14. 次にやりたくなること

この記事でできること

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で毎朝実行しようとした場合):

Before(実行前)のExcel画面
状況 結果
出勤前にExcelを開いてOnTimeをセット 出勤が遅れるとバックアップが走らない
Excelを開きっぱなしで退勤 翌朝まで開きっぱなし。メモリ消費
PCがスリープに入った OnTimeも止まる

After(タスクスケジューラ+VBScript):

After(実行後)のExcel画面
状況 結果
PCの電源が入っている 指定時刻にExcelが自動起動→マクロ実行→自動で閉じる
自分がPCの前にいなくてもOK 出勤したらもう処理が終わっている
ログファイルで実行結果を確認 成功/失敗が一目でわかる

以前は毎朝8時にバックアップマクロを動かしたくて、出勤前にExcelを開いてApplication.OnTimeをセットしていた。でも出勤が遅れた日はバックアップが走らない。Excelを閉じ忘れて帰った日は翌朝まで開きっぱなし。正直めんどくさかった。タスクスケジューラ+VBScriptにしてからは、PCの電源さえ入っていれば自分がいなくてもバックアップが毎朝走るようになった。出勤したらもう終わっている。Application.OnTimeで不便を感じている人に、この記事でExcelを閉じたままの定時実行を体験してほしい。

全体の仕組み

処理の流れは3ステップ。


① タスクスケジューラ(指定時刻に起動)
   ↓
② VBScript(.vbs)がExcelを起動してマクロを呼び出す
   ↓
③ VBAマクロが処理を実行 → Excelを閉じる

必要なファイルは2つ:

  1. Excelファイル(.xlsm): VBAマクロが入ったブック
  2. VBScriptファイル(.vbs): Excelを起動してマクロを呼び出すスクリプト

実行前の準備

バックアップを取る

VBScriptからExcelを操作するため、マクロの内容によってはファイルが変更される。 必ずExcelファイルのコピーを別フォルダに保存してから始める。

バックアップの自動化は フォルダ内のファイルを日付フォルダに自動バックアップ を参照。

Excelをマクロ有効ブック(.xlsm)で保存する

拡張子が .xlsx のままだとマクロが保存できない。

  1. 「ファイル」→「名前を付けて保存」
  2. ファイルの種類を「Excelマクロ有効ブック (*.xlsm)」に変更
  3. 保存

フォルダ構成を決める

以下のフォルダ構成を前提とする(パスは自分の環境に合わせて変更):


C:\VBA自動実行\
  ├── 処理対象.xlsm     ← VBAマクロが入ったExcelファイル
  ├── 実行スクリプト.vbs  ← VBScriptファイル
  └── log\              ← ログ出力先(実務版で使用)

手順1:VBAコードを準備する

まずExcelファイルにマクロを作成する。

VBE(コードを書く画面)を開く

  1. Excelで Alt + F11 を押す

標準モジュールを挿入する

  1. VBEのメニュー →「挿入」→「標準モジュール」

コードを貼り付ける

  1. コードウィンドウに、下の「VBAコード」をそのままコピペする
  2. Ctrl + S で保存(.xlsm形式)

ボタンに割り当てて手動テストもできる。方法は マクロをボタン1つで実行する方法 を参照。

手順2:VBScriptファイルを作成する

  1. メモ帳を開く(Windowsキー →「メモ帳」で検索)
  2. 下の「VBScriptコード」をそのままコピペする
  3. 「ファイル」→「名前を付けて保存」
  4. ファイル名を 実行スクリプト.vbs にする(拡張子を .vbs にする
  5. 文字コード(エンコード)は ANSI を選択
  6. 保存

注意: メモ帳で保存するとき、ファイルの種類を「すべてのファイル」にしないと .vbs.txt になってしまう。必ず「すべてのファイル」を選んでから .vbs で保存する。

手順3:タスクスケジューラに登録する

  1. Windowsキーを押して「タスクスケジューラ」と入力 → 起動
  2. 右側の「基本タスクの作成」をクリック
  3. 名前: 「Excel定時実行」など分かりやすい名前を入力 →「次へ」
  4. トリガー: 「毎日」を選択 →「次へ」
  5. 開始日時: 実行したい時刻を指定(例:08:00:00) →「次へ」
  6. 操作: 「プログラムの開始」を選択 →「次へ」
  7. プログラム/スクリプト: wscript.exe と入力
  8. 引数の追加: "C:\VBA自動実行\実行スクリプト.vbs" と入力(パスをダブルクォートで囲む
  9. 開始(オプション): C:\VBA自動実行 と入力(VBScriptがあるフォルダ)
  10. 「次へ」→「完了」

手動テスト

登録したタスクを右クリック →「実行」で手動実行できる。まずはこれで動作確認する。

コード(最小版)

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を閉じる、の橋渡し役
  • 実務版: エラー処理+ログ出力で無人実行の結果を確認できる

関連記事

次にやりたくなること

コメント

タイトルとURLをコピーしました