Comparer 2 listes de valeur avec un critère

Bonjour,

Je souhaite comparer 2 listes de valeur selon un critère. Je m'explique, j'ai une nouvelle liste avec des données actualisées chaque mois selon leur statut : "en cours", "gagné" ou "perdu". Je souhaite afficher les projets qui sont nouvellement passés à "gagné" OU à "perdu".

Vous trouverez ci-joint la construction de mon fichier.

Je n'ai aucune idée de comment procéder, auriez-vous une idée ?

En vous remerciant pour votre aide,

Adeline

Bonjour,

Ci-joint une proposition à tester, en VBA.

Bonne journée

Bouben

Bonjour,

Salut Bouben !

Macro encore. Méthode un peu différente :

Sub ProjetsFinalisés()
    Dim d As Object, StaMod(), k, n%, i%, ws1$, ws2$
    ws1 = InputBox("Indiquer le nom de la liste de projets à vérifier.", "Feuille Mois 1")
    If ws1 = "" Then Exit Sub
    ws2 = InputBox("Indiquer le nom de la liste de projets actualisés.", "Feuille Mois 2")
    If ws2 = "" Then Exit Sub
    Set d = CreateObject("Scripting.Dictionary")
    On Error GoTo errNF1
    With Worksheets(ws1)
        On Error GoTo 0
        n = .Cells(.Rows.Count, 1).End(xlUp).Row
        For i = 2 To n
            If .Cells(i, 3) = "En cours" Then
                k = .Cells(i, 1) & Chr(160) & .Cells(i, 2)
                d(k) = ""
            End If
        Next i
    End With
    On Error GoTo errNF2
    With Worksheets(ws2)
        On Error GoTo 0
        n = .Cells(.Rows.Count, 1).End(xlUp).Row
        For i = 2 To n
            If .Cells(i, 3) <> "En cours" Then
                k = .Cells(i, 1) & Chr(160) & .Cells(i, 2)
                If d.exists(k) Then d(k) = .Cells(i, 3)
            End If
        Next i
    End With
    For Each k In d.keys
        If d(k) = "" Then d.Remove (k)
    Next k
    ReDim StaMod(1 To d.Count, 1 To 3): n = 0
    For Each k In d.keys
        n = n + 1: StaMod(n, 3) = d(k)
        StaMod(n, 2) = Split(k, Chr(160))(1)
        StaMod(n, 1) = Split(k, Chr(160))(0)
    Next k
    With Worksheets("Récap changement statut")
        n = .Cells(.Rows.Count, 1).End(xlUp).Row
        Application.ScreenUpdating = False
        If n > 1 Then .Cells(2, 1).Resize(n - 1, 3).ClearContents
        .Cells(2, 1).Resize(UBound(StaMod, 1), 3).Value = StaMod
    End With
    Exit Sub
errNF1:
    MsgBox "Le nom de la feuille Mois 1 est erroné." & Chr(10) & "Procédure interrompue.", _
     vbInformation, "Erreur de saisie"
    Exit Sub
errNF2:
    MsgBox "Le nom de la feuille Mois 2 est erroné." & Chr(10) & "Procédure interrompue.", _
     vbInformation, "Erreur de saisie"
End Sub

NB- Saisie des noms de feuille au démarrage pour rendre la procédure réutilisable...

Cordialement.

Bonjour Bouben et MFerrand,

Merci beaucoup pour vos réponses qui fonctionnent parfaitement bien. Cependant je ne maîtrise absolument pas les macros et bien que je me forme dessus, je souhaiterais dans un premier temps trouver une solution via une formule afin d'avoir la main sur ce que j'implémente dans mon fichier et pouvoir les modifier si besoin.

Auriez-vous une formule à me proposer ?

Merci beaucoup pour votre aide,

Adeline

Bonjour à tous,

Pour une solution sans VBA, je laisse la main ...

Cordialement

Bouben

Bonjour,

Quelqu'un aurait-il une solution pour moi ?

Merci,

Bonjour,

Il est toujours bon de savoir formuler pour obtenir un résultat, mais il faut être conscient que l'adaptabilité ne sera pas la même. Il te faudra reprendre les formules chaque mois (ou trouver un dispositif les rendant pérennes, mais au prix de formules plus complexes).

Un dispositif macro montre qu'on pouvait le rendre aisément durable de mois en mois... soit selon la méthode que j'ai proposée (saisie des sources par l'utilisateur), soit en portant les sources à un endroit déterminé de la feuille résultat où la macro peut les prélever.

Système formule en deux temps :

En D2 sur Liste mois2 :

=SIERREUR(SI(ET(C2<>"En cours";RECHERCHEV(A2;'Liste mois1'!$A$2:$C$16;3;FAUX)="En cours");LIGNE()-1;"");"")

A tirer vers le bas jusqu'à la fin de la liste mois 2.

On marque ainsi les projets modifiés à récupérer.

Sur la feuille résultats, en A2 :

=SIERREUR(INDEX('Liste mois2'!A$2:A$21;PETITE.VALEUR('Liste mois2'!$D$2:$D$21;LIGNE(1:1)));"")

Là, la formule est matricielle (à valider par Ctrl+Maj+Entrée).

On tire la formule sur la ligne jusqu'en C2. Puis on tire l'ensemble vers le bas.

Tous les projets finalisés s'affichent.

Je laisse à quelqu'un d'autre le soin de chercher à fusionner en une seule formule... Cela doit être faisable mais incorporer le marquage effectué par la première formule implique de ne pas formuler avec ET (qui ne supportera pas la matricialisation).

Par la suite, l'idée d'avoir les noms des feuilles sources notées dans des cellules de la feuille résultat pour y faire référence, est applicable pour rendre la formule pérenne. Elle implique l'utilisation de INDIRECT.

Cordialement et bonne continuation.

adelinev a écrit :

Bonjour Bouben et MFerrand,

Merci beaucoup pour vos réponses qui fonctionnent parfaitement bien. Cependant je ne maîtrise absolument pas les macros et bien que je me forme dessus

As-tu essayé au moins ?

Bonjour,

Merci Mferrand, je regarde, ça va bien m'aider

@patrick1957 : Oui j'ai bien sûr essayé mais mon fichier est en réalité bien plus complexe que celui envoyé, j'ai énormément de colonnes et de feuilles qui ne sont pas nommées comme telles avec un nombre d'informations à trouver beaucoup plus importantes donc le VBA proposé est très bien mais incomplet pour mon fichier et je ne sais pas le modifier comme je pourrais le faire sur des formules.

Rechercher des sujets similaires à "comparer listes valeur critere"