Probleme de requete [VBA] - VB/VBA/VBS - Programmation
Marsh Posté le 18-07-2007 à 09:47:27
Est-ce que ta requete d'insertion fonctionne via l'interface Access, avec cette même syntaxe ?
Plutôt que d'utiliser ADODB essaie d'utiliser « DoCmd.RunSQL reqSQL » pour voir.
Marsh Posté le 18-07-2007 à 09:50:58
En fait je modifie une macro deja ecrite, et seul ADODB avait été utilisé.
Je ne connais pas ta syntaxe DoCmd... :s
Pour te répondre, oui si j'explicite clairement la requete dans la macro (ouvrir requete, executerSql, fermer) avec ma requete, celle ci marche!
c'est pour ca que j'ai des doutes concernant le FOM Tab2 avec Tab2 resultat d'une requete selection.
Marsh Posté le 18-07-2007 à 10:08:33
atta, deja tu nous dit que tu fais tes requetes, mais t'es dans excel ou dans access la ??
Marsh Posté le 18-07-2007 à 10:36:25
Comme je l'ai dit en haut, je ne connais pas cette syntaxe
j'ai jeté un coup d'oeil sur le net
et visiblement il faut d'autres ligne de code pour se connecter, et ouvrir la base...
exemple : Dim qdf As DAO.Querydef
les modules on jusqu'a present été ecrite avec des ADO
y a t-il un risque de conflit ou autre (je suis vraiment debutant...)
si quelqu'un pouvait trouver une idée pour que je garde le ADO, je suis preneur!
En attendant, je vais tester avec votre solution du DoCmd!
Marsh Posté le 18-07-2007 à 10:54:45
ton interface n'est pas liée drectement avec la base dans ton cas, c'est ca ?
Marsh Posté le 18-07-2007 à 11:08:52
eeuuhh j'ais pa compris la question ...
de quelle interface parles tu et de quelle liaison parle tu?
Marsh Posté le 18-07-2007 à 11:13:04
ton code, tu le fais tourner derriere des formulaires non ?
ces formulaires vont-ils taper dans la bdd access ou bien une autre ailleurs ?
Marsh Posté le 18-07-2007 à 11:14:42
non je n'utilise pas de formulaires jpcheck
j'importe des données depuis des tables liées
et en sortie j'effectue une mise en forme de ces données sous excel
Marsh Posté le 18-07-2007 à 11:25:57
ok,
amha :
au lieu de faire de l'ADODB, tu lies les tables dans ton fichier mdb, et tu travailles dessus comme si de rien n'était avec DoCmd et CurrentDb
je pense aussi je la connection dans ton code d'origine est pas top...
Marsh Posté le 18-07-2007 à 11:47:23
hhmm,
bon j'ai comme meme utilisé la connexion ADO, et j'ai juste executé ma requete avec un DoCmd et ... magie ca marche!
vous auriez un bon lien qui explique la "difference" entre ADO, DOA s'il vous plait?
en tout cas merci tegu et jpcheck pour votre solution!
Marsh Posté le 18-07-2007 à 11:53:43
sujet traité en partie ici :
http://www.commentcamarche.net/for [...] sual-basic
Marsh Posté le 18-07-2007 à 13:04:17
ok merci, je jetterai un coup d'oeil dessus apres avoir digeré
Marsh Posté le 19-07-2007 à 11:00:01
ReBonjour,
J'ai une macro sous Access qui me permet de recuperer des donées et de les traiter a ma guise
A la fin de cette macro, je désire exporter les données traitées vers 3 fichiers excel distincts.
Quand j'execute le code d'exportation pour 1 fichier a la fois, l'export se fait sans probleme
Cepedant quand dans ma macro, j'enchaine l'execution des 3 exportations, la premiere s'effectue normalement, et la 2e plante forcement!
Une fonction d'exportation a la structure suivante :
Citation : Declaration et Initialisation générale |
Lors de la 2e exportation, l'erreur se produit a l'appel d'une fonction, plus precisement a la premeire ligne qui est simplement un Range()
Je n'arrive pas a m'expliquer ce phenomene, si vous avez nue idée, n'hesitez pas!
Marsh Posté le 19-07-2007 à 11:08:29
l'import de données externes passe par la fonction docmd.trasfertsheet normalement
Marsh Posté le 19-07-2007 à 11:57:04
Code :
|
tableexport est la table qui a récupéré le résultat de ta requete,
fichier est le fichier d'export
Marsh Posté le 19-07-2007 à 13:22:42
ok merci, seulement moi je veut effectuer une mise en former, donc quand j'exporte, j'ouvre une appli excel, j'ouvr un workbook ... ect
je suis pas sur que ce soit une solution qui est adapté a ce que je dois faire, mais bon je vasi voir et tester ca!
merci
Marsh Posté le 19-07-2007 à 13:28:36
ben tu fais ton export,
puis tu fais ta mise en forme dans le fichier excel en question
Marsh Posté le 19-07-2007 à 13:38:39
Si le problème est lié à l'ouverture et la (non)fermeture de certains objets Excel (voire Excel lui-même), il va falloir nous donner un peu de code pour qu'on mette le doigt dessus.
Est-ce que tu gardes ton objet Excel entre deux exportations ?
Marsh Posté le 20-07-2007 à 09:20:44
Alors effectivement j'avais pensé a ca, aussi je me suis attarder sur toutes les ouverture effetuées et si elle était fermé!
Voila les differentes ouvertures :
Citation : Dim cnn As ADODB.Connection |
Voila donc la structure de mes fonction d'importations
Donc pour te repondre tegu, non je ne garde pas le meme.
Dans le Code je remplit la feuille puis je fais appel a des fonctions de mise en page
Quand je lance ma macro avec l'exction des 3 codes exports a la suite,
le classeur 1 s'ouvre, ouvre une feuille, se remplit, et se ferme
le classeur 2 s'ouvre se remplit, et au moment de l'appel de la 1ere fonction de mise en page, ca bug d'entrée au niveau du Range, 'la metgode Range au niveau _Global a échoué'
Pour info, je fais des tests en attendant vos reponse et donc j'ai crée 2 autres modules avec dedans une seule fonction d'export
macro 1 : init, remplissage et export1
macro 2 : export 2
macro 3 : export 3
j'execute la macro 1 init et export 1 OK
j'execute la macro 2 export 2 bug --> pb de range ...
je met fin au debogeur, arrete la macro et relance la macro 2 --> cette fois c'est OK
j'execute la macro 3 export 3 bug --> pb de range ...
je met fin au debogeur, arrete la macro et relance la macro 3 --> cette fois c'est OK!
Donc voila, je soupconne un probleme de variables ... ou alors un petit bug d'acces ... a vous la parole!
Marsh Posté le 20-07-2007 à 09:51:32
ton problème de range tu peux nous montrer la ligne incriminée stp ?
Marsh Posté le 20-07-2007 à 10:32:20
Bon je vais te dire comment j'aurais déclaré tout ça, sans présumer pour autant que ça résoudra ton problème :
Déclaration en deux temps pour ADODB.Recordset
Dim rst2 As ADODB.Recordset
Set rst2 = New ADODB.Recordset
Remplacer
Set xlApp = CreateObject("Excel.Application" )
par
Set xlApp = New Excel.Application
sauf si, au final, tu voudras être totalement indépendant de la version d'Excel, auquel cas il faut aussi déclarer tous tes objets Excel en « Object ».
Les deux conseils suivants peuvent résoudre ton problème :
Avant de faire
Set wbk = Nothing
tu devrais faire
wbk.Close
Avant de faire
Set xlApp = Nothing
tu devrais faire
xlApp.Quit
Pour compléter, ajoute à la fin
Set rst2 = Nothing
Set cnn = Nothing
Marsh Posté le 20-07-2007 à 10:49:54
j'ai u peu modifié mon code , mais selon l'ordre de mes exportation (l'ordre importe peu, et j'ai effetué toutes les permutations possibles pour determiner si un export en particliuer plantait, mais non)
If (Range("D8:D8" ).Value <> 0) Then
If (Range("D8" ).Value <> 0) Then
If (Range(Cells(8, 4), Cells(8, 4)).Value <> 0) Then
j'ai essayé plusieurs versions sans succes
tegu, les close et le quit sont present dans le code,
tu me propose de faire dans "l'ordre", wbk.close, set nothing, x1App.quit, set nothing, c'est bien ca?
[Edit]
Sans succès pour
wbk.Close
Set wbk = Nothing
x1App.Quit
Set xlApp = Nothing
[\Edit]
Marsh Posté le 20-07-2007 à 11:03:44
nop ...
tu pense que je devrait faire des ActiveWorkBook.Range ?
Range est une methode compatible avec un workbook? ce ne serait pas plutot ActiveSheet?
Marsh Posté le 20-07-2007 à 11:37:59
ce code la marche nickel chez moi...
avec Path en string
Code :
|
Marsh Posté le 20-07-2007 à 11:53:48
Code :
|
Meme erreur de range _global
Code :
|
erruer 91, la methode Range ne semble pas s'appliquer avec un objet worbook dnas un with!
Mais tout de meme lorsque j'ai séparé mes export dans differentes macros, j'avais l'impression qu'il fallait "terminer" la macro vis a vis de l'objet _Global puis lancer l'autre export pour que ca mache ... je sais pas si je m'exprime bien là :s
Marsh Posté le 20-07-2007 à 12:00:08
euh ,détail a la con, tu as bien mis dans les référence la bibli excel ?
Marsh Posté le 20-07-2007 à 12:15:54
eeuuhhh....
euuuuhhh
je viens de chercher ce que c'est sur le net
je n'ai pas de outils/refrence ni sous acces, ni sous excel
( je precise que j'ai la verion 2000 pour ces 2 soft)
mais sinon non je ne pense pas que la personne qui ait ecrite le code initial l'ai faite ...
Autrement, ma premiere idée semble etre la bonne :
TEST1:
j'ouvre le module1 ou est la fonction d'export1
je lance la fonction, l'export 1 se fait sans pb
j'ouvre le module2 ou est la fonction d'export2
je lance la fonction, l'export 2 bug et j'ai le proleme de range du _Global
TEST2:
j'ouvre le module1 ou est la fonction d'export1
je lance la fonction, l'export 1 se fait sans pb
j'ouvre le module2 ou est la fonction d'export2
JE REINITIALISE!
je lance la fonction, l'export 2 marche!
Donc mon idée de variables qui traine et bug semble pas si mauvaise
si quelqu'un sait comment on peut reinitialiser dans ue macro entre 2 execution de code, je veut bien tester!
(j'ai cherché moi meme mais rien ne me tente pour le moment, je regarderais chacune des effet des actions qui sont proposés dans la macro dans l'aprem!)
EDIT : Bon appétit ^^
Marsh Posté le 20-07-2007 à 13:16:46
Quand tu es dans l'interface d'écriture du code VBA (par ALT+F11) tu dois avoir un menu Outils et une option Références, même dans Excel 2000.
Mais si tu n'a pas de référence vers la bibliothèque Excel je ne comprends pas pourquoi les types d'objet Worksheet et Workbook peuvent être déclarés.
As-tu utilisé l'option de compilation dans ce module, au moins une fois (ALT+F11, menu Debogage, option compiler...) ?
edit: tu n'as pas précisé si tu avais testé en ajoutant les deux lignes :
Set rst2 = Nothing
Set cnn = Nothing
Marsh Posté le 20-07-2007 à 13:48:53
Dsl je n'avait pas "vu" ces lignes
mes yeux sont passé dessus en comprenant *.close
Effectivement c'est pas bete, etant donnée que je reutilise ces meme noms dans les autres exports.
Bon, ca ne marche pas mieux, mais je laisse ces lignes ^^
Autrement, j'avais compris les reference dans excel ou access ...
Dans l'editeur vba, j'ai effectivement outils/references des cf cochés!
Marsh Posté le 23-07-2007 à 11:09:22
Bon voila, le dernier probleme concernant l'enchainement des export n'est toujours pas reglé,
j'ai commencé a rédiger mon rapport de stage et vous y figurer tous les deux!
encore merci de m'avoir répondu et aidé, ca fais plaisir de trouver de l'aide! =)
Marsh Posté le 23-07-2007 à 16:16:28
une copie du rapport? lol je vois pas trop ce que tu veut en faire mais bon
sinon il est a peine entamé, docn plus tard! ^^
Si une idée vous passe par la tete concernant un probleme d'ouverture successive de fichier excel pour l'exportation de donnée depuis access, n'hesitez pas!
Marsh Posté le 26-07-2007 à 15:10:49
Bon alors toujours ce probleme d'exportation successive de données depuis access vers excel ...
j'aurais donc une question .....
est ce que, je dis bien est ce que .... il serait possble de générer dans une macro, ou une fonction l'action REinitialiser que l'on peu faire avec la souris sous vba?
Marsh Posté le 18-07-2007 à 08:31:38
Bonjour,
je suis actuellement en stage et je suis amené a ecrire des macros (access, exel)
je n'avais jamais touché a ca avant, donc mechamment debutant
voila mon probleme :
j'ai ecrit dans un module une fonction
Dim CnxBasCrt As ADODB.Connection 'Connection sur la Base Courante
Set CnxBasCrt = CurrentProject.Connection 'Ouverture de la base courante
Dim ReqSQL As String 'Variable qui va nous permettre de découper une requete
ReqSQL = ****
CnxBasCrt.Execute ReqSQL
MsgBox ("cette putain de requete a été executé!" )
CnxBasCrt.Close
Ma requete est du style :
ReqSQL = "INSERT INTO Tab1 SELECT * FROM Tab2;"
Cette requete ne veut pas s'executer, enfin elle s'execute, mais ne produit aucun resultat (la msgbox apparait correctement!)
Enfin ma question, Tab2 étant le resultat d'une requete selection, ma requete est elle possible?
j'ai essayé de remplacé Tab2 par une autre "vrai" table et là ca marche!
Tab2 est correctement remplie.
Voila, si quelqu'un pouvait me renseigner!
Merci d'avance!