Analyse colonne en fonction d'autres colonnes d'un tableau

Bonjour à tous,

Je débute en VBA sur Excel et j'ai réussi à me débrouillé jusqu'à maintenant grâce aux sujets traitant les même problèmes que j'ai rencontré jusqu'à présent. Mais cette fois, impossible de trouver la solution dont j'ai besoin, c'est pourquoi je fais appel à vous pour m'aider sur ce problème qui dans le fond ne doit pas être si compliqué que ça..

Je m'explique : j'ai un tableau (qui s'agrandit au fur et à mesure) servant de base de données pour calculer des ratios en fonction de données qui sont saisies (un type et une caractéristique en fonction du type). Les ratios sont calculés pour chaque type et donc pour chaque caractéristiques. J'ai donc besoin de vérifier de temps en temps si il n'y a pas de ratio aberrant dans la base de données auquel cas mes résultats seraient faux.

J'ai toute la démarche de la boucle dans ma tête mais le seul problème c'est que je n'arrive pas à la transmettre en code VBA..

Mon besoin est donc d'analyser ligne par ligne certaines colonnes pour détecter des erreurs :

0- Démarrer un compteur pour calculer le nombre d'erreur
1- Il faut repérer ce qui est écrit dans la colonne D ET dans la colonne E d'une ligne du tableau parmi 86 combinaisons possibles. Des que la bonne combinaison est trouvée, passer à l'étape 2
(Les combinaisons possibles sont dans la feuille Liste, Chaque combinaison a un ratio min et max associé et qu'il faut donc vérifier dans ce tableau)
2- En fonction de ce qui est écrit en colonne D ET E, la valeur de la colonne N doit être comprise entre la valeur mini et la valeur maxi inscrit sur une autre feuille (La colonne N pourrait aussi être la colonne O ou P en fonction du cas)
3- Si la valeur de la colonne N est bien comprise entre le mini et maxi (du type et caractéristique correspondant) alors on passe à la ligne suivante du tableau
4- Sinon, mettre le texte de la ligne en couleur rouge (ou uniquement le ratio) et ajouter 1 au compteur, puis passer à la ligne suivante jusqu'à arriver à la fin du tableau

Par exemple, par rapport au fichier joint:

Sur la ligne i, Si la valeur dans la colonne D="Type 2" et valeur dans la colonne colonne E="X < Y < Z" OU SI la valeur dans la colonne D="Type 2" et valeur dans la colonne colonne E="Y < Z < W" OU etc... (86 combinaisons possibles, possible de passer à l'étape suivante quand condition vérifiée ?) Alors, la valeur dans la colonne N doit être compris entre le bon mini et maxi correspondant Sinon, texte de la ligne en rouge (ou ratio en rouge uniquement) ET compteur +1 Ligne suivante

Peut-être que ma démarche n'est pas la plus rapide et la plus fonctionnelle mais j'espère avoir été assez clair pour comprendre mon objectif et donc j'espère que vous trouverez une solution pour me débloquer

En vous remerciant par avance pour votre aide, bonne journée

19calcul-ratios.xlsm (55.70 Ko)

UP

Hello,

Sur ton fichier il n'est pas très clair quel cellule veux-tu contrôler par rapport aux quelles.. Tu parles de 86 combinaisons, mais je n'en voit que 13.

Tes 86 combinaisons doivent être générer par code, ou elles sont connues et peuvent être renseigner dans la feuille BD ?

A+

Kilian

Bonjour Kilian et merci pour ta réponse.

Dans le fichier c'est un exemple il n'y a que 13 combinaisons parce que je ne peux pas diffuser mon vrai fichier mais en réalité j'ai 27 types avec 1 à 4 caractéristiques.

Mes combinaisons sont connues étant donnée qu'elles dépendent d'un type et d'une caractéristique que je fixe.

Ce que je veux contrôler c'est la valeur d'un ratio (colonne N O ou P). Cette valeur doit être comprise entre un minimum et un maximum que je fixe. Le problème c'est que mon ratio dépend du Type et d'une caractéristique donc de ce que j'ai appelé une combinaison.

Par exemple : en colonne D j'ai Type 2, en colonne E j'ai X < Y, je suis donc dans le cas de la combinaison 3, donc la valeur du ratio doit être comprise entre 1 et 2

Est-ce plus clair ? N'hésitez pas à me demander d'autres explications.

Hello,

Donc si je comprend bien, le travail doit s'effectuer sur la feuille "Base de données" et comparer les cellules D et E avec le "Tableau" dans la feuille "Listes" ?

Et à quel endroit retransmettre la valeur minimal et quel endroit la valeur maximal ?

Oui c'est ça on analyse sur la feuille base de donnée, il faut comparer les cellules D et E avec la cellule N (ou O ou P mais on peut rester sur la colonne N uniquement pour simplifier).

Les valeurs min et max sont renseigné sur une autre feuille, dans l'exemple de mon fichier les valeurs sont sur la feuille Listes à côté des combinaisons

Hello,

Voici une solution, deux choses à prendre en compte :

J'ai enlever tout ce qui n'était pas relevant pour une meilleure visibilité, je te laisse donc adapté tes cellules directement dans le code.

Le compteur ce réinitialise à chaque check du tableau (à désactiver dans le code si tu veux avoir la totalité de tes erreurs sur le fichiers)

J'ai du retaper les "types" car le format n'était pas bon pour la correspondance, attention sur ton fichier original.

A+,

Kilian

Salut !

Merci pour ta proposition rapide, effectivement le format de cellule n'étais pas le bon..

L'idée est là, le compteur, la comparaison et la couleur c'est TOP merci !

Par contre en faisant des test je me rend compte que c'est toujours les 3 même valeurs qui sont affichées comme faussent, même en modifiant les mini et maxi pour qu'elles soient correctes, elles apparaissent toujours en rouge. J'essaye de travailler dessus pour résoudre ça. Encore merci pour cette proposition !

Encore merci pour cette proposition !

Hello,

Oui effectivement j'ai fait une erreur...

A remplacer par celui-ci :

Option Explicit
Dim WsB As Worksheet, WsL As Worksheet
Dim x%, y%, sCe%
Sub CheckVal()
Set WsB = Sheets("Base de données")
Set WsL = Sheets("Listes")
With WsB
    .Range("Q2").Value = 0 ' Réinitialise le compteur d'erreur, enlever cette ligne si non necessaire
    .Range(Cells(2, 2), Cells(Rows.Count, 2)).Font.ColorIndex = 1
End With
    For x = 2 To WsB.Cells(Rows.Count, 1).End(xlUp).Row
        For y = 2 To WsL.Cells(Rows.Count, 1).End(xlUp).Row
            If WsB.Cells(x, 3).Value = WsL.Cells(y, 2).Value And _
               WsB.Cells(x, 4).Value = WsL.Cells(y, 3).Value Then ' Compare les types & les caractéristiques
                If WsB.Cells(x, 13).Value > WsL.Cells(y, 4).Value And _
                   WsB.Cells(x, 13).Value < WsL.Cells(y, 5).Value Then ' Compare cellule M si la valeur est plus grande que mini et plus petit que maxi
                Else
                    With WsB
                        .Cells(x, 2).Font.ColorIndex = 3 ' Colori la cellule Noms en rouge
                        .Range("Q2").Value = WsB.Range("Q2").Value + 1 ' Compteur d'erreur
                    End With
                End If
         End If
        Next
    Next
End Sub

La comparaison n'était pas fais sur la bonne colonne :

 If WsB.Cells(x, 13).Value > WsL.Cells(y, 4).Value And _
                   WsB.Cells(x, 13).Value < WsL.Cells(y, 5).Value Then ' Compare cellule M si la valeur est plus grande que mini et plus petit que maxi

La colonne est bien la 13 et non la 14.

Est-ce que tu dois également comparer les ratio2 et ratio3 en cas de cellule vide dans la ratio1 ou 2 ?

A+,

Kilian

Effectivement ce n'étais pas la bonne colonne mais j'avais remplacé avant de faire les tests. J'ai essayé plusieurs choses mais rien y fait, j'ai toujours les 3 mêmes cellules en rouge peut importe les valeurs des ratios ou des valeurs min et max (Type 1 X < Y).

Avec le nouveau code si le ratio est respecté rien est en rouge donc ça c'est bon mais si par exemple aucun ratio est respecté, seul les Type 1 X < Y sont en rouge et je ne comprend pas pourquoi... est-ce que tu as ce problème aussi ?

Oui je dois aussi comparer les autres ratios, un seul ratio par ligne peut exister mais il peut être en 1 2 ou 3.

Le problème vient du format de tes cellules, même en convertissant les cellules ça ne change rien, par contre si tu réécris manuellement dans tes cellules tes valeurs, ça marche..

Jamais vue ce problème.. Voir si tu peux les réécrire ou extraire d'ailleurs.

Voici le code pour comparer sur les 3 cellules ratio

Option Explicit
Dim WsB As Worksheet, WsL As Worksheet
Dim x%, y%, sCe%
Sub CheckVal()
Set WsB = Sheets("Base de données")
Set WsL = Sheets("Listes")
With WsB
    .Range("Q2").Value = 0 ' Réinitialise le compteur d'erreur, enlever cette ligne si non necessaire
    .Range(Cells(2, 2), Cells(Rows.Count, 2)).Font.ColorIndex = 1
End With
    For x = 2 To WsB.Cells(Rows.Count, 1).End(xlUp).Row
        For y = 2 To WsL.Cells(Rows.Count, 1).End(xlUp).Row
            If WsB.Cells(x, 3).Value = WsL.Cells(y, 2).Value And _
               WsB.Cells(x, 4).Value = WsL.Cells(y, 3).Value Then ' Compare les types & les caractéristiques
                If WsB.Cells(x, 13).Value <> "" Then
                    If WsB.Cells(x, 13).Value > WsL.Cells(y, 4).Value And _
                    WsB.Cells(x, 13).Value < WsL.Cells(y, 5).Value Then ' Compare cellule M si la valeur est plus grande que mini et plus petit que maxi
                    Else
                        With WsB
                            .Cells(x, 2).Font.ColorIndex = 3 ' Colori la cellule Noms en rouge
                            .Range("Q2").Value = WsB.Range("Q2").Value + 1 ' Compteur d'erreur
                        End With
                    End If
                ElseIf WsB.Cells(x, 14).Value = "" Then
                    If WsB.Cells(x, 14).Value > WsL.Cells(y, 4).Value And _
                    WsB.Cells(x, 14).Value < WsL.Cells(y, 5).Value Then ' Compare cellule N si la valeur est plus grande que mini et plus petit que maxi
                    Else
                        With WsB
                            .Cells(x, 2).Font.ColorIndex = 3 ' Colori la cellule Noms en rouge
                            .Range("Q2").Value = WsB.Range("Q2").Value + 1 ' Compteur d'erreur
                        End With
                    End If
                ElseIf WsB.Cells(x, 15).Value = "" Then
                    If WsB.Cells(x, 15).Value > WsL.Cells(y, 4).Value And _
                    WsB.Cells(x, 15).Value < WsL.Cells(y, 5).Value Then ' Compare cellule O si la valeur est plus grande que mini et plus petit que maxi
                    Else
                        With WsB
                            .Cells(x, 2).Font.ColorIndex = 3 ' Colori la cellule Noms en rouge
                            .Range("Q2").Value = WsB.Range("Q2").Value + 1 ' Compteur d'erreur
                        End With
                    End If
                End If
         End If
        Next
    Next
End Sub

A+,

Kilian

C'est super merci beaucoup Kilian !!

Effectivement je ne comprend pas trop cette histoire de format de cellule mais en réécrivant ca marche parfaitement !

Je crois que ca ne marchais pas sur les autres colonnes alors j'ai juste remplacé :

ElseIf WsB.Cells(x, 14).Value = "" Then

Par :

ElseIf WsB.Cells(x, 14).Value <> "" Then   

Merci beaucoup pour ton aide !

Bonne journée !

Le code modifié :

Option Explicit
Dim WsB As Worksheet, WsL As Worksheet
Dim x%, y%, sCe%
Sub CheckVal()
Set WsB = Sheets("Base de données")
Set WsL = Sheets("Listes")
With WsB
    .Range("Q2").Value = 0 ' Réinitialise le compteur d'erreur, enlever cette ligne si non necessaire
    .Range(Cells(2, 2), Cells(Rows.Count, 2)).Font.ColorIndex = 1
End With
    For x = 2 To WsB.Cells(Rows.Count, 1).End(xlUp).Row
        For y = 2 To WsL.Cells(Rows.Count, 1).End(xlUp).Row
            If WsB.Cells(x, 3).Value = WsL.Cells(y, 2).Value And _
               WsB.Cells(x, 4).Value = WsL.Cells(y, 3).Value Then ' Compare les types & les caractéristiques
                If WsB.Cells(x, 13).Value <> "" Then
                    If WsB.Cells(x, 13).Value > WsL.Cells(y, 4).Value And _
                    WsB.Cells(x, 13).Value < WsL.Cells(y, 5).Value Then ' Compare cellule M si la valeur est plus grande que mini et plus petit que maxi
                    Else
                        With WsB
                            .Cells(x, 2).Font.ColorIndex = 3 ' Colori la cellule Noms en rouge
                            .Range("Q2").Value = WsB.Range("Q2").Value + 1 ' Compteur d'erreur
                        End With
                    End If
                ElseIf WsB.Cells(x, 14).Value <> "" Then
                    If WsB.Cells(x, 14).Value > WsL.Cells(y, 4).Value And _
                    WsB.Cells(x, 14).Value < WsL.Cells(y, 5).Value Then ' Compare cellule N si la valeur est plus grande que mini et plus petit que maxi
                    Else
                        With WsB
                            .Cells(x, 2).Font.ColorIndex = 3 ' Colori la cellule Noms en rouge
                            .Range("Q2").Value = WsB.Range("Q2").Value + 1 ' Compteur d'erreur
                        End With
                    End If
                ElseIf WsB.Cells(x, 15).Value <> "" Then
                    If WsB.Cells(x, 15).Value > WsL.Cells(y, 4).Value And _
                    WsB.Cells(x, 15).Value < WsL.Cells(y, 5).Value Then ' Compare cellule O si la valeur est plus grande que mini et plus petit que maxi
                    Else
                        With WsB
                            .Cells(x, 2).Font.ColorIndex = 3 ' Colori la cellule Noms en rouge
                            .Range("Q2").Value = WsB.Range("Q2").Value + 1 ' Compteur d'erreur
                        End With
                    End If
                End If
         End If
        Next
    Next
End Sub

Effectivement, j'ai oublié de corrigé sur les lignes 14 et 15 le <>.

Si tu trouves une explication à ces formats, n'hésite pas à me le faire savoir, ça m'intrigue

Bonne journée à toi aussi,

Kilian

Rechercher des sujets similaires à "analyse colonne fonction colonnes tableau"