IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

Problème export excel sur une requete avec critère


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 73
    Points : 41
    Points
    41
    Par défaut Problème export excel sur une requete avec critère
    Bonjour à tous,


    J'ai un petit souci, j'ai un code qui marche très bien sur ma requete lorsque je n'ai pas de critère dans celle-ci.
    Mais lorsque je rajoute un critère ("comme formulaire") sur un champ. Il me sort le message suivant
    Erreur execution 3061 trop peu de paramètres. 2 attendu



    Avez vous une idée, SVP???

    Ps: voici le code pour infos

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Private Sub Commande11_Click()
    Call Exportation("SYNTHESE_PORT_NAT_HORS_INTRA", "D:\Analyse_Avoirs_(annee_mois_debut)_(annee_mois_fin).xls", "Extraction")
    End Sub
     
    Sub Exportation(requete As String, fichier As String, onglet As String)
     
     Dim xlA As Object, xlW As Object, t As DAO.Recordset
     Dim s As String, NumChamp As Long, ligne As Long
     
     Set xlA = CreateObject("excel.application")    'lance Excel
     xlA.Visible = True
     xlA.workbooks.Open (fichier)       'ouvre le fichier
     Set xlW = xlA.activeworkbook
     ligne = 1
      Set t = CurrentDb.OpenRecordset(requete)    'ouvre la requete
     Do Until t.EOF
       ligne = ligne + 1            'ligne suivante dans la feuille Excel
       For NumChamp = 0 To 10        'pour chaque colonne de la requete
           s = t(NumChamp)       'recupération des données au format Texte
        xlW.Sheets(onglet).cells(ligne, NumChamp + 1) = "'" & s 'ecriture dans la cellule
       Next NumChamp
       t.MoveNext                    'enregistrement suivant
      Loop
     t.Close
     xlW.Save
     xlA.Quit
     Set xlA = Nothing    ' puis libère la référence.
     
    End Sub
    MErci beaucoup d'avance

  2. #2
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 060
    Points : 24 664
    Points
    24 664
    Par défaut
    Bonjour,

    Apparement c'est un problème avec la requête, ce serait bien d'avoir plutot la requete ou au moins sa partie Where.

    Cordialement,

  3. #3
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 73
    Points : 41
    Points
    41
    Par défaut
    Voici les sql de ma requete si ça peut t'aider

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT CONSO_BASE_HI_CODE_COM.annee_mois, CONSO_BASE_HI_CODE_COM.REGION, CONSO_BASE_HI_CODE_COM.no_societe, CONSO_BASE_HI_CODE_COM.nom_societe, BASE_Plan_comm.no_agence_comm, BASE_Plan_comm.compute_0004 AS agence_comm, BASE_Plan_comm.no_commercial, BASE_Plan_comm.compute_0006 AS commercial, CONSO_BASE_HI_CODE_COM.typologie, Count(CONSO_BASE_HI_CODE_COM.typologie) AS NB, Sum(CONSO_BASE_HI_CODE_COM.montant_TTC) AS SommeDemontant_TTC
    FROM CONSO_BASE_HI_CODE_COM LEFT JOIN BASE_Plan_comm ON CONSO_BASE_HI_CODE_COM.IDCODE = BASE_Plan_comm.ID
    GROUP BY CONSO_BASE_HI_CODE_COM.annee_mois, CONSO_BASE_HI_CODE_COM.REGION, CONSO_BASE_HI_CODE_COM.no_societe, CONSO_BASE_HI_CODE_COM.nom_societe, BASE_Plan_comm.no_agence_comm, BASE_Plan_comm.compute_0004, BASE_Plan_comm.no_commercial, BASE_Plan_comm.compute_0006, CONSO_BASE_HI_CODE_COM.typologie
    HAVING (((CONSO_BASE_HI_CODE_COM.annee_mois) Between [Formulaires]![Export]![annee_mois_debut] And [Formulaires]![Export]![annee_mois_fin]));

    Merci encore

  4. #4
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    bjr,

    il faut renseigner les paramètres, il ne va pas les chercher tout seul dans ce cas de figure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim qdf As DAO.QueryDef
    Dim rs As DAO.Recordset
    Dim db As DAO.Database
    Set db = CurrentDb
    Set qdf = db.QueryDefs(requete)
    qdf.Parameters("[Formulaires]![Export]![annee_mois_debut]").Value = [Formulaires]![Export]![annee_mois_debut]
    qdf.Parameters("[Formulaires]![Export]![annee_mois_fin]").Value = [Formulaires]![Export]![annee_mois_fin]
    Set rs = qdf.OpenRecordset
    .....
    .....
    Set db = Nothing
    rs.Close
    Set rs = Nothing
    Set qdf = Nothing
    ou de manière générique (ça marche bien avec des critères comme les tiens):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Dim qdf As DAO.QueryDef
    Dim rs As DAO.Recordset
    Dim db As DAO.Database
    Dim i As Integer
    Set db = CurrentDb
    Set qdf = db.QueryDefs(requete)
    For i = 0 To qdf.Parameters.Count - 1
        qdf.Parameters(i).Value = Eval(qdf.Parameters(i).Name)
    Next
    Set rs = qdf.OpenRecordset
    ....
    ....
    Set db = Nothing
    rs.Close
    Set rs = Nothing
    Set qdf = Nothing

  5. #5
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 73
    Points : 41
    Points
    41
    Par défaut
    Merci

    Ok ouah c'est un beu balèze.

    Si tu pouvais m'aider pour l'insérer, je t'en serais vraiment reconnaissant.


    Merci



  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 710
    Points : 847
    Points
    847
    Par défaut
    Salut,

    Pour copier les données du recordset dans ta feuille, tu peux aussi utiliser la méthode range.copyfromrecordset

    tu peux ainsi remplacer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Do Until t.EOF
       ligne = ligne + 1            'ligne suivante dans la feuille Excel
       For NumChamp = 0 To 10        'pour chaque colonne de la requete
           s = t(NumChamp)       'recupération des données au format Texte
        xlW.Sheets(onglet).cells(ligne, NumChamp + 1) = "'" & s 'ecriture dans la cellule
       Next NumChamp
       t.MoveNext                    'enregistrement suivant
      Loop
    par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    xlW.Sheets(onglet).cells(1, 1).copyfromrecordset t
    A+

  7. #7
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    Ca doit ressembler à ça
    Au lieu de faire le recordset sur currentdb, on rajoute une couche : la requete qdf pour pouvoir définir ses paramètres
    J'ai rajouté un objet db parce que ça permet de le libérer à la fin (sinon l'utilisation de currentdb directement crée une instance de base de données jamais libérée, c'est pas un drame mais c'est mieux comme ça)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    Private Sub Commande11_Click()
    Call Exportation("SYNTHESE_PORT_NAT_HORS_INTRA", "D:\Analyse_Avoirs_(annee_mois_debut)_(annee_mois_fin).xls", "Extraction")
    End Sub
    
    Sub Exportation(requete As String, fichier As String, onglet As String)
    
     Dim xlA As Object, xlW As Object, t As DAO.Recordset
     Dim qdf As DAO.QueryDef
     Dim db As DAO.Database
     Dim i as Integer
     Dim s As String, NumChamp As Long, ligne As Long
     
     Set xlA = CreateObject("excel.application")    'lance Excel
     xlA.Visible = True
     xlA.workbooks.Open (fichier)       'ouvre le fichier
     Set xlW = xlA.activeworkbook
     ligne = 1
     Set db = CurrentDb
     Set qdf = db.QueryDefs(requete)
     For i = 0 To qdf.Parameters.Count - 1
         qdf.Parameters(i).Value = Eval(qdf.Parameters(i).Name)
     Next
     Set t = qdf.OpenRecordset    'ouvre la requete
     Do Until t.EOF
       ligne = ligne + 1            'ligne suivante dans la feuille Excel
       For NumChamp = 0 To 10        'pour chaque colonne de la requete
           s = t(NumChamp)       'recupération des données au format Texte
        xlW.Sheets(onglet).cells(ligne, NumChamp + 1) = "'" & s 'ecriture dans la cellule
       Next NumChamp
       t.MoveNext                    'enregistrement suivant
      Loop
      t.Close
     Set t = Nothing
     Set qdf = Nothing
     Set db = Nothing
     xlW.Save
     xlA.Quit
     Set xlA = Nothing    ' puis libère la référence.
    
    End Sub
    Dans le cas où le critère est du style [Entrez la valeur recherchée], alors la fonction Eval ne fonctionnera pas.
    Il suffit de changer la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    qdf.Parameters(i).Value = Eval(qdf.Parameters(i).Name)
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        On Error Resume Next
        qdf.Parameters(i).Value = Eval(qdf.Parameters(i).Name)
        If Err.number = 2482 Then ' Paramètre non évaluable
            ' Demande la saisie du paramètre dans une inputbox
            qdf.Parameters(i).Value = InputBox(qdf.Parameters(i).Name)
        End If
        On Error GoTo 0
    pour demander la saisie du paramètre dans une inputbox.

  8. #8
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 73
    Points : 41
    Points
    41
    Par défaut
    Ca marche nickel.


    Super et merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème sur une requete avec fonction
    Par amelyfred dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 03/07/2015, 08h12
  2. Requete SUM sur une table avec critère sur une autre
    Par wail00 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/05/2007, 16h58
  3. Pb sur une requete avec jointure droite
    Par crashyear dans le forum Langage SQL
    Réponses: 3
    Dernier message: 06/02/2007, 08h06
  4. erreur sur une requete avec param curentuser
    Par laurent.w dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 17/01/2007, 13h39
  5. Problème sur une requete avec champ date
    Par islande dans le forum Access
    Réponses: 2
    Dernier message: 21/09/2006, 19h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo