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
Bonjour et bienvenue sur le forum
Un essai à tester, si cela est toujours d'actualité.
Cela te convient-il ?
Bye !
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 :
Et ici deux OK seuls mais qui apparaissent en POK (PC) :
@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