- 최초 작성일: 2004-09-14
- 최종 수정일: 2026-09-30
- 조회수: 9 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 문장 내 특정글자 서식변경
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
Dell의 경영철학 가운데 '5초간 기뻐하고 5시간 반성하라'는 슬로건이 있다고 합니다. 엄청난 실적을 거둔 직원에게도 칭찬은 짧게 하고 더 나은 방법을 찾도록 독려한다는 이야기입니다. 소위 '잘' 나갈 때일수록 경계를 늦추지 말아야 할 일입니다.
질문 하나
안녕하세요? vb를 공부하다 얼마전에 엑셀러님의 사이트를 알게된 사람입니다. find 메소드에 대한 좋은 강좌도 잘 보았습니다. 그런데 흔히 웹상에서 검색할 때 처럼 검색된 결과물 중에서 해당 검색어의 색깔을 다르게 하고 싶은데요... vba로 가능할까요? 예를 들어 find 메소드를 이용하여 '강아지'가 포함된 행을 따로 추려낼 때 추려낸 결과물 중에서 같은 셀 안의 다른 단어의 글자색은 그냥 두고 검색어인 '강아지'를 빨간 색으로 할 수 있을런지요?
문장 내 특정글자 서식변경
핵심 요약: 셀 안의 검색어에만 서식 지정하기
웹에서 검색할 때처럼 셀의 문장 속에서 검색어와 일치하는 글자만 빨간색 굵은 글씨로 표시하는 VBA 코드입니다. 이미 서식이 지정된 글자는 원래대로 되돌립니다.
- 1단계: InputBox로 검색어와 검색 범위를 입력받습니다.
- 2단계: InStr 함수로 셀 안에서 검색어의 위치를 찾습니다.
- 3단계: Characters(위치, 길이).Font 속성으로 서식을 지정하고 다음 위치부터 다시 찾습니다.
Step 1: 연습용 시트 만들기
연습용 시트를 하나 만들어서 테스트 해 보도록 하지요. 아래 버튼을 누르세요!
버튼을 클릭하니까 시트가 새로 만들어지고 특정한 문자열에 대해서는 지정한 지정한 서식이 설정되지요?
먼저 시트를 생성하고 데이터를 옮기는 프로시저를 작성합니다. 여러 곳에서 공통으로 사용할 상수는 프로시저 바깥에 선언합니다.
Const strURL As String = "www.iExceller.com"
' 여러 곳에서 공통으로 사용할 상수를 선언합니다.
Sub TransferData()
' 먼저 시트를 생성하고 데이터를 옮기는 프로시저를 작성합니다.
Dim rngCell As Range
Worksheets("Preface").UsedRange.Copy
Worksheets.Add after:=Sheets(Sheets.Count)
Range("A1").PasteSpecial xlPasteValues
ActiveWindow.DisplayGridlines = False
Set rngCell = ActiveSheet.Range("A1").Offset(0, 7)
' 버튼을 만들고 프로시저를 연결하는 과정입니다.
Range("A1").Select
With rngCell
With ActiveSheet.Buttons.Add(.Left, .Top, .Width * 2, .Height * 2)
.OnAction = "ChangeFormat"
' 실제로 서식을 바꾸어 주는 것은 외부에 있는 ChangeFormat 프로시저입니다.
.Caption = "여기를 누르세요!"
End With
End With
MsgBox "연습용 시트를 만들었습니다. 버튼을 누르세요!", , strURL
End Sub
Step 2: 특정 문자열의 서식 바꾸기
다음은 사용자가 지정한 문자열에 대해 서식을 변경하는 프로시저입니다.
Sub ChangeFormat()
Dim rngCell As Range
Dim rngTarget As Range
Dim rngDefault As Range
Dim strWord As String
Dim intFind As Integer
Dim intLen As Integer
Dim intStart As Integer
On Error Resume Next
strWord = InputBox("검색할 단어를 입력하세요! ""강아지""라고 넣어 볼까요?", strURL, "강아지")
' 서식을 변경할 단어를 입력받습니다. 기본값으로 '강아지'라는 단어가 들어가도록 설정하였습니다.
intLen = Len(strWord)
If strWord = "" Then Exit Sub
Set rngDefault = ActiveSheet.UsedRange
Set rngTarget = Application.InputBox("검색 범위를 지정하세요!", strURL, Type:=8, Default:=rngDefault.Address)
' 검색 대상 영역을 설정합니다. 기본값으로 UsedRange, 즉 현재 시트에서 사용된 범위를
' 대상 영역으로 하였습니다.
For Each rngCell In rngTarget
' 이제부터 For Each ~ Next 순환문을 이용하여 영역 내의 모든 셀을 대상으로 '강아지'라는
' 문자열이 들어있나 없나 찾은 다음, 발견될 경우 서식을 변경합니다.
intStart = 1
Do While InStr(intStart, rngCell, strWord)
' 한 셀 안에 여러 개의 같은 문자열이 있을 경우에 대비, Do ~ Loop 순환문을 한번더
' 사용합니다.
intFind = InStr(intStart, rngCell, strWord)
' 찾고자 하는 단어가 문장 내에서 몇번째에 위치하는가를 파악하여 intFind 변수에
' 담아두고...
With rngCell.Characters(Start:=intFind, Length:=intLen).Font
' 검색한 단어의 Bold 속성이 지정되어 있지 않다면 굵은 글씨, 붉은색으로 지정합니다.
' Bold 속성이 이미 지정되어 있으면 해제하고 글씨색을 검정색으로 바꿉니다.
If .Bold = False Then
.Bold = True
.ColorIndex = 3
Else
.Bold = False
.ColorIndex = 1
End If
End With
intStart = intFind + intLen
' 다음 단어가 있을 경우 검색을 위해 해당 단어수만큼 더해 줍니다.
Loop
Next rngCell
End Sub
많이 응용해 보시기 바랍니다.
다음 시간에 또...
정리 — 특정 글자 서식 변경 코드 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 검색어 입력 | InputBox(...) | 서식을 바꿀 단어 입력 |
| 범위 입력 | Application.InputBox(..., Type:=8) | 검색 범위를 마우스로 선택 |
| 위치 찾기 | InStr(intStart, rngCell, strWord) | 검색어의 시작 위치 |
| 서식 지정 | rngCell.Characters(Start, Length).Font | 일부 글자만 서식 지정 |
| 반복 | Do While InStr(...) | 한 셀 안의 여러 검색어 처리 |
자주 묻는 질문 (FAQ)
Q1. 셀 안에서 일부 글자에만 서식을 지정할 수 있나요?
네, Range 개체의 Characters(Start, Length) 속성으로 셀 안의 일부 글자를 지정한 뒤 Font 속성을 설정하면 됩니다.
Q2. 한 셀에 검색어가 여러 번 나오면 어떻게 하나요?
찾은 위치에 검색어 길이를 더한 값을 다음 검색 시작 위치로 삼고 Do While 문으로 InStr 검색을 반복하면 모든 검색어에 서식을 지정할 수 있습니다.
Q3. 대소문자를 구분하지 않고 찾으려면 어떻게 하나요?
InStr 함수의 마지막 인수로 vbTextCompare를 지정하면 대소문자를 구분하지 않고 검색합니다.
마치며
InStr 함수로 위치를 찾고 Characters 속성으로 서식을 지정하는 조합만 익혀 두면 웹 검색처럼 검색어를 강조하는 기능을 쉽게 만들 수 있습니다.