[Résolu] Erreur dans l'ouverture d'un recordset

Erreur dans l'ouverture d'un recordset [Résolu] - VB/VBA/VBS - Programmation

Marsh Posté le 05-09-2006 à 16:18:32    

Bonjour,
 
Je laisse ce message parce que je ne comprends vraiment pas pourquoi une erreur se produit.
 
Le contexte : je crée un formulaire dans Access, qui doit permettre d'importer les données d'un fichier Excel directement dans certaines colonnes de la base de données. Mais les données que l'utilisateur va importer dépendent du mois de l'année. L'utilisateur choisit donc dans une liste le mois correspondant.
 
C'est pour cela que j'utilise un recordset : en fonction du mois choisi, je fais une requete de sélection sur une table qui contient des informations qui me permettent de localiser les données à importer.
 
Maintenant voilà le code (uniquement ce qui est utile):
 

Code :
  1. Dim dbs As DAO.Database
  2. Dim Month As String
  3. Dim Filepath As String
  4. Dim ClasseurXLS
  5. Dim Sh As Excel.Worksheet
  6. Dim rst As DAO.Recordset
  7. Private Sub Import_Data()
  8. MsgBox (" fichier : " & Filepath)
  9. '   ***   INITIALISATIONS   ***
  10. 'Création du classeur Excel
  11. Set ClasseurXLS = CreateObject("Excel.application" )
  12. 'Ouverture du classeur d'importation
  13. ClasseurXLS.Workbooks.Open Filepath
  14. Set Sh = ClasseurXLS.Worksheets("P & L" )
  15. Set dbs = CurrentDb
  16. MsgBox ("mois: " & Month)
  17. 'Récupération du numéro de colonne
  18. sqlCol = "SELECT MonthPandL FROM tbl_MonthNumber WHERE Month = '" & Month & "' ;"
  19. MsgBox (" requete :" & sqlCol)
  20. Set rst = dbs.OpenRecordset(sqlCol, dbOpenDynaset)
  21. Column = rst.Fields(0).Value
  22. MsgBox ("test rst :" & Column)
  23. ...


 
Et j'obtiens systématiquement malgré tous mes efforts une erreur 3061 "Too few parameters. 1 Expected" soit en français, "Trop peu de paramètres. 1 attendu."
 
Auriez vous une piste à me donner ?


Message édité par Alphajet le 06-09-2006 à 09:26:41

---------------
Bien joué! Mais une brique ne rend jamais les coups.
Reply

Marsh Posté le 05-09-2006 à 16:18:32   

Reply

Marsh Posté le 05-09-2006 à 17:06:13    

Salut,
 
On ne voit pas ce que contient ta variable "Month" qui est utilisée pour filtrer ta requête.
 
A+
Horatio
 
 
 

Reply

Marsh Posté le 05-09-2006 à 17:27:24    

Sinon, je ne comprends pas comment tu peux vouloir ouvrir un recordset alors que tu n'as pas de table.
« dbs.OpenRecordset » permet d'ouvrir un recordset basé sur une table ou une requete enregistrées dans ta base Access.
Or ton fichier Excel est externe et je ne vois nulle part d'importation ou de liaison de ces données Excel dans un conteneur Access.

Message cité 1 fois
Message édité par tegu le 05-09-2006 à 17:31:24
Reply

Marsh Posté le 05-09-2006 à 17:28:48    

La variable Month est bien récupérée, elle provient d'une liste déroulante dans le formulaire :
 

Code :
  1. Private Sub Month_list_AfterUpdate()
  2. Month = Month_list
  3. MsgBox ("testmois :" & Month)
  4. End Sub


 
La boite de test ici fonctionne bien et renvoie la bonne valeur.


---------------
Bien joué! Mais une brique ne rend jamais les coups.
Reply

Marsh Posté le 05-09-2006 à 17:29:44    

Salut,
 
  En fait, il faut que tu crée un Querydef (une requete), et que ce Querydef remplisse ton recordset:
 

Code :
  1. Dim dbs As DAO.Database
  2. Dim qdf As QueryDef
  3. Dim rs As Recordset
  4. Dim strReq As String
  5. strReq = "SELECT MonthPandL FROM tbl_MonthNumber WHERE Month = '" & Month & "' ;"
  6. Set qdf = dbs.CreateQueryDef("", strReq)
  7. Set rs = qdf.OpenRecordset
  8. If rs.RecordCount > 0 Then
  9.     ' traitement
  10. End If


 
 

Code :
  1. Set qdf = dbs.CreateQueryDef("", strReq)

 
Dans cette ligne, il faut laisser les 2 guillemets vides, sinon tu donnes un nom à ta requete qui deviendra une requete stockée.
 
Voilà.


---------------
J'ai un message.."Cliquez OK pour continuer."...Qu'est ce que je fais ?
Reply

Marsh Posté le 05-09-2006 à 17:33:11    

tegu a écrit :

...
Sinon, je ne comprends pas comment tu peux vouloir ouvrir un recordset alors que tu n'as pas de table.
« dbs.OpenRecordset » permet d'ouvrir un recordset basé sur une table ou une requete enregistrées dans ta base Access.
Or ton fichier Excel est externe et je ne vois nulle part d'importation ou de liaison de ces données Excel dans un conteneur Access.


 
En fait le recordset en lui même n'a rien à voir avec le fichier Excel.
Il est exécuté dans la base Access sur les données d'une table dans Access.  
Tout le code VBA est exécuté depuis Access, et je ne fais aucune opération à partir du fichier Excel même.
 
En fait la suite du code permet de récupérer les valeurs de certaines cellules d'un fichier (pour éclaircir : j'ai des dizaines de fichiers Excel au format identique dont je veux récupérer les données, et ils sont classés par agence, mois et par année. Mon formulaire permet donc de sélectionner une agence, une année, un mois puis de sélectionner le fichier Excel à importer)


---------------
Bien joué! Mais une brique ne rend jamais les coups.
Reply

Marsh Posté le 05-09-2006 à 17:34:44    

JihemAir a écrit :

Salut,
 
  En fait, il faut que tu crée un Querydef (une requete), et que ce Querydef remplisse ton recordset:


 
Ah donc le QueryDef est nécessaire ? J'avais recherché des exemples du type de ce que j'ai écrit et apparemment ils fonctionnaient. Mais je vais essayer avec le QueryDef


---------------
Bien joué! Mais une brique ne rend jamais les coups.
Reply

Marsh Posté le 05-09-2006 à 17:45:18    

:( Malheureusement j'ai exactement le même problème, l'erreur renvoyée est la même, sur cette ligne :
 

Code :
  1. Set Rs = qdf.OpenRecordset


---------------
Bien joué! Mais une brique ne rend jamais les coups.
Reply

Marsh Posté le 05-09-2006 à 18:20:32    

Re,
 
J'ai une bonne nouvelle :
- Ton code fonctionne pour ce qui est de la requête, il n'est donc pas nécessaire de passer par un QueryDef.
Lorsque Month = "Apr", on récupère bien "Avril"
etc..
 
et une mauvaise :
- Je ne vois pas ce qui cloche.
 
Es-tu bien sûr que le champ "Month" de ta table "tbl_MonthNumber" est bien une chaîne de caractères ?
 
A+
Horatio


Message édité par Lord Nelson le 05-09-2006 à 18:21:31
Reply

Marsh Posté le 06-09-2006 à 07:55:40    

Re:
 
  Regarde aussi dans ta base de données, si tu n'as pas une requête enregistrée.
  J'ai l'impression que ton code appelle cette requête, sans lui passer de paramètre.
 


---------------
J'ai un message.."Cliquez OK pour continuer."...Qu'est ce que je fais ?
Reply

Marsh Posté le 06-09-2006 à 07:55:40   

Reply

Marsh Posté le 06-09-2006 à 09:26:18    

Merci à vous deux pour votre aide déjà :) J'ai trouvé l'erreur grâce à vous :
 
=> Lord nelson : Le champ Month est bien une chaîne de caractères, par contre le nom de la colonne avait changé pour MonthName dans la BD, je n'avais pas répercuté ça dans le code ... D'où l'erreur, la colonne n'était pas trouvée  
 
Désolé, comme souvent, c'était une erreur bête ! Et comme souvent on cherche à côté de là où il faut chercher


Message édité par Alphajet le 06-09-2006 à 09:27:03

---------------
Bien joué! Mais une brique ne rend jamais les coups.
Reply

Marsh Posté le 06-09-2006 à 10:29:53    

Salut,
 
Content que tu aies résolu ton problème.
 
Il me semble que tu pourrais obtenir un résultat analogue plus simplement en utilisant la fonction RECHDOM (DLOOKUP en anglais) d'Access. Tu récupérerais le mois dans la table sans passer par DAO.
Par exemple :
Dim MoisComplet As String
MoisComplet = DLookup("MonthPandL", "tbl_MonthNumber", "Month='" & Me.ListeMois & "'" )
MsgBox MoisComplet
 
En fait DLookup lance directement une requête sur la table.
 
A+
Horatio


Message édité par Lord Nelson le 06-09-2006 à 10:31:17
Reply

Sujets relatifs:

Leave a Replay

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