web-dev-qa-db-fra.com

Exécution de Microsoft Access en tant que tâche planifiée

Je cherche des commentaires sur la façon de planifier les mises à jour automatiques d'une base de données (.accdb) car je ne suis pas très à l'aise avec le processus que j'ai mis en place.

Actuellement, cela fonctionne comme suit:

  1. Le Planificateur de tâches appelle un .bat
  2. .bat appelle un .vbs
  3. .vbs ouvre la base de données et appelle une macro
  4. La macro appelle une fonction (niveau VBA)
  5. La fonction appelle la sous-routine de mise à jour

Je considère qu'il y a trop d'étapes et le fait qu'il nécessite 2 fichiers externes (.Bat et .vbs) liés à la base de données et stockés sur le système augmentent le risque de rupture de la procédure.

Apparemment (mais dites-moi que je me trompe et comment je peux le changer) .vbs ne peut pas appeler un sous-programme mais seulement une macro. Identiquement, une macro d'accès ne peut pas appeler un sous-programme mais uniquement une fonction si l'utilisateur s'attend à entrer dans l'environnement VB de la base de données. C'est la raison pour laquelle j'ai appelé une fonction (niveau VBA) qui appelle ensuite le sous-programme.

J'espère que certains d'entre vous savent comment raccourcir les marches et éventuellement se débarrasser des .bat et .vbs

16
ProtoVB

À ma connaissance, le chemin le plus court pour une tâche planifiée Windows pour "faire quelque chose d'utile dans Access VBA" est:

Créez une fonction publique (pas Sub) dans la base de données. Par exemple:

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

Créez une macro dans la base de données pour appeler la fonction:

Macro.png

Créez une tâche planifiée Windows pour appeler MSACCESS.EXE avec les paramètres appropriés

SchedTask.png

Dans la boîte de dialogue ci-dessus, les valeurs sont les suivantes:

Programme/script:

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

Ajouter des arguments (optionnel):

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

Un script vbs peut appeler n'importe quelle sous-routine vba standard avec les éléments suivants:

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

accessApp.Run "TimeUpDate"

accessApp.Quit
set accessApp = nothing

Notez que le sous TimeUpDate est un sous-programme VBA standard. Cela signifie pas de marocrs autoexec, et pas de macros du tout - seulement des sous-appels VBA purs + ce script vbs.

7
Albert D. Kallal

Il existe une astuce peu connue qui remonte aux premières années d'accès pour lui permettre de fonctionner comme un processus qui fonctionne toujours. Au démarrage, Access recherchera toujours une macro appelée "Autoexec". S'il le trouve, il commencera immédiatement à exécuter cette macro. Je trouve cela extrêmement utile si j'ai besoin d'initialiser le programme avant d'ouvrir des formulaires ou, comme dans le cas du questionneur d'origine, d'exécuter l'accès en tant que processus planifié sans E/S utilisateur.

6
Andrew Thackray

Après avoir frappé ma tête contre le mur pendant environ quatre heures, j'ai finalement réussi à faire fonctionner ceci:

1) Créez un fichier batch DOS avec une seule ligne. La ligne est composée de trois parties a) le chemin d'accès complet à Microsoft Access (msaccess.exe), b) le chemin d'accès complet de la base de données Microsoft Access avec le code qu'il contient, et c) l'argument de ligne de commande Access "/ x MacroName" . Les deux premiers éléments doivent être entourés de guillemets. Le mien ressemble à ceci:

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

2) Créez une macro dans Access avec le nom que vous avez utilisé dans votre fichier de commandes. Il a une commande, RunCode, avec un argument du nom d'une fonction VBA que vous souhaitez appeler. Cela devrait être suivi par une parenthèse d'ouverture/fermeture "()". Je n'ai pas essayé de passer de paramètres à la fonction; Je pense que ce serait problématique.

4) Assurez-vous que la fonction VBA que vous appelez a un Docmd.Quit à la fin, ou que vous l'ajoutiez comme deuxième ligne à votre macro. Cela garantira qu'Access ne restera pas ouvert après l'exécution de votre processus.

5) Dans le Planificateur de tâches Windows, sélectionnez "créer une tâche de base" (qui appelle un assistant). Définissez le nom du programme sur le nom de votre fichier de commandes DOS. Il y a une case à cocher utile intitulée quelque chose comme "Ouvrez la fenêtre des propriétés lorsque j'ai terminé." Cochez cela pour que vous accédiez à la fenêtre des propriétés.

6) Définissez la tâche à exécuter, que l'utilisateur soit connecté ou non. Cochez également la case "Exécuter avec les privilèges les plus élevés", suggérée par un ami ici.

Vous pouvez maintenant tout tester en cliquant avec le bouton droit sur la tâche planifiée et en sélectionnant la commande Exécuter.

J'ai aimé le scénario d'Albert Kallal et je l'ai essayé. Tout fonctionnait très bien jusqu'à ce que j'essaie de le planifier. Ensuite, pour une raison mystérieuse, le programmateur ne voulait pas le lancer.

3
Karl Hoaglund