首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >减少If语句VBA

减少If语句VBA
EN

Stack Overflow用户
提问于 2016-06-22 03:20:28
回答 3查看 108关注 0票数 2

因此,现在我正在用excel制作一个交互式图形,用户可以通过下拉菜单选择各种选项。例如,如果用户想要将其中一个图表的颜色更改为红色,则选择该图表的下拉菜单,选择红色,然后该图表变为红色。我已经写了一些宏来做这件事,但是它包含了多个if语句来处理每种颜色。有没有一种好的方法来减少所有这些if语句?当前代码工作正常,如下所示。F16是下拉菜单在excel中的位置,用于指示将更改的颜色。我也在使用excel 2010

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

发布于 2016-06-22 03:30:45

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

代码语言:javascript
复制
Dim colorActions As Dictionary
Set colorActions = New Dictionary

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

代码语言:javascript
复制
Dim colorActions As Object
Set colorActions = CreateObject("Scripting.Dictionary")

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

代码语言:javascript
复制
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更改时重新创建它!

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

代码语言:javascript
复制
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是无用的杂物,您可以放心地省略它。

我还怀疑所有这些独立的方法实际上都在做同样的事情,可以全部删除并替换为一个参数化版本-但如果没有看到实际的代码,就无法确定……如果你真的想要清理你的代码,把它带到,并给出尽可能多的上下文代码!

票数 6
EN

Stack Overflow用户

发布于 2016-06-22 03:29:18

正如@findwindow在注释中所述,您可以从Select语句中受益。考虑下面的例子:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-06-22 03:29:52

代码语言:javascript
复制
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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37952883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档