2012-07-26 81 views
1

我有一个对象(即一个包含文本的矩形形状),我希望形状变化的颜色(状态)取决于一个单元格内的文本(从下拉列表)。VBA中单个对象上的多个条件格式

我现在使用'if'函数来格式化形状,我觉得这是最好的方法;但是我不确定如何在VBA中运行多个“IF”公式。

我已经运行了一个成功的'如果'公式格式化,但这只能够改变2种颜色。这是我的单一'如果'公式。

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 

当我添加其他条件/'如果'公式脚本它无法改变对象的颜色。我得到的最接近的是'If'和'End If'公式来涵盖所有可能性。这是我最接近的提取(从我的经验)。

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

你可以尝试[编辑您的问题(http://stackoverflow.com/posts/11666218/edit)和正确缩进代码,然后选择它,然后按' {}'按钮使它看起来不错? – assylias 2012-07-26 09:27:42

+1

您需要使用语句“ElseIf”。在这种情况下,我可能会选择案例。 – Trace 2012-07-26 09:50:24

回答

0

要添加到亚历山大的回答(不要忘了接受它!),你可以重构一点,以避免重复:

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

这几乎是完美的,但是只有当我将宏指定给一个按钮时,对象的颜色才会更新。我beleiev这是我需要弄清楚,也许一个设置是一个错误! 无论如何,非常感谢! – 2012-07-31 13:42:35

+0

你会从worksheet_change事件中调用它。 – 2012-07-31 15:00:06

0

elseif的将是一个进步,但最干净的方法是只用选择这样的:

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 

此代码已经过测试,在我的电脑上工作。

编辑:只是为了完整起见,这里是使用if/ELSEIF /其他相同的代码:

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

嘿,谢谢......它看起来像它会工作,我刚刚与另一个答案,因为我foudn它第一..谢谢! – 2012-07-31 13:41:42

相关问题