减lessIf语句VBA

所以现在我在Excel中创build一个交互式graphics,用户可以通过下拉菜单select各种选项。 例如,如果用户想要将其中一个图表的颜色更改为红色,则select该图表的下拉菜单,select红色,然后图表变为红色。 我已经写了macros来做到这一点,但它由多个if语句组成。 有没有减less所有这些陈述的好方法? 目前的代码工作,并在下面。 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 

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

 Dim colorActions As Dictionary Set colorActions = New Dictionary 

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

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

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

 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字典在模块级colorActions ,然后把代码放在启动时填充 – 在SheetChanged处理程序中这样做会比所需要的做更多的工作,没有任何理由:您不需要重新创build它每次F16改变!

现在假设这些方法都是公有的,你可以使用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是无用的混乱,你可以放心地忽略它。


我也怀疑所有这些单独的方法实际上都在做同样的事情,都可以被删除,并用一个参数化的版本replace – 但是没有看到你的实际代码没有办法确定…如果你真的想清理把你的代码joinCode Review,并尽可能地给出上下文代码!

正如@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 
 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 

在这里寻找更多的细节

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