减少If语句VBA

时间:2016-06-21 19:20:28

标签: excel vba excel-vba excel-2010

所以现在我在excel中制作一个交互式图表,用户可以通过下拉菜单选择各种选项。例如,如果用户想要将其中一个图表的颜色更改为红色,则会选择该图表的下拉菜单,选择红色,然后图表变为红色。我已经编写了宏来执行此操作,但它由每种颜色的多个if语句组成。有没有一种方法可以减少所有这些if语句?当前代码有效,如下所示。 F16是下拉菜单在excel中的位置,表示将改变的颜色。我也在使用excel 2010

If Target = Range("F16") Then
    'Checks to see if the color is being changed for the Elevation Graph
    If Worksheets("Reference_Sheet").Range("H9").Value = "Black" Then
        Call Black_Line_ELE
    ElseIf Worksheets("Reference_Sheet").Range("H9").Value = "Tan" Then
        Call Tan_ELE
    ElseIf Worksheets("Reference_Sheet").Range("H9").Value = "Dark Blue" Then
        Call Dark_Blue_ELE
    ElseIf Worksheets("Reference_Sheet").Range("H9").Value = "Yellow" Then
        Call Yellow_ELE
    ElseIf Worksheets("Reference_Sheet").Range("H9").Value = "Olive Green" Then
        Call Olive_Green_ELE
    ElseIf Worksheets("Reference_Sheet").Range("H9").Value = "Light Green" Then
        Call Light_Green_ELE
    ElseIf Worksheets("Reference_Sheet").Range("H9").Value = "Green" Then
        Call Green_ELE
    ElseIf Worksheets("Reference_Sheet").Range("H9").Value = "Light Blue" Then
     Call Light_Blue_ELE
    ElseIf Worksheets("Reference_Sheet").Range("H9").Value = "Aqua" Then
        Call Aqua_ELE
    ElseIf Worksheets("Reference_Sheet").Range("H9").Value = "Theme Orange" Then
        Call Theme_Orange_ELE
    ElseIf Worksheets("Reference_Sheet").Range("H9").Value = "Standard Orange" Then
        Call Standard_Orange_ELE
    ElseIf Worksheets("Reference_Sheet").Range("H9").Value = "Standard Purple" Then
        Call Standard_Purple_ELE
    ElseIf Worksheets("Reference_Sheet").Range("H9").Value = "Theme Purple" Then
        Call Theme_Purple_ELE
    ElseIf Worksheets("Reference_Sheet").Range("H9").Value = "Theme Blue" Then
        Call Theme_Blue_ELE
    ElseIf Worksheets("Reference_Sheet").Range("H9").Value = "Standard Blue" Then
        Call Standard_Blue_ELE
    ElseIf Worksheets("Reference_Sheet").Range("H9").Value = "Standard Red" Then
        Call Standard_Red_ELE
    ElseIf Worksheets("Reference_Sheet").Range("H9").Value = "Theme Red" Then
        Call Theme_Red_ELE
        End if
End if

3 个答案:

答案 0 :(得分:5)

一些映射的时间!引用VBScript运行时并创建一个新的Scripting.Dictionary对象。

Dim colorActions As Dictionary
Set colorActions = New Dictionary

或者,不要引用VBScript运行时并使用后期绑定来创建字典:

Dim colorActions As Object
Set colorActions = CreateObject("Scripting.Dictionary")

接下来,将每个值映射到表示要运行的过程名称的字符串:

With colorActions
    .Add "Black", "Black_Line_ELE"
    .Add "Tan", "Tan_ELE"
    .Add "Dark Blue", "Dark_Blue_ELE"
    '...
    .Add "Theme Red", "Theme_Red_ELE"
End With

我会在模块级别生成colorActions字典,然后将代码放在启动时填充它 - 在SheetChanged处理程序中执行此操作将比需要做更多的工作,没理由:每次F16更改都不需要重新创建它!

现在假设这些方法都是公共subs,您可以使用Application.Run执行映射到H9值的命名过程:

Dim key As String
key = Worksheets("Reference_Sheet").Range("H9").Value

If colorActions.Exists(key) Then
    Application.Run colorActions(key)
Else
    MsgBox "Not supported."
End If

这将比Select Case块更好地扩展,并且只有一个实际执行某个地方的单个地方。当您需要添加支持的颜色/方法时,您只需添加一个字典条目即可完成。

那说Call是无用的混乱,你可以放心地省略它。

我还怀疑所有这些单独的方法都在做同样的事情,并且可以全部删除并替换为单个参数化版本 - 但是如果没有看到您的实际代码,就没有办法确定。如果您真的想要清理代码,请将其带到Code Review并尽可能多地提供上下文代码!

答案 1 :(得分:2)

正如@findwindow在评论中所说,您可以从Select声明中受益。请考虑以下示例: -

If Target = Range("F16") Then
   'Checks to see if the color is being changed for the Elevation Graph
   Select Case Worksheets("Reference_Sheet").Range("H9").Value 

       Case "Black" 
           Call Black_Line_ELE

       Case "Tan" 
            Call Tan_ELE

        '... [Your other options] ...

    End Select
End if

答案 2 :(得分:2)

If Target = Range("F16") Then
    Select Case Worksheets("Reference_Sheet").Range("H9").Value
         Case "Black"
             Call Black_Line_ELE
         Case "Tan"
             Call Tan_ELE
         Case 'Do this for all cases
    End Select
End If

Look here for more details

应该使代码的结构更清晰。