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

Macros et VBA Excel Discussion :

Requête SQL avec écriture dans fichier Excel = trop long


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Requête SQL avec écriture dans fichier Excel = trop long
    Bonjour tout le monde !
    J'aimerais solliciter votre aide pour tenter d'optimiser mon code.

    BESOIN :
    Je dois a partir de plusieurs requetes SQL récupérer des données issu d'un fichier excel pour les retranscrire dans un autre fichier excel... Données brutes > Données mises en formes

    EXISTANT:
    J'ai un fichier excel avec 30 colonnes et un maximum de 400 lignes en gros sur une année.
    J'effectue des requetes SQL pour récupérer des informations sur ces 400 lignes (compter le nombre d’occurrence basées sur certains critères, etc ...
    Ex. Sur ces 400 lignes j'ai pour le mois de janvier 5 ventes de l'article A, 3 de l'article B ... en février 2 vente de l'article A, 0 de l'article B et 1 de l'article C ... etc

    Je compte donc le nombre de ventes de l'article A avec comme critère "JANVIER", puis "FEVRIER" etc ... et ces 5 lignes je les regroupes en une seule pour obtenir le tableau suivant :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MOIS      | ARTICLE | QTE
    JANVIER | ARTICLE A | QTE
    JANVIER | ARTICLE B | QTE
    FEVRIER | ARTICLE A | QTE
    FEVRIER | ARTICLE C | QTE


    Seulement voilà ... quand je fais ça je boucle sur mes réulstats SQL

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    sql = "SELECT * FROM [TEST$] WHERE MOIS = 1"
    Set rs = cn.Execute(sql)
    i = 2
    Do
      Sheets("TEST").Range("A" & i).Value = rs(0)
      [...]
      rs.Movenext
    Loop Until rs.EOF
    [...]


    Et le fait de mettre les données en retour dans les cellules cela prend un temps inconsidérable.


    HELP:

    J'ai certainement des lacunes en VBA du coup je vous solicite pour connaitre finalement une méthode rapide et fiable pour effectuer ce type d'opération.
    J'avais opter pour une solution alternative sans SQL ... avec des =SOMMEPROD() ... etc mais pareil je me retrouvais avec des formules partout qui alourdissait considérablement le fichier et son traitement !
    Comme certain produit ne sont pas toujours vendu le mois donnée ... j'étais partit sur :
    Lister tous les articles en ventes par mois
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    JANVIER | ARTICLE A
    JANVIER | ARTICLE B
    JANVIER | ARTICLE C
    JANVIER | ARTICLE D
    FEVRIER | ARTICLE A
    FEVRIER | ARTICLE B
    FEVRIER | ARTICLE C
    FEVRIER | ARTICLE D
    MARS     | ARTICLE A
    MARS     | ARTICLE B
    ...          | ...


    Ajouter sur chaque ligne les formules excel SOMMEPROD etc ... et supprimer ensuite les ligne donc les ventes sont = 0 pour n'avoir que les articles vendu ! ...

    C'est lourd et très complexe à gérer ... je suis donc partit sur du SQL

    Merci pour votre aide sur ce sujet épineux !
    Excellente journée

  2. #2
    Membre confirmé
    bonjour,
    voila qui devrait allé plus vite!
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
     Sheets("TEST").Range("A2").CopyFromRecordset cn.Execute(Sql)


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub test()
    With Sheets("Resultat")
        .Range(.Range("A2"), .Cells(.Rows.Count, "C").End(xlUp)).Clear
    End With
    With CreateObject("AdoDB.Connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=YES;"""
          Sql = "Select MOIS,ARTICLE,sum(Nb) as QTS from [TEST$] group by  MOIS,ARTICLE"
        Sheets("Resultat").Range("A2").CopyFromRecordset .Execute(Sql)
        .Close
    End With
    End Sub