2016-06-21 9 views
2

지금은 Excel에서 대화 형 그래프를 만들고 있는데, 여기서 드롭 다운 메뉴를 통해 다양한 옵션을 선택할 수 있습니다. 예를 들어 사용자가 차트 중 하나의 색을 빨간색으로 변경하려면 해당 차트의 드롭 다운 메뉴를 선택하고 빨간색을 선택한 다음 차트가 빨간색으로 바뀝니다. 이 작업을 수행하기 위해 매크로를 작성했지만 각 색상에 대해 여러 if 문을 작성합니다. 이 if 문 모두를 줄일 수있는 좋은 방법이 있습니까? 현재 코드가 작동하며 아래에 있습니다. F16은 어떤 색상이 변경 될 것인지를 나타내는 드롭 다운 메뉴가있는 곳입니다. 또한 @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 

나는 colorActions 사전 모듈 리터에 살고 만들 것입니다 : 절차는 실행하려면 evel을 실행 한 다음 시작시에 코드를 채우려면 코드를 넣으십시오. 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

권자 나는 분명히 어떤 절차를 매개 변수화에 의해, 영업 이익의 문제가 실제로 * * 해결 될 가능성이 높다는 최악의 부분은 @findwindow – findwindow

+1

, 나는 그것의 어느 것도도 관련이 없다고 생각 XD에 대해 XD도 생각하지 않았다 _my_ 질문에서 아무 것도 배운 적이 거기에서 불리고있다. 긴 라이브 CR! –