• 최초 작성일: 2002-06-12
  • 최종 수정일: 2026-09-29
  • 조회수: 16 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: DB 발송용 주소인쇄3

들어가기 전에

오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.

이번 시간에는 EXCEL 강좌 85번 "DM발송용 주소인쇄"를 유용하게 쓰고 계신 독자분의 질문에서 출발합니다. 한 셀 안에서 주소는 궁서체로, 이름은 바탕체 굵게처럼 글꼴을 서로 다르게 지정하고 싶다는 질문이었는데요, VBA의 Characters 속성을 이용하면 어렵지 않게 해결할 수 있습니다.

권현욱(엑셀러)
저자: 권현욱(엑셀러), 아이엑셀러 대표

필자는 Excel 컨설턴트, 작가, 그리고 크리에이터입니다. 현재 Microsoft Excel MVP이며, 『챗GPT+엑셀 업무자동화 정석』을 비롯한 10여 권의 도서를 집필했습니다. Excel 자동화 및 생산성 향상 분야에서 25년 넘는 경력을 보유하고 있습니다.

권현욱(엑셀러) 님의 최신 포스트:
  • 최신 글을 불러오는 중...


26년 경력 Microsoft MVP 권현욱(엑셀러) 지음

📊 신간 전자책(PDF) · 287쪽 · 13500원

엑셀 대시보드를 만드는 최적의 '표준 3계층 구조'

  • 3초 안에 읽히는 화면 설계 감각 습득
  • Microsoft Excel MVP의 실전 노하우 수록
  • 중간마진 없는 합리적인 가격, 오직 아이엑셀러에서만!
지금 구매하기 완성 화면 보기

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)(캐리지 리턴)으로 연결해 하나의 문자열로 만듭니다.
2InStr 함수로 캐리지 리턴의 위치를 찾아 각 필드의 시작/길이를 계산합니다.
3Characters(Start:=,Length:=).Font 속성으로 원하는 부분에만 서식을 적용합니다.
4Mod 연산자로 짝수/홀수 레코드를 다른 열에 나누어 출력합니다.

자주 묻는 질문 (FAQ)

Q1. 한 셀 안에서 일부 글자만 다른 글꼴로 지정하려면 어떻게 하나요?

Range 객체의 Characters(Start:=시작위치, Length:=길이) 속성을 이용하면 셀 안의 특정 위치, 특정 길이의 문자에 대해서만 Font 속성(글꼴명, 굵기, 크기 등)을 지정할 수 있습니다.

Q2. 문자열 안에서 특정 위치를 어떻게 찾아내나요?

InStr 함수를 사용합니다. InStr(시작위치, 문자열, 찾을문자)로 캐리지 리턴(Chr(10)) 같은 구분자가 문자열 내 몇 번째 위치에 있는지 알아낸 뒤, 그 위치 정보를 이용해 Characters 속성의 Start와 Length 인수를 계산합니다.

Q3. 짝수·홀수 레코드를 다른 열에 나누어 출력하려면 어떻게 하나요?

레코드 번호를 2로 나눈 나머지를 Mod 연산자로 구해서, 나머지가 0이면 짝수 열(0번째 열)에, 1이면 홀수 열(1번째 열)에 출력하도록 분기하면 됩니다.

마치며

겉보기에 불규칙해 보이는 데이터도 패턴을 찾아내면 VBA의 반복 처리로 손쉽게 자동화할 수 있습니다. Characters 속성은 라벨 인쇄뿐 아니라 셀 안에서 부분적으로 강조 표시를 하고 싶은 다양한 상황에 응용할 수 있으니 꼭 익혀 두시기 바랍니다.