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 |
| Compact | 12 | Rectangle | Coucou | 50 | 100 | 5 |
| Compact | 12 | Rectangle | Coucou | 101 | 200 | 10 |
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 = TrueSurtout 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 ThenMerci 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 SubBonjour,
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 = xlSheetVisibleMais 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 LDans 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 SubJe 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,