2013-11-27 27 views
13

Sto cercando commenti su come pianificare gli aggiornamenti automatici di un database (.accdb) poiché non mi sento molto a mio agio con il processo che ho impostato.Esecuzione di Microsoft Access come attività pianificata

Attualmente, funziona come segue:

  1. Utilità di pianificazione chiama un bat
  2. .bat chiama un vbs
  3. vbs apre il database e chiama una macro
  4. La macro chiamate una funzione (Livello VBA)
  5. la funzione richiama la subroutine aggiornamento

Ritengo che ci siano troppi passaggi e il fatto che siano necessari 2 file esterni (.Bat e .vbs) relativi al database e archiviati nel sistema aumentano il rischio che la procedura si interrompa.

Apparentemente (ma per favore dimmi che ho torto e come posso cambiarlo). Vbs non può chiamare una subroutine ma solo una macro. Identicamente, una macro di accesso non può chiamare una subroutine ma solo una funzione se l'utente si aspetta di entrare nell'ambiente VB del database. Questo è il motivo per cui ho chiamato una funzione (livello VBA) che chiama la subroutine.

Speranza alcuni di voi sanno come accorciare i passi e, infine, ottenere giro del bat e vbs

+2

** (1) ** Il tuo script '.bat' o' .vbs' è qualcosa di più di una singola riga di codice? In caso contrario, probabilmente si potrebbe semplicemente aggiornare l'attività pianificata per eseguire 'MSACCESS.EXE' con i parametri richiesti. ** (2) ** Sì, una Macro in Access può solo richiamare una Funzione, ma probabilmente potresti convertire il Sub in una Funzione che non restituisce nulla (o restituisce un valore arbitrario come 'True'). –

+0

Ho provato a chiamare MSACCESS.EXE dall'Utilità di pianificazione, ma non ho avuto esito positivo e questo è il motivo per cui ho usato il metodo .bat .vbs. Ci riproverò. Suppongo che sia necessario avere un timer in Access che attivi l'aggiornamento ... – ProtoVB

+1

No, si richiama MSACCESS.EXE con l'opzione della riga di comando '-x' e il nome della macro che si desidera eseguire. Dettagli [qui] (http://support.microsoft.com/kb/209207). –

risposta

18

Per quanto a mia conoscenza, il percorso più breve per un'attività pianificata di Windows a "fare qualcosa di utile in Access VBA "è:

Creare una funzione pubblica (non secondaria) nel database. Per esempio:

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 

creare una macro nel database per richiamare la funzione:

Macro.png

Crea attività pianificata di Windows per richiamare MSACCESS.EXE con i parametri appropriati

SchedTask.png

Nella finestra di dialogo sopra i valori sono:

Programma/script:

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

Aggiungi argomenti (opzionale) :

C:\Users\Public\schedTest.accdb /x DoSomething 
+2

Per gli argomenti, ha bisogno di virgolette sul percorso del file. ** "C: \ Users \ Public \ schedTest.accdb"/x DoSomething "** –

4

C'è poco conosciuto trucchetto che risale ai primi anni di accesso per consentire l'esecuzione come un processo che funziona ancora. L'accesso sarà sempre all'avvio cercando una macro chiamata "Autoexec". Se lo trova inizierà immediatamente l'esecuzione di questa macro. Trovo che questo sia estremamente utile se ho bisogno di inizializzare il programma prima di aprire i moduli o, come nel caso del questionario originale, eseguire l'accesso come un processo pianificato senza I/O utente.

3

Uno script VBS può chiamare qualsiasi SUBROUTINE VBA di serie con il seguente:

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

accessApp.Run "TimeUpDate" 

accessApp.Quit 
set accessApp = nothing 

Si noti che il sub TimeUpDate è una subroutine standard VBA. Questo significa niente autoexec marocrs e niente macros - solo le sub calls VBA pure + questo script vbs.

2

Dopo aver battuto la testa contro il muro per circa quattro ore, finalmente ho questo lavoro:

1) Creare un file batch DOS con una linea esso. La riga è composta da tre parti a) il percorso completo di Microsoft Access (msaccess.exe), b) il percorso completo del database di Microsoft Access con il codice in esso e c) l'argomento della riga di comando di Access "/ x MacroName" . I primi due elementi dovrebbero essere circondati da virgolette. Il mio è il seguente:

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

2) Creare una macro all'interno di Access con il nome utilizzato nel file batch. Ha un comando, RunCode, con un argomento del nome di una funzione VBA che si desidera chiamare. Questo dovrebbe essere seguito da parentesi aperta/chiusa "()". Non ho provato a passare alcun parametro alla funzione; Penso che questo sarebbe problematico.

4) Assicurarsi che la funzione VBA che si chiama abbia un comando Docmd.Quit alla fine o che questa sia aggiunta come seconda linea alla macro. Questi faranno in modo che Access non rimanga aperto dopo l'esecuzione del processo.

5) Nell'Utilità di pianificazione di Windows, selezionare "crea un'attività di base" (che richiama una procedura guidata). Imposta il nome del programma sul nome del tuo file batch DOS. C'è una utile casella di controllo con l'etichetta "Apri la finestra delle proprietà quando ho finito." Controlla che tu vada alla finestra delle proprietà.

6) Impostare l'attività da eseguire indipendentemente dal fatto che l'utente sia connesso o meno. Controlla anche la casella "Esegui con i privilegi più alti", suggerita da un amico qui sopra.

È ora possibile testare tutto facendo clic con il pulsante destro del mouse sull'attività pianificata e selezionando il comando Esegui.

Mi è piaciuta la sceneggiatura di Albert Kallal e l'ho provata. Tutto ha funzionato alla grande fino a quando ho provato a programmarlo. Quindi, per qualche misterioso motivo, lo schedulatore non l'avrebbe fatto.

Problemi correlati