Vérification si appartient à 2 groupe de valeurs
Bonjour à tous.
Le problème sur lequel je bute n'est pas simple à expliquer.
Disons que j'ai une liste de produit, avec 2 références de groupe différentes, et sans rapport.
Je ne souhaite pas faire un tableau effectuant un lien entre ces 2 types de groupes, ces valeurs étant quasiment aléatoires, et variables d'un fichier à l'autre.
Je bataille a trouver une formule qui pourrait me donner l'exception, ou les exceptions d'un groupe.
Le plus simple est d'illustrer.
S'il n'y a pas d'erreur, le tableau ressemble à ça :
Produit G1 G2
Produit 1 513561 566542
Produit 2 513561 566542
Produit 3 513561 566542
Produit 4 513561 566542
Produit 5 513562 566543
Produit 6 513562 566543
Produit 7 513562 566543
Produit 8 513562 566543
Produit 9 513562 566543
Produit 10 513564 566544
Produit 11 513564 566544
Produit 12 513564 566544
Produit 13 513564 566544
Produit 14 513565 566548
Produit 15 513565 566548
Produit 16 513565 566548
Produit 17 513565 566548
Produit 18 513569 566550
On voit bien que si une liste de produit ont la même valeur G1, elles doivent avoir la même valeur G2.
Il faudrait que cette formule soit capable de détecter les incohérences entre ces 2 groupes de valeurs , par exemple :
Produit G1 G2
Produit 1 513561 566545
Produit 2 513561 566542
Produit 3 513561 566542
Produit 4 513561 566542
Produit 5 513562 566543
Produit 6 513562 566543
Produit 7 513562 566543
Produit 8 513562 566543
Produit 9 513562 566544
Produit 10 513564 566544
Produit 11 513564 566544
Produit 12 513560 566544
Produit 13 513564 566544
Produit 14 513565 566548
Produit 15 513565 566548
Produit 16 513565 566548
Produit 17 513565 566548
Produit 18 513569 566550
et d'afficher ces incohérences dans une 4ème colonne. ( ERREUR GROUPE 1 / ERREUR GROUPE 2 / UNIQUE PRODUIT DU GROUPE)
J'ai tenté plusieurs formules, avec des INDEX EQUIV, mais le résultat ne me convient pas, car cela détecte bien le problème, mais uniquement sur le groupe entier, et non pas sur un seul produit. J'ai également essayé avec des formules matricielles, mais sans succès.
Mon approche n'est peut être pas la bonne, je suis ouvert à toute suggestion.
Merci d'avance.
Bonjour,
Tu peux facilement mettre en évidence les couples G1-G2 qui "semblent" présenter une anomalie.
Tu crées une colonne dans laquelle tu concatènes les 2 références
Tu effectues un comptage de ces nouvelles références avec une formule du type
=NB.SI($E$2:$E$19;$E2)
Si ce nombre est égal à 1, c'est que le couple doit être vérifié.
Ce n'est qu'une première approche car on peut imaginer qu'un couple (sans erreur) n'est présent qu'une fois.
De même, il est possible qu'une même erreur se produise plusieurs fois.
Dans ces 2 cas, la méthode proposée ne permet pas de différencier un couple singulier et une anomalie.
Cordialement.
Malheureusement cela ne suffit pas.
Il est effectivement possible que le groupe comporte qu'une valeur, mais il est aussi possible qu'un groupe déjà utilisé soit utilisé à tord pour un produit, dans ce cas NB.SI sera supérieur à 1 mais ce sera faux.
Merci de ton aide.
Bonjour le fil, bonjour le forum,
Par formule je ne sais pas faire. Une proposition par VBA.
Les valeurs dont les groupes 1 sont identiques et les groupes 2 différents sont en vert. Les valeurs dont les groupes 1 sont différents et les groupes 2 égaux sont en jaune.
Le code :
Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incréemnt)
Dim J As Integer 'déclare la variable J (incrément)
Set O = Worksheets("Feuil1") 'définit l'onglet O (à adapter)
O.Columns("E:F").Clear 'efface les colonnes E à F
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionanire D
For I = 2 To UBound(TV, 1) 'boucle sur toutes les les lignes I du tableau des valeurs TV (en partant de la seconde)
D(TV(I, 2) & " " & TV(I, 3)) = "" 'alimente le dictionnaire D avec le groupe 1, un espace et le groupe 2
Next I 'prochaine ligne de la boucle
'renvoie dans E2 redimensionnée les éléments du dictionnaire D sans doublon
O.Range("E2").Resize(D.Count, 1).Value = Application.Transpose(D.Keys)
'convertis les données en deux cellules (groupe1 et groupe 2) colonnes E et F
O.Range("E2").CurrentRegion.TextToColumns Destination:=Range("E2"), DataType:=xlFixedWidth, _
FieldInfo:=Array(Array(0, 1), Array(6, 1)), TrailingMinusNumbers:=True
TV = O.Range("E2").CurrentRegion 'redéfinit le tableau des valeurs TV
For I = 1 To UBound(TV, 1) 'boucle : sur toutes les les lignes I du tableau des valeurs TV
For J = 2 To UBound(TV, 1) - 1 'boucle 2 : sur toutes les les lignes de 2 à l'avant dernière du tableau des valeurs
'si les groupe 1 des ligne I et J(=I+1) sont égaux et les groupes 2 sont différents, colores les lignes I et J en vert
'incrémente I et sort de la boucle 2
If TV(I, 1) = TV(J, 1) And TV(I, 2) <> TV(J, 2) Then O.Cells(I + 1, "E").Resize(2, 2).Interior.ColorIndex = 4: I = I + 1: Exit For
'si les groupe 1 des lignes I et J(=I+1) sont différents et les groupes 2 sont egaux, colores les lignes I et J en jaune
'incrémente I et sort de la boucle 2
If TV(I, 1) <> TV(J, 1) And TV(I, 2) = TV(J, 2) Then O.Cells(I + 1, "E").Resize(2, 2).Interior.ColorIndex = 6: I = I + 1: Exit For
Next J 'prochaine ligne de la boucle 2
Next I 'prochaine ligne de la boucle 1
End SubMerci de ton aide.
Je me suis permis de modifier légèrement ton code, et ça fonctionne. Reste a intégrer ça au reste du fichier.
Sub Macro1()
Application.ScreenUpdating = False
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incréemnt)
Dim J As Integer 'déclare la variable J (incrément)
Set O = Worksheets("Feuil1") 'définit l'onglet O (à adapter)
O.Columns("E:F").Clear 'efface les colonnes E à F
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionanire D
For I = 2 To UBound(TV, 1) 'boucle sur toutes les les lignes I du tableau des valeurs TV (en partant de la seconde)
D(TV(I, 2) & " " & TV(I, 3)) = "" 'alimente le dictionnaire D avec le groupe 1, un espace et le groupe 2
Next I 'prochaine ligne de la boucle
'renvoie dans E2 redimensionnée les éléments du dictionnaire D sans doublon
O.Range("E2").Resize(D.Count, 1).Value = Application.Transpose(D.Keys)
'convertis les données en deux cellules (groupe1 et groupe 2) colonnes E et F
O.Range("E2").CurrentRegion.TextToColumns Destination:=Range("E2"), DataType:=xlFixedWidth, _
FieldInfo:=Array(Array(0, 1), Array(6, 1)), TrailingMinusNumbers:=True
TV = O.Range("E2").CurrentRegion 'redéfinit le tableau des valeurs TV
For I = 1 To UBound(TV, 1) 'boucle : sur toutes les les lignes I du tableau des valeurs TV
For J = 2 To UBound(TV, 1) - 1 'boucle 2 : sur toutes les les lignes de 2 à l'avant dernière du tableau des valeurs
'si les groupe 1 des ligne I et J(=I+1) sont égaux et les groupes 2 sont différents, colores les lignes I et J en vert
'incrémente I et sort de la boucle 2
If TV(I, 1) = TV(J, 1) And TV(I, 2) <> TV(J, 2) Then
O.Cells(J + 1, "G").FormulaLocal = "=NB.SI.ENS(B:B;E" & J + 1 & ";C:C;F" & J + 1 & ")"
O.Cells(I + 1, "G").FormulaLocal = "=NB.SI.ENS(B:B;E" & I + 1 & ";C:C;F" & I + 1 & ")"
If O.Cells(J + 1, "G").Value < O.Cells(I + 1, "G") Then
O.Cells(J + 1, "F").Interior.ColorIndex = 4: I = I + 1: Exit For
Else
O.Cells(I + 1, "F").Interior.ColorIndex = 4: I = I + 1: Exit For
End If
End If
'si les groupe 1 des lignes I et J(=I+1) sont différents et les groupes 2 sont egaux, colores les lignes I et J en jaune
'incrémente I et sort de la boucle 2
If TV(I, 1) <> TV(J, 1) And TV(I, 2) = TV(J, 2) Then
O.Cells(J + 1, "G").FormulaLocal = "=NB.SI.ENS(B:B;E" & J + 1 & ";C:C;F" & J + 1 & ")"
O.Cells(I + 1, "G").FormulaLocal = "=NB.SI.ENS(B:B;E" & I + 1 & ";C:C;F" & I + 1 & ")"
If O.Cells(J + 1, "G").Value < O.Cells(I + 1, "G") Then
O.Cells(J + 1, "E").Interior.ColorIndex = 6: I = I + 1: Exit For
Else
O.Cells(I + 1, "E").Interior.ColorIndex = 6: I = I + 1: Exit For
End If
End If
Next J 'prochaine ligne de la boucle 2
Next I 'prochaine ligne de la boucle 1
O.Columns("G:G").Clear
Application.ScreenUpdating = True
End Sub