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 Sub

Merci 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
Rechercher des sujets similaires à "verification appartient groupe valeurs"