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 donc je me suis dit que finalement je n'avais pas trouvé la bonne réponse.

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 ? peut-on faire autrement c'est à dire que seulement si on rentre une valeur en J alors la valeur doit être supérieur à celle en H et K doit être remplie aussi ?

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 (faut vraiment que j'arrête avec se travers)

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 !

Rechercher des sujets similaires à "comparer deux"