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

Macros et VBA Excel Discussion :

SQL dans VBA sous Excel (Classeur fermé) [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Mai 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 66
    Points : 56
    Points
    56
    Par défaut SQL dans VBA sous Excel (Classeur fermé)
    Bonjour à tous,

    Je cherche à lier deux fichiers excel via des requêtes SQL programmé sous VBA. J'ai, grâce au tutoriel de SilkyRoad, réussi à aller les chercher les données dans un classeur fermé grace à ces requêtes mais maintenant je voudrais pouvoir lier deux classeurs fermés et rassembler les données ensembles. et faire la somme par ID.

    Donc j'ai un autre classeur qui se nomme auto1 dont je veux assembler avec le classeur auto ci-dessous dans le code.

    Merci pour votre aide


    Voila mon programme que j'ai pour l'instant pour la lecture du premier classeur auto:

    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
     
     
    Sub Loading_players()
     
    class = "C:\Bibliothèques\Documents\auto.xlsx"
     
    'Permet d'enlever les espaces et les "é" accent dans les en-tête pour les définir comme clefs en SQL
    Set wb = Workbooks.Open(class)
     For i = 1 To 50
        Sheets(1).Cells(1, i) = Replace(Sheets(1).Cells(1, i), " ", "_")
        Sheets(1).Cells(1, i) = Replace(Sheets(1).Cells(1, i), "é", "e")
     Next
     wb.Save
     wb.Close
     
        Dim Cn As ADODB.Connection
        Dim Fichier As String
        Dim NomFeuille As String, TxtSQL As String
        Dim Rst As ADODB.Recordset
     
        'Définit le classeur fermé servant de base de données
        Fichier = "C:\Bibliothèques\Documents\auto.xlsx"
     
        'Nom de la feuille dans le classeur fermé
        NomFeuille = "auto"
     
        Set Cn = New ADODB.Connection
     
        '--- Connexion ---
        With Cn
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
                & Fichier & ";Extended Properties=""Excel 12.0;HDR=YES;"""
            .Open
        End With
        '-----------------
        '
    'Définit la requête.
        '/!\ Attention à ne pas oublier le symbole $ après le nom de la feuille.
     
        TxtSQL = "SELECT ID_joueur, SUM(Nom_points_gagnés), SUM(Nombre_points_perdus) FROM [" & NomFeuille & "$], GROUP BY ID_joueur"
     
        Set Rst = New ADODB.Recordset
        Set Rst = Cn.Execute(TxtSQL)
     
     
        'Ecrit le résultat de la requête dans la cellule A1
        Feuil11.Range("A1").CopyFromRecordset Rst
     
        '--- Fermeture connexion ---
        Cn.Close
        Set Cn = Nothing
     
    End Sub

  2. #2
    Invité
    Invité(e)
    Par défaut Bonjour, regardes ç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
    'Nom de la feuille dans le classeur fermé
    FichierCible = "C:\MyTest\Classeur3.xlsx"
    FichierSource = "C:\MyTest\Classeur2.xlsx"
    NomFeuille = "Feuil1"
    Set Cn = New ADODB.Connection
    '--- Connexion ---
    With Cn
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
        & FichierCible & ";Extended Properties=""Excel 12.0;HDR=YES;"""
        .Open
    End With
    Sql = "INSERT INTO [" & NomFeuille & "$]   SELECT * FROM  [" & NomFeuille & "$] IN '" & FichierSource & "' 'Excel 12.0;';"
    Cn.Execute Sql
    Sql = "SELECT * FROM  [" & NomFeuille & "$] as rr INNER JOIN (SELECT * FROM  [" & NomFeuille & "$] IN '" & FichierSource & "' 'Excel 12.0;') as frm on frm.Champ1=rr.Champ1;"
    Set Rst = Cn.Execute(Sql)
    ActiveCell.CopyFromRecordset Rst
    Dernière modification par Invité ; 29/07/2014 à 12h48.

  3. #3
    Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Mai 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 66
    Points : 56
    Points
    56
    Par défaut
    Le problème est que la macro ne se trouve pas dans le même classeur que les deux où je vais chercher les données.

    J'ai un classeur Base.xlsm avec cette macro et les deux autres classeurs dans un autre dossier. Ils sont identiques (en-tête de colonne) les deux classeurs.
    Ce que je veux c'est quand je lance la macro de mon ficher Base.xlsm, cela va chercher les données dans les deux classeurs les regroupes par l'ID des joueurs et somme à chaque fois quand il y a des id identiques les points gagnés et perdus. Sachant que dans un même classeur il peut également y avoir deux fois le même ID.

    Ouai je sais je suis compliqué ahah

    Merci pour votre aide

  4. #4
    Invité
    Invité(e)
    Par défaut
    je te rappels que les fichiers xlsx ("C:\MyTest\Classeur3.xlsx" et "C:\MyTest\Classeur2.xlsx") ne peuvent pas contenir de macro; donc je vais bien récupérer des données dans d’autre classeurs que le xlsm!

  5. #5
    Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Mai 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 66
    Points : 56
    Points
    56
    Par défaut
    Oui c'est pas faux, mais j'obtient pas les bonnes choses quand même. Cela m'affiche la table de mon premier fichier et ensuite que les id des joueurs en dessous sans le regroupement par id des joueurs et sommes de leurs points

  6. #6
    Invité
    Invité(e)
    Par défaut
    Dans mon exemple on voie bien que je me conect a un ficher xlsx en effectuant un lien avec un autre.

    Maintenant toujours dan mon exemple j'ai renomé les tabe en rr et frm.

    Dans ta requête tu dois faire référence a ces table sum(rr.score) as equipe1,sum(frm.score) as equipe2

  7. #7
    Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Mai 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 66
    Points : 56
    Points
    56
    Par défaut
    Bon j'ai bien essayé de tourner la chose dans tous les sens mais en fait quand je fais cela, ça change les données dans mes fichiers xlsx et je ne veux pas qu'elles changent ...

    Voila le code que j'ai essayé de refaire du coup mais ça me met une erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        TxtSQL = "SELECT ID_joueur, Points_gagnes, Points_perdus FROM [" & NomFeuille & "$] UNION ALL SELECT ID_joueur, Points_gagnes, Points_perdus FROM [" & NomFeuille2 & "$] IN '" & Fichier2 & "' 'Excel 12.0;' GROUP BY ID_joueur;"
    Cela me met comme erreur que "Points_gagnes" ne fait pas partie de la fonction d'agrégat
    Erreur d'exécution '-2147217887 (80040e21)':

  8. #8
    Invité
    Invité(e)
    Par défaut Bonjour,test ça
    j'ai test comme toujours!
    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
    Sub Test()
    'Nom de la feuille dans le classeur fermé
    Fichier1 = "C:\MyTest\Classeur3.xlsx"
    Fichier2 = "C:\MyTest\Classeur2.xlsx"
    NomFeuille2 = "Feuil2"
    Set Cn = New ADODB.Connection
    '--- Connexion ---
    With Cn
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
        & Fichier1 & ";Extended Properties=""Excel 12.0;HDR=YES;"""
        .Open
    End With
        TxtSQL = "SELECT  frm3.ID_joueur,sum(frm3.Points_gagnes),sum(frm3.Points_perdus) FROM "
        TxtSQL = TxtSQL & "(SELECT  frm1.ID_joueur,frm1.Points_gagnes,frm1.Points_perdus FROM [" & NomFeuille2 & "$] as frm1 "
        TxtSQL = TxtSQL & "UNION ALL  "
        TxtSQL = TxtSQL & "select frm2.ID_joueur, frm2.Points_gagnes, frm2.Points_perdus from (SELECT  * FROM [" & NomFeuille2 & "$] IN '" & Fichier2 & "' 'Excel 12.0;') as frm2) as frm3 "
        TxtSQL = TxtSQL & "Group BY  frm3.ID_joueur;"
        Set Rst = Cn.Execute(TxtSQL)
        ActiveCell.CopyFromRecordset Rst
    End Sub

  9. #9
    Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Mai 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 66
    Points : 56
    Points
    56
    Par défaut
    Merci c'est impeccable

  10. #10
    Invité
    Invité(e)
    Par défaut
    il faut dire que tu as commencé par le plus simple

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/10/2008, 17h37
  2. Réponses: 5
    Dernier message: 27/05/2008, 18h43
  3. ouvrir un fichier dans un programme VBA sous excel
    Par bryan dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 17/01/2008, 14h38
  4. Critère SQL en VBA sous Excel
    Par ShAk44 dans le forum Excel
    Réponses: 6
    Dernier message: 10/07/2007, 12h38
  5. PW perdu dans code VBA sous Excel ?
    Par electrosat03 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/01/2007, 22h32

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