2016-06-02 3 views
0

VBA를 처음 사용합니다. 이것이 내가하는 일을하는 최선의 방법이 아니라는 것을 알고 있습니다. 그래서 개선을위한 아이디어와 일반적인 방법론에 대한 도움을 주시면 감사하겠습니다!Excel VBA 복수 조건부 서식

내가 원하는 세 가지 형식이 있습니다. 보다 작음,보다 큼 및 빈 셀 형식

거의 모든 코드가 각 행을 해당 행 (목표)의 끝에있는 값과 비교하여 검사합니다. 목표보다 크거나 같으면 녹색으로 바뀝니다. 덜 작 으면, 빨강. 목표 셀이 비어 있으면 모든 셀이 비어 있습니다 (서식은 흰색 배경, 검은 색 텍스트). 셀이 비어 있으면 셀이 비어 있습니다 (흰색 배경).

나는 5 개의 매크로를 모두, 적은, 큰, 같음, 빈 목표, 빈 셀 순서로 실행했습니다. 이것은 올바른 형식으로 멋진 엑셀을 만들었습니다.

목표 번호를 변경하면 해당 행의 셀이 각각 변경됩니다. 큰! 그러나 이전에 빈 목표에 새 번호를 추가하거나 목표 번호를 삭제하면 매크로를 다시 실행하여 서식을 가져와야합니다.

사이드 노트 : 내 코드의 경우, 내가 원했던 행 (Empty Cell 제외)을 기록한 다음 추가 행을 루프로 바꿨습니다.

매크로 다시 실행을 제거하는 방법에 대한 아이디어가 있으십니까? 이상적으로이 Excel 문서는 VBA에 대해 모르는 사람에게 전송됩니다.

Sub Greater() 
Dim i As Integer 
Dim myRange As String 
Dim myComparison As String 
For i = 4 To 97 
    myRange = "C" & i & ":BC" & i 
    myComparison = "=$BD$" & i 
    Range(myRange).Select 
    Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlGreater, _ 
     Formula1:=myComparison 
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority 
    With Selection.FormatConditions(1).Font 
     .Color = -16752384 
     .TintAndShade = 0 
    End With 
    With Selection.FormatConditions(1).Interior 
     .PatternColorIndex = xlAutomatic 
     .Color = 13561798 
     .TintAndShade = 0 
    End With 
    Selection.FormatConditions(1).StopIfTrue = False 
    Next i 
End Sub 

X

Sub Lesser() 
Dim i As Integer 
Dim myRange As String 
Dim myComparison As String 
For i = 4 To 97 
    myRange = "C" & i & ":BC" & i 
    myComparison = "=$BD$" & i 
    Range(myRange).Select 
    Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlLess, _ 
     Formula1:=myComparison 
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority 
    With Selection.FormatConditions(1).Font 
     .Color = -16383844 
     .TintAndShade = 0 
    End With 
    With Selection.FormatConditions(1).Interior 
     .PatternColorIndex = xlAutomatic 
     .Color = 13551615 
     .TintAndShade = 0 
    End With 
    Selection.FormatConditions(1).StopIfTrue = False 
    Next i 
End Sub 

X

Sub Equal() 
Dim i As Integer 
Dim myRange As String 
Dim myComparison As String 
For i = 4 To 97 
    myRange = "C" & i & ":BC" & i 
    myComparison = "=$BD$" & i 
    Range(myRange).Select 
    Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _ 
     Formula1:=myComparison 
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority 
    With Selection.FormatConditions(1).Font 
     .Color = -16752384 
     .TintAndShade = 0 
    End With 
    With Selection.FormatConditions(1).Interior 
     .PatternColorIndex = xlAutomatic 
     .Color = 13561798 
     .TintAndShade = 0 
    End With 
    Selection.FormatConditions(1).StopIfTrue = False 
    Next i 
End Sub 

X

Sub EmptyGoal() 
Dim i As Integer 
Dim myRange As String 
Dim myComparison As String 
For i = 4 To 97 
    myRange = "C" & i & ":BC" & i 
    Range(myRange).Select 
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:=IsEmpty(Cells(i, 56)) 
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority 
    With Selection.FormatConditions(1).Font 
     .ThemeColor = xlThemeColorLight1 
     .TintAndShade = 0 
    End With 
    With Selection.FormatConditions(1).Interior 
     .PatternColorIndex = xlAutomatic 
     .ThemeColor = xlThemeColorDark1 
     .TintAndShade = 0 
    End With 
    Selection.FormatConditions(1).StopIfTrue = False 
    Next i 
End Sub 

X

Sub EmptyCell() 
    Range("C4:BC97").Select 
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _ 
     "=LEN(TRIM(C4))=0" 
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority 
    With Selection.FormatConditions(1).Interior 
     .PatternColorIndex = xlAutomatic 
     .ThemeColor = xlThemeColorDark1 
     .TintAndShade = 0 
    End With 
    Selection.FormatConditions(1).StopIfTrue = False 
End Sub 
+0

데이터를 보지 않고 무엇을하고 있는지 정확하게 이해하기는 어렵지만 환경 설정 순서에 따라 4 개 또는 5 개의 조건을 사용하여 * 전체 데이터 세트 *에 한 번만 서식을 적용 할 수 있다고 생각합니다. 행을 반복하거나 매크로를 작성할 필요가 없습니다. 수식 옵션을 사용하여 가능한 변경 사항을 통합하는 방식으로 규칙을 작성할 수 있습니다. –

답변

0
  1. 매크로를 모두 호출하는 매크로를 추가하지 않는 이유는 무엇입니까? 그런 다음 시트의 어딘가에 버튼을 설정하여 실행하십시오. (추신 : 당신은 쉽게 동일한 Sub에있는 모든 것을 할 수 있고, 각 셀을 반복 할 필요가없는 모든 셀 (이제는 ($$)을 사용하여 절대 참조를 설정하기 때문에이 작업을 수행 할 수 있습니다. 엑셀, 그냥 열을 잠그면 괜찮을거야.)
  2. 부수적으로, 조건부 서식에 대해 설정된 원래 범위에서 범위를 삭제 한 다음 무언가를 추가/삭제하면 조건부 서식이 해당 범위로 분할 될 가능성이 있습니다 (지정된 범위가 잠겨 있지 않으면 변경되고 Excel에서 예상되는 동작입니다.) 그러나 사용자가 행을 추가하면 전체 열에 대해 아무 작업도 수행되지 않습니다. 즉, 추가 된 행에 대해 조건부 서식이 유지됩니다 열 추가/삭제시 행에 대한 원칙).

예를 들어 GreaterLesserAndEqual 대신이 보조 기능을 사용할 수 있습니다.

Sub AddConditionalFormating() 
Dim myRange As Range: Set myRange = Range("C4:BC97") 
myRange.FormatConditions.Delete 
Call AddGreaterLesserAndEqual(xlGreater, 198, 239, 206, 0, 97, 0) 
Call AddGreaterLesserAndEqual(xlLess, 156, 0, 6, 255, 199, 206) 
Call AddGreaterLesserAndEqual(xlEqual, 0, 97, 0, 198, 239, 206) 
End Sub 
Sub AddGreaterLesserAndEqual(OperatorToEvalaute, RColorFonT As Long, GColorFont As Long, BColorFont As Long, RInteriorColor As Long, GInteriorColor As Long, BInteriorColor As Long) 
Const myComparison = "=$BD1" 
Dim myRange As Range: Set myRange = Range("C4:BC97") 
myRange.FormatConditions.Add Type:=xlCellValue, Operator:=OperatorToEvalaute, _ 
Formula1:=myComparison 
myRange.FormatConditions(myRange.FormatConditions.Count).SetFirstPriority 
myRange.FormatConditions(1).Font.Color = RGB(RColorFonT, GColorFont, BColorFont) 
myRange.FormatConditions(1).Interior.Color = RGB(RInteriorColor, GInteriorColor, BInteriorColor) 
myRange.FormatConditions(1).StopIfTrue = False 
End Sub 
0

내가이 쇼에 늦었는지 확실하지 않지만 내 두 센트를 추가 할 것으로 생각했습니다. 업데이트하지 않는 셀에 문제가있는 부분이이 코드 Selection.FormatConditions.Add Type:=xlExpression, Formula1:=IsEmpty(Cells(i, 56))과 관련이 있다고 생각합니다.여기서 일어나는 일은 VBA가이 표현식 IsEmpty(Cells(i, 56))을 TRUE 또는 FALSE로 계산하고 그 부울 값이 조건부 형식으로 채워지는 것입니다. TRUE는 항상 TRUE이고 FALSE는 항상 FALSE이므로 절대 업데이트되지 않습니다. 귀하의 다른 표현과 비슷한 것을 사용하면 여기에서 효과가있을 것입니다. =LEN(TRIM(C4))=0

또한 향후 marcoing에 도움이되는 재미있는 사실입니다. Cells(i, 56) 또는 Cells(i, "BD")을 넣을 수 있으며 올바르게 처리 할 수 ​​있습니다. 때로는 나중에 코드로 돌아 왔을 때 어떤 열인지 기억하기가 힘들 때가 있습니다.

조건부 서식에 대해 멋진 또 다른 사항은 조건에 수식을 넣을 수 있고 셀의 수식과 마찬가지로 Excel에서 계산할 수 있다는 것입니다. 셀 "A1"에 =SUM(B1:C1)이 포함되어 있고 해당 셀을 복사하여 셀 "A2"에 붙여 넣으면 "A2"에 =SUM(B2:C2)이 포함되고 달러 기호는 해당 위치의 주소 부분을 고정시킵니다. 따라서 $ A1은 열을 "A"로 유지하지만 행을 변경할 수있게합니다. 그러나 A $ 1은 열을 변경할 수 있지만 행은 동일하게 유지됩니다. 그리고 마침내 $ A $! "절대"위치가되므로 열이나 행이 변경되지 않습니다.

조건부 형식의 조건에도 적용됩니다. 수식 =C4=$BD4을 만들면 C4는 =C4=$BD4으로 표시되지만 C5는 =C5=$BD5으로 표시되고 마지막으로 D6은 =D6=$BD6으로 표시됩니다. 따라서이 지식을 사용하면 실제로 모든 행을 반복하는 for 루프를 수행 할 필요가 없으며 $를 올바르게 사용해야합니다.

이 모든 것을 고려하여 이전에했던 것과 동일한 결과를 얻는 다음 코드를 작성 했으므로 조금 더 읽기 쉬울 수도 있습니다.

주목할만한 점은 현재 Cell = Goal 및 Cell> Goal이 같은 방식으로 형식이 지정되었지만 Cell> = 목표 인 하나의 조건부 형식 일 수는 있지만 별도로 두었 기 때문에 미래의 각 조건. 또한 xlThemeColorLight1과 Dart1은 Excel에서 White로 표시되었으므로 실제로 어떤 색상을 사용했는지 확신 할 수 없었습니다. 그러나 색인 번호를 알고있는 경우 .Color = RGB(XXX, XXX, XXX) 또는 .Color = XXXXXXX을 사용할 수 있습니다.

Sub CombinedMacro() 

    Dim ws As Worksheet 
    Dim rng1 As Range, rng2 As Range 
    Dim rowStart As Integer, rowEnd As Integer 

    Set ws = ActiveSheet 
    rowStart = 14 
    rowEnd = 17 

    Set rng1 = ws.Range("C" & rowStart & ":BC" & rowEnd) 
    Set rng2 = ws.Range("BD" & rowStart & ":BD" & rowEnd) 

    rng1.FormatConditions.Delete 
    rng2.FormatConditions.Delete 

    With rng1 
     'Condition if cell is empty 
     .FormatConditions.Add xlExpression, , "=LEN(TRIM(C" & rowStart & "))=0" 
     With .FormatConditions(1) 
      .Interior.Color = vbYellow 
      .StopIfTrue = False 
     End With 

     'Condition if cell is equal to goal 
     .FormatConditions.Add xlExpression, , "=C" & rowStart & "=$BD" & rowStart 
     With .FormatConditions(2) 
      .Font.Color = 24832 'positive version of -16752384 
      .Interior.Color = 13561798 
      .StopIfTrue = False 
     End With 

     'Condition if cell is less than goal 
     .FormatConditions.Add xlExpression, , "=C" & rowStart & "<$BD" & rowStart 
     With .FormatConditions(3) 
      .Font.Color = 393372 'positive version of -16383844 
      .Interior.Color = 13551615 
      .StopIfTrue = False 
     End With 

     'Condition if cell is greater than goal 
     .FormatConditions.Add xlExpression, , "=C" & rowStart & ">$BD" & rowStart 
     With .FormatConditions(4) 
      .Font.Color = 24832 'positive version of -16752384 
      .Interior.Color = 13561798 
      .StopIfTrue = False 
     End With 
    End With 

    With rng2 
     'Condition if goal is empty 
     .FormatConditions.Add xlExpression, , "=LEN(TRIM(BD" & rowStart & "))=0" 
     With .FormatConditions(1) 
      .Interior.Color = vbBlue 
      .StopIfTrue = False 
     End With 
    End With 

End Sub 

아, 또한 해당 범위에 추가하는 각 조건에 대해 FormatCondition (#)이 1 씩 증가합니다. 그래서 그들은 당신이 그들을 창조하는 순서대로 일어날 것입니다, 나는 당신이 Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority을 사용하고있는 것을 보았습니다 만 그것은 단지 순서를 바꿉니다. 코드에서 순서를 변경하면 같은 효과가 있어야합니다.

이 정보가 도움이되기를 바랍니다. 행복한 Marco-ing!