2016-06-21 94 views
2

所以現在我在Excel中,用戶可以通過下拉菜單中選擇各種選項進行的互動圖表。例如,如果用戶想要將其中一個圖表的顏色更改爲紅色,則選擇該圖表的下拉菜單,選擇紅色,然後圖表變爲紅色。我已經編寫了宏來執行此操作,但它由多個if語句組成。有沒有減少所有這些陳述的好方法?目前的代碼工作,並在下面。 F16是excel中的下拉菜單的位置,表示將改變顏色。也正在使用Excel 2010削減下來的if語句VBA

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 
+4

查找到'case'語句。另外,用''。 – findwindow

+1

Protip:將您的工作代碼(帶有完整上下文)帶到[codereview.se]進行徹底清理。 –

回答

2

由於@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 
2
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

應該讓你的代碼更清晰的結構。

5

時間對於一些映射!引用VBScript運行時並創建一個新的Scripting.Dictionary對象。

Dim colorActions As Dictionary 
Set colorActions = New Dictionary 

或者,不引用VBScript運行時並使用後期綁定來創建,而不是字典:

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 

我會使​​字典住在模塊-1埃維爾,然後把代碼在啓動時填充它 - 這樣做,在SheetChanged處理器將做更多的工作比需要的,沒有理由:你不需要每次重建它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塊好得多,只有1使實際執行某事的單個地方。當您需要添加支持的顏色/方法時,您只需添加一個字典條目即可完成。

也就是說Call是無用的混亂,你可以放心地忽略它。


我還懷疑,所有這些不同的方法確實都在做同樣的事情,可以全部取出,並用一個參數化的版本替換 - 但有沒有告訴肯定的方式,沒有看到您的實際代碼..如果你真的清理你的代碼,把它帶到Code Review,給儘可能多的上下文代碼越好!

+1

哈哈我清楚地從_my_問題中沒有學到任何東西XD沒有想到它XD – findwindow

+1

@findwindow最糟糕的部分是,我認爲它們都沒有甚至相關,OP的問題很可能通過參數化任何過程被稱爲那裏。萬歲CR! –