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

VBA Access Discussion :

Résultat d'une requête dans une feuille Excel [AC-2010]


Sujet :

VBA Access

  1. #1
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut Résultat d'une requête dans une feuille Excel
    Bonjour,
    Il y a de cela quelques temps, rdurupt m'a permis de créer un code qui me permet d'afficher le resultat d'une requete Access sur une feuille Excel.
    Code ci dessous;
    Si je reviens sur cette requête, c'est que j'aimerais rajouter une boucle à ce code qui permettrait à la requête de faire une boucle pour récuperer une liste de postalCode_Debut et de PostalColde_Fin et d'afficher les resultats ( cf. photo ci dessous).

    Nom : Boucle.PNG
Affichages : 1526
Taille : 3,3 Ko

    Actuellement, j'affiche uniquement un seul postalCode_debut et un seul Postal Code_Fin et j'exécute la requete. Ensuite, j'efface les données et je recommence l'opération avec un nouveau postalCode_debut et un nouveau postal code_fin.
    Ce n'est pas pratique..



    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    Private Sub Cmd_PosalCode_Click()
     
    Dim sql As String
    Dim GenereCSTRING As String
    Dim Debut As Object
    Dim Fin As Object
    Dim PostalCode_Debut As Object
    Dim PostalCode_Fin As Object
     
    Dim Cm As Object 'Pour utiliser une requête parametrés il faut utiliser l'oblet Command!
    Dim cn As Object 'Pour ce connecter à un base de données Access il faut utiliser l'objet Connection!
    Dim rs As Object
     
    Dim i As Integer
     
     
    Range("S27:S100").ClearContents
     
    Application.ScreenUpdating = False
     
    sql = "SELECT  * FROM Requete1" ' je détermine une requête sql qui pointe sur ta requête Acces."
     
     
    Set cn = CreateObject("ADODB.Connection")
    Set Cm = CreateObject("Adodb.Command")
     
     GenereCSTRING = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="chemin de la base de donnee" 'Je defini un chêne de texte qui contient les information de ma connection.
     cn.Open GenereCSTRING 'J'ouvre ma connection.
     
     
    Cm.CommandText = sql 'je passe ma requête à mon objet command
    Cm.ActiveConnection = cn 'j'affecte ma connection à ma commande
     
    Const adDate = 7 'defini le type de parametre
    Const adVarChar = 200
     
    'c'est avec l'objet Parameter que je vais renseigner les parmetres de ma requête Access.
    'Cellule où est stokcé la date cdate(format(ThisWorkbook.Sheets("Req_ExportUnionExcel").range("B1").value,"yyyy-mm-dd hh:mm"))
     
    Set Debut = CreateObject("ADODB.Parameter") 'c'est avec l'objet Parameter que je vais reseigner les parmetres de ma requête Access.
    Debut.Name = "Debut": Debut.Type = adDate: Debut.Value = CDate(Format(ThisWorkbook.Sheets("feuil1").Range("Q1").Value, "yyyy-mm-dd")): Cm.Parameters.Append Debut
    '
    Set Fin = CreateObject("ADODB.Parameter") 'c'est avec l'objet Parameter que je vais reseigner les parmetres de ma requête Access.
    Fin.Name = "Fin": Fin.Type = adDate: Fin.Value = CDate(Format(ThisWorkbook.Sheets("feuil1").Range("Q2").Value, "yyyy-mm-dd")): Cm.Parameters.Append Fin
     
    Set PostalCode_Debut = CreateObject("ADODB.Parameter") 'c'est avec l'objet Parameter que je vais reseigner les parmetres de ma requête Access.
    PostalCode_Debut.Name = "PostalCode_Debut": PostalCode_Debut.Type = adstring: PostalCode_Debut.Value = ThisWorkbook.Sheets("feuil1").Range("Q27").Value: Cm.Parameters.Append PostalCode_Debut
     
    Set PostalCode_Fin = CreateObject("ADODB.Parameter") 'c'est avec l'objet Parameter que je vais reseigner les parmetres de ma requête Access.
    PostalCode_Fin.Name = "PostalCode_Fin": PostalCode_Fin.Type = adstring: PostalCode_Fin.Value = ThisWorkbook.Sheets("feuil1").Range("R27").Value: Cm.Parameters.Append PostalCode_Fin
     
     
    Set rs = Cm.Execute 'on recupere le résultat de la requête.
     
    With ThisWorkbook.Sheets("Feuil1")
     
         For i = 0 To rs.Fields.Count -1 
                   .Range("S26").Offset(0, i) = rs(i).Name 
         Next
     
            .Range("S27").CopyFromRecordset rs 'la on copie le résultat de la requête!
     
    End With
     
    End Sub

  2. #2
    Membre émérite Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 670
    Points : 2 489
    Points
    2 489
    Par défaut
    Ne serait-il pas plus simple d'exploiter le lien direct Excel-Access; via le Ruban\Données\Données externes\Access Puis choisir la requête voulue ?

  3. #3
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    Bonjour Zekraoui_Jakani,
    J'aimerais bien compléter ce code avec une liste de parametre. Ainsi je pourrais l'utiliser pour d'autre requete

  4. #4
    Membre émérite Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 670
    Points : 2 489
    Points
    2 489
    Par défaut
    Je maintiens ma 1ère réponse! Récupérer 2 codes postaux tenant compte de 2 dates peut se faire plus simplement via le menu "données" même si on a plusieurs paramètres, et ceci peut être utilisé plusieurs fois.

  5. #5
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    Bonjour Zekraoui_Jakani,
    Je reviens vers toi sur ce soucis de faire une boucle pour récuperer une liste de postalCode_Debut et de PostalColde_Fin.
    J'ai essayer de faire ce que tu ma dis
    Ruban\Données\Données externes\Access Puis choisir la requête voulue
    je bloque car j'ai une boite de dialogue qui s'ouvre pour me dire de rentrer un mot de passe..

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    J'imagine que ta boucle s'exécute à partir d'un tableaux excel?

  7. #7
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    bonjour dysorthographie
    content de te revoir et de de relire

    Oui effectivement, ma boucle s'exécute à partir d'un tableau Excel.
    Les 2 paramètres PostalCode_Debut et PostalCode_Fin se trouve sur une feuille Excel.
    Voir tableau ci dessous ( ne pas prendre en compte la pièce jointe)
    Pièce jointe 379064

    je souhaiterais donc que ma requête fasse une boucle sur cette liste de paramètre PostalCode_Debut et PostalCode_Fin.
    Je m'explique:
    La requête parcourt la 1ere ligne et lit le 1er paramètre PostalCode_Debut (75001) , lit ensuite le 2ième paramètre PostalCode_Fin (75012) et me donne le résultat en C2
    Ensuite la requête parcourt la deuxième ligne et lit le paramètre PostalCode_Debut (78001) , lit ensuite le paramètre PostalCode_Fin (78001) et me donne le résultat en C3.
    et ceci jusqu'à la dernière ligne non vide de la colonne PostalCode_Debut.
    c'est un exemple..

    Ton code VBA cité ci dessus avec les paramètres date debut et date fin est super. Si j'arrivais ( avec ton aide bien évidemment lol) à intégrer, dans ce code, cette boucle pour ces deux paramètres PostalCode_Debut et PostalCode_Fin je serais remplie de joie

    Merci d'avance pour ton aide dysorthographie
    Images attachées Images attachées  

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    981
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 981
    Points : 1 028
    Points
    1 028
    Billets dans le blog
    36
    Par défaut
    Bonjour Facteur,

    Pourquoi fais tu piloter Access par Excel alors que comme le suggère zekraoui_jakani, c’est beaucoup plus facile de faire un export vers Excel depuis Access.

    Pourquoi ne pas faire une interface Access dans laquelle tu saisies tes données / paramètres et ensuite affiche le résultat dans Access et si tu veux l’exporter sur Excel, tu utilises une des deux méthodes ci-dessous



    Si l’outil doit être utilisé par plusieurs utilisateurs, pas d’inquiétude pour les licences, Access fonctionne sans licence (Runtime) et dans ce cas, la seule contrainte est qu’il n’est plus possible de faire de développements sur les ordi en runtime donc pour les utilisateurs
    Mal nommer un objet, c'est ajouter au malheur de ce monde, car le mensonge est justement la grande misère humaine, c'est pourquoi la grande tâche humaine correspondante sera de ne pas servir le mensonge
    Poésie 44, n° 17 - Albert Camus

    Mes réponses vous ont aidés, un clic sur leur pouce vert
    Bonjour chez vous

  9. #9
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    Bonjour informer,
    A la question,
    Pourquoi fais tu piloter Access par Excel alors que comme le suggère zekraoui_jakani, c’est beaucoup plus facile de faire un export vers Excel depuis Access.
    c'est que mes collègues sont plus à l'aise avec Excel qu'avec Access.
    Donc, pour palier à cela, j' ai crée la requête sur Access et je l'appelle à partir d'Excel.

    dysorthographie, m'a aidé a concevoir le code vba qui est joint dans cette discussion. Et je trouve ce code très intéressant et facilement adaptable à n'importe quelle requête access.
    Et c'est pourquoi, je souhaiterais continuer à développer ce code avec une boucle .

    Informer et Zekraoui_Jakani, c'est sympa de m'aider mais il est vrai que j'aimerais plutôt une solution qui reprend le code vba joint que repartir sur une nouvelle piste même si celle-ci est intéressante.
    Il faudrait que j'essaie cette piste sur une requête que j' utilise personnellement.

  10. #10
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    981
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 981
    Points : 1 028
    Points
    1 028
    Billets dans le blog
    36
    Par défaut
    Facteur,

    Je te conseille de créer ta requête en dynamique plutôt que de passer par parameters sauf si tu as une requête stockée dans ta base avec des paramètres Cf. Ici/

    Tu as donc ta requête

    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
     
     
    Set cn = CreateObject("ADODB.Connection")
    Set Cm = CreateObject("Adodb.Command")
     
     GenereCSTRING = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source= 'chemin de la base de donnee' "
     cn.Open GenereCSTRING 
     
    sSelect = "SELECT .... FROM table WHERE 1" 
    sAnd = " AND debut = #" &  CDate(Format(ThisWorkbook.Sheets(feuil1").Range("Q1").Value, "yyyy-mm-dd")) & "#"
    sAnd = sAnd & " AND fin = #" &  CDate(Format(ThisWorkbook.Sheets("feuil1").Range("Q2").Value, "yyyy-mm-dd")) & "#"
    sAnd = sAnd & " AND PostalCode_Debut = '" &  ThisWorkbook.Sheets("feuil1").Range("Q27").Value & "' "
    sAnd = sAnd & " AND PostalCode_Fin = '" &  ThisWorkbook.Sheets("feuil1").Range("R27").Value & "' "
     
    sSql = sSelect & sAnd
    Cm.CommandText = sSql
    Cm.ActiveConnection = cn 
    Set rs = Cm.Execute
    ...
    J’ai par contre un doute sur le AND des dates, faut tester s’il faut mettre entre #

    Moins de code donc plus lisible
    Meilleure maitrise de ta requête que tu peux complexifier facilement à souhait.
    Mal nommer un objet, c'est ajouter au malheur de ce monde, car le mensonge est justement la grande misère humaine, c'est pourquoi la grande tâche humaine correspondante sera de ne pas servir le mensonge
    Poésie 44, n° 17 - Albert Camus

    Mes réponses vous ont aidés, un clic sur leur pouce vert
    Bonjour chez vous

  11. #11
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    si j'ai bien compris ça devrait ressembler à ça!

    pour la date début/fin j'ai des doutes.

    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
    With ThisWorkbook.Sheets("Feuil1")
        For l = 2 To .Range("A1").CurrentRegion.Rows.Count
            Set Cm = CreateObject("Adodb.Command")
            Set Debut = CreateObject("ADODB.Parameter") 'c'est avec l'objet Parameter que je vais reseigner les parmetres de ma requête Access.
            Debut.Name = "Debut": Debut.Type = adDate: Debut.Value = CDate(Format(.Range("Q1").Value, "yyyy-mm-dd")): Cm.Parameters.Append Debut
            '
            Set Fin = CreateObject("ADODB.Parameter") 'c'est avec l'objet Parameter que je vais reseigner les parmetres de ma requête Access.
            Fin.Name = "Fin": Fin.Type = adDate: Fin.Value = CDate(Format(.Range("Q2").Value, "yyyy-mm-dd")): Cm.Parameters.Append Fin
     
            Set PostalCode_Debut = CreateObject("ADODB.Parameter") 'c'est avec l'objet Parameter que je vais reseigner les parmetres de ma requête Access.
            PostalCode_Debut.Name = "PostalCode_Debut": PostalCode_Debut.Type = adstring: PostalCode_Debut.Value = .Cells(l, "A").Value: Cm.Parameters.Append PostalCode_Debut
     
            Set PostalCode_Fin = CreateObject("ADODB.Parameter") 'c'est avec l'objet Parameter que je vais reseigner les parmetres de ma requête Access.
            PostalCode_Fin.Name = "PostalCode_Fin": PostalCode_Fin.Type = adstring: PostalCode_Fin.Value = Cells(l, "B").Value: Cm.Parameters.Append PostalCode_Fin
     
            Set rs = Cm.Execute 'on recupere le résultat de la requête.
           .Cells(l, "C").CopyFromRecordset rs 'la on copie le résultat de la requête!
           Set Cm = Nothing
        Next
    End With

  12. #12
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 951
    Points
    55 951
    Billets dans le blog
    131
    Par défaut
    Salut

    Citation Envoyé par informer Voir le message
    Facteur,

    Je te conseille de créer ta requête en dynamique plutôt que de passer par parameters sauf si tu as une requête stockée dans ta base avec des paramètres[...]
    Marrant, je donnerais pile-poil le conseil inverse. Il me semble bien plus sécurisant de créer la requête en utilisant une commande adodb paramétrée comme le montre Robert. L'utilisation de paramètres dispense de devoir réaliser soi-même la bonne chaine sql (avec les ' et les # qui encadrent les textes et les dates, les problèmes de séparateurs pour les nombres réels, la conversion des dates, etc).

    @Robert
    Sauf erreur, dans ton exemple, il me semble que tu oublies le cm.commandtext. Or, il est important de préciser qu'avec Access, on doit spécifier la place des paramètres dans la requête avec des ? et que les paramètres doivent être créés dans l'ordre de remplacement des ?, Access ne gérant pas les paramètres donnés. Donc, pour une requête avec un paramètre dans la clause where, on peut écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cm.commandtext = "select * form matable where pk = ?"
    puis passer un paramètre comme montré ci-dessous.

    De plus, question personnelle bien sûr, je n'aime pas l'utilisation des : pour passer plusieurs instructions sur une même ligne car je trouve que cela rend le code illisible. De plus, la création des paramètres peut être écrite de la façon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cm.parameters.append cm.createparameter(Nom,Type,Sens,Taille,Valeur)
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  13. #13
    Invité
    Invité(e)
    Par défaut
    Bonsoir Pierre,

    oui une légère distraction.

    pour ce qui concerne la requête dynamique, c'est d'autant plus inutile dans le cas qui nous préoccupe vue qu'il s'agit d'une requête Access parametrées (Requete1)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sql = "SELECT  * FROM Requete1"' je détermine une requête sql qui pointe sur ta requête Acces."
    Set Cm = CreateObject("Adodb.Command")
    Cm.CommandText = sql 'je passe ma requête à mon objet command
    Cm.ActiveConnection = cn 'j'affecte ma connection à ma commande
    Dernière modification par Invité ; 11/05/2018 à 23h18.

  14. #14
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    981
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 981
    Points : 1 028
    Points
    1 028
    Billets dans le blog
    36
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Salut

    Marrant, je donnerais pile-poil le conseil inverse. Il me semble bien plus sécurisant de créer la requête en utilisant une commande adodb paramétrée comme le montre Robert. L'utilisation de paramètres dispense de devoir réaliser soi-même la bonne chaine sql (avec les ' et les # qui encadrent les textes et les dates, les problèmes de séparateurs pour les nombres réels, la conversion des dates, etc).
    C’est indeniablement un avantage mais j’y vois plusieurs inconvénients majeurs
    1. Il est impossible de créer des requêtes dont la structure change en fonction de critères saisis dans une IHM
    2. C’est beaucoup plus compliqué pour débogguer
    3. Le code est très lourd et peu lisible -> maintenance complexe


    Quant à l’écriture de la requête, elle correspond à celle réalisée dans l’éditeur de requête donc ça ne pose pas de problème. Il se charge très bien des points soulevés.

    Chaque méthode a des avantages/inconvénients. A chacun de se faire son opinion.
    Mal nommer un objet, c'est ajouter au malheur de ce monde, car le mensonge est justement la grande misère humaine, c'est pourquoi la grande tâche humaine correspondante sera de ne pas servir le mensonge
    Poésie 44, n° 17 - Albert Camus

    Mes réponses vous ont aidés, un clic sur leur pouce vert
    Bonjour chez vous

  15. #15
    Invité
    Invité(e)
    Par défaut
    le fait d'utiliser une requête élaboré par le requêteur Access sous entend que la requête n'évolue pas; de plus c'est une requête avec des paramètres donc qui ne peux s'exécuté qu'avec la méthode Adodb.Command ou DAO querydef parameters il n'y a donc pas de débat à avoir sur le choix des armes.

    c'est pour cela que j'avais proposé cette solution à l'époque.

    ADODB.command est de toute les façons la plus sur pour les #date# les apostrophes ['] et d'autre blagues.

    de plus la requête reste la même car elle n'a pas de raison de changer et le paramètre sons entrés en l'état sens avoir besoins d’être formatés.
    Dernière modification par Invité ; 12/05/2018 à 01h17.

  16. #16
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 951
    Points
    55 951
    Billets dans le blog
    131
    Par défaut
    C'est indéniablement une question de choix...

    Citation Envoyé par informer Voir le message
    [...]Il est impossible de créer des requêtes dont la structure change en fonction de critères saisis dans une IHM
    Je ne comprends pas bien ce que tu veux dire. On parle bien de requêtes adodb ici. En quoi l'utilisation des paramètres adodb est-elle impossible dans ce cas?


    Citation Envoyé par informer Voir le message
    [...]
    C’est beaucoup plus compliqué pour débogguer
    C'est pour moi un argument non pertinent "Plus compliqué" est une appréciation subjective donc pour moi "plus compliqué" ne veut rien dire. Perso, je pense qu'il est plus facile de regarder des valeurs de paramètres adodb que de vérifier le bon format des dates, que l'on a bien pensé à doubler les ' dans les chaines qui en contiennent et autres amusements pour que le texte passe, ...

    Citation Envoyé par informer Voir le message
    [...]
    Le code est très lourd et peu lisible -> maintenance complexe
    A nouveau, "argument" subjectif qui pour moi ne veut rien dire. Ca veut dire quoi "très lourd"? Ca veut dire quoi "peu lisible"? Ca veut dire quoi "maintenance complexe"? Je trouve bien plus lisible et bien moins lourd une suite de lignes d'ajouts de paramètres qu'une longue chaîne sql créée à coup de &, d'insertion de caractères # et ' et autres amusements du même genre. Et je trouve la maintenance facilitée, notamment suite à cette absence de morceaux de chaînes concaténées., notamment parce que tu n'as pas à penser à ajouter tous ces caractères pour que la chaîne soit valide.

    La découverte et l'utilisation des paramètres adodb m'a aidé personnellement à écrire un code qui, sur le plan de la structure, de la lecture et de la maintenance, me convient bien mieux.

    Mais comme tu le dis, c'est affaire de choix (et ne vois pas dans mes propos une attaque personnelle )
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  17. #17
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    C'est indéniablement une question de choix, choix effectué par notre ami il y a déjà quelque temps.

    Travailler à partir d'une requête paramétrable a toujours fait partie du postulat.

    Ici il est question d'une évolution d'une solution qui fonctionne.

    Pas de remettre en cause une solution murement réfléchi.

    Je puis comprendre qu'il ne soit pas facile appréhender certains sujets mais c'est également notre travail de mettre à l'aise les novices.
    Dernière modification par Invité ; 12/05/2018 à 13h57.

  18. #18
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    Bonsoir tout le monde
    avant tout je tenais à vous remercier de porter une attention à mon problème.

    Pierre fauconner et Informer, je remets pas en cause vos réponse qui semble intéressante mais comme dis dysorthographie
    Travailler à partir d'une requête paramétrable a toujours fait partie du postulat.
    Ici il est question d'une évolution d'une solution qui fonctionne.
    Pas de remettre en cause une solution murement réfléchi.
    je voulais continuer à travailler sur une solution qui fonctionne très bien.

    dysorthographie
    J'ai rajouté ton code dans le mien (j ai changer simplement la variable l en i plus facile à lire )
    Lorsque je lance le code, il fonctionne très bien pour la première ligne mais lorsqu'il passe à la deuxième ligne, il affiche un message d'erreur
    variable objet ou variable de bloc with non definie


    ce message d'erreur s'affiche sur la ligne de code 14 (je précise encore que ce message s'affiche lorsque le code fais sa première boucle)

    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
    Set Debut = CreateObject("ADODB.Parameter") 'c'est avec l'objet Parameter que je vais reseigner les parmetres de ma requête Access.
    Debut.Name = "Debut": Debut.Type = adDate: Debut.Value = CDate(Format(ThisWorkbook.Sheets("feuil1").Range("F1").Value, "yyyy-mm-dd hh:mm")): Cm.Parameters.Append Debut
    '
    Set Fin = CreateObject("ADODB.Parameter") 'c'est avec l'objet Parameter que je vais reseigner les parmetres de ma requête Access.
    Fin.Name = "Fin": Fin.Type = adDate: Fin.Value = CDate(Format(ThisWorkbook.Sheets("feuil1").Range("F2").Value, "yyyy-mm-dd hh:mm")): Cm.Parameters.Append Fin
     
     
     With ThisWorkbook.Sheets("Feuil1")
     
        For i = 2 To .Range("A1").CurrentRegion.Rows.Count
     
     
    Set PostalCode_Debut = CreateObject("ADODB.Parameter") 'c'est avec l'objet Parameter que je vais reseigner les parmetres de ma requête Access.
    PostalCode_Debut.Name = "PostalCode_Debut": PostalCode_Debut.Type = AdString: PostalCode_Debut.Value = .Cells(i, "A").Value: Cm.Parameters.Append PostalCode_Debut
     
    Set PostalCode_Fin = CreateObject("ADODB.Parameter") 'c'est avec l'objet Parameter que je vais reseigner les parmetres de ma requête Access.
    PostalCode_Fin.Name = "PostalCode_Fin": PostalCode_Fin.Type = AdString: PostalCode_Fin.Value = .Cells(i, "B").Value: Cm.Parameters.Append PostalCode_Fin
     
     
    Set rs = Cm.Execute 'on recupere le résultat de la requête.
     .Cells(i, "C").CopyFromRecordset rs 'la on copie le résultat de la requête!
     Set Cm = Nothing
        Next
    End With
     
     
    End Sub

  19. #19
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Oui comme l'a souligné Pierre, j'avais oublié

    sql = "SELECT * FROM Requete1"
    Set Cm = CreateObject("Adodb.Command")
    Cm.CommandText = sql
    Cm.ActiveConnection = cn

    Dans la boucle.

    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
    Set Debut = CreateObject("ADODB.Parameter") 'c'est avec l'objet Parameter que je vais reseigner les parmetres de ma requête Access.
    Debut.Name = "Debut": Debut.Type = adDate: Debut.Value = CDate(Format(ThisWorkbook.Sheets("feuil1").Range("F1").Value, "yyyy-mm-dd hh:mm"))
    Set Fin = CreateObject("ADODB.Parameter") 'c'est avec l'objet Parameter que je vais reseigner les parmetres de ma requête Access.
    Fin.Name = "Fin": Fin.Type = adDate: Fin.Value = CDate(Format(ThisWorkbook.Sheets("feuil1").Range("F2").Value, "yyyy-mm-dd hh:mm"))
    With ThisWorkbook.Sheets("Feuil1")
     
        For i = 2 To .Range("A1").CurrentRegion.Rows.Count
    Set Cm = CreateObject("Adodb.Command")
    Cm.CommandText = sql 'je passe ma requête à mon objet command
    Cm.ActiveConnection = cn 'j'affecte ma connection à ma commande
     
     
    Cm.Parameters.Append Debut
    Cm.Parameters.Append Fin
     
    Set PostalCode_Debut = CreateObject("ADODB.Parameter") 'c'est avec l'objet Parameter que je vais reseigner les parmetres de ma requête Access.
    PostalCode_Debut.Name = "PostalCode_Debut": PostalCode_Debut.Type = AdString: PostalCode_Debut.Value = .Cells(i, "A").Value: Cm.Parameters.Append PostalCode_Debut
     
    Set PostalCode_Fin = CreateObject("ADODB.Parameter") 'c'est avec l'objet Parameter que je vais reseigner les parmetres de ma requête Access.
    PostalCode_Fin.Name = "PostalCode_Fin": PostalCode_Fin.Type = AdString: PostalCode_Fin.Value = .Cells(i, "B").Value: Cm.Parameters.Append PostalCode_Fin
     
     
    Set rs = Cm.Execute 'on recupere le résultat de la requête.
     .Cells(i, "C").CopyFromRecordset rs 'la on copie le résultat de la requête!
     Set Cm = Nothing
        Next
    End With
    End Sub
    Ceci dit il faut que je précise que Pierre et moi sommes sur la même longueur d'onde sur ce sujet. A savoir l' utilisation d'adodb.command et ce pas seulement pour le cas qui nous préoccupe.
    Dernière modification par Invité ; 13/05/2018 à 23h17.

  20. #20
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 951
    Points
    55 951
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par dysorthographie Voir le message
    [...]

    Ceci dit il faut que je précise que Pierre et moi sommes sur la même longueur d'onde sur ce sujet. A savoir l' utilisation d'adodb.command et ce pas seulement pour le cas qui nous préoccupe.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 30
    Dernier message: 12/05/2016, 20h57
  2. Résultat d'un champ d'une requête dans une variable
    Par PsychedeChed dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 11/01/2009, 12h50
  3. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48
  4. Réponses: 2
    Dernier message: 02/06/2006, 11h26
  5. Réponses: 4
    Dernier message: 01/12/2005, 14h36

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