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 :

comparaison et agrégation (macro-excel)


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Par défaut comparaison et agrégation (macro-excel)
    Bonjour,
    Je vous explique mon problème. Je travaille donc sous excel, en fait j'ai deux fichiers de données dans deux feuilles différentes avec une colonne commune. Ce que je souhaite réalisé c'est comparer ces deux colonnes et lorsque elle sont identiques copier les données de la deuxième feuille sur la première bien évidemment sur la ligne qu'elles ont en communes. J'ai réalisé une macro qui fonctionne sur quelques lignes mais pas sur mes données réelles.(1500 lignes)
    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
     
    Sub Comparer() 
    Dim ws1 As Worksheet, ws2 As Worksheet, Maligne As Variant, Maligne2 As Variant, Macolonne As Variant, Macolonne2 As Variant, i2, i3, k, kk, z 
    Set ws1 = Worksheets(1) 
    Set ws2 = Worksheets(2) 
    Set ws3 = Worksheets(3) 
    Maligne = ws1.Range("A1").End(xlDown).Address 
    Maligne = ws1.Range(Maligne).Row 
    Maligne2 = ws2.Range("A1").End(xlDown).Address 
    Maligne2 = ws2.Range(Maligne2).Row 
    Macolonne = ws1.Range("A1").End(xlToRight).Address 
    Macolonne = ws1.Range(Macolonne).Column 
    Macolonne2 = ws2.Range("A1").End(xlToRight).Address 
    Macolonne2 = ws2.Range(Macolonne2).Column 
    With ws1 
    'on parcours la colonne dans la première feuille 
    For k = 1 To Maligne 
    z = .Range("A" & k) 
    'on parcours la colonne dans la deuxième feuille 
    For kk = 1 To Maligne2 
    'on compare avec la valeur de la première feuille 
    If ws2.Range("A" & kk) = z Then 
    i3 = Macolonne 
    'on écrit les données correspondante 
    For i2 = 2 To Macolonne2 
    i3 = i3 + 1 
    ws1.Cells(k, i3).Value = ws2.Cells(kk, i2).Value 
    Next 
    End If 
    Next 
    Next 
    End With 
    End Sub
    Je pense que ce sont surement les 3 boucles imbriquées qui posent problème. En vous remerciant
    Bonne journée

  2. #2
    Membre expérimenté
    Inscrit en
    Février 2008
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 208
    Par défaut
    bonjour

    j'ai testé sur le fichier joint. Ceci devrait répondre à ton problème
    http://http://cjoint.com/?eipO4TJm7C
    contacte moi si tu souhaites des éclaircissements
    à plus

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Par défaut
    Et ceci ? (pas testé, et j'ai pas l'habitude de travailler avec des Range, mais bon...)
    Par contre attention, il faut que la colonne "commune" ait des identifiants uniques, sinon... ça se complique.

    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
     
    Sub Comparer() 
    Dim ws1 As Worksheet, ws2 As Worksheet, Maligne As Variant, Maligne2 As Variant, Macolonne As Variant, Macolonne2 As Variant, i2, i3, k, kk, z 
    Set ws1 = Worksheets(1) 
    Set ws2 = Worksheets(2) 
    Set ws3 = Worksheets(3) 
    Maligne = ws1.Range("A1").End(xlDown).Address 
    Maligne = ws1.Range(Maligne).Row 
    Maligne2 = ws2.Range("A1").End(xlDown).Address 
    Maligne2 = ws2.Range(Maligne2).Row 
    Macolonne = ws1.Range("A1").End(xlToRight).Address 
    Macolonne = ws1.Range(Macolonne).Column 
    Macolonne2 = ws2.Range("A1").End(xlToRight).Address 
    Macolonne2 = ws2.Range(Macolonne2).Column 
    With ws1 
    'on parcours la colonne dans la première feuille 
    For k = 1 To Maligne 
       z = ws1.Range("A" & k).Value 
       'on parcours la colonne dans la deuxième feuille 
       For kk = 1 To Maligne2 
          'on compare avec la valeur de la première feuille 
          If ws2.Range("A" & kk).Value = z Then 
             'i3 = Macolonne (ligne inutile)
             'on écrit les données correspondantes 
             For i2 = 2 To Macolonne2 
                'i3 = i3 + 1 (ligne inutile)
                ws1.Cells(k, i2).Value = ws2.Cells(kk, i2).Value 
             Next 
             Exit for 'inutile de continuer à boucler quand la correspondance a été trouvée
          End If 
       Next 
    Next 
    End With 
    End Sub

    Edit :
    Je ne comprends pas bien ce que tu voulais faire avec la ligne :
    Tu voulais rajouter les données de la feuille 2 à la suite de celles de la feuille 1 ? Ou tu préfèrerais les écraser (ce que fait mon code) ?

  4. #4
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Par défaut
    Citation Envoyé par neupont Voir le message
    Edit :
    Je ne comprends pas bien ce que tu voulais faire avec la ligne :
    Tu voulais rajouter les données de la feuille 2 à la suite de celles de la feuille 1 ? Ou tu préfèrerais les écraser ?
    Bien vu, en fait je veux rajouter les données de la feuille 2 à la suite de la feuille 1. Les données de la première colonne sont des codes de commune d'une région(il y'en a 1500 et des brouettes) et la ligne que tu ne comprends pas en fait je réinitialise i3 pour me retrouvé à chaque fois à rajouter les données dans la même colonne. Je vais tester ta macro Le Pierre et je vous tiens au courant.
    Merci pour vos réponse rapide

  5. #5
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Par défaut
    Arf ca ne marche pas, en fait sa donne le même résultat que ma macro, il copie juste la première ligne à la suite dans la feuille1 et il s'arrête la.

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Par défaut
    Un truc tout con, il faudrait sans doute mettre Next k et next kk, plutôt que next tout court. A part ça ta macro a l'air bien.

    Edit : sans oublier next i2.
    Tu devrais indenter ton code, quand on fait des boucles imbriquées c'est quand même plus clair.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Par défaut
    Et bien nan j'ai rajouté les next k, kk et i2 et ta sortie de boucle. et toujours pareil il me copie que la première ligne, j'avoue que je comprends pas vu que sa marche sur un plus petit fichier... C'est à se tirer une balle...

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Par défaut
    Bizarre, quand je teste ton code à peine modifié avec ce qu'on a dit ça fonctionne chez moi (1600 lignes) :
    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
     
    Sub Comparer()
    Dim ws1 As Worksheet, ws2 As Worksheet, Maligne As Variant, Maligne2 As Variant, Macolonne As Variant, Macolonne2 As Variant, i2, i3, k, kk, z
    Set ws1 = Worksheets(1)
    Set ws2 = Worksheets(2)
    Set ws3 = Worksheets(3)
    Maligne = ws1.Range("A1").End(xlDown).Address
    Maligne = ws1.Range(Maligne).Row
    Maligne2 = ws2.Range("A1").End(xlDown).Address
    Maligne2 = ws2.Range(Maligne2).Row
    Macolonne = ws1.Range("A1").End(xlToRight).Address
    Macolonne = ws1.Range(Macolonne).Column
    Macolonne2 = ws2.Range("A1").End(xlToRight).Address
    Macolonne2 = ws2.Range(Macolonne2).Column
    With ws1
    'on parcours la colonne dans la première feuille
    For k = 1 To Maligne
        z = .Range("A" & k)
        'on parcours la colonne dans la deuxième feuille
        For kk = 1 To Maligne2
            'on compare avec la valeur de la première feuille
            If ws2.Range("A" & kk) = z Then
                i3 = Macolonne
                'on écrit les données correspondante
                For i2 = 2 To Macolonne2
                    i3 = i3 + 1
                    ws1.Cells(k, i3).Value = ws2.Cells(kk, i2).Value
                Next i2
            Exit For
            End If
        Next kk
    Next k
    End With
    End Sub

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Par défaut
    Par contre c'est très lent avec deux fois 1600 lignes... il y a certainement moyen de faire bien plus rapide avec la commande Find.

  10. #10
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Bonjour tlm,

    Ci-dessous le code un peu nettoyé
    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
    Sub Comparer()
    Dim Ws1 As Worksheet, Ws2 As Worksheet
    Dim Lig1 As Integer, Lig2 As Integer, Col2 As Integer
    Dim i As Integer, k As Integer, kk As Integer
     
    Set Ws1 = Worksheets(1)
    Set Ws2 = Worksheets(2)
     
    Lig1 = Ws1.Range("A1").End(xlDown).Row
    Lig2 = Ws2.Range("A1").End(xlDown).Row
    Col2 = Ws2.Range("A1").End(xlToRight).Column
     
    For k = 1 To Lig1
       For kk = 1 To Lig2
          If Ws2.Cells(kk, 1) = Ws1.Cells(k, 1) Then
             For i = 2 To Col2
                Ws1.Cells(k, i) = Ws2.Cells(kk, i)
             Next
             GoTo suite
          End If
       Next
    suite:
    Next
    End Sub
    Je reviens avec une solution adoptant la fonction Find qui comme le dit très bien Neupont, sera bcp plus rapide

  11. #11
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Ci-dessous le code avec la fonction Find
    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
    Sub Comparer()
    Dim Ws1 As Worksheet, Ws2 As Worksheet
    Dim Lig1 As Integer, Col2 As Integer ,k As Integer
     
    Set Ws1 = Worksheets(1)
    Set Ws2 = Worksheets(2)
     
    Lig1 = Ws1.Range("A1").End(xlDown).Row
    Col2 = Ws2.Range("A1").End(xlToRight).Column
     
     
     
    For k = 1 To Lig1
        Set c = Ws2.Range("A:A").Find(what:=Ws1.Cells(k, 1), lookat:=xlWhole)
            If Not c Is Nothing Then
                Ws2.Range(Cells(c.Row, 2).Address & ":" & Cells(c.Row, Col2).Address).Copy Ws1.Cells(k, 2)
            End If
    Next
    End Sub

  12. #12
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Par défaut
    Le code avec la fonction Find marche nikel, seulement j'aimerais que les cellules que l'on copie soit écrit dans les premières colonnes vides dans la feuille 1. Parce que là sa m'écrase des données de la feuille1 que je souhaite conserver. Je suis en train de cherché mais j'essaye déjà de comprendre comment fonctionne Find.
    Encore une fois merci à tous pour votre aide

  13. #13
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Par défaut
    Et ben voilà c'est bon suffit de trouvé la dernière colonne vide de la feuille 1 et de changé en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Copy Ws1.Cells(k,Col1+1)
    Merci bien

  14. #14
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Re,

    Essaye comme ceci pour inscrire les données dans les colonnes vides, en supposant que toutes tes lignes ont le même nombre de colonne comportant des données
    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
    Sub Comparer()
    Dim Ws1 As Worksheet, Ws2 As Worksheet
    Dim Lig1 As Integer, Col1 As Integer, Col2 As Integer, k As Integer
     
    Set Ws1 = Worksheets(1)
    Set Ws2 = Worksheets(2)
     
    Lig1 = Ws1.Range("A1").End(xlDown).Row
    Col1 = Ws2.Range("A1").End(xlToRight).Offset(0, 1).Column
    Col2 = Ws2.Range("A1").End(xlToRight).Column
     
     
     
    For k = 1 To Lig1
        Set c = Ws2.Range("A:A").Find(what:=Ws1.Cells(k, 1), lookat:=xlWhole)
            If Not c Is Nothing Then
                Ws2.Range(Cells(c.Row, 2).Address & ":" & Cells(c.Row, Col2).Address).Copy Ws1.Cells(k, Col1)
            End If
    Next
    End Sub
    Edit : oui ta solution est bonne aussi

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

Discussions similaires

  1. [XL-2010] comparaison des cellules VBA (MAcro Excel)
    Par developpeur82 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 31/08/2012, 12h20
  2. Macro Excel : Comparaison de 2 feuilles
    Par michaeljeru dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 19/10/2010, 17h21
  3. [macro Excel]
    Par Mugette dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/09/2005, 09h54
  4. débutant en VBA je n'arrive pas à finir ma macro excel
    Par jeanpierreco dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 19/01/2005, 12h20
  5. Porter une macro Excel vers OpenOffice
    Par totofweb dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 13/07/2004, 13h20

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