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. 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
    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:

        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. 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. 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. 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. 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:

                  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. 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. 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