Vérification borne avec plusieurs critères

Bonjour tout le monde,

Je viens avec une nouvelle problématique, j'ai réalisé un fichier dans lequel des fournisseurs vont venir remplir des colonnes dans l'onglet Modèle (Matière / Epaisseur /Forme / Nom / Profondeur min / Profondeur max / Prix ...).

Il est possible qu'un fournisseur puisse mettre deux lignes pour un même produit, mais les bornes ne seront pas les mêmes car le prix du produit bouge en fonction des bornes exemple :

Matière

Epaisseur

Forme

Modèle

Profondeur min

Profondeur max

Prix

Compact12RectangleCoucou501005
Compact12RectangleCoucou10120010

Mon but est de vérifier qu'il n'y est pas de trou dans la raquette c'est à dire que la profondeur max de la ligne 1 doit être raccord avec la profondeur min de la ligne 2 (voir fichier joint avec exemples)

J'ai réalisé un code mais il fonctionne une fois sur 40 et je ne comprends pas du tout pourquoi donc je viens vers vous pour comprendre où j'aurais pu faire une erreur ..

Je pense que l'erreur doit être au niveau de :

LR = .Cells(.Rows.Count, 1).End(xlUp).Row
    For L = 2 To LR
        .Cells(L, 4) = UCase(SupprimerAccents(.Cells(L, 4)))
        For i = 2 To 9
            If .Cells(L, i) = "" Or _
            .Cells(L, 10) <> "" And .Cells(L, 10) < .Cells(L, 8) Or _
            .Cells(L, 10) <> "" And .Cells(L, 11) = "" Or _
            .Cells(L, 11) <> "" And .Cells(L, 11) < .Cells(L, 10) Or _
            .Cells(L, 4) = .Cells(L, 1) Or _
            .Cells(L, 2) <> "" And .Cells(L, 2) = .Cells(L + 1, 2) And .Cells(L, 3) = .Cells(L + 1, 3) And .Cells(L, 4) = .Cells(L + 1, 4) And .Cells(L, 6).Value <> .Cells(L + 1, 5).Value + 1 Then
                ERREUR = True

Surtout sur :

.Cells(L, 2) <> "" And .Cells(L, 2) = .Cells(L + 1, 2) And .Cells(L, 3) = .Cells(L + 1, 3) And .Cells(L, 4) = .Cells(L + 1, 4) And .Cells(L, 6).Value <> .Cells(L + 1, 5).Value + 1 Then

Merci d'avance à vous !

bonjour,

une proposition, code à adapter pour la présentation des messages d'erreur

Sub verifier_continuite()
'macro de vérification de la continuité des dimensions, suppose le fichier trié en ordre croissant sur les 5 premières colonnes
    With Sheets("modèle")
        LR = .Cells(Rows.Count, 1).End(xlUp).Row
        pr = .Cells(2, 1) & .Cells(2, 2) & .Cells(2, 3) & .Cells(2, 4) 'identification du produit 2
        For i = 3 To LR 'parcourt des lignes
            npr = .Cells(i, 1) & .Cells(i, 2) & .Cells(i, 3) & .Cells(i, 4) 'identification du produit en ligne i
            If npr = pr Then 'même produit ?
                If .Cells(i, 5) - 1 <= .Cells(i - 1, 6) Then 'compare dimension de début de la ligne en cours et fin de la ligne précédente
                Else 'discontinuité
                    MsgBox "pas de continuité entre les lignes " & i & " et " & i - 1
                End If
            End If
            pr = npr
        Next i
    End With
End Sub

Bonjour,

pourquoi pas avec une MFC ?
Ainsi l'utilisateur voit tout de suite l'anomalie à la saisie.
MFC sur F2:Fx : =ET(D2=D3;E3-F2>1)
eric

Bonjour à vous deux,

Tout d'abord merci pour vos réponses

'macro de vérification de la continuité des dimensions, suppose le fichier trié en ordre croissant sur les 5 premières colonnes

Le fichier est envoyé à des fournisseurs il n'est donc pas forcément trié car ils vont le faire à leur manière, ce qui est sûr c'est que si le produit est décomposé en trois bornes alors les lignes se suivront forcément (je ne sais pas si ton message voulait dire ça )

pourquoi pas avec une MFC ?

Ainsi l'utilisateur voit tout de suite l'anomalie à la saisie.

MFC sur F2:Fx : =ET(D2=D3;E3-F2>1)

J'utilise bien une MEFC dans mon fichier via la macro :

"=ET($A2<>"""";ET($A2=$A3;ET($B2=$B3;ET($C2=$C3;ET($D2=$D3;ET(OU($F2=$E3;OU($F2>$E3;OU($E3<>$F2+1)))))))))"

Le problème c'est qu'elle ne vient que si la macro détecte une "Erreur" (sinon elle fonctionne), mon but c'est que la personne ne puisse passer à l'étape suivante que si tout est ok dans les vérifications d'où le :

 Else
        MsgBox "LA VALIDATION EST CONFORME", vbInformation
        Worksheets("Dimensions").Visible = xlSheetVisible

Mais le problème c'est que je n'arrive pas à faire passer le test de bornes

Sub verifier_finitions()
Dim ERREUR As Boolean, L%, i%, LR%
With Sheets("Modèle")
    LR = .Cells(.Rows.Count, 1).End(xlUp).Row
    For L = 2 To LR
        .Cells(L, 4) = UCase(SupprimerAccents(.Cells(L, 4)))
        For i = 2 To 9
            If .Cells(L, i) = "" Or _
            .Cells(L, 10) <> "" And .Cells(L, 10) < .Cells(L, 8) Or _
            .Cells(L, 10) <> "" And .Cells(L, 11) = "" Or _
            .Cells(L, 11) <> "" And .Cells(L, 11) < .Cells(L, 10) Or _
            .Cells(L, 4) = .Cells(L, 1) Then
                ERREUR = True
                Exit For
            End If
        Next i
    Next L

Dans cette partie de code il n'y a pas la vérification des bornes mais j'avais fait avec la même trame pour sortir l'erreur sauf qu'elle n'est pas toujours présente et je me demande si ce n'est pas le "Or" qui fait sauter la vérification ...

Merci à vous !

Je viens de revoir mon code et je pense avoir solutionné mon problème avec le code suivant (attention il est entier donc tout n'est pas juste pour ma demande) :

Sub verifier_finitions()
Dim ERREUR As Boolean, L%, i%, LR%, W%
Dim pr As String
Dim npr As String
With Sheets("Modèle")
    LR = .Cells(.Rows.Count, 1).End(xlUp).Row
    For W = 2 To LR
     .Cells(W, 4) = UCase(SupprimerAccents(.Cells(W, 4)))
     Next W
    For L = 2 To LR
        pr = .Cells(L, 1) & .Cells(L, 2) & .Cells(L, 3) & .Cells(L, 4)
        npr = .Cells(L + 1, 1) & .Cells(L + 1, 2) & .Cells(L + 1, 3) & .Cells(L + 1, 4)
        If npr = pr Then
            If .Cells(L + 1, 5) - 1 <> .Cells(L, 6) Then
                ERREUR = True
            End If
        End If
        For i = 2 To 9
            If .Cells(L, i) = "" Or _
            .Cells(L, 10) <> "" And .Cells(L, 10) < .Cells(L, 8) Or _
            .Cells(L, 10) <> "" And .Cells(L, 11) = "" Or _
            .Cells(L, 11) <> "" And .Cells(L, 11) < .Cells(L, 10) Or _
            .Cells(L, 4) = .Cells(L, 1) Then
                ERREUR = True
                Exit For
            End If
        Next i
    Next L
    If ERREUR = True Then
        .Unprotect "MDP"
        If .Cells.FormatConditions.Count > 0 Then
            .Cells.FormatConditions.Delete
        End If
        With Range(.Cells(2, 2), .Cells(LR, 11))
            .FormatConditions.Add xlExpression, , "=ET($A2<>"""";OU(B2="""";ET(COLONNE(B2)=10;B2<$H2);ET(COLONNE(B2)=4;B2=$A2);ET(COLONNE(B2)=11;B2<$J2)))"
            .FormatConditions(1).Interior.COLOR = 7697919
        End With
        With Range(.Cells(3, 5), .Cells(LR, 5))
            .FormatConditions.Add xlExpression, , "=ET($A2<>"""";ET($A2=$A3;ET($B2=$B3;ET($C2=$C3;ET($D2=$D3;ET(OU($F2=$E3;OU($F2>$E3;OU($E3<>$F2+1)))))))))"
            .FormatConditions(2).Interior.COLOR = 7697919
        End With
        MsgBox "LES CELLULES SURLIGNEES NE SONT PAS VALIDES", vbCritical, "CELLULES ATTENDANT DES VALEURS"
        .Protect "MDP"
        Else
        MsgBox "LA VALIDATION EST CONFORME", vbInformation
        Worksheets("Dimensions").Visible = xlSheetVisible
    End If
End With
End Sub

Je pense que le problème venait du fait que j'intégrais la mise en majuscule en même temps que la vérification ce qui fait qu'à mon avis il n'y avait pour lui pas d'erreur car une cellule était en MAJ et l'autre en MIN du coup ligne suivante etc ... En forçant la MAJ avant maintenant mon erreur ressort bien sans avoir à cliquer deux ou trois fois sur le bouton de vérification

N'hésitez pas à me faire un retour sur mon code il est peut être loin d'être parfait donc je suis preneur de retour

Bonjour,

J'utilise bien une MEFC dans mon fichier via la macro :

Le problème c'est qu'elle ne vient que si la macro détecte une "Erreur"

et donc quel est l'intérêt de la mettre par macro et non directement sur la feuille où elle réagira à la saisie?

Par macro autant colorer les cellules, c'est plus léger.
On ne le fait par macro que pour les reconstruire s'il y a un risque qu'elles soient détruites ou multipliées suite à des copiés-collés.
eric

Bonjour Eriiic,

En fait je me suis mal exprimé avec le "le problème c'est", je voulais dire cela dans le sens où si ma macro ne détecte pas d'erreur alors pas de case colorée (ce qui est normal) mais ici j'avais un soucis car j'avais bien une erreur mais la macro passée au dessus, et j'ai découvert que c'est dû au fait que je passe en majuscule l'une de mes colonnes (dans une boucle) donc lorsque je cliquais une fois la macro ne détectait pas d'erreur car ma case D2 et D3 ne sont pas égales car une en MAJ l'autre non.

J'ai réussis à régler mon problème, du coup maintenant tout fonctionne ;)

Ce qui fait qu'effectivement on pourrait se dire qu'il est mieux d'avoir la cellule dès le début mais ce n'est pas mon but je préfère laisser remplir la personne faire la vérification via la macro et si problème alors message d'erreur et cellule colorée.

Par macro autant colorer les cellules, c'est plus léger.

Je ne comprends pas la différence dans ton message ? Ma cellule vient bien se colorer avec la MEFC.

Il est possible que la personne vienne faire des copier-coller sur le fichier via son EDI ou d'autres fichiers de son côté.

Merci à toi,

Cordialement

Bonjour à tous,

Ce qu'à voulu dire Eriiic c'est qu'il est plus léger de colorer des cellules via un remplissage non dynamique donc sans passer par MEFC : on vérifie la cellule dans le code VBA et on lui applique ou non la couleur rouge selon le résultat du test conditionnel. Ca consomme moins de temps et de ressource car la MEFC se recalcule à chaque valeur modifiée, ce qui est un avantage (aspect dynamique) et un inconvénient (si trop de données, fichier très fortement ralenti).

Ici si on part sur un remplissage non conditionnel alors on rempli les cellules non conformes en rouge lors de la vérification. Or si la personne corrige, sauf réactivation de la macro de vérification (ou un évenement worksheet_change adapté), la couleur ne sera pas supprimée.

Cdlt,

Bonjour,

D'accord, je comprends mieux le message du coup, mais effectivement il faut que ça reste dynamique dans le sens ou lorsque la personne modifie ensuite en direct ça change de couleur si ok puis hop (re)click sur la vérification et on passe à un nouvel onglet :)

Merci à vous,

Cordialement,

Rechercher des sujets similaires à "verification borne criteres"