自動スケジュールでAccessコードを実行したいと思ったことはありませんか?
既存のAccessアプリケーションを使用して、タスクスケジューラを介して起動したときに正常に実行および終了し、エンドユーザーが起動したときに使いやすいユーザーインターフェイスを表示する方法を説明します。
それを機能させるための鍵は、/cmd
です。 フラグ。
アクセスするコマンドライン引数を渡すには、/cmd
を使用します アプリケーション起動時のコマンドライン引数:
コマンドラインに続くのは、コマンドによって返される値であることを指定します 働き。このオプションは、コマンドラインの最後のスイッチである必要があります。 / cmd の代わりにセミコロン(;)を使用できます 。
このスイッチを使用して、Visual Basic for Applications(VBA)コードで使用できるコマンドライン引数を指定します
/cmd
に続いてコマンドラインで渡すテキストを取得するには 引数には、VBA.Command
を使用します 働き。
起動時にこの関数を使用して、コードをリダイレクトし、定期的なタスクを実行できます。
- 新しいデータベースを作成する
- 次のコードを新しい標準モジュールに追加します。
Public Function Startup()
If Trim(VBA.Command) = "Nightly" Then
Shell "winver", vbNormalFocus
Application.Quit
End If
MsgBox "Start up"
End Function
- 新しいマクロを作成する
- 「RunCode」を選択します 「[新しいアクションの追加]ドロップダウンから
- 「関数名」を
Startup()
に設定します - マクロを閉じて「AutoExec」として保存します "
通常のユーザーとしてアプリケーションをテストするには、データベースを圧縮して修復するだけです。
「起動します」というメッセージボックスが表示されます。
スケジュールされたタスクとしての実行を模倣するには、データベースを閉じて、次のコマンドで起動します。
"C:\Path\To\msaccess.exe" "C:\Path\To\MyDb.accdb" /cmd Nightly
Accessが画面上で短時間点滅し、[About Windows]ダイアログボックスが表示され、Accessが自動的に閉じます。
-
AutoExec
起動時に自動的に実行される特別なマクロです -
Startup()
であっても ルーチンは値を返さないので、Function
として宣言しますSub
を直接呼び出すことはできないためです Accessのマクロから - 通常の使用では、cmdウィンドウコードはスキップされます
-
Application.Quit
を明示的に呼び出します ユーザーの操作を必要とするコード(私の例のMsgBoxコードなど)でAccessがハングするのを防ぐために、「Nightly」ブロック内 - 私は常に
Trim()
を呼び出しますVBA.Command
周辺 コマンドラインの先頭または末尾の空白によって発生するバグを回避する機能 -
/cmd
の代わりに 、/x
を使用することもできます カスタムマクロの名前を切り替えて渡します(私は千の白い暑い太陽の情熱を持ってマクロを嫌うので、そうしません。私が今まで使用したマクロはAutoexec
の2つだけです。 およびAutokeys
特別な機能を提供するため )
夜間に実行するように設定したときにタスクが機能していないように見える場合は、スケジュールされたタスクオプションを[ユーザーがログオンしているときにのみ実行する]に切り替えてみてください。
Officeアプリケーションは、Windowsが「非対話型」モードと呼ぶもので実行することを目的としていません。スケジュールされたタスクを「ユーザーがログオンしているかどうかに関係なく実行する」に設定すると、そのタスクは非対話型モードで実行されます。これは、特に定期的なプロセスの一部としてExcelを自動化する場合に、さまざまな問題を引き起こす可能性があります。
最も簡単な解決策は、ログオフする代わりにワークステーションをロックし、オプションを「ユーザーがログオンしているときにのみ実行する」に設定したままにすることです。
それはあなたの状況では実用的ではないかもしれませんが、知っておくべき重要な考慮事項です。警告されていると考えてください:
Microsoftは現在、無人の非対話型クライアントアプリケーションまたはコンポーネントからのMicrosoftOfficeアプリケーションの自動化を推奨していません。