- 최초 작성일: 2002-06-12
- 최종 수정일: 2026-09-29
- 조회수: 16 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: DB 발송용 주소인쇄3
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
이번 시간에는 EXCEL 강좌 85번 "DM발송용 주소인쇄"를 유용하게 쓰고 계신 독자분의 질문에서 출발합니다. 한 셀 안에서 주소는 궁서체로, 이름은 바탕체 굵게처럼 글꼴을 서로 다르게 지정하고 싶다는 질문이었는데요, VBA의 Characters 속성을 이용하면 어렵지 않게 해결할 수 있습니다.
DB 발송용 주소인쇄3
핵심 요약: 셀 안의 일부 문자에만 다른 글꼴 지정하기
주소록 라벨을 만들 때 한 셀 안에 이름과 주소를 함께 넣으면서도, 이름은 굵게·주소는 다른 글꼴로 구분해서 표시하고 싶은 경우가 있습니다. VBA의 Characters 속성을 이용하면 셀 안의 특정 부분에만 서식을 적용할 수 있습니다.
- Characters 속성: 셀 문자열 중 원하는 위치·길이만큼만 서식을 지정합니다.
- InStr 함수: 캐리지 리턴 위치를 찾아 이름·주소의 경계를 구분합니다.
- Mod 연산자: 짝수/홀수 레코드를 서로 다른 열에 나누어 출력합니다.
원래 이것은 VBA 강좌 시간에 다루어야 할 듯 하나, 아주 예전에 Excel 강좌 시간에 다루었던 주제이므로 그대로 Excel 강좌 시간에 소개를 드리도록 합니다. 쉬운 듯 하면서 약간은 까다로운 문제입니다. 아래 매크로를 실행해 보세요.
Sub MakeLable()
Dim rngStart As Range
Dim strTemp As String
Dim strMsg As String
Dim intNum As Integer
Dim intNum1 As Integer
Dim intFirst As Integer
Dim intSecond As Integer
Dim intThird As Integer
Dim intLen As Integer
Dim intLen2 As Integer
Dim shtTarget As Worksheet
Set rngStart = Sheets("Source").[A2]
For Each shtTarget In Worksheets
' 현재 워크북 내의 시트들을 검색하여 '주소록'이라는 이름을 가진 시트가 있는 지 확인하여 같은
' 것이 있다면 삭제합니다.
If shtTarget.Name = "주소록" Then
Application.DisplayAlerts = False
MsgBox "같은 시트가 이미 있으므로 지우겠습니다", , "www.iExceller.com"
shtTarget.Delete
End If
Next shtTarget
Worksheets.Add after:=Worksheets("Preface")
ActiveSheet.Name = "주소록"
ActiveSheet.Columns.ColumnWidth = [A1].ColumnWidth * 4
' 워크시트를 한장 삽입하고 '주소록'이라고 이름을 정해 준 다음 열 너비를 A1 셀의 너비보다 4배 넓게
' 지정해 줍니다. 왜 하필 4배 넓이로 지정해 주느냐? 그것은… 경험치랍니다.
Do While rngStart.Offset(intNum, 0) <> ""
' rngStart에서 아래로 내려가면서 공란을 만날 때까지 구문을 계속 실행합니다.
If intNum Mod 2 = 0 Then
intNum1 = 0
Else
intNum1 = 1
End If
' 짝수 레코드는 A열에, 홀수 레코드는 B열에 인쇄하기 위한 구문입니다.
' 2로 나누어서 나누어 떨어지면 짝수 열에, 1이 남으면 홀수 열에 출력을 하는 것입니다.
With rngStart
strTemp = .Offset(intNum, 2) & Chr(10) & _
.Offset(intNum, 3) & Chr(10) & _
.Offset(intNum, 1) & Chr(10) & _
.Offset(intNum, 0) & " 귀하"
' 각 필드의 값을 캐리지 리턴(Chr(10))으로 연결하여 strTemp라는 문자열에 담아 둡니다.
[A1].Offset(Int(intNum / 2), intNum1) = strTemp
intFirst = InStr(1, strTemp, Chr(10))
intSecond = InStr(intFirst + 1, strTemp, Chr(10))
intThird = InStr(intSecond + 1, strTemp, Chr(10))
intLen = intSecond - intFirst
intLen2 = Len(strTemp) - 2 - intThird
' 이 부분이 X0082 강좌와 달라진 부분입니다. 즉 strTemp라는 문자열 중에서 캐리지 리턴인
' Chr(10)이 어디에 있는 지 그 위치 정보를 intFirst, intSecond, intThird 라는 정수형 변수에
' 저장해 놓습니다. 그런 다음 이것을 이용하여 이름과 주소 정보의 길이 정보를 intLen, intLen2
' 변수에 저장합니다.
End With
With [A1].Offset(Int(intNum / 2), intNum1).Characters(Start:=intFirst, Length:=intLen).Font
.Name = "궁서"
.Size = 11
End With
' 이렇게 해서 이름과 주소의 위치 정보를 구분해 내었으므로 이것을 이용하여 Font 속성을
' 지정해 줍니다.
With [A1].Offset(Int(intNum / 2), intNum1).Characters(Start:=intThird, Length:=intLen2).Font
.Name = "궁서"
.FontStyle = "굵게"
.Size = 12
End With
intNum = intNum + 1
Loop
strMsg = "출력작업이 끝났습니다." & vbCr & "총 " & intNum & "명이 등록되어 있습니다"
MsgBox strMsg, , "www.iExceller.com"
End Sub
불규칙해 보이는 현상 중에서 규칙을 찾아내는 것이 관건입니다. 일단 규칙만 찾아내면 컴퓨터의 가장 큰 장점인 무진장 빠른 순환, 반복 기능을 이용하여 프로그래밍을 하면 되지요. 많이 응용해 보시기 바랍니다.
정리 — Characters 속성으로 셀 안 부분 서식 지정하기
| 단계 | 내용 |
|---|---|
| 1 | 각 필드 값을 Chr(10)(캐리지 리턴)으로 연결해 하나의 문자열로 만듭니다. |
| 2 | InStr 함수로 캐리지 리턴의 위치를 찾아 각 필드의 시작/길이를 계산합니다. |
| 3 | Characters(Start:=,Length:=).Font 속성으로 원하는 부분에만 서식을 적용합니다. |
| 4 | Mod 연산자로 짝수/홀수 레코드를 다른 열에 나누어 출력합니다. |
자주 묻는 질문 (FAQ)
Q1. 한 셀 안에서 일부 글자만 다른 글꼴로 지정하려면 어떻게 하나요?
Range 객체의 Characters(Start:=시작위치, Length:=길이) 속성을 이용하면 셀 안의 특정 위치, 특정 길이의 문자에 대해서만 Font 속성(글꼴명, 굵기, 크기 등)을 지정할 수 있습니다.
Q2. 문자열 안에서 특정 위치를 어떻게 찾아내나요?
InStr 함수를 사용합니다. InStr(시작위치, 문자열, 찾을문자)로 캐리지 리턴(Chr(10)) 같은 구분자가 문자열 내 몇 번째 위치에 있는지 알아낸 뒤, 그 위치 정보를 이용해 Characters 속성의 Start와 Length 인수를 계산합니다.
Q3. 짝수·홀수 레코드를 다른 열에 나누어 출력하려면 어떻게 하나요?
레코드 번호를 2로 나눈 나머지를 Mod 연산자로 구해서, 나머지가 0이면 짝수 열(0번째 열)에, 1이면 홀수 열(1번째 열)에 출력하도록 분기하면 됩니다.
마치며
겉보기에 불규칙해 보이는 데이터도 패턴을 찾아내면 VBA의 반복 처리로 손쉽게 자동화할 수 있습니다. Characters 속성은 라벨 인쇄뿐 아니라 셀 안에서 부분적으로 강조 표시를 하고 싶은 다양한 상황에 응용할 수 있으니 꼭 익혀 두시기 바랍니다.