bak*_*son 2 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
Run Code Online (Sandbox Code Playgroud)
一些映射的时间!引用VBScript运行时并创建一个新Scripting.Dictionary对象.
Dim colorActions As Dictionary
Set colorActions = New Dictionary
Run Code Online (Sandbox Code Playgroud)
或者,不要引用VBScript运行时并使用后期绑定来创建字典:
Dim colorActions As Object
Set colorActions = CreateObject("Scripting.Dictionary")
Run Code Online (Sandbox Code Playgroud)
接下来,将每个值映射到表示要运行的过程名称的字符串:
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
Run Code Online (Sandbox Code Playgroud)
我将使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
Run Code Online (Sandbox Code Playgroud)
这将比Select Case块更好地扩展,并且只有1个单独的地方实际执行某些东西.当您需要添加支持的颜色/方法时,您只需添加一个字典条目就可以了.
那说Call是无用的杂乱,你可以安全地省略它.
我还怀疑所有这些单独的方法都在做同样的事情,并且可以全部删除并替换为单个参数化版本 - 但是如果没有看到您的实际代码就无法确定...如果您真的想要清理编写代码,将其带到Code Review并尽可能多地提供上下文代码!
| 归档时间: |
|
| 查看次数: |
95 次 |
| 最近记录: |