减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
在这里寻找更多的细节
应该使你的代码结构更清晰。