VBA EXCEL utilisation variable dans condition

Résolu/Fermé
vbatta16
Messages postés
11
Date d'inscription
vendredi 28 janvier 2011
Statut
Membre
Dernière intervention
24 janvier 2016
- 28 janv. 2011 à 13:04
 Info - 28 janv. 2011 à 19:13
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

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
0
vbatta16
Messages postés
11
Date d'inscription
vendredi 28 janvier 2011
Statut
Membre
Dernière intervention
24 janvier 2016
1
28 janv. 2011 à 14:16
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
0
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
0
vbatta16
Messages postés
11
Date d'inscription
vendredi 28 janvier 2011
Statut
Membre
Dernière intervention
24 janvier 2016
1
28 janv. 2011 à 15:08
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
0
vbatta16
Messages postés
11
Date d'inscription
vendredi 28 janvier 2011
Statut
Membre
Dernière intervention
24 janvier 2016
1
28 janv. 2011 à 15:55
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
0
vbatta16
Messages postés
11
Date d'inscription
vendredi 28 janvier 2011
Statut
Membre
Dernière intervention
24 janvier 2016
1
28 janv. 2011 à 16:00
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
0
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
0
vbatta16
Messages postés
11
Date d'inscription
vendredi 28 janvier 2011
Statut
Membre
Dernière intervention
24 janvier 2016
1
28 janv. 2011 à 19:00
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
0
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
0