Erreur intermittente lors de la tentative de contrôle d'une autre base de données dans VBA

StackOverflow https://stackoverflow.com/questions/70417

  •  09-06-2019
  •  | 
  •  

Question

J'ai le code suivant:

Dim obj As New Access.Application
obj.OpenCurrentDatabase (CurrentProject.Path & "\Working.mdb")
obj.Run "Routine"
obj.CloseCurrentDatabase
Set obj = Nothing

Le problème que je teste est une fenêtre contextuelle qui me dit que Access ne peut pas définir le focus sur l'autre base de données. Comme vous pouvez le constater d'après le code, je souhaite exécuter un sous-programme dans un autre fichier mdb. Tout autre moyen d'y parvenir sera apprécié.

Je travaille avec MS Access 2003.

Ceci est une erreur intermittente. Comme il s'agit d'un code de production qui ne sera exécuté qu'une fois par mois, il est extrêmement difficile à reproduire et je ne peux pas vous donner le texte ni le numéro exact pour le moment. C’est le deuxième mois que cela se produit.

Je pense que cela peut se produire lorsqu'une personne travaille avec cette base de données ou une autre.

Le flux de données consiste à mettre à jour tous les "projets" une fois par mois dans une base de données, puis à rendre cette information disponible dans l'autre base de données.

Peut-être est-ce dû à la première ligne du code "Routines":    Si vbNo = MsgBox ("Voulez-vous mettre à jour?", VbYesNo, "Mettre à jour"), puis        Fonction de sortie    Fin si

Je vais créer un autre sous-programme sans la MsgBox.

J'ai été capable de reproduire ce problème. Cela se produit lorsque le focus doit être placé sur la base de données appelée, mais que l'utilisateur définit le focus ([ALT] + [TAB]) sur la première base de données. La "solution" était d'éduquer l'utilisateur.

Ceci est une erreur intermittente. Comme il s'agit d'un code de production qui ne sera exécuté qu'une fois par mois, il est extrêmement difficile à reproduire et je ne peux pas vous donner le texte ni le numéro exact pour le moment. C’est le deuxième mois que cela se produit.

Je pense que cela peut se produire lorsqu'une personne travaille avec cette base de données ou une autre.

Le flux de données consiste à mettre à jour tous les "projets" une fois par mois dans une base de données, puis à rendre cette information disponible dans l'autre base de données.

Peut-être est-ce dû à la première ligne du code "Routines":     Si vbNo = MsgBox ("Voulez-vous mettre à jour?", VbYesNo, "Mettre à jour"), puis         Fonction de sortie     Fin si

Je vais créer un autre sous-programme sans la MsgBox.

Je l'ai essayé dans notre base de données de développement et cela fonctionne. Cela ne veut rien dire, l’autre code fonctionne également très bien en développement.

Était-ce utile?

La solution 3

J'ai été en mesure de reproduire l'erreur dans le "développement".

" Cette action ne peut pas être terminée car l'autre application est occupée. Choisissez "Basculer vers" pour activer .... "

Je ne vois vraiment pas le reste du message car il clignote très vite. Je suppose que cette erreur est due au "basculement" entre les deux bases de données. J'espère qu'en informant l'utilisateur, cela cessera.

Philippe, votre réponse est bien sûr correcte. J'aurais choisi cette voie si je n'avais pas développé la "routine" auparavant.

"J'ai pu reproduire ce problème. Cela se produit lorsque le focus doit être placé sur la base de données appelée, mais que l'utilisateur définit le focus ([ALT] + [TAB]) sur la première base de données. La "solution" consistait à éduquer l'utilisateur. " Comme il est impossible d'empêcher l'utilisateur de changer d'application dans Windows, j'aimerais fermer le sujet.

Autres conseils

Je suppose que ce message d'erreur est lié à l'état de l'une de vos bases de données. Vous utilisez ici les connexions Jet et les objets Access, et vous pourriez ne pas être en mesure, pour plusieurs raisons (environnement multi-utilisateur, impossibilité de supprimer le fichier LDB Lock, etc.) de fermer correctement votre base de données active et d’en ouvrir une autre. Donc, selon moi, la solution consiste à oublier le moteur Jet et à utiliser une autre connexion pour mettre à jour les données dans "autre". base de données.

Lorsque vous dites "Le flux de données consiste à mettre à jour tous les" projets "une fois par mois dans une base de données, puis à rendre ces informations disponibles dans l'autre base de données", je suppose que le rôle de votre "Routine". consiste à mettre à jour des données, via des instructions SQL ou des mises à jour équivalentes de jeux d’enregistrements

Pourquoi n'essayez-vous pas d'effectuer les mises à jour correspondantes en ouvrant une connexion avec votre autre base de données et (1) en envoyant les instructions SQL correspondantes ou (2) en ouvrant un jeu d'enregistrements et en effectuant les mises à jour demandées?

Une idée serait par exemple:

Dim cn as ADODB.connexion, 
    qr as string, 
    rs as ADODB.recordset

'qr can be "Update Table_Blablabla Set ... Where ...
'rs can be "SELECT * From Table_Blablabla INNER JOIN Table_Blobloblo  

set cn = New ADODB.connexion
cn.open

You can here send any SQL instruction (with command object and execute method) 
or open and update any recordset linked to your other database, then

cn.close

Cela peut également être effectué via une connexion ODBC (et DAO.recordsets), afin que vous puissiez choisir vos objets préférés.

Si vous souhaitez utiliser un autre moyen d’exécuter la fonction, essayez ce qui suit:

Dim obj As New Access.Application
obj.OpenCurrentDatabase (CurrentProject.Path & "\Working.mdb")

obj.DoCmd.RunMacro "MyMacro"
obj.CloseCurrentDatabase
Set obj = Nothing

Où " MyMacro " a pour action " Code d'exécution " avec le nom de fonction que vous préférez exécuter dans Working.mdb

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top