Comparer des valeurs et les incrémenter dans une autre feuille

Bonjour à toutes et tous,

Je suis totalement novice avec VBA et je dois réaliser un script qui au départ me parraissait simple, mais qui finalement s'avère plus compliqué qu'espéré.

(Vous trouverez un exemple du fichier en pièce jointe.)

Grossomodo je cherche a écrire un script qui va parcourir la feuille "Initial", lire la colonne "Resultat" et en fonction de si c'est "OK" ou "NOK", incrémenter la feuille "Final" avec le bon résulat.

En effet, si deux "Test" pour un seul "Req" (colonne ID2) sont l'un "OK" et l'autre "NOK", le "Resultat final" dans la feuille "Final" doit être "NOK". En revanche si il y a deux "OK", le résultat sera bien entendu "OK" dans la feuille "Final".

Voilà, j'espère avoir été clair. Je ne sais pas vraiment comment m'y prendre pour faire ces comparaison en VBA et en fonction des valeurs "OK" ou "NOK" en déduire un résultat et en même temps récupérer les deux première colonnes "ID" et "ID2" pour les insérer au bon endroit dans la feuille "Final", et tout ça de façon dynamique pour X tests et X Req.

Merci d'avance, j'espère que vous pourrez m'aider et je reste à votre disposition si il est nécessaire d'éclaircir certains points :) .

Pierre

11exemple1.xlsx (10.77 Ko)

Bonjour et bienvenue sur le forum

Un essai à tester, si cela est toujours d'actualité.

Cela te convient-il ?

22exemple1-v1.xlsm (24.03 Ko)

Bye !

Bonsoir à tous !

Une proposition via Power Query :

3pierro31-pq.xlsx (27.38 Ko)

Merci pour vos réponses, j'ai pu récupérer vos codes et les modifiés afin de bien comprendre leurs fonctionnement.

Ca m'a beaucoup aidé :)

Bonjour à tous !

Parfait !

N'oubliez pas de passer le sujet en mode résolu !

Bonjour à tous,

Désolé JFL j'ai oublié de notifier le sujet comme résolu mais visiblement cela va me servir.

En effet, cela fait maintenant quelques temps que je modifie la macro de @gmb afin d'intégrer de nouvelles possibilités, malheureusement je galère sur un point en particulier et après plusieurs semaines de recherches et d'essais, je me lance enfin sur ce forum par désespoir.

A présent il existe d'autres possibilités comme résultat final et comme tests : POK & NR.

Néanmoins je me heurte à un souci (outre le fait que mon code ne soit absolument pas ergonomique ni optimisé), je souhaite que lorsqu'un NR est présent avec un OK dans la colonne des tests, le résultat doit être POK, mais je veux aussi que si un OK seul est détecté, celui-ci soit OK dans la colonne des résultats, or ce n'est pas le cas et c'est un POK qui est incrémenté.

Comment puis-je résoudre ce souci ? Mon code n'est peut-être pas adapté à ce type de fonctionnement avec plusieurs possibilités ?

Merci d'avance à ceux qui pourraient m'aider, je suis conscient que mon souci n'est pas très simple à comprendre ni à résoudre, enfin je crois ... :D

Pierro

Sub SRD_Final()

    Sheets(srd).Select

    Set fi = Sheets(srd)
    tablo = fi.Range(first_value).CurrentRegion
    Set dico = CreateObject("Scripting.Dictionary")
    ReDim tabloR(1 To UBound(tablo, 1), 1 To UBound(tablo, 2) + 1)

    'On teste chaque posisiblité
    For i = 2 To UBound(tablo, 1)
        If dico.exists(tablo(i, 2)) Then
            If tablo(i, test_column) = "NR" Then
                dico(tablo(i, 2)) = 7
            End If
        Else
            dico(tablo(i, 2)) = IIf(tablo(i, test_column) = "", 7, 7)
        End If
    Next i

    For i = 2 To UBound(tablo, 1)
        If dico.exists(tablo(i, 2)) Then
            If tablo(i, test_column_title) = "" Then
                dico(tablo(i, 2)) = 7
            End If
        End If
    Next i

    For i = 2 To UBound(tablo, 1)
        If dico.exists(tablo(i, 2)) Then
            If tablo(i, test_column) = "OK" Then
                dico(tablo(i, 2)) = 1
            End If
        Else
            dico(tablo(i, 2)) = IIf(tablo(i, test_column) = "POK", 2, 1)
        End If
    Next i

    For i = 2 To UBound(tablo, 1)
        If dico.exists(tablo(i, 2)) Then
            If tablo(i, test_column) = "OK" Then
                dico(tablo(i, 2)) = 1
            End If
        Else
            dico(tablo(i, 2)) = IIf(tablo(i, test_column) = "NOK", 3, 1)
        End If
    Next i

    For i = 2 To UBound(tablo, 1)
        If dico.exists(tablo(i, 2)) Then
            If tablo(i, test_column) = "OK" Then
                dico(tablo(i, 2)) = 1
            End If
        Else
            dico(tablo(i, 2)) = IIf(tablo(i, test_column) = "", 1, 7)
        End If
    Next i

    For i = 2 To UBound(tablo, 1)
        If dico.exists(tablo(i, 2)) Then
            If tablo(i, test_column) = "NR" Then
                dico(tablo(i, 2)) = 7
            End If
        Else
            dico(tablo(i, 2)) = IIf(tablo(i, test_column) = "OK", 2, 1)
        End If
    Next i

    For i = 2 To UBound(tablo, 1)
        If dico.exists(tablo(i, 2)) Then
            If tablo(i, test_column) = "POK" Then
                dico(tablo(i, 2)) = 2
            End If
        Else
            dico(tablo(i, 2)) = IIf(tablo(i, test_column) = "NOK", 3, 2)
        End If
    Next i

    For i = 2 To UBound(tablo, 1)
        If dico.exists(tablo(i, 2)) Then
            If tablo(i, test_column) = "POK" Then
                dico(tablo(i, 2)) = 2
            End If
        Else
            dico(tablo(i, 2)) = IIf(tablo(i, test_column) = "", 2, 7)
        End If
    Next i

    For i = 2 To UBound(tablo, 1)
        If dico.exists(tablo(i, 2)) Then
            If tablo(i, test_column) = "POK" Then
                dico(tablo(i, 2)) = 2
            End If
        Else
            dico(tablo(i, 2)) = IIf(tablo(i, test_column) = "NR", 2, 2)
        End If
    Next i

    For i = 2 To UBound(tablo, 1)
        If dico.exists(tablo(i, 2)) Then
            If tablo(i, test_column) = "NOK" Then
                dico(tablo(i, 2)) = 3
            End If
        Else
            dico(tablo(i, 2)) = IIf(tablo(i, test_column) = "", 3, 7)
        End If
    Next i

    For i = 2 To UBound(tablo, 1)
        If dico.exists(tablo(i, 2)) Then
            If tablo(i, test_column) = "NOK" Then
                dico(tablo(i, 2)) = 3
            End If
        Else
            dico(tablo(i, 2)) = IIf(tablo(i, test_column) = "NR", 3, 3)
        End If
    Next i

    For i = 2 To UBound(tablo, 1)
        If dico.exists(tablo(i, 2)) Then
            If tablo(i, test_column) = "OK" Then
                dico(tablo(i, 2)) = 2
            End If
        Else
            dico(tablo(i, 2)) = IIf(tablo(i, test_column) = "NR", 2, 1)
        End If
    Next i

    'Détermination du résultat final
    For i = 2 To UBound(tablo, 1)
        For j = 1 To UBound(tablo, 2)
            If j = 3 Then
                If dico(tablo(i, 2)) = 1 Then
                    tabloR(i - 1, j) = "OK"
                ElseIf dico(tablo(i, 2)) = 2 Then
                    tabloR(i - 1, j) = "POK"
                ElseIf dico(tablo(i, 2)) = 3 Then
                    tabloR(i - 1, j) = "NOK"
                ElseIf dico(tablo(i, 2)) = 7 Then
                    tabloR(i - 1, j) = ""
                End If
            Else
                tabloR(i - 1, j) = tablo(i, j)
            End If
        Next j
    Next i

    Range("A1").CurrentRegion.Offset(1, 0).ClearContents
    Range("A1").CurrentRegion.Offset(1, 0).UnMerge
    Range("A2").Resize(UBound(tabloR, 1), UBound(tabloR, 2)) = tabloR

    'Petits ajustements
    'Ajout du nom Final Status et suppression du PC en trop
    Application.Range("C3").Value = "Final status"
    'Application.Range("C3").Value = ""

    'Mise en forme
    Dim Derligne As Integer
    Dim Cel As Range
    Derligne = Cells(Rows.Count, 8).End(xlUp).Row
    For Each Cel In Range("C4:C" & Derligne)
        If Cel = "OK" Then
            With Cel.Offset(, 0)
            .Interior.Color = 5287936
            .Borders.ColorIndex = 1
            .Borders.Weight = xlMedium
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlCenter
            End With
        ElseIf Cel = "POK" Then
            With Cel.Offset(, 0)
            .Interior.ColorIndex = 44
            .Borders.ColorIndex = 1
            .Borders.Weight = xlMedium
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlCenter
            End With
        ElseIf Cel = "NOK" Then
            With Cel.Offset(, 0)
            .Interior.ColorIndex = 3
            .Borders.ColorIndex = 1
            .Borders.Weight = xlMedium
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlCenter
            End With
        End If
    Next Cel

    'Fusion des résultats identiques
    lnD = 2
    For i = 2 To UBound(tablo, 1)
        If tablo(i, 2) <> tablo(lnD, 2) Then
            Application.DisplayAlerts = False
            Range(letter_finalstatus_column & lnD & ":" & letter_finalstatus_column & i - 1).Merge
            lnD = i
        End If
        If i = UBound(tablo, 1) Then
            Application.DisplayAlerts = False
            Range(letter_finalstatus_column & lnD & ":" & letter_finalstatus_column & i).Merge
        End If
    Next i

End Sub

Ici le POK (PC) comme prévu avec les OK et NR :

image pasted at 2022 2 1 11 24

Et ici deux OK seuls mais qui apparaissent en POK (PC) :

image pasted at 2022 2 1 11 23

@gmb

Pourrais-tu m'expliquer le fonctionnement de ton code, plus précisement la fonction RésultatFinal, je ne comprends pas vraiment ta boucle "For" avec la fonction "dico.exists".

Merci d'avance si tu peux m'aider :D

Pierre

Bonjour

Bonjour à tous

@ Pierre31

Un dictionnaire est une liste de données uniques qu’on peut allonger.

A chaque donnée, on peut associer une valeur.

Si on ajoute au dictionnaire une donnée déjà existante, cela n’a comme conséquence que de modifier éventuellement la valeur associée à cette donnée dans le dictionnaire.

Il n’y a donc pas de doublon dans un dictionnaire.

L’instruction :

If dico.exists(tablo(i, 2)) Then

a pour rôle de tester si la donnée de (tablo(i,2) existe déjà dans le dictionnaire.

Si oui et que tablo(i,3) vaut ‘’NOK’’ alors, la donnée associée à dico(tablo(i, 2)) vaudra 0

Si non (dico(tablo(i,2) n’existe pas), on la crée et lui associe la valeur 1 si tablo(i,3) = ‘’OK’’ et on lui associe la valeur 0 si tablo(i,3) est différent de ‘’OK’’

OK ?

Bye !

Merci beaucoup @gmb ! A force de chercher, de bidouiller et de modifier ton code je pense avoir bien compris son fonctionnement :D !

Malheureusement il ne semble plus adapté aux ajouts que je souhaite faire pour mon résultat final, je cherche une autre technique.

Pierro

Rechercher des sujets similaires à "comparer valeurs incrementer feuille"