gpt4 book ai didi

vba - 减少 If 语句 VBA

转载 作者:行者123 更新时间:2023-12-02 23:39:08 27 4
gpt4 key购买 nike

现在我正在 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

最佳答案

是时候绘制 map 了!引用 VBScript 运行时并创建一个新的 Scripting.Dictionary 对象。

Dim colorActions As Dictionary
Set colorActions = New Dictionary

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

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 更改时都重新创建它!

现在假设这些方法都是公共(public)子方法,您可以使用 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 block 更好地扩展,并且只需要 1 个位置来实际执行某些操作。当您需要添加支持的颜色/方法时,只需添加一个字典条目即可完成。

这就是说 Call 是无用的困惑,你可以安全地忽略它。

<小时/>

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

关于vba - 减少 If 语句 VBA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37952883/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com