2016-06-21 7 views
2

今私はExcelでインタラクティブなグラフを作っています。ここでドロップダウンメニューからさまざまなオプションを選択できます。たとえば、ユーザーがグラフの1つの色を赤に変更したい場合は、そのグラフのドロップダウンメニューを選択し、赤を選択するとグラフが赤に変わります。これを行うためのマクロを作成しましたが、各色のif文を複数作成します。これらのif文をすべて削除する良い方法はありますか?現在のコードは動作し、以下のとおりです。 F16は、ドロップダウンメニューがどの色が変わるかを示すExcelの位置です。 @findwindowはコメントで述べたようにもエクセル2010If文を減らす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

を使用しています、あなたは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 

私は​​辞書はモジュール-Lでのライブになるだろうそれでは、起動時にコードを投入するコードを入れてください。SheetChangedハンドラでは、何もせずに必要以上に多くの作業を行うでしょう:毎回F16が変更される必要はありません!

は今、これらのメソッドは、すべての公共潜水艦あると仮定すると、あなたがH9の値にマッピングされた名前のプロシージャを実行するためにApplication.Runを使用することができます。

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

lol私は明らかに_my_質問から何も学んでいませんでしたXD – findwindow

+1

@findwindow最悪の部分は、どれも関連していないと思う、OPの問題は実際にはどんな手順でもパラメータ化するそこに呼ばれている。ロングライブCR! –