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 :

Macro Excel : Comparaison de 2 feuilles


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 340
    Par défaut Macro Excel : Comparaison de 2 feuilles
    "Bonjour"

    Voilà, je souhaite faire une macro Excel me permettant de comparer 2 onglets excel d'une semaine d'écart (2 exports de ma base clients) et m'affiche les nouveaux clients dans un 3ème onglet.
    Je précise que je suis débutant en VB.

    En cherchant sur le net et en bricolant un peu, voila ce que j'ai fait :
    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
     
    //MACRO DELTA
    Sub delta()
    Classeur = Application.GetOpenFilename("Classeurs Excel,*.xls")
    If Classeur = False Then Exit Sub
    Workbooks.Open Filename:=Classeur
      Windows("Classeur1.xls").Activate
        Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet, i1, i2, i3, k, kk
     
        Set ws1 = Worksheets(1)
        Set ws2 = Worksheets(2)
        i1 = ws1.Range("A1").End(4).Row
     
        i2 = ws2.Range("A1").End(4).Row
        Sheets.Add After:=Sheets(Worksheets.Count)
        Set ws3 = Worksheets(3)
        i3 = 0
        With ws1
          For k = 1 To i1
            mat1 = .Range("A" & k)
            For kk = 1 To i2
             mat2 = ws2.Range("A" & kk)
             z2 = ws2.Range("A" & kk).Columns
                If mat2 <> mat1 Then
                    ws3.Range("A" & i3 + 1) = z2
                    i3 = i3 + 1
                End If
            Next
     
        Next
        End With
    End Sub
    Mes valeurs de tests sont (chq valeur est sur une ligne différente) :
    Feuille 1 : toto tata titi
    Feuille 2 : toto tutu tete

    Le résultat que j'obtiens :
    Feuille 3 : tutu tete toto tutu tete toto tutu tete

    Le résultat que je voudrais obtenir :
    Feuille 3 : tutu tete


    En gros, l'algorithme que je cherche à mettre en place est :
    Pour chaque client c dans Feuille 2
    si c est dans Feuille 1
    alors rien
    sinon
    copier c dans Feuille 3
    Merci pour votre aide

  2. #2
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Edit
    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
    Sub Delta()
    Dim wbk As Workbook
    Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet
    Dim Classeur As Variant
    Dim LastLig1 As Long, LastLig2 As Long, i As Long
    Dim c As Range
     
    Application.ScreenUpdating = False
    Classeur = Application.GetOpenFilename("Classeurs Excel,*.xls")
    If Classeur <> False Then
        Set wbk = Workbooks.Open(Classeur)
        Set ws1 = wbk.Worksheets(1)
        Set ws2 = wbk.Worksheets(2)
        LastLig1 = ws1.Cells(Rows.Count, 1).End(xlUp).Row
        LastLig2 = ws2.Cells(Rows.Count, 1).End(xlUp).Row
     
        Set ws3 = wbk.Sheets.Add(After:=wbk.Sheets(Worksheets.Count))
        For i = 1 To LastLig2
            Set c = ws1.Range("A1:A" & LastLig1).Find(ws2.Range("A" & i).Value, lookat:=xlWhole)
            If c Is Nothing Then ws2.Range("A" & i).Copy ws3.Cells(Rows.Count, 1).End(xlUp)(2)
        Next i
        Set ws3 = Nothing
        Set ws2 = Nothing
        Set ws1 = Nothing
        wbk.Save
        wbk.Close
        Set wbk = Nothing
    End If
    End Sub

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 340
    Par défaut
    Mercatog, tu reprends une fonction la fonction Find que j'ai déjà trouvée auparavant, sans réussir à la faire fonctionner. Donc ça devrait me plaire.

    Par contre, il y a un message d'erreur incompréhensible sur la ligne : "If c is nothing Then c.copy(...)"

    Erreur d'exécution '91' :

    Variable objet ou variable de bloc With non définie

  4. #4
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    J'ai édité ma réponse. désolé

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 340
    Par défaut
    Ok, merci, ça marche. J'ai juste la première cellule qui est vide, je ne sais pas pourquoi.

    j'essaye d'aller plus loin maintenant, et de récupérer non pas la seule 1ère colonne, mais les lignes entières concernées.

    j'ai donc modifié la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If c Is Nothing Then ws2.Range("A1:E" & i).Copy ws3.Cells(Rows.Count, 1).End(xlUp)(2)
    afin d'atteindre jusqu'à la colonne E

    Mais j'obtient un résultat inexact :
    (toujours une ligne vide)
    toto 1 2 3 4
    tutu 2 3 4 5
    toto 1 2 3 4
    tutu 2 3 4 5
    tete 3 4 5 6
    au lieu de

    tutu 2 3 4 5
    tete 3 4 5 6

  6. #6
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Edit: Si tu as des doublons sur la feuille 2
    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
    Sub Delta()
    Dim wbk As Workbook
    Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet
    Dim Classeur As Variant
    Dim LastLig1 As Long, LastLig2 As Long, i As Long, k As Long
    Dim c As Range, v As Range
     
    Application.ScreenUpdating = False
    Classeur = Application.GetOpenFilename("Classeurs Excel,*.xls")
    If Classeur <> False Then
        Set wbk = Workbooks.Open(Classeur)
        Set ws1 = wbk.Worksheets(1)
        Set ws2 = wbk.Worksheets(2)
        LastLig1 = ws1.Cells(Rows.Count, 1).End(xlUp).Row
        LastLig2 = ws2.Cells(Rows.Count, 1).End(xlUp).Row
     
        Set ws3 = wbk.Worksheets.Add(After:=wbk.Sheets(wbk.Worksheets.Count))
        For i = 1 To LastLig2
            Set c = ws1.Range("A1:A" & LastLig1).Find(ws2.Range("A" & i).Value, lookat:=xlWhole)
            If c Is Nothing Then
            Set v = ws3.Columns(1).Find(ws2.Range("A" & i).Value, lookat:=xlWhole)
            If v Is Nothing Then
                k = k + 1
                ws2.Range("A" & i & ":E" & i).Copy ws3.Range("A" & k)
                End If
            End If
            Set v = Nothing
        Next i
        Set c = Nothing
        Set ws3 = Nothing
        Set ws2 = Nothing
        Set ws1 = Nothing
        wbk.Save
        wbk.Close
        Set wbk = Nothing
    End If
    End Sub

Discussions similaires

  1. Macro excel pour toutes les feuilles du classeur
    Par duffie34 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 28/03/2013, 12h55
  2. comparaison et agrégation (macro-excel)
    Par noobynoob dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 09/04/2008, 09h12
  3. VBA-Excel Comparaison 2 feuilles
    Par PiuPiu dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 15/10/2007, 18h05
  4. Macro VBA Excel : Comparaison des deux 1ères colonnes de 2 fichiers Excel
    Par techneric dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/01/2007, 10h00
  5. VBA - Excel - comparaison de deux feuilles
    Par toto14 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 13/10/2006, 13h52

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