- 최초 작성일: 2005-09-20
- 최종 수정일: 2026-09-30
- 조회수: 36 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 특정 글자색 제거하기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
질문 하나
제가 시험을 앞두고 예상문제를 만들었습니다. 그런데 문제지에 숙제와 답을 함께 적었는데(답은 빨간색으로) 답을 한꺼번에 지우거나 숨기게 할 수는 없을까요?
문제수는 들쑥날쑥 합니다.
도와주세요! Please~~
특정 글자색 제거하기
핵심 요약: 빨간색 글자만 지우기
시험 문제지처럼 문제와 정답이 한 셀에 함께 있고 정답만 빨간색인 경우, 빨간 글자를 공백으로 바꾸어 한꺼번에 지우는 VBA 코드입니다.
- 1단계: 첫 번째 열의 값이 들어 있는 셀을 작업 대상으로 지정합니다.
- 2단계: 셀 안의 글자를 하나씩 확인해 ColorIndex가 3(빨간색)인지 판단합니다.
- 3단계: 빨간색이면 공백, 아니면 원래 글자를 이어 붙여 셀에 다시 입력합니다.
Step 1: 어떤 질문이었을까요?
원래 저는 다른 사람의 숙제에는 전혀 관심이 없습니다만, 이번 질문은 숙제와는 조금 거리가 있는 듯 하고, 또 여러 가지로 응용이 가능할 듯 하여 강좌 시간에 다루어 볼까 합니다. ^^
숙제성 질문을 올려서 해결해 달라고 하는 것은 비록 일시적 해결책은 될 지 모르겠으나 자신의 실력 향상에는 아무런 기여를 할 수 없습니다. 또한 숙제를 내주신 분의 의도와도 어긋나게 되므로 숙제성 질문은 정중히 사양합니다. 그런데…
"어떤 것이 숙제성 질문인지 그 기준을 밝혀라!"
하고 따지는(?) 분이 계실 법 하군요.
그것은… 다년간의 경험(?)으로 척 보면 압니다(진짭니다! ^^;V).
자, 본론으로 들어갑니다. 예제에 사용된 문제지는 다음과 같은 모습입니다. 정답은 빨간색으로 표시되어 있습니다.
Q1 다음 함수 중 조건이 참이면 값1, 거짓이면 값2를 반환하는 함수는? (3)
(1) MID (2) LEFT (3) IF (4) DATE
Q2 시작일부터 종료일까지의 기간을 구할 때 사용하는 DATEDIF 함수의 바른 순서는? (2)
(1) 단위, 시작일, 종료일 (2) 시작일, 종료일, 단위 (3) 시작일, 단위, 종료일 (4) 종료일, 시작일, 단위
Q3 참조 영역의 행 번호를 구하는 함수는 어느 것입니까? (2)
(1) COLUMN (2) ROW (3) VLOOKUP (4) HLOOKUP
Q4 조건을 지정하여 조건을 만족하는 셀에만 서식을 적용하는 서식 지정 방법은? (조건부 서식)
Q5 참조 영역에서 지정한 행과 열만큼 떨어진 위치로부터 지정한 높이와 너비만큼의 참조 영역을 구해주는 함수는 어느 것입니까? (1)
(1) OFFSET(참조 영역, 행, 열, 높이, 너비) (2) OFFSET(참조 영역, 너비, 높이, 행, 열) (3) MATCH(값, 검색 범위, 방법) (4) MATCH(값, 참조 영역, 열)
버튼을 누르면 빨간색 정답이 한꺼번에 지워집니다. 문제가 얼마나 되든 상관이 없습니다! 코드를 볼까요?
Step 2: 코드 살펴보기
Sub DelRedChar()
Dim rngCell As Range
Dim rngTarget As Range
Dim intLen As Integer
Dim i As Integer
Dim strTemp As String
Set rngTarget = Columns(1).SpecialCells(xlTextValues)
' 첫번째 열 중에서 값이 들어있는 영역을 작업 대상으로 합니다.
For Each rngCell In rngTarget
intLen = Len(rngCell)
' 작업 대상 범위 내의 각 셀을 돌면서 셀의 문자열 길이값을 intLen 변수에 담습니다.
For i = 1 To intLen
' 문자열의 길이만큼 순환을 하면서 ColorIndex 속성값이 3인지 여부를 확인합니다.
' 속성값이 3, 즉 빨간색이면 공란을 strTemp라는 임시 문자열 변수값에 덧붙이고
' 그렇지 않으면 원래 문자열의 글자를 하나씩 strTemp 변수에 더합니다.
If rngCell.Characters(i, 1).Font.ColorIndex = 3 Then
strTemp = strTemp & Space(1)
Else
strTemp = strTemp & Mid(rngCell, i, 1)
End If
Next i
rngCell = strTemp
strTemp = ""
Next rngCell
End Sub
색을 판별하는 방법: ColorIndex = 3은 기본 팔레트의 빨간색만 골라냅니다. 진한 빨강이나 RGB로 직접 지정한 색을 대상으로 하려면 .Font.Color = RGB(255, 0, 0)처럼 색상 값을 직접 비교하도록 바꾸어 사용하시기 바랍니다.
싱거우리만치 간단하지요? 잘 응용하시면 여러 가지로 많이 응용하실 수 있을 것입니다.
특히 문제지가 Stage와 같이 자유방임적(?)으로 구성되어 있지 않고 조금더 체계적으로 구분되어 있다면 아주 다양하게 구성할 수 있을 것입니다. 질문주신 분과 비슷한 상황에 처한 분이 계시다면 잘 정리해 보세요.
다음에 또…
정리 — 글자색 제거 코드 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 대상 영역 | Columns(1).SpecialCells(xlTextValues) | 첫 번째 열의 문자 셀 |
| 문자열 길이 | Len(rngCell) | 글자 수만큼 반복하기 위한 값 |
| 글자색 확인 | .Characters(i, 1).Font.ColorIndex = 3 | 한 글자의 색이 빨간색인지 판별 |
| 글자 조립 | strTemp & Space(1) / Mid(rngCell, i, 1) | 빨간 글자는 공백, 나머지는 그대로 |
| 결과 입력 | rngCell = strTemp | 조립한 문자열을 셀에 대입 |
자주 묻는 질문 (FAQ)
Q1. 셀 안의 일부 글자만 색이 다를 때 그 색을 어떻게 알 수 있나요?
Range 개체의 Characters 속성을 사용하면 셀 안의 글자를 원하는 위치와 길이만큼 지정할 수 있습니다. Characters(i, 1).Font.ColorIndex처럼 한 글자씩 확인하면 됩니다.
Q2. 빨간색 글자를 지우지 않고 숨기기만 할 수도 있나요?
네, 코드에서 공백으로 바꾸는 대신 해당 글자의 글자색을 배경색과 같은 흰색으로 지정하면 눈에 보이지 않게 숨길 수 있습니다.
Q3. 질문의 개수가 들쑥날쑥해도 사용할 수 있나요?
네, SpecialCells로 값이 입력된 셀만 골라 처리하므로 문제 수가 몇 개이든 관계없이 동작합니다.
마치며
코드는 싱겁게 느껴질 만큼 간단하지만 문제지처럼 자유롭게 구성된 문서뿐 아니라 체계적으로 구분된 문서에도 다양하게 응용할 수 있습니다.