毎朝同じクエリをCSVで出力する作業は、Windowsのタスクスケジューラを使えば、Accessを手で開かずに実行できます。仕組みは単純で、決まった時刻にAccessを起動し、出力用のマクロを実行して、終わったらAccessを閉じるだけです。
ただし、無人で動かす場合は、エラーのダイアログや起動時の確認画面が出ると、誰も操作しないまま処理が止まります。この記事では、止まりにくい出力処理の作り方、起動コマンドの手動テスト、タスクスケジューラの設定、実行結果の確かめ方を順に説明します。
エクスポート定義と出力するクエリは、すでに作成済みであることを前提にします。
全体の流れ
- 出力処理をVBAの関数にまとめる(日付付きファイル名・エラー時の記録)
- その関数を実行してAccessを終了するマクロを作る
- データベースを信頼できる場所に置く
/xオプション付きでAccessを起動し、手動で動作を確かめる- タスクスケジューラに登録する
- 出力ファイルとログで結果を確かめる
手順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:実行結果を確かめる
登録したら、タスクを右クリックして「実行」を選び、すぐに動作を確認します。翌朝まで待つ必要はありません。
確かめる場所
- 出力フォルダ:日時付きのCSVができているか
- ログファイル:最新の行が「OK」か「NG」か。NGならエラー番号と内容
- CSVの中身:見出しを除いた行数が、ログの件数と一致するか
- タスクスケジューラの「前回の実行結果」:
0x0ならプログラムが正常に終了したという意味。0x41301はタスクが実行中であることを示します - タスクマネージャー:MSACCESS.EXE が残っていないか
「前回の実行結果」が 0x0 でも、それはAccessが終了したことを示すだけで、CSVが正しく出力されたかどうかは分かりません。ファイルとログで判断します。
タスクの「履歴」タブが空の場合は、タスクスケジューラ右側の「すべてのタスク履歴を有効にする」で記録を有効にできます。
動かないときの確認順
| 症状 | 確認すること |
|---|---|
| ファイルもログも残っていない | マクロ名の綴り、データベースのパス、信頼できる場所の設定。手順4の手動実行で同じ現象になるか |
| ログに「NG」がある | エラー番号と内容。定義名・クエリ名の綴り、出力先フォルダの有無と書き込み権限 |
| Accessが開いたまま残る | 起動時のフォーム・AutoExec、パラメータクエリの入力画面、終了アクションのオプション |
| 手動では動くが、スケジュールでは動かない | 実行するユーザー、ログオン状態、ネットワークの場所をドライブ文字で指定していないか |
| 前回のファイルが消えている | ファイル名に日付・時刻が入っているか。同じ名前で出力していないか |
| 他の人がデータベースを開いていると失敗する | データベースが排他モードで開かれていないか。出力専用データベースからリンクする構成を検討する |
定時実行を始めてしばらくは、毎朝ログとファイルを確認し、件数が普段と大きく違わないかも見ておくと、元データ側の異常にも気づけます。
