Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/09/2011, 09h17   #1
Invité de passage
 
Inscription : septembre 2011
Messages : 9
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 9
Points : 1
Points : 1
Par défaut VBA Excel/Access: lecture seule après macro

Bonjour, voila je suis debutante en VBA, j'ai trouvé un code sur internet qui permet de lancer une macro access depuis un fichier excel. Tout fonctionne la premiere fois, c'est genial. Mais en relançant une fois la macro, il y a un hic... ça ne marche plus:

Citation:
Message Erreur d'execution '3027'
mise à jour impossible. La base de données ou l'objet est en lecture seule.
Donc j'ai été voir la base access en question, et tant que je ne ferme pas mon fichier excel, il reste en lecture seule. Il faudrait qu'après la macro, le fichier access se ferme completement, pour que je puisse relancer d'autres macro dans cette base.

Code :
1
2
3
4
5
6
7
Sub ExécuterMacroAccess()
 Dim MonAccess As New Access.Application
 MonAccess.OpenCurrentDatabase "Q:\Documents\lahila\base de donnees.mdb" 
MonAccess.DoCmd.RunMacro "Executer les macros"
 MonAccess.Quit acQuitSaveNone
 Set MonAccess = Nothing
End Sub
Si vous avez la solution je prends . Merci d'avance
lahila est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 10h13   #2
Membre éclairé
 
Avatar de tototiti2008
 
Inscription : octobre 2008
Messages : 327
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 327
Points : 320
Points : 320
Bonjour lahila,

Ton code fonctionne chez moi, à plusieurs reprises aussi...

ajoute peut-être un
Code :
MonAccess.Visible = True
au début du code, Access devrait apparaître et ça te permettra peut-être de vérifier si ta macro s'est exécutée correctement et s'il ferme bien la base et Access à la fin

Au pire, peut-être essayer d'ajouter la ligne

Code :
MonAccess.CurrentDb.Close
Avant de quitter Access
__________________
tototiti2008 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 10h44   #3
Invité de passage
 
Inscription : septembre 2011
Messages : 9
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 9
Points : 1
Points : 1
Merci pour votre reponse. C'est bizarre que ca bloque chez moi alors, au niveau d'executer la macro
Code :
MonAccess.DoCmd.RunMacro "Executer les macros"
. J'ai mis le visible = true, la fenetre access n'apparait qu'une seconde et se referme immediatement. Maintenant le deuxieme code, je dois le mettre ou exactement? si je le mets à la fin, il me met un message d'erreur bloc with ou objet, et si je le mets en avant dernier, j'ai une erreur serveur client. Que dois je faire?
lahila est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 10h50   #4
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
Le problème d'Access c'est que ça n'a pas vocation à être multi-utilisateur. Du coup lorsque tu travailles sur une bdd elle est verrouillée par Access pour empêcher que quelqu'un d'autre puisse la modifier en même temps.

Je plussoie donc la solution proposée par tototiti2008, à savoir fermer la bdd courante. Par contre je le ferai plutôt comme cela:

Code :
Application.CloseCurrentDatabase
Car la méthode:

s'applique à un objet DAO qui n'a pas été explicitement instancié dans notre cas (et qui n'existe donc pas forcément). D'ailleurs à ce sujet voici ce que dit l'aide VBA:

Citation:
Ne confondez pas la méthode OpenCurrentDatabase avec la méthode Open des objets ADO (Objets de données ActiveX) ou la méthode OpenDatabase des objets DAO (Objets d'accès aux données). La méthode OpenCurrentDatabase ouvre une base de données dans la fenêtre Microsoft Access. La méthode Open des objets ADO renvoie une variable objet Connection, et la méthode OpenDatabase des objets DAO renvoie une variable objet Database ; elles représentent toutes les deux une base de données particulière, mais n'ouvrent pas en fait la base de données dans la fenêtre Microsoft Access.
Le mieux est encore d'essayer les deux pour voir lequel(s) fonctionne(nt) correctement.
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/09/2011, 11h00   #5
Membre éclairé
 
Avatar de tototiti2008
 
Inscription : octobre 2008
Messages : 327
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 327
Points : 320
Points : 320
Bonjour Sclarckone,
Re,

Merci de ta précision, ça clarifie pourquoi la base ne se fermait pas dans ma fenêtre...
__________________
tototiti2008 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 11h33   #6
Invité de passage
 
Inscription : septembre 2011
Messages : 9
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 9
Points : 1
Points : 1
Je ne connais que très peu le vba, j'ai essayé vos deux codes, juste avant end sub
Pour le
Code :
Application.CloseCurrentDatabase
, en regardant les lignes du code une par une, il ya une erreur 438 proprieté non gérée par l'objet. La macro d'access s'execute à chaque fois et application.close.. fonctionne mais juste apres il ya le message d'erreur.

Pour
Code :
MonAccess.CurrentDb.Close
, la c'est la meme chose sauf qu'il ya un code d'erreur 91 variable objet ou variable de bloc with non définie.

Je ne sais pas trop quoi faire.
lahila est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 11h37   #7
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
Par rapport au code que tu as proposé au début remplace:

Code :
1
2
 MonAccess.Quit acQuitSaveNone
 Set MonAccess = Nothing
par:

Code :
1
2
MonAccess.CloseCurrentDatabase
MonAccess.Quit acQuitSaveNone
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 11h55   #8
Invité de passage
 
Inscription : septembre 2011
Messages : 9
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 9
Points : 1
Points : 1
merci de ton aide, j'ai fait comme tu m'as dit, helas, la deuxieme fois, ça fonctionne toujours pas, toujours cette erreur 3027;

Tant que je referme pas le fichier excel, le fichier access reste en lecture seule. Et pourtant en ouvrant le gestionnaire des taches, il n'ya pas d'application access ouverte.
lahila est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 12h43   #9
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
C'est bien de préciser quelle erreur se produit mais ça serait encore mieux si tu peux nous donner la ligne où elle se produit.

Peux-tu également nous reposter le code tel qu'il est actuellement après les modifications que tu lui a apportées?
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 14h25   #10
Invité de passage
 
Inscription : septembre 2011
Messages : 9
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 9
Points : 1
Points : 1
L'erreur 91 et 438 c'etait juste après
Code :
MonAccess.CurrentDb.Close
et
Code :
Application.CloseCurrentDatabase
. Après j'ai remplacé comme tu m'as dis les deux derniere lignes, ca marche une fois, et quand je recommence la macro s'arrete ici:
Code :
MonAccess.DoCmd.RunMacro "Executer les macros"
Si j'arrivais a fermer cette lecture seule...
lahila est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 14h30   #11
Membre éclairé
 
Avatar de tototiti2008
 
Inscription : octobre 2008
Messages : 327
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 327
Points : 320
Points : 320
Re,

Comme je n'arrive pas à reproduire ton soucis, peux-tu nous expliquer les traitements lancés par ta macro "Exécuter les macros" ?

Citation:
J'ai mis le visible = true, la fenetre access n'apparait qu'une seconde et se referme immediatement.
Est-ce normal, en prenant en compte le temps d'exécution de ta macro ?
Si tu la lances à la main, ça prend combien de temps ?
__________________
tototiti2008 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 15h26   #12
Invité de passage
 
Inscription : septembre 2011
Messages : 9
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 9
Points : 1
Points : 1
Je crois avoir trouvé le problème. En fait je vais t'expliquer ce que je fais reellement. Donc sur ma page excel, j'ai fait Données => données externes=> importer. Donc j'ai maintenant une plage de donnée en A3 qu'actualise en cliquant droit . Mon code entier est le suivant:

Code :
1
2
3
4
5
6
7
8
9
10
Sub ExécuterMacroAccess()
 Dim MonAccess As New Access.Application
 MonAccess.OpenCurrentDatabase "Q:\Documents\lahila\base de donnees.mdb" 
MonAccess.DoCmd.RunMacro "Executer les macros"
 MonAccess.Quit acQuitSaveNone
 Set MonAccess = Nothing
 
Range("A3").Select
  Selection.QueryTable.Refresh BackgroundQuery:=False
 End Sub
J'aurai du vous le dire avant pour les deux dernieres lignes (actualisation), j'en suis desolée, mais j'etais certaine que ca venait pas de cela, puisque sans c'est deux dernieres lignes, j'avais executer le code plusieurs fois et l'erreur 3047 apparaissait toujours. Hors j'ai reouvert le fichier sans actualiser dutout, meme manuellement, et le debut fonctionne à volonté, et des que j'actualise, ca fonctionne plus. Donc c'est les deux codes ensemble qui posent problemes... mais quel probleme? Pourquoi il est en lecture seule le fichier access jusqu'a la fermeture?

Encore desolé, j'espere que ca va plus vous eclairer
lahila est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 16h16   #13
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
Normalement tu devrais plutôt avoir ça:

Code :
1
2
3
4
5
6
7
8
Sub ExécuterMacroAccess()
Dim MonAccess As New Access.Application
MonAccess.OpenCurrentDatabase "Q:\Documents\lahila\base de donnees.mdb" 
MonAccess.DoCmd.RunMacro "Executer les macros"
MonAccess.CloseCurrentDatabase
MonAccess.Quit acQuitSaveNone
Set MonAccess = Nothing
End Sub
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 16h40   #14
Membre éclairé
 
Avatar de tototiti2008
 
Inscription : octobre 2008
Messages : 327
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 327
Points : 320
Points : 320
Re,


essaye peut-être comme ça

Code :
1
2
3
4
5
6
7
8
9
10
11
Sub ExécuterMacroAccess()
 Dim MonAccess As New Access.Application
 MonAccess.OpenCurrentDatabase "Q:\Documents\lahila\base de donnees.mdb" 
MonAccess.DoCmd.RunMacro "Executer les macros"
MonAccess.CloseCurrentDatabase
MonAccess.Quit acQuitSaveNone
 Set MonAccess = Nothing
 
Range("A3").Select
  Selection.QueryTable.Refresh BackgroundQuery:=True
 End Sub
__________________
tototiti2008 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 17h08   #15
Invité de passage
 
Inscription : septembre 2011
Messages : 9
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 9
Points : 1
Points : 1
Si je fais ton code sclarkone, ca fonctionne tant que je ne fais pas de mise a jour. Si je rajoute le code, ca marche plus apres. Donc ton code tototiti ca marche une fois, tant qu'il a pas passé la mise à jour, puis apres, erreur 3027 et tant que je n'ai plus fermé le fichier excel.

Je comprends pas ce qui ne va pas avec la Mise a jour, cette lecture seule sur le fichier access.
lahila est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 17h38   #16
Membre éclairé
 
Avatar de tototiti2008
 
Inscription : octobre 2008
Messages : 327
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 327
Points : 320
Points : 320
Re,

Edit : Oups, Erreur de saisie, désolé

Bon, j'ai essayé de faire des données externes sur la même base (à la main, les données externes) et je n'ai toujours pas de soucis
La macro appelée dans la base ajoute un enregistrement à la table liée par les données externes et pourtant ça fonctionne chez moi, même à plusieurs reprises....
Plus vraiment d'idée en stock, sauf peut-être à répondre à la question

Citation:
peux-tu nous expliquer les traitements lancés par ta macro "Exécuter les macros" ?
__________________
tototiti2008 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 17h42   #17
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
A tous les coups, c'est parce que ta QueryTable effectue une requête sur la même bdd (et l'a donc verrouillée).

Comment est effectuée l'import des données externes, à la main ou via du code VBA?
Il faut faire en sorte que l'ouverture de la bdd par la QueryTable se fasse en mode non exclusif.
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 12h08   #18
Invité de passage
 
Inscription : septembre 2011
Messages : 9
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 9
Points : 1
Points : 1
je vais regarder avec un ami, et je vous redis. Compliquée cette histoire

Probleme resolu, dans la requete excel, j'ai remplacé Mode=Share Deny Write par Mode=Share Deny None. Et ca fonctionne. merci vous deux.
lahila est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 12h15   #19
Membre éclairé
 
Avatar de tototiti2008
 
Inscription : octobre 2008
Messages : 327
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 327
Points : 320
Points : 320
Bonjour lahila,

Pour que je meure moins bête, peux-tu préciser à quel endroit tu changes ce mode de connexion ?

Merci
__________________
tototiti2008 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 15h39   #20
Invité de passage
 
Inscription : septembre 2011
Messages : 9
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 9
Points : 1
Points : 1
Salut, quand t'as importé tes données externes tu cliques droit sur une case de cette base de données, tu cliques sur requête, et il ya du code, et c'est ici que j'ai remplacé. Voila. Merci encore pr ton aide !
lahila est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h55.


 
 
 
 
Partenaires

Hébergement Web