VBA 조건부 서식: 네 셀의 강조와 기존 규칙 보존을 함께 검사하기
셀에 빨간색이 보인다는 것만으로 올바른 조건부 서식인지 알 수는 없습니다. 잘못 고정한 행 참조가 모든 셀을 칠했거나 직접 채우기 색이 남아 있을 수 있습니다. 이 글에서는 강조될 셀 주소 네 개와 규칙 개수를 완료 조건으로 삼습니다.
기존 숫자·문구 알고리즘은 보존했습니다. 첨부 워크북은 입력과 논리 검산 수식이며 실제 조건부 서식 규칙이나 VBA는 넣지 않았습니다. Python 검산과 XLSX 수식 결과는 확인했고, Excel VBA 실행과 실제 색상 관찰은 하지 않았습니다.

숫자 0.8과 연속된 지연 문구
| 숫자 시트 셀 | 실제 숫자/빈 값 | 예상 강조 |
|---|---|---|
| C2 | 0.65 | 빨강 |
| C3 | 0.8 | 없음 |
| C4 | 0.95 | 없음 |
| C5 | 0.4 | 빨강 |
| C6 | 빈 셀 | 없음 |
| C7 | 1 | 없음 |
숫자 시트 이름은 CF_Number_Demo입니다. 규칙은 =AND(ISNUMBER($C2),$C2<0.8)이고 적용 범위는 C2:C7입니다. 0.8은 미만이 아니므로 강조하지 않습니다. 숫자 문자열 "0.65"나 빈 셀도 ISNUMBER 조건에서 제외합니다. 음수는 실제 숫자이므로 이 조건에서는 강조 대상입니다.
문구 시트 CF_Text_Demo A2:A7은 순서대로 배송지연, 입금완료, 지연확인중, 정상처리, 지 연, DELAY입니다. A2·A4만 노랑입니다. 지 연의 공백을 임의 제거하거나 DELAY를 번역해서 찾는 기능은 없습니다.
같은 규칙만 재사용합니다
FormatConditions.Add는 새 조건부 서식을 추가합니다. 규칙이 없을 때만 Add를 호출하고, 하나가 있으면 종류·적용 범위·수식이 정확히 같은지 확인합니다. 다르면 지우지 않고 중단합니다. 단순히 실행할 때마다 Add를 호출하면 같은 규칙이 여러 개 쌓일 수 있습니다.
StopIfTrue는 참인 규칙 뒤의 추가 규칙을 평가할지를 정하는 Boolean 속성입니다. 예제는 False를 명시하지만 여러 규칙이 공존하는 업무 시트를 정리하는 프로그램은 아닙니다. 정확히 같은 규칙은 소유한 실습 규칙으로 보고 색·폰트·StopIfTrue를 설정하므로, 동일 수식에 별도 디자인을 해 놓았다면 그 모양이 바뀔 수 있습니다.

전체 모듈과 행 참조
$C2의 열은 고정하고 행은 상대 참조로 둡니다. $C$2로 바꾸면 모든 행이 첫 값 0.65를 보므로 빈 C6까지 참으로 판정되는 반례가 됩니다. 규칙의 수식과 범위를 함께 읽어야 하는 이유입니다. 텍스트 수식의 한글은 ChrW로 구성해 BAS 가져오기 인코딩에 덜 의존하게 했습니다.
Option Explicit
Public Sub ApplyNumberRule()
Dim ws As Worksheet, rng As Range, cell As Range
Dim rule As FormatCondition
On Error GoTo Failed
Set ws = ThisWorkbook.Worksheets("CF_Number_Demo")
Set rng = ws.Range("C2:C7")
For Each cell In rng.Cells
If IsError(cell.Value2) Then Err.Raise vbObjectError + 801, , "Fix input error: " & cell.Address
Next cell
Set rule = OwnedExpressionRule(rng, "=AND(ISNUMBER($C2),$C2<0.8)")
With rule
.Interior.Color = RGB(255, 199, 206)
.Font.Color = RGB(156, 0, 6)
.StopIfTrue = False
End With
MsgBox "Number rule ready. Check C2 and C5.", vbInformation
Exit Sub
Failed:
MsgBox "Number rule stopped: " & Err.Number & " / " & Err.Description, vbExclamation
End Sub
Public Sub ApplyTextRule()
Dim ws As Worksheet, rng As Range, cell As Range
Dim rule As FormatCondition, keyword As String
On Error GoTo Failed
Set ws = ThisWorkbook.Worksheets("CF_Text_Demo")
Set rng = ws.Range("A2:A7")
For Each cell In rng.Cells
If IsError(cell.Value2) Then Err.Raise vbObjectError + 802, , "Fix input error: " & cell.Address
Next cell
keyword = ChrW(&HC9C0) & ChrW(&HC5F0)
Set rule = OwnedExpressionRule(rng, _
"=ISNUMBER(SEARCH(""" & keyword & """,$A2))")
With rule
.Interior.Color = RGB(255, 235, 156)
.Font.Color = RGB(156, 101, 0)
.StopIfTrue = False
End With
MsgBox "Text rule ready. Check A2 and A4.", vbInformation
Exit Sub
Failed:
MsgBox "Text rule stopped: " & Err.Number & " / " & Err.Description, vbExclamation
End Sub
Private Function OwnedExpressionRule(ByVal rng As Range, ByVal formula As String) As FormatCondition
Dim existing As Object
If rng.FormatConditions.Count = 0 Then
Set OwnedExpressionRule = rng.FormatConditions.Add(Type:=xlExpression, Formula1:=formula)
Exit Function
End If
If rng.FormatConditions.Count <> 1 Then
Err.Raise vbObjectError + 803, , "Existing rules found. Use a clean practice range."
End If
Set existing = rng.FormatConditions(1)
If existing.Type <> xlExpression Then
Err.Raise vbObjectError + 804, , "Existing rule type differs. No rules deleted."
End If
If existing.AppliesTo.Address <> rng.Address Then
Err.Raise vbObjectError + 805, , "Existing rule covers a different range."
End If
If StrComp(existing.Formula1, formula, vbTextCompare) <> 0 Then
Err.Raise vbObjectError + 806, , "Existing formula differs. No rules deleted."
End If
Set OwnedExpressionRule = existing
End Function
두 범위에 규칙을 적용하는 순서
-
practice-79.xlsx를 format-demo.xlsm 사본으로 저장하고 두 입력 시트의 값을 확인합니다.
-
ConditionalFormatPractice.bas를 표준 모듈로 가져와 컴파일을 확인합니다.
-
ApplyNumberRule을 실행하고 C2·C5만 빨강인지 확인합니다.
-
ApplyTextRule을 실행하고 A2·A4만 노랑인지 확인합니다.
-
규칙 관리자에서 적용 범위·수식·규칙 한 개를 확인하고 논리검산 F열에 실제 색상 결과를 입력합니다.
-
두 매크로를 다시 실행해 규칙이 늘지 않는지 확인하고 변형 실험은 별도 사본에서 실행합니다.
검증 결과: 논리와 색상을 다른 열에 기록합니다
논리검산!A2:F13에는 12개 입력이 있습니다. D열은 고정 정답, E열은 같은 입력에 대한 일반 셀 수식 결과입니다. E2·E5·E8·E10은 강조이고 나머지는 없음입니다. F열은 실제 Excel에서 색상을 본 뒤 적도록 비워 두었습니다. E열이 맞는다는 사실은 조건부 서식의 색상·우선순위가 맞다는 증거가 아닙니다.
Python 참조 검사는 숫자/문자·빈 값·음수·0.8 경계와 문구 공백을 구분합니다. 별도 상태 모형으로 규칙 없음→한 개 생성, 정확한 규칙 재사용, 다른 규칙 거부를 검산했습니다. 이것은 Excel FormatConditions 개체를 실제 실행한 테스트가 아닙니다.

오류를 숨기지 않고 사본에서 복구합니다
입력 셀에 #N/A 같은 오류가 있으면 규칙을 건드리기 전에 중단합니다. 오류의 원인을 고치고 새 실습 사본에서 다시 실행하세요. 기존 규칙이 다르다는 메시지에는 지우는 우회 코드를 추가하지 않습니다. 규칙 관리자의 종류·적용 범위·수식을 읽고, 업무용 규칙은 보존한 채 깨끗한 별도 범위로 옮겨 실습합니다.
지역 설정에 따라 Excel이 수식 문자열을 다르게 정규화해도 이 엄격한 비교는 중단할 수 있습니다. 재실행을 통과시키려고 무조건 일치 처리하지 말고 실제 Formula1을 확인합니다. 색 설정 중 오류가 나면 일부 속성이 바뀔 수 있으며 이전 디자인으로 자동 복구하는 코드는 없습니다.
변경 실험의 완료 기준
별도 사본에서 숫자 C3을 0.79로 바꾸면 강조 대상에 추가돼야 하고, C5를 지우면 빠져야 합니다. 문구 A6을 지연으로 바꾸면 추가되고 A2를 입금완료로 바꾸면 빠집니다. 다시 실행한 뒤 각 범위의 규칙이 여전히 한 개인지 확인하세요. 8행 이후 자동 확장, 복수 규칙 우선순위 설계, 모든 Excel 환경의 호환성은 별도 검증입니다.
공식 자료
FormatConditions.Add method (Excel)
FormatCondition.StopIfTrue property (Excel)
출처 원문 수집일: S1 2026-09-24; S2 2026-09-24.