2008-09-16 8 views
2

je le code suivant:erreur intermittente lors d'une tentative de contrôler une autre base de données dans VBA

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 expérimenter est un pop-up qui me dit Access ne peut pas mettre l'accent sur l'autre base de données. Comme vous pouvez le voir dans le code, je veux exécuter un sous-programme dans un autre 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 de le reproduire, et je ne peux pas vous donner le texte et le numéro exact pour le moment. C'est le deuxième mois que cela s'est passé.

Je suppose que cela peut se produire lorsque quelqu'un travaille avec cette base de données ou avec l'autre.

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.

Peut-être, c'est à cause de la première ligne dans le code 'Routines': Si vbNo = MsgBox ("Voulez-vous mettre à jour?", VbYesNo, "Mise à jour") Puis sortie Fonction End If

Je vais faire un autre sous-programme sans MsgBox.

J'ai été capable de reproduire ce comportement. Cela se produit lorsque le focus doit se déplacer vers 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 de le reproduire, et je ne peux pas vous donner le texte et le numéro exact pour le moment. C'est le deuxième mois que cela s'est passé.

Je suppose que cela peut se produire lorsque quelqu'un travaille avec cette base de données ou avec l'autre.

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.

Peut-être, c'est à cause de la première ligne dans le code 'Routines': Si vbNo = MsgBox ("Voulez-vous mettre à jour?", VbYesNo, "Mise à jour") Puis sortie Fonction End If

Je vais faire un autre sous-programme sans MsgBox. J'ai essayé cela dans notre base de données de développement et cela fonctionne. Je l'ai essayé dans notre base de données de développement. Cela ne veut rien dire car l'autre code fonctionne aussi bien dans le développement.

+0

Je n'ai jamais vu Access donner ce message d'erreur particulier. J'ai vu "vous n'avez pas la permission d'ouvrir la base de données" et "Access ne peut pas mettre l'accent sur" un objet, mais pas le message d'erreur que vous dites. Pourriez-vous s'il vous plaît poster le numéro d'erreur et le message d'erreur exact? Je soupçonne, comme le fait Remi, que l'erreur est dans le code de votre routine dans l'autre DB, donc vous aurez probablement besoin de poster cela aussi. –

Répondre

1

J'ai été capable de reproduire l'erreur dans 'développement'.

« Cette action ne peut pas être terminée, car l'autre application est occupée. Choisissez « Switch To » pour activer .... »

Je ne vois vraiment pas le reste du message, comme il clignote très vite. Je suppose que cette erreur est due à la «commutation» entre les deux bases de données. J'espère qu'en éduquant l'utilisateur, cela s'arrêtera. Philippe, votre réponse est, bien sûr, correcte. J'aurais choisi ce chemin si je n'avais pas développé la 'routine' auparavant.

"J'ai été capable de reproduire ce comportement lorsque le focus doit se déplacer vers 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. solution "était d'éduquer l'utilisateur." Comme il est impossible d'empêcher l'utilisateur de changer d'application sous Windows, j'aimerais fermer le sujet.

1

Je suppose que ce message d'erreur est lié à l'état de l'une de vos bases de données. Vous utilisez ici des connexions Jet et des objets Access, et vous pourriez ne pas pouvoir, pour plusieurs raisons (environnement multi-utilisateur, impossibilité de supprimer le fichier LDB Lock, etc.), fermer correctement votre base de données active et en ouvrir une autre. Donc, selon moi, la solution est d'oublier le moteur Jet et d'utiliser une autre connexion pour mettre à jour les données dans la base de données "other".Quand vous dites "Le flux de données consiste à mettre à jour tous les 'projets' une fois par mois dans une base de données et à rendre cette information disponible dans l'autre base de données", je suppose que votre "Routine" , soit via des instructions SQL ou des mises à jour de jeu d'enregistrements équivalentes. Pourquoi ne pas essayer d'effectuer les mises à jour correspondantes en ouvrant une connexion à votre autre base de données et (1) envoyer les instructions SQL correspondantes ou (2) ouvrir le jeu d'enregistrements et effectuer 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 aussi se faire via une connexion ODBC (et DAO.recordsets), de sorte que vous pouvez choisir vos objets préférés.

1

Si vous souhaitez un autre moyen de fonctionnement de la fonction, effectuez les opérations suivantes:

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

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

MaMacro 'a une action de « ExécuterCode » avec le nom de la fonction que vous préférez exécuter dans Working.mdb

Questions connexes