web-dev-qa-db-ja.com

スケジュールされたタスクとしてのMicrosoft Accessの実行

データベース(.accdb)の自動更新をスケジュールする方法についてのコメントを募集しています。設定したプロセスにあまり慣れていないためです。

現在、次のように機能します。

  1. タスクスケジューラが.batを呼び出す
  2. .batは.vbsを呼び出します
  3. .vbsはデータベースを開き、マクロを呼び出します
  4. マクロは関数を呼び出します(VBAレベル)
  5. 関数は更新サブルーチンを呼び出します

手順が多すぎると思います。データベースに関連し、システムに保存されている2つの外部ファイル(.Batおよび.vbs)が必要なため、手順が失敗するリスクが高くなります。

どうやら(しかし、私が間違っているとどのように変更できるか教えてください).vbsはサブルーチンを呼び出すことはできず、マクロのみを呼び出すことができます。ユーザーがデータベースの環境VB=次に、サブルーチンを呼び出します。

一部の人が手順を短縮して、最終的に.batと.vbsに乗る方法を知っていることを願っています

16
ProtoVB

私の知る限り、Windowsスケジュールタスクが「Access VBAで何か便利なことをする」ための最短パスは次のとおりです。

データベースに(Subではなく)パブリック関数を作成します。例えば:

Option Compare Database
Option Explicit

Public Function WriteToTable1()
    Dim cdb As DAO.Database
    Set cdb = CurrentDb
    cdb.Execute "INSERT INTO Table1 (textCol) VALUES ('sched test')", dbFailOnError
    Set cdb = Nothing
    Application.Quit
End Function

データベースにマクロを作成して、関数を呼び出します。

Macro.png

適切なパラメーターでMSACCESS.EXEを呼び出すWindowsスケジュールタスクを作成します。

SchedTask.png

上記のダイアログボックスでは、値は次のとおりです。

プログラム/スクリプト:

"C:\Program Files\Microsoft Office\Office14\MSACCESS.EXE"

引数を追加 (オプション)

C:\Users\Public\schedTest.accdb /x DoSomething
23
Gord Thompson

Vbsスクリプトは、次を使用して標準のvba SUBROUTINEを呼び出すことができます。

dim accessApp
set accessApp = createObject("Access.Application")
accessApp.OpenCurrentDataBase("C:\MyApp\MultiSelect.mdb")

accessApp.Run "TimeUpDate"

accessApp.Quit
set accessApp = nothing

サブTimeUpDateは標準のVBAサブルーチンであることに注意してください。これは、autoexec marocrsとマクロがまったくないことを意味します-純粋なVBAサブ呼び出し+このvbsスクリプトのみ。

7

まだ機能するプロセスとして実行できるようにするために、アクセスの最初の年にさかのぼる少し知られているトリックがあります。 Accessは、起動時に常に「Autoexec」というマクロを探します。それが見つかると、すぐにこのマクロの実行を開始します。フォームを開く前にプログラムを初期化する必要がある場合、または元の質問者の場合のように、ユーザーI/Oなしでスケジュールされたプロセスとしてアクセスを実行する場合、これは非常に便利です。

6
Andrew Thackray

約4時間、頭を壁に打ちつけた後、ようやくこれが機能するようになりました。

1)DOSバッチファイルを1行で作成します。この行は、a)Microsoft Accessへのフルパス(msaccess.exe)、b)コードを含むMicrosoft Accessデータベースのフルパス、c)Accessコマンドライン引数「/ x MacroName」の3つの部分で構成されています。 。最初の2つの項目は引用符で囲む必要があります。私のものは次のようになります。

"C:\Program Files (x86)\Microsoft Office\Office14\MSACCESS.EXE" "C:\MyPrograms\ProdDB Reports\ProdDB Reports.accdb" /X DailyTestReportsRun

2)バッチファイルで使用した名前でマクロをAccess内に作成します。 RunCodeという1つのコマンドがあり、呼び出したいVBA関数の名前の引数があります。この後に、開き/閉じ括弧「()」が続くはずです。関数にパラメーターを渡そうとしませんでした。これには問題があると思います。

4)呼び出すVBA関数の最後にDocmd.Quitコマンドがあること、またはこれをマクロの2行目として追加することを確認します。これらは、プロセスの実行後にAccessが開いたままにならないようにします。

5)Windowsタスクスケジューラで、「基本タスクの作成」を選択します(ウィザードを起動します)。プログラム名をDOSバッチファイルの名前に設定します。 「終了したらプロパティウィンドウを開く」などのラベルの付いた便利なチェックボックスがあります。それを確認して、プロパティウィンドウに移動します。

6)ユーザーがログオンしているかどうかに関係なく、タスクを実行するように設定します。また、ここで友人が提案した「最高の権限で実行する」ボックスもチェックしてください。

これで、スケジュールされたタスクを右クリックし、[実行]コマンドを選択して、すべてをテストできます。

アルバート・カラルの台本が好きで試してみました。私はそれをスケジュールしようとするまで、すべてがうまくいった。その後、なんらかの謎の理由で、スケジューラーはそれを開始しません。

3
Karl Hoaglund