毎朝同じクエリをCSVで出力する作業は、Windowsのタスクスケジューラを使えば、Accessを手で開かずに実行できます。仕組みは単純で、決まった時刻にAccessを起動し、出力用のマクロを実行して、終わったらAccessを閉じるだけです。

ただし、無人で動かす場合は、エラーのダイアログや起動時の確認画面が出ると、誰も操作しないまま処理が止まります。この記事では、止まりにくい出力処理の作り方、起動コマンドの手動テスト、タスクスケジューラの設定、実行結果の確かめ方を順に説明します。

エクスポート定義と出力するクエリは、すでに作成済みであることを前提にします。

全体の流れ

  1. 出力処理をVBAの関数にまとめる(日付付きファイル名・エラー時の記録)
  2. その関数を実行してAccessを終了するマクロを作る
  3. データベースを信頼できる場所に置く
  4. /x オプション付きでAccessを起動し、手動で動作を確かめる
  5. タスクスケジューラに登録する
  6. 出力ファイルとログで結果を確かめる

手順1:出力処理をVBAの関数にまとめる

標準モジュールに次の関数を書きます。定義名・クエリ名・フォルダは、ご自分の環境に合わせて書き換えてください。

Public Function ExportDailyCsv()
    Dim outPath As String

    On Error GoTo ErrHandler

    outPath = "C:\export\sales_" & Format(Now, "yyyymmdd_hhnnss") & ".csv"

    DoCmd.TransferText acExportDelim, "売上_エクスポート定義", "Q_売上出力", outPath, True

    WriteLog "OK" & vbTab & outPath & vbTab & "件数=" & DCount("*", "Q_売上出力")
    Exit Function

ErrHandler:
    WriteLog "NG" & vbTab & Err.Number & vbTab & Err.Description
End Function

Private Sub WriteLog(ByVal msg As String)
    Dim f As Integer
    f = FreeFile
    Open "C:\export\export_log.txt" For Append As #f
    Print #f, Format(Now, "yyyy-mm-dd hh:nn:ss") & vbTab & msg
    Close #f
End Sub

ポイントは次のとおりです。

  • Subではなく Function にする:マクロの「プロシージャの実行」(RunCode)から呼び出せるのは関数(Function)です。
  • ファイル名に日時を入れる:Format(Now, "yyyymmdd_hhnnss") で「sales_20261007_060000.csv」のような名前になります。VBAの書式では分は nn です(mm は月)。日付だけでよい場合は Format(Date, "yyyymmdd") にします。同じ日に2回動かす可能性があるなら、時刻まで入れておくと前のファイルを上書きしません。
  • エラーを処理して記録する:エラー処理がないと、エラーのダイアログが表示されたまま止まります。On Error GoTo で受け止め、ログに番号と内容を書いて関数を抜けるようにします。
  • 件数を記録する:出力したクエリの件数をログに残しておくと、あとでCSVの行数と照合できます。

出力するクエリがパラメータクエリ(実行時に値の入力を求めるクエリ)の場合、入力ダイアログで処理が止まります。定時実行では、条件をクエリ内に固定するか、日付などの条件をテーブルから読む形にしておきます。

手順2:関数を実行してAccessを終了するマクロを作る

「作成」タブの「マクロ」で新しいマクロを作り、次の2つのアクションを順に並べます。

順番 アクション 設定
1 プロシージャの実行(RunCode) 関数名:ExportDailyCsv()
2 Accessの終了(QuitAccess) オプション:「すべて保存」または「終了」

「定時CSV出力」などの名前で保存します。この名前を、あとで起動コマンドに指定します。

終了アクションのオプションを「確認」にすると、保存の確認画面で止まる可能性があります。アクションやオプションの表示名はバージョンによって違う場合があるので、マクロデザイナーの一覧で該当するものを選んでください。

起動時に動く処理がないか確認する

データベースに AutoExec マクロや起動時に表示するフォームが設定されていると、/x で指定したマクロとは別にそれらも動きます。入力を待つフォームやメッセージが出る設計だと、無人実行が止まります。

起動時の処理を外せない場合は、出力専用の小さなデータベースを別に作り、元のテーブルをリンクして、そこに出力用のクエリ・関数・マクロを置く方法もあります。

手順3:データベースを信頼できる場所に置く

データベースが信頼されていない状態だと、VBAやマクロが無効になったり、セキュリティの警告が表示されたりします。無人実行では、警告に応答する人がいません。

Accessの「ファイル」→「オプション」→「トラストセンター」→「トラストセンターの設定」→「信頼できる場所」で、データベースを置いたフォルダを追加します。ネットワーク上のフォルダを指定する場合は、同じ画面でネットワーク上の場所を許可する設定が必要です。社内のセキュリティ方針で設定が制限されていることもあるため、管理者の指示に従ってください。

手順4:/x オプション付きで手動起動して確かめる

タスクスケジューラに登録する前に、同じコマンドを手で実行して、出力から終了まで通ることを確認します。

まず、MSACCESS.EXE の場所を調べます。スタートメニューのAccessを右クリックして「ファイルの場所を開く」を選び、表示されたショートカットのプロパティにある「リンク先」で確認できます。Microsoft 365 の場合、次のような場所にあることが多いですが、インストール方法によって異なります。

C:\Program Files\Microsoft Office\root\Office16\MSACCESS.EXE

PowerShellで次のように実行します。

& "C:\Program Files\Microsoft Office\root\Office16\MSACCESS.EXE" "C:\db\売上管理.accdb" /x 定時CSV出力

/x の後にマクロ名を書くと、データベースを開いたあとにそのマクロが実行されます。マクロ名に空白が含まれる場合は、マクロ名も引用符で囲みます。

確認すること:

  • Accessが起動し、何も操作せずに閉じたか
  • C:\export に日時付きのCSVができたか
  • export_log.txt に「OK」の行が追加されたか
  • タスクマネージャーに MSACCESS.EXE が残っていないか

ここで途中の画面が出て止まる場合は、手順2・3に戻って原因を取り除きます。手動で止まるものは、スケジュール実行でも必ず止まります。

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

タスクスケジューラを開き、右側の「タスクの作成」を選びます。「基本タスクの作成」より設定できる項目が多いため、こちらを使います。

全般タブ

  • 名前:「Access 売上CSV出力」など、あとで見て分かる名前
  • 「ユーザーがログオンしているときのみ実行する」を選ぶ

Officeアプリは、画面のある通常のログオン状態で動くことを前提にしています。ログオンしていない状態での実行は、ダイアログが表示できずに止まるなど、動作が不安定になりやすいため避けます。

トリガータブ

「新規」で「毎日」「午前6:00」のように実行時刻を設定します。平日だけにしたい場合は「毎週」を選び、曜日を指定します。

操作タブ

「新規」で「プログラムの開始」を選び、次のように入力します。

欄 入力例
プログラム/スクリプト "C:\Program Files\Microsoft Office\root\Office16\MSACCESS.EXE"
引数の追加 "C:\db\売上管理.accdb" /x 定時CSV出力
開始(オプション) C:\db

データベースや出力先がネットワーク上にある場合、ドライブ文字(Z:\ など)ではなく \\server\share\... の形式(UNCパス)で指定します。割り当てたドライブ文字は、タスクの実行時には使えない場合があります。VBA内の出力先・ログの場所も同じです。

条件タブ

  • ノートPCの場合、「コンピューターをAC電源で使用している場合のみタスクを開始する」が有効だと、バッテリー駆動中は動きません。必要に応じて外します。
  • スリープ中に時刻が来る可能性があるなら、「タスクを実行するためにスリープを解除する」を検討します。ただし、電源が切れているPCでは動きません。

設定タブ

  • 「タスクを停止するまでの時間」を、通常の処理時間より十分長い値(たとえば1時間)にします。予期しないダイアログで止まった場合も、ここで打ち切られます。
  • 「タスクが既に実行中の場合に適用される規則」は「新しいインスタンスを開始しない」にします。

手順6:実行結果を確かめる

登録したら、タスクを右クリックして「実行」を選び、すぐに動作を確認します。翌朝まで待つ必要はありません。

確かめる場所

  1. 出力フォルダ:日時付きのCSVができているか
  2. ログファイル:最新の行が「OK」か「NG」か。NGならエラー番号と内容
  3. CSVの中身:見出しを除いた行数が、ログの件数と一致するか
  4. タスクスケジューラの「前回の実行結果」:0x0 ならプログラムが正常に終了したという意味。0x41301 はタスクが実行中であることを示します
  5. タスクマネージャー:MSACCESS.EXE が残っていないか

「前回の実行結果」が 0x0 でも、それはAccessが終了したことを示すだけで、CSVが正しく出力されたかどうかは分かりません。ファイルとログで判断します。

タスクの「履歴」タブが空の場合は、タスクスケジューラ右側の「すべてのタスク履歴を有効にする」で記録を有効にできます。

動かないときの確認順

症状 確認すること
ファイルもログも残っていない マクロ名の綴り、データベースのパス、信頼できる場所の設定。手順4の手動実行で同じ現象になるか
ログに「NG」がある エラー番号と内容。定義名・クエリ名の綴り、出力先フォルダの有無と書き込み権限
Accessが開いたまま残る 起動時のフォーム・AutoExec、パラメータクエリの入力画面、終了アクションのオプション
手動では動くが、スケジュールでは動かない 実行するユーザー、ログオン状態、ネットワークの場所をドライブ文字で指定していないか
前回のファイルが消えている ファイル名に日付・時刻が入っているか。同じ名前で出力していないか
他の人がデータベースを開いていると失敗する データベースが排他モードで開かれていないか。出力専用データベースからリンクする構成を検討する

定時実行を始めてしばらくは、毎朝ログとファイルを確認し、件数が普段と大きく違わないかも見ておくと、元データ側の異常にも気づけます。

おすすめの記事