VBA EXCEL utilisation variable dans condition

Résolu
Bonjour,

Donc je cherche à utiliser une variable dans une formule de conditionnement dans VBA excel, genre :
(je lis chaque ligne : si la cellule à gauche est alimenté à "OK", je surligne la celulle (ligne, colonne) en vert). En l'état ci-dessous, cela ne fonctionne pas.. Qqun pourrait m'aider ? Encore une histoire d'apostrophe ??
Merci bcp

For Ligne = 4 To iMax

Cells(Ligne, Colonne).Select
Selection.FormatConditions.Delete
Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
"=SI(RC[-1] =""OK"";VRAI;FAUX)"
Selection.FormatConditions(1).Interior.ColorIndex = 4

Next

10 réponses

  1. Bonjour,

    Quelque chose du genre ?

    Sub Test2() 
    
        Dim Ligne As Integer 
        Dim iMax As Integer 
        Dim Colonne As Integer 
             
        iMax = 10: Colonne = 4 
         
        With ActiveSheet 
            For Ligne = 4 To iMax 
                ActiveSheet.Cells(Ligne, Colonne).Select 
                Selection.EntireRow.Interior.ColorIndex = xlNone 
                If (.Cells(Ligne, Colonne).Offset(0, -1).Value = "OK") Then 
                    Selection.EntireRow.Interior.ColorIndex = 4 
                End If 
            Next Ligne 
        End With 
    
    
    End Sub 
    


    Info
    1. Bonjour
      Merci pour la réponse, mais petite précision qui a son importance, je voudrai que cela reste une "mise en forme conditionnelle" car l'alimentation à "OK" se fera par l'utilisateur directement dans EXCEL, donc après le présent traitement batch
      D'où mon utilisation de la formule :
      Selection.FormatConditions.Add Type:=xlExpression, Formula1:= etc..

      Merci
      1. re:

        Malheureusement, je ne suis pas expert de formule dans xl.

        J'ai tenté de remodeler votre code et ça me donne ceci :

        Sub Test3()
        
            Dim Ligne As Integer
            Dim iMax As Integer
            Dim Colonne As Integer
                 
            iMax = 10: Colonne = 4
             
            With ActiveSheet
                For Ligne = 4 To iMax
                    .Cells(Ligne, Colonne).Select
                    Selection.Interior.ColorIndex = xlNone
                    Selection.FormatConditions.Delete
                    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
                        "=""SI(RC[-1] = """"OK"""";VRAI;FAUX]"""
                    Selection.FormatConditions(1).Interior.ColorIndex = 4
                Next Ligne
            End With
        
        
        End Sub
        


        Sinon, un autre plus expert en formule que moi devra vous venir en aide.

        INfo
        1. En fait, je ne comprends pas trop pourquoi le code ci-dessous ne fonctionne pas

          For Ligne = 4 To iMax

          Cells(Ligne, Colonne).Select
          Selection.FormatConditions.Delete
          Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
          "=SI(RC[-1] =""OK"";VRAI;FAUX)"
          Selection.FormatConditions(1).Interior.ColorIndex = 4

          Next

          Est ce la fonction FormatConditions qui ne supporte pas les variables ? ou il y a juste une erreur de syntaxe.. ?

          Merci
          Vincent
          1. re:

            Une chose est clair pour moi !

            La syntaxe : "=SI(RC[-1] =""OK"";VRAI;FAUX)" me génère une erreur
            lors de l'exécution.

            À l'aide de l'enregistreur de macro, j'ai recréé la syntaxe suivante
            qui est reconnu par VBA :

            "=""SI(RC[-1] = """"OK"""";VRAI;FAUX]"""

            Info
            1. Je viens de tester mais le pble ,c'est qu'il écrit dans la forme conditionnelle dans excel :
              ="SI(RC[-1]=""OK"";VRAI;FAUX)"

              => alors que voudrai que ce soit : ="SI(K6="OK";VRAI;FAUX)" par exemple si je suis à la ligne 6
              En gros, il ne m'a pas traduit RC[-1] en position relative, mais il l'a gardé en caractère

              Merci pour ton aide néanmoins

              Qqun d'expert a t-il une idée ?

              Merci
              1. Sinon, ta formule avec Cells(Ligne, Colonne).Offset(0, -1).Value = "OK" du début me plaisait bien, mais je n'arrive pas à la combiner avec la fonction FormatConditions.add
                1. re:

                  Je crois connaître une autre solution en traduisant la procédure
                  en fonction volatile qui opère seulement lors d'un changement de l'utilisateur.

                  Je vais tenter de construire cette fonction et de la déposer ici.

                  Info
                  1. Bonjour

                    En fait, j'ai réussis à partir de ta formule :

                    For Ligne = 4 to iMax

                    Cells(Ligne, F05_ControleCRA).Select
                    Selection.FormatConditions.Delete
                    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
                    "=SI(" & Cells(Ligne, F05_ControleCRA).Offset(0, 0).Address(RowAbsolute:=False) & "=""OK"";VRAI;FAUX)"
                    Selection.FormatConditions(1).Interior.ColorIndex = 4

                    Next

                    Par contre, j'ai un autre problème, quand j'applique un tri sur ces données par la suite : les valeurs des champs sont triées mais pas les mises en forme conditionnelles !!!
                    Cela signifie que l'on ne peut pas trier des mises en forme conditionnelles dans EXCEL ??
                    Qqun a une idée ?

                    Merci
                    1. re:

                      J'ai aussi trouvé une solution sans formule qui fonctionne très bien.

                      Place le code suivant derrière la feuille en adaptant les plages (Range)

                      Option Explicit
                      '
                      
                      Private Sub Worksheet_Change(ByVal Target As Range)
                      
                          'Désactiver les évènements pour éviter la récursivité
                          Application.EnableEvents = False
                      
                          If (Target.Column = 3) Then
                              
                              Dim Plage As Range, Cible As Range
                          
                              Set Plage = Range("C4:C10")
                                      
                              For Each Cible In Plage
                                  If (Target.Value = "OK") Then
                                      Target.Offset(0, 1).Interior.ColorIndex = 4
                                  Else
                                      Target.Offset(0, 1).Interior.ColorIndex = xlNone
                                  End If
                              Next Cible
                          
                          End If
                          
                          ' Réactiver les évènements
                          Application.EnableEvents = True
                      
                      End Sub
                      


                      Info