2012-07-26 1 views
1

J'ai un objet (c'est-à-dire un texte en forme de rectangle), j'aimerais que la forme change de couleur (état) en fonction du texte dans un cel (à partir d'une liste déroulante). J'utilise les fonctions 'If' pour formater la forme actuellement, et je pense que c'est la meilleure façon; Cependant je ne sais pas comment avoir plusieurs formules 'IF' fonctionnant dans VBA.Plusieurs formats conditionnels sur un seul objet en VBA

J'ai exécuté une formule 'If' réussie pour le formatage, mais celle-ci ne pouvait changer que de 2 couleurs. Voici ma seule formule "si". Lorsque j'ai ajouté d'autres conditions/formules 'If' au script, la couleur de l'objet n'a pas pu être modifiée. Le plus proche était avec les formules 'If' et 'end If' pour couvrir toutes les possibilités. Voici mon extraction la plus proche (de mon expérience).

If Range("I2") = "Yes" Then 
    Worksheets("M2").Shapes("Rect1").Fill.ForeColor.RGB = RGB(0, 128, 0) 
End If 

If Range("I2") = "No" Then 
    Worksheets("M2").Shapes("Rect1").Fill.ForeColor.RGB = RGB(218, 9, 4) 
End If 

If Range("I2") = "In Progress" Then 
    Worksheets("M2").Shapes("Rect1").Fill.ForeColor.RGB = RGB(201, 129, 13) 
End If 

If Range("I2") = "Deviation" Then 
    Worksheets("M2").Shapes("Rect1").Fill.ForeColor.RGB = RGB(79, 79, 79) 
Else 
    Worksheets("M2").Shapes("Rect1").Fill.ForeColor.RGB = RGB(0, 102, 204) 
End If 
+1

Pouvez-vous essayer de [modifier votre question] (http://stackoverflow.com/posts/11666218/edit) et en retrait de votre code correctement, puis sélectionnez-le et appuyez sur la ' {} 'bouton pour le rendre joli? – assylias

+1

Vous devez utiliser l'instruction "ElseIf". Dans ce cas, j'irais probablement avec un cas Select. – Trace

Répondre

0

Pour ajouter à la réponse d'Alexandre (ne pas oublier de l'accepter!), Vous pouvez refactoriser un peu pour éviter la répétition:

Dim clr As Long 

Select Case Range("I2").Value 
    Case "Yes": clr = RGB(0, 128, 0) 
    Case "No": clr = RGB(218, 9, 4) 
    Case "In Progress": clr = RGB(201, 129, 13) 
    Case "Deviation": clr = RGB(79, 79, 79) 
    Case Else: clr = RGB(0, 102, 204) 
End Select 

ActiveSheet.Shapes("Rect1").Fill.ForeColor.RGB = clr 
+0

C'est presque parfait, mais la couleur de l'objet ne se met à jour que lorsque j'attribue la macro à un bouton. Je crois que c'est quelque chose que je dois comprendre, peut-être un réglage est une faute! En tout cas, merci beaucoup! –

+0

Vous appelez cela depuis un événement worksheet_change. –

0

ElseIf serait une amélioration, mais la manière la plus propre est d'utiliser il suffit de sélectionner comme ceci:

Select Case Range("I2").Value 
    Case "Yes" 
     ActiveSheet.Shapes("Rect1").Fill.ForeColor.RGB = RGB(0, 128, 0) 
    Case "No" 
     ActiveSheet.Shapes("Rect1").Fill.ForeColor.RGB = RGB(218, 9, 4) 
    Case "In Progress" 
     ActiveSheet.Shapes("Rect1").Fill.ForeColor.RGB = RGB(201, 129, 13) 
    Case "Deviation" 
     ActiveSheet.Shapes("Rect1").Fill.ForeColor.RGB = RGB(79, 79, 79) 
    Case Else 
     ActiveSheet.Shapes("Rect1").Fill.ForeColor.RGB = RGB(0, 102, 204) 
End Select 

Ce code a été testé pour fonctionner sur mon ordinateur.

Edit: Juste pour être complet, voici le même code en utilisant si/elseif/else:

If Range("I2") = "Yes" Then 
    ActiveSheet.Shapes("Rect1").Fill.ForeColor.RGB = RGB(0, 128, 0) 
ElseIf Range("I2") = "No" Then 
    ActiveSheet.Shapes("Rect1").Fill.ForeColor.RGB = RGB(218, 9, 4) 
ElseIf Range("I2") = "In Progress" Then 
    ActiveSheet.Shapes("Rect1").Fill.ForeColor.RGB = RGB(201, 129, 13) 
ElseIf Range("I2") = "Deviation" Then 
    ActiveSheet.Shapes("Rect1").Fill.ForeColor.RGB = RGB(79, 79, 79) 
Else 
    ActiveSheet.Shapes("Rect1").Fill.ForeColor.RGB = RGB(0, 102, 204) 
End If 
+0

Hé, merci ... On dirait que ça va marcher, je suis juste allé avec une autre réponse comme je l'ai d'abord foutu .. MERCI !!! –

Questions connexes