Probleme avec Set Recordset = objConn.Execute

gerardcjf Messages postés 47 Date d'inscription mardi 3 juillet 2007 Statut Membre Dernière intervention 26 décembre 2013 - 31 oct. 2009 à 23:01
gerardcjf Messages postés 47 Date d'inscription mardi 3 juillet 2007 Statut Membre Dernière intervention 26 décembre 2013 - 1 nov. 2009 à 08:23
Bonjour,

Voici un code que j'ai adapté d'un autre code qui fonctionne très bien :

Sub Extract_TI()
'déclaration des variables et de leur type
Dim maPersonne, maBase, maFeuille As String
Dim x, lg As Long
'initialisation de certaines variables
maPersonne = Sheets("Paramètres").Range("F1")
maBase = Sheets("Paramètres").Range("C2")
maFeuille = "Donnees_TI"
'*****
lg = 5 'on réserve ici 5 lignes pour les données communes et les titres
'*****
'existence de la base ciblée
Set fs = CreateObject("Scripting.FileSystemObject")
If fs.FileExists(maBase) = False Then
MsgBox "Le fichier " & maBase & " n'a pu être trouvé." & Chr(13) & "Impossible de continuer."
Exit Sub
End If
'connexion à la base de données
Set objConn = CreateObject("ADODB.Connection")
objConn.ConnectionString = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & maBase
objConn.Open
'REM : on pourrait mettre une seule ligne mais pour plus de lisibilité je préfère décomposer
szSQL = "SELECT da_personne.*, df_compte.*, dk_respon.*"
szSQL = szSQL & " FROM (da_personne INNER JOIN df_compte ON da_personne.da_numpers=df_compte.df_da_numpers) INNER JOIN dk_respon ON df_compte.df_numcpte=dk_respon.dk_df_numcpte"
szSQL = szSQL & " WHERE (da_personne.da_numpers like '%" & maPersonne & "%' AND df_compte.df_ch_cdcat=3)"
'exécution de la requête et récupération des informations
Set Recordset = objConn.Execute(szSQL) 'lancement requête
'
'Accès à la feuille DONNEES
Sheets(maFeuille).Select
ActiveSheet.Unprotect
'
'effacement des données éventuellement présentes
Sheets(maFeuille).Range(Cells(2, 1), Cells(2, 15)).ClearContents 'vide la zone uniquement contenu mais garde format
Cells(1, 1).Select
x = ActiveCell.SpecialCells(xlCellTypeLastCell).Row 'on repère la ligne de la dernière ligne utilisée
Sheets(maFeuille).Range(Cells(lg + 1, 1), Cells(x, 15)).ClearContents 'vide cette zone
'
'exploitation des résultats
If Not Recordset.EOF Then 'il y a au moins un enregistrement
'report des enregistrements communs (N° personne, Nom ETC...)
Sheets(maFeuille).Range("A1") = "N° de personne"
Sheets(maFeuille).Range("A2") = Recordset("da_numpers")
Sheets(maFeuille).Range("B1") = "Nom personne"
Sheets(maFeuille).Range("B2") = Recordset("da_nompers")
Sheets(maFeuille).Range("D1") = "SIREN"
Sheets(maFeuille).Range("D2") = Recordset("da_numpublic")
Sheets(maFeuille).Range("F1") = "N° de compte"
Sheets(maFeuille).Range("F2") = Recordset("dk_df_numcpte")

'etc... à compléter

Else 'pas d'enregistrement
MsgBox "xxxx" & Chr(10) & "xxxx ?" & Chr(10) & "xxx"
GoTo Fin
End If
'on met les titres du tableau
Sheets(maFeuille).Range(A5) = "Compte"
Sheets(maFeuille).Range(B5) = "Période"
Sheets(maFeuille).Range(C5) = "Revenus déclarés"
Sheets(maFeuille).Range(D5) = "Cotisations déclarées"
Sheets(maFeuille).Range(E5) = "Revenus de Remplacement"

Sheets(maFeuille).Range(A6) = "'" & Recordset("df_numcpte")
Sheets(maFeuille).Range(B6) = Recordset("dk_an1")
Sheets(maFeuille).Range(C6) = Recordset("dk_rev1")
Sheets(maFeuille).Range(D6) = Recordset("dk_cot1")
Sheets(maFeuille).Range(E6) = Recordset("dk_revremp1")
Sheets(maFeuille).Range(A7) = "'" & Recordset("df_numcpte")
Sheets(maFeuille).Range(B7) = Recordset("dk_an2")
Sheets(maFeuille).Range(C7) = Recordset("dk_rev2")
Sheets(maFeuille).Range(D7) = Recordset("dk_cot2")
Sheets(maFeuille).Range(E7) = Recordset("dk_revremp2")
Sheets(maFeuille).Range(A8) = "'" & Recordset("df_numcpte")
Sheets(maFeuille).Range(B8) = Recordset("dk_an3")
Sheets(maFeuille).Range(C8) = Recordset("dk_rev3")
Sheets(maFeuille).Range(D8) = Recordset("dk_cot3")
Sheets(maFeuille).Range(E8) = Recordset("dk_revremp3")
Sheets(maFeuille).Range(A9) = "'" & Recordset("df_numcpte")
Sheets(maFeuille).Range(B9) = Recordset("dk_an4")
Sheets(maFeuille).Range(C9) = Recordset("dk_rev4")
Sheets(maFeuille).Range(D9) = Recordset("dk_cot4")
Sheets(maFeuille).Range(E9) = Recordset("dk_revremp4")
Sheets(maFeuille).Range(A10) = "'" & Recordset("df_numcpte")
Sheets(maFeuille).Range(B10) = Recordset("dk_an5")
Sheets(maFeuille).Range(C10) = Recordset("dk_rev5")
Sheets(maFeuille).Range(D10) = Recordset("dk_cot5")
Sheets(maFeuille).Range(E10) = Recordset("dk_revremp5")
Sheets(maFeuille).Range(A7) = "'" & Recordset("df_numcpte")
Sheets(maFeuille).Range(B7) = Recordset("dk_an6")
Sheets(maFeuille).Range(C7) = Recordset("dk_rev6")
Sheets(maFeuille).Range(D7) = Recordset("dk_cot6")
Sheets(maFeuille).Range(E7) = Recordset("dk_revremp6")
Fin:
'Fermeture de la base et Libération des objets
objConn.Close
Set Recordset = Nothing
Set objConn = Nothing

End Sub


Là ou je ne comprends pas c'est lorsque c'a plante au lancement de la requête :
Set Recordset = objConn.Execute(szSQL) 'lancement requête

Pouvez vous m'aider ... d'avance merci à tous !

3 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
1 nov. 2009 à 01:55
Salut
Non, la syntaxe n'est pas la bonne.
Execute ne sert qu'aux instructions SQL du style Delete ou Insert Into et, dans ce cas là, on n'utilise pas de RecordSet puisqu'il n'y a pas de résultat à récupérer.

Puisque tu utilises ADODB, mieux vaux ajouter la référence à la bibliothèque plutôt que d'utiliser une déclaraion tardive (CreateObject).
(Menu "Outils", "Références" + "Microsoft ActiveX Data Objects 2.8 Library")
Syntaxe :
Dim maConnexion As ADODB.Connection
Dim monRecordSet As ADODB.RecordSet
Set maConnexion = New ADODB.Connection
maConnexion.ConnectionString = "DRIVER={Microsoft ...
Set monRecordSet = New ADODB.Recordset
monRecordSet.CursorLocation = adUseClient
monRecordSet.Open szSQL, maConnexion, adOpenStatic, adLockReadOnly
...


D'après le traitement que tu fais ensuite avec ton RecordSet, il semble que tu sois sûr de ne récupérer qu'une seule ligne de données dans ton RecordSet.
Sinon, il faudra énumérer chaque ligne avec une boucle Do-Loop classique, qu'on trouve dans n'importe quel projet qui traite de database.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
1 nov. 2009 à 01:56
PS : J'ai oublié le .Open de la connexion
0
gerardcjf Messages postés 47 Date d'inscription mardi 3 juillet 2007 Statut Membre Dernière intervention 26 décembre 2013
1 nov. 2009 à 08:23
Bonjour Jack,

D'abord merci pour toutes ces précisions ....

J'ai quand même un souci, ce code va servir à plus d'une centaine de personne ... dont je ne sais pas à l'avance si la référence à la bibliothèque Microsoft ActiveX Data Objects 2.8 Library sera effective.

En second lieu, effectivement je suis sûr de ne récupérer qu'une seule ligne ... comme tu le précises c'est la raison pour laquelle je n'ai pas fait de boucle DO... loop (j'ai utilisé ce même type de code pour la récupération de plusieurs lignes de résultat avec do ... loop et le fameux Execute ... et c'a marche ! ce qui est vrai pour n ligne de résultat devrait au moins être vrai pour une non ?)

Qu'en penses tu ?
Encore merci de ton aide ... car à travers ce forum je vérifie l'adage : "tout ce que je sais ... c'est que je ne sais rien" !
0
Rejoignez-nous