[VBA] Probleme de requete

Probleme de requete [VBA] - VB/VBA/VBS - Programmation

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  :pt1cable:  
voila mon probleme :
 
j'ai ecrit dans un module une fonction
 

Citation :

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!  
 
 
 

Reply

Marsh Posté le 18-07-2007 à 08:31:38   

Reply

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.

Reply

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.

Reply

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 ??

Reply

Marsh Posté le 18-07-2007 à 10:14:33    

je suis sous acces

Reply

Marsh Posté le 18-07-2007 à 10:16:11    

bon ben tu fais un  
 
docmd.runquery reqsql

Reply

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!

Reply

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 ?

Reply

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?

Reply

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 ?

Reply

Marsh Posté le 18-07-2007 à 11:13:04   

Reply

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

Reply

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...

Reply

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!

Reply

Marsh Posté le 18-07-2007 à 11:53:43    

Reply

Marsh Posté le 18-07-2007 à 13:04:17    

ok merci, je jetterai un coup d'oeil dessus apres avoir digeré ;)

Reply

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
Traitement de l'entete et remplissage du tableau xl
Appel a des fonction de mise en forme  
Options et fermeture


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!  

Reply

Marsh Posté le 19-07-2007 à 11:08:29    

l'import de données externes passe par la fonction docmd.trasfertsheet normalement

Reply

Marsh Posté le 19-07-2007 à 11:15:34    

je suis sous access et je souhaite exporter sous excel ;)

Reply

Marsh Posté le 19-07-2007 à 11:57:04    

Code :
  1. ' export
  2.     DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, TableExport, fichier, True


 
tableexport est la table qui a récupéré le résultat de ta requete,
fichier est le fichier d'export :)

Reply

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

Reply

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 :)

Reply

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 ?

Reply

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
Dim rst2 As New ADODB.Recordset      
Dim xlApp As Excel.Application
Dim wbk As Excel.Workbook
Dim sht As Excel.Worksheet
 
Set cnn = CurrentProject.Connection
rst2.Open "Tab1", cnn, adOpenKeyset, adLockOptimistic, adCmdTableDirect
 
Set xlApp = CreateObject("Excel.Application" )
xlApp.Application.DisplayAlerts = False
 
With xlApp
    .Visible = True
    .SheetsInNewWorkbook = 1
        Set wbk = .Workbooks.Add
            Set sht = .Worksheets.Add
               With sht
                  *** Code ***
               End With
        wbk.Close
   .Quit
End With
 
Set sht = Nothing
Set wbk = Nothing
Set xlApp = Nothing
Set fso = Nothing
rst2.Close
cnn.Close


 
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!  :pt1cable:


Message édité par Akash31 le 20-07-2007 à 09:21:12
Reply

Marsh Posté le 20-07-2007 à 09:51:32    

ton problème de range tu peux nous montrer la ligne incriminée stp ?

Reply

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

 


Message édité par tegu le 20-07-2007 à 10:33:56
Reply

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]


Message édité par Akash31 le 20-07-2007 à 10:54:36
Reply

Marsh Posté le 20-07-2007 à 10:57:22    

tu as mis activeworkbook avant tes range ?

Reply

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?

Reply

Marsh Posté le 20-07-2007 à 11:37:59    

ce code la marche nickel chez moi...
avec Path en string  
 

Code :
  1. Workbooks.Open FileName:=Path
  2.     For i = 1 To 1000
  3.         If ActiveWorkbook.Range("c" & i).Value = "Contrepartie eligible" Then
  4.             ActiveWorkbook.Range("d" & i).Value = 1
  5.         ElseIf ActiveWorkbook.Range("c" & i).Value = "Professionnel" Then
  6.             ActiveWorkbook.Range("d" & i).Value = 2
  7.           ElseIf ActiveWorkbook.Range("c" & i).Value = "Client Retail" Then
  8.             ActiveWorkbook.Range("d" & i).Value = 4
  9.         End If
  10.     Next i
  11.     ActiveWorkbook.SaveAs FileName:=Path, FileFormat:=xlExcel9795, Password:="", WriteResPassword:="", _
  12.     ReadOnlyRecommended:=False, CreateBackup:=False
  13.     ActiveWindow.Close

Reply

Marsh Posté le 20-07-2007 à 11:53:48    

Code :
  1. If (ActiveWorkbook.Range("D8" ).Value <> 0) Then


 Meme erreur de range _global
 

Code :
  1. With ActiveWorkbook
  2.     If (.Range("D8" ).Value <> 0) Then


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

Reply

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 ?

Reply

Marsh Posté le 20-07-2007 à 12:15:54    

eeuuhhh....
euuuuhhh  :whistle:  
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!  :bounce:  
 
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 ^^


Message édité par Akash31 le 20-07-2007 à 12:25:31
Reply

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
 


Message édité par tegu le 20-07-2007 à 13:24:08
Reply

Marsh Posté le 20-07-2007 à 13:48:53    

Dsl je n'avait pas "vu" ces lignes :p
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!


Message édité par Akash31 le 20-07-2007 à 13:51:45
Reply

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! =)


Message édité par Akash31 le 23-07-2007 à 11:09:48
Reply

Marsh Posté le 23-07-2007 à 11:11:10    

on pourra avoir une copie ?  :sol:

Reply

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 :p
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! :D

Reply

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?

Reply

Marsh Posté le 26-07-2007 à 15:37:37    

qu'appelles-tu "reinitialiser" ?  :heink:

Reply

Marsh Posté le 30-07-2007 à 08:53:33    

jpcheck a écrit :

qu'appelles-tu "reinitialiser" ?  :heink:


 
http://img406.imageshack.us/img406/6718/reinitialiserio9.th.jpg

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed