Comparer deux cellules
Ok pour la validation de données pour un copier/coller, mais normalement lors de l'exécution de la macro la MEFC devrait faire apparaître la cellule en rouge non ? comme elle est inférieure à l'autre cellule ce qui n'est pas le cas ici
Cordialement,
Bonjour,
Oui comme dit j'étais resté sur l'ancienne plage d'application où la colonne J n'était pas prise en compte. Donc, comme vous l'aviez préconisé:
With Range(.Cells(2, 2), .Cells(LR, 9))
'Devient
With Range(.Cells(2, 2), .Cells(LR, 11))
Cdlt,
J'ai bien effectué la mise à jour mais malgré tout ça ne fonctionne pas
Sinon il faut donc que j'intègre :
If .Cells(L, 10) <> "" Then
If .Cells(L, 10) < .Cells(L, 8) Then
ERREUR = True
Mais pour autant ça va pas colorier la cellule je crois
Bonjour,
Dans le fichier joint le fonctionnement me semble conforme. Lorsque je colle 1 en J2, la cellule devient bien rouge en pré ou post macro.
Cdlt,
Est-ce qu'il serait possible que le problème vient du fait que je ne suis pas sous forme de tableau ?
Merci
Bonjour,
Non ça n'a pas d'incidence. Pourriez vous joindre le fichier sur lequel vous faites votre test et l'enchaînement des manipulation pour arriver au résultat non-conformes afin que j'essaie de le reproduire chez moi ?
Cdlt,
Oui pas de soucis ci-joint le fichier ,
Il faut savoir que je me suis trompé d'ailleurs il doit vérifier par rapport à H2 et pas G2 donc j'ai fait la modification dans le code,
Mais du coup ce que je fais c'est que j'ai rentré toutes les valeurs sauf celle en J2, et je viens coller une valeur inférieur à celle présente en H2 (par exemple : 12), puis je click sur le bouton vérifier sur lequel j'ai bien-sûr associé la macro fonctionnelle.
Option Explicit
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
If .Cells(L, 4) <> "" Then
.Cells(L, 4) = UCase(SupprimerAccents(.Cells(L, 4)))
If .Cells(L, 4) = .Cells(L, 1) Then ERREUR = True
End If
Next L
For L = 2 To LR
For i = 2 To 9
If .Cells(L, i).Value = "" 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, , "=OU(B2="""";ET(COLONNE(B2)=10;B2<=$H2);ET(COLONNE(B2)=4;B2=$A2))"
.FormatConditions(1).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
Voilà c'est tout ce que je fais
Merci d'avance
Bonjour,
Merci je comprend mieux. En fait la MEFC ici ne s'applique QUE si une des cellules à contrôler et vide. Nous ne passons pas la valeur ERREUR à True si la cellule J est inférieure à G, cette fonction était juste intégrée dans la MEFC mais visible que si une des cellules des colonnes 2 à 9 à contrôler était vide (on faisait d'une pierre, 2 coups).
Donc on peut ajouter ce cas de figure dans le code VBA qui applique la MEFC également si J<=G, qu'on intègre sur la même ligne de vérification des cellules vides pour optimiser et ne pas créer une 3ème boucle :
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
If .Cells(L, 4) <> "" Then
.Cells(L, 4) = UCase(SupprimerAccents(.Cells(L, 4)))
If .Cells(L, 4) = .Cells(L, 1) Then ERREUR = True
End If
Next L
For L = 2 To LR
For i = 2 To 9
If .Cells(L, i) = "" Or .Cells(L, 10) <= .Cells(L, 7) Then 'Ici
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, , "=OU(B2="""";ET(COLONNE(B2)=10;B2<=$H2);ET(COLONNE(B2)=4;B2=$A2))"
.FormatConditions(1).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 même qu'il est possible de n'avoir qu'une seule boucle mais il va falloir que je me plonge correctement dedans.
En espérant que mes explications vous aident à y voir plus clair.
Cdlt,
Super ! C'est ce que je pensais à la lecture du code sans en être sûr, du coup j'avais de mon côté fait une modification aussi dans le code mais pas comme vous et ce qui n'était pas ok, j'avais changé la partie :
For L = 2 To LR
For i = 2 To 9
If .Cells(L, i) = ""
En passant de 9 à 10 mais ce qui fait que je rendais obligatoire la saisie d'une donnée dans la colonne 10 ce que je ne voulais pas je vais tester avec votre bout de code, car sinon je serais passé par une formule comme ça :
If .Cells(L, 10) <> "" Then
If .Cells(L, 10) < .Cells(L, 8) Then
ERREUR = True
Je rendais le code plus lourd mais j'avais la même vision
Mais pour le coup je ne mettais pas le égal je me disais que si je rentrais une valeur égale en colonne J et H alors j'aurais l'erreur mais apparemment je me trompe
Je check ça merci !
EDIT : Apparemment après test ça rend la saisie dans la colonne J et K obligatoire du coup ?
Je pense que j'ai ma réponse :
For L = 2 To LR
For i = 2 To 9
If .Cells(L, i) = "" Or .Cells(L, 10) <> "" And .Cells(L, 10) < .Cells(L, 8) Then
ERREUR = True
Exit For
End If
Next i
Next L
Dis moi ce que tu penses de ce code
Merci encore à toi !
Cordialement
EDIT : il faut maintenant que je trouve le fait que si la colonne J à une donnée alors la colonne K doit en avoir une aussi
EDIT 2 : Voici mon nouveau code qui prend en compte les paramètres cités précédemment, n'hésites pas à me faire un retour sur ça
Option Explicit
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
If .Cells(L, 4) <> "" Then
.Cells(L, 4) = UCase(SupprimerAccents(.Cells(L, 4)))
If .Cells(L, 4) = .Cells(L, 1) Then ERREUR = True
End If
Next L
For L = 2 To LR
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) 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, , "=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
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
Bonjour,
Désolé je n'ai pas vu avec les EDIT.
Ca me semble cohérent ! Par contre je vous conseille tout de même de mettre un commentaire sur cette ligne pour ne pas oublier son interprétation (elle commence à être longue). Il vaut peut être ajouter chaque combinaison de or avec un _ pour retourner à la ligne et y voir plus clair. Et tant qu'on y est, tout insérer dans la même boucle comme ça on travaille plus simplement :
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
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, , "=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
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
Par contre ici, si J est vide et K est vide, alors c'est conforme, je ne sais pas si c'est voulu, je suppose que oui comme nous ne vérifions qu'il n'y ai des valeurs que des colonnes 2 à 9.
Cdlt,
Bonjour,
Pas de soucis, c'est moi qui me reprend à plusieurs reprises sur mes posts
Trop content de commencer à comprendre mieux le VBA et surtout de comprendre ce que je fais et ce qu'on me dit !
Merci beaucoup pour ton aide en tout cas !
J'ai une autre demande mais je vais peut être arrêter de mettre sur cette discussion car au final on a répondu à la problématique enfin tu y as répondu
Mais si tu es dispo et que ça te dérange pas trop je voudrais bien t'en parler ou voir avec toi (c'est dans la continuité du fichier
Bonne journée et encore merci !
Bonjour,
Pas de soucis je reste disponible comme les membres actifs de cette communauté.
Heureux d'avoir pu répondre à ta problématique et de t'avoir fait progressé !
Cdlt,
Je peux donc continuer sur ce fil pour l'autre problématique ?
Et je viens de penser à autre chose lorsque je supprime ma donnée dans la colonne matière, la MEFC reste et toute la ligne vient au rouge mais il serait peut être pratique de la retirer sur la ligne en question lorsque je fais ça, mais du coup je ne sais pas comment il faut procéder, j'imagine que le mieux est un worksheet_change ?
Merci à toi ;)
Bonjour,
Où vous modifiez la MEFC en disant qu'elle ne s’exécute que si A n'est pas vide. Je pense que c'est pas "grave" si elle s’exécute sur une ligne vide du moment que ce n'est pas des milliers, ce qui pourrait ralentir votre fichier.
Ce qui serait quelque chose du style :
"=ET($A2<>"""";OU(B2="""";ET(COLONNE(B2)=10;B2<$H2);ET(COLONNE(B2)=4;B2=$A2);ET(COLONNE(B2)=11;B2<$J2)))"
A tester car je l'ai écrite à la volée sans EXCEL mais vous avez l'idée je pense désormais !
Cdlt,
Oui c'est vrai j'avais zappé la solution par la MEFC direct, car je pensais à une suppression ou réinitialisation via du VBA mais encore une fois je me suis peut être prit direct la tête pour rien
Je vais tester ça et au pire voir par moi même en modifiant un peu
Merci !
Bonjour Ergotamine,
Je reviens sur ce sujet avant d'en ouvrir un autre car tu seras peut être répondre rapidement ce qui évitera peut être un sujet pour rien
Je viens de créer ma nouvelle formule MEFC :
=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)))))))))
J'aimerais que cette formule soit reprise dans le code VBA que l'on a vue ensemble et qu'il soit étendu sur toute la colonne E (voir F) mais je ne sais pas trop comment le faire, j'ai voulu l'ajouter sur la partie :
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
Mais si je fais exprès de mettre des erreurs ça ne prend pas
Pourrais-tu m'aider si ça ne te dérange pas ?
Merci d'avance et bonne journée !
Je pense avoir trouvé la solution mais je veux bien un retour de ta part si tu as le temps pour me dire si ça te semble ok (niveau délais exécution / code)
Voici le nouveau code :
Option Explicit
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) 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
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
Les deux parties ajoutées sont :
.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
Et :
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
Merci d'avance à toi et bonne journée !
Bonjour kinders59,
Désolé de ne répondre que maintenant.
Pour moi le code est OK, attention cependant à ne pas démultiplier les exceptions au risque de ralentir le fichier. Ce que j'ai compris de la seconde MEFC c'est pour éviter les doublons ? A voir si elle est intégrable dans la première MEFC.
Après il faut tester pour voir.
Cdlt,
Bonjour Ergotamine,
Ne t'inquiète pas il n'y a pas de problème
J'ai du revoir le code car quelques erreurs et surtout refaire quelques MEFC car manquante ce qui me donne le code suivant qui fonctionne au quart de tour mais bon je ne suis clairement pas sûr du fait que ça soit le plus "simple" et qui tourne le mieux
Option Explicit
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, 11) <> "" And .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, 9))
.FormatConditions.Add xlExpression, , "=ET($A2<>"""";OU(B2="""";ET(COLONNE(B2)=10;B2<$H2);ET(COLONNE(B2)=4;B2=$A2)))"
.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
With Range(.Cells(2, 10), .Cells(LR, 11))
.FormatConditions.Add xlExpression, , "=ET($J2<>"""";ET($K2<$J2))"
.FormatConditions.Add xlExpression, , "=ET($K2<>"""";ET($J2=""""))"
.FormatConditions(1).Interior.COLOR = 7697919
.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
ça fonctionne c'est déjà ça et ça tourne plus vite que l'ancien maintenant à voir dans le temps comment il va tenir
Encore merci à toi !