• 최초 작성일: 2000-08-30
  • 최종 수정일: 2026-09-30
  • 조회수: 8 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 자동 TextBox 그리기

들어가기 전에

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

Exceller님! 유익한 사이트를 운영하여 주셔서 고맙습니다.
이 사이트를 알게된 지 보름여 이지만, 그동안 제 엑셀과 비주얼 베이직 실력이 향상된 듯 해 기분이
좋군요. 항상 밝은 격려와 유머 감각으로 부드러운 강의 진행을 하여서 감사드립니다.
특히 최근 중복 아이템 삭제의 예는 비주얼 베이직 이해에 도움이 많이 되네요. 내 실력은 Exceller님이
지칭한 무대뽀 프로그래머 수준일 텐데, range object를 이용하여 프로그램을 효율적으로 짤 수 있는
방법을 가르쳐 주셔서 고맙습니다. 그런데 궁금한 것은 중복 아이템의 개수를 알고 싶은 경우 어떻게 하
면 효율적으로 프로그램을 짤 수 있을까요? 이 부분에 대해서도 제가 기존에 하더 방법은 무대뽀 방법이
죠… 헤헤… ^^;
앞으로도 좋은 강의 부탁드리면서 무더운 여름 건강하게 보내세요…
참고로 전 경제학을 전공하는 박사과정 대학원성 김OO라고 합니다. 통계자료를 많이 다루다 보니까
아무래도 프로그램을 짤 줄 알아야 해서 비주얼 베이직을 공부하게 되었습니다.
그럼 이만 총총…

아직도 Excel을 단순한 수치계산용 프로그램으로만 생각하고 계시는 분이 있나 모르겠군요. Excel과 VB(A)는 논리적인 사고를 기를 수 있는 최상의 도구이며 어떻게 응용을 하느냐에 따라 못할 것 이 거의 없는(없어 보이는 !) Powerful한 도구입니다. 굳이 돈들여가며 PIMS 등의 소프트웨어를 사는데 돈을 들일 필요가 전혀 없다는 것이지요!

자녀를 가진 인생선배(Old-timer)님들 중에서 '우리 애가 컴퓨터 앞에 앉아서 맨날 뭔가 하기는 하는데 혹시 음란물을 접하고 있는 것은 아닌지 걱정이 되는데 음란물 차단 소프트웨어를 설치해야되나 말아야 되나?'하고 걱정하는 분들이 적지 않은 것 같습니다.

언젠가 말씀드린 기억이 납니다만 우리의 자녀들은 우리가 생각하는 것 이상으로 성숙되어 있는 것으로 생각됩니다. 또한 마음만 먹으면 인터넷이 아니라도 얼마든지 타락할 환경이 조성(?)되어 있으니까 너무 조급하게 생각하지 마시기 바랍니다. 방화벽 아니라 뭘 설치한다고 하더라도 열 포졸이 한 도둑을 잡지 못합니다(비유를 들고보니 적당한 것 같지는 않습니다만 의미만 생각하세요. ^^).

가장 훌륭한 방화벽은 부모가 컴퓨터를 잘 다룬다는 사실이 아닐까 생각합니다.

오랜만에 한잔 했더니 사설이 길어졌습니다. 먼 얘기를 하다가 여기까지 오게됐나 모르겠는데… 하여튼 사설은 이쯤에서 접고, 오늘 진도 나갑니다.

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

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

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


26년 경력 Microsoft MVP 권현욱(엑셀러) 대표 직강 1강 무료

🎁 파워툴스 마스터클래스 · 엑셀 바이브 코딩

AI에게 말로 지시해서 '나만의 엑셀 도구'를 만들고 리본에 장착합니다.

  • 코딩 지식 없이 시작 · 코드는 AI가 작성
  • 엑셀 리본에 내 탭과 버튼을 만들고 XLAM으로 공유
  • 1강 무료 수강 가능
수강 신청하기 강의 소개 보기

자동 TextBox 그리기

핵심 요약: 텍스트 상자 자동 그리기

반복되는 텍스트 상자 작성과 서식 지정을 유저폼 하나로 자동화합니다.

  • 1단계: Initialize에서 RefEdit1에 선택 셀의 왼쪽 위 주소를 표시합니다.
  • 2단계: 확인 버튼에서 TextBoxes.Add로 텍스트 상자를 그리고 제목을 입력합니다.
  • 3단계: 옵션 버튼과 체크박스에 따라 색상, 모서리, 그림자, 자동 크기를 지정합니다.

Step 1: 결과 미리 보기

이번 시간에는 실제 업무에 바로 써먹을 수 있는, 아주 실용적인 예제 하나를 다루어 보도록 합니다.

보고서 등을 만들다보면 제목부분에 TextBox를 그리고 그 안에 타이틀을 입력하고 여러 가지 서식을 지정해서 강조를 하게 됩니다. 제 경우에는 별로 선호하는 타입은 아닙니다만 그런 형태의 문서가 자주 눈에 띄더군요.

그런데 문서를 작성할 때마다 매번 문자열 상자(다른 도형의 경우에도 마찬가지!)를 그리고, 글꼴, 크기, 배경색 등을 일일이 지정하고 크기를 조절해 주려면 많은 시간과 노력이 들어갈 것입니다. 해서 오늘은 이것을 자동화시키는 방법에 대해 살펴보도록 하겠습니다.

절대 말로 때우는 법이 없으니까… 버튼을 눌러 예제를 실행해 보고 오시기 바랍니다.

이제 만들어 보도록 하지요. 아래의 순서대로 따라 오시기 바랍니다.

Step 2: 유저폼 만들기

(1) 먼저, UserForm을 하나 삽입하고 아래의 그림을 참고하여 필요한 컨트롤들을 삽입합니다.

출력 위치, 제목, 배경색, 옵션을 지정하는 자동 TextBox 유저폼
아이엑셀러

(2) 이번 강좌에서는 비교적 여러 종류의 컨트롤들이 사용되었군요. 그렇지만 적어도 한번씩은 다 소개 해 드렸습니다. 이제 척~ 보면 어떤어떤 컨트롤들이 사용된 것인지 아시겠지요? 6종류 총 20개의 컨트롤이 사용되 었습니다. 다른 것은 잘 아실테고… "출력 위치 지정" 부분에 사용된 것은 RefEdit 컨트롤, "옵션 지정" 부분에 사용된 컨트롤은 CheckBox 입니다.

Step 3: 코드 작성하기

(1) 초기화 이벤트

(3) 컨트롤이 없는 빈 영역을 더블클릭한 다음 이벤트 선택 목록에서 Initialize를 선택하고 아래의 코드를 입력합니다. 이것은 사용자가 최초로 유저폼을 호출했을 때, 현재 선택되어진 셀의 주소를 RefEdit1 컨트롤에 default 값으로 표시되도록 하기 위한 과정입니다.

Private Sub UserForm_Initialize()
    RefEdit1.Text = Selection.Cells(1).Address
    '//그렇다면 왜 Selection.Address와 같이 해주지 않고 Selection 다음에 Cells(1)이라는 것을 붙여
    '//주었을까요? 그것은 만약에 사용자가 여러 셀을 선택했을 경우 지정된 범위의 맨 좌측 상단셀을 기
    '//준으로 삼기 위한 것입니다.
End Sub

(2) 확인 버튼

(4) Shift + <F7>키를 눌러 유저폼으로 돌아간 다음, "확인" 버튼을 더블클릭합니다. 그러면 Click 이벤트 가 발생하는데 여기에 아래의 코드를 입력해 줍니다. 이 cmdOK_Click 이벤트 프로시저가 오늘 강좌 에서 가장 중요한 부분입니다.

Private Sub cmdOK_Click()
    Dim intColor As Integer
    Dim i As Single
    Dim j As Single
    Dim strTitle As String
    Dim rngTarget As Range
    '//언제나 그랬듯이 필요한 변수를 먼저 선언해 주었습니다.

    On Error Resume Next
    Set rngTarget = Range(RefEdit1.Text)
    '//초기화 이벤트에서 RefEdit1의 기본값을 정했었는데 그것을 여기서 사용을 합니다.

    strTitle = txtTitle.Text
    If strTitle = "" Then
        MsgBox "제목을 입력하세요!", , ID
        txtTitle.SetFocus
        Exit Sub
    End If
    '//제목 부분에 아무 것도 입력되지 않았으면 에러 메시지를 띄운 다음 포커스를 txtTitle 텍스트 박스
    '//에 위치를 시켜 둡니다.

    If Err <> 0 Then
        MsgBox "범위를 다시 확인하세요", , ID
        Exit Sub
    End If
    '//이 부분은 혹시나 있을 지 모르는 에러 발생시 처리를 해 주기 위한 부분이지요.
    On Error GoTo 0

    i = rngTarget.Left
    j = rngTarget.Top
    ActiveSheet.TextBoxes.Add(i, j, Len(strTitle) * 10, 30).Select
    Selection.Characters.Text = strTitle
    '//선택된 셀의 왼쪽 좌표값을 변수 I에, 위쪽 좌표값을 j에 담아둔 다음, 텍스트 박스를 하나 그립니다.
    '//그런 다음에 UserForm을 통해 입력받은 값을 텍스트 박스에 적어 줍니다.

    Select Case True
        Case optBlack: intColor = 1
        Case optWhite: intColor = 2
        Case optRed: intColor = 3
        Case optBlue: intColor = 5
        Case optYellow: intColor = 6
        Case optCyan: intColor = 8
        Case optMagenta: intColor = 22
        Case optTBlue: intColor = 23
        Case optGreen: intColor = 31
        Case optMGreen: intColor = 43
        '//이 부분은 어떤 옵션 버튼이 눌려졌는지를 파악한 다음 해당 색상의 ColorIndex값을 intColor
        '//변수에 담아주는 것입니다. 이 때 ColorIndex 값은 VB0036에서 소개해 드린 PowerTools의
        '//"색상 지정하기"를 실행시켜 보시면 될 것입니다.
    End Select

    With Selection
        .Interior.ColorIndex = intColor
        If chkRound Then .RoundedCorners = True
        If chkShadow Then .Shadow = True
        If chkAutoSize Then .AutoSize = True
        '//여기서 Selection은 현재 선택된 것, 그러니까 TextBox가 되겠지요? 따라서 선택된 텍스트 박스
        '//의 내부색을 intColor 변수에 담긴 값으로 지정합니다. 그 다음에 세 가지 체크 박스 중에서 어떤
        '//것들이 선택되었는지 파악을 하여 눌려진 항목에 대해서는 True값을 지정해 줍니다.

        With .Characters(Start:=1, Length:=Len(strTitle)).Font
            .Name = "Arial"
            .Size = 20
            .ColorIndex = 1
        End With
        '//텍스트 박스 내부에 입력된 글자에 대해 글꼴, 크기, 글 색상 등을 새로 지정해 주고…

        RefEdit1.Text = ""
        txtTitle.Text = ""
        Range(.TopLeftCell.Address).Select
        '//모든 작업이 끝났으면 RefEdit1 컨트롤과 txtTitle 컨트롤에 입력(지정)되어 있는 내용을 지웁니
        '//다. 그리고 TopLeftCell 이라는 속성에 대해서는 지난 번에 설명을 드렸지요? 선택된 오브젝트
        '//의 맨 위/왼쪽 셀을 선택하도록 하는 것이었지요. 이 부분은 왜 적어 주었을까요?

        '//그렇습니다! 이 부분이 없으면 텍스트 박스 오브젝트가 활성화(즉 선택된) 상태로 남아있어서
        '//미관상 별로 보기 좋지 않을 뿐더러 사용자가 다시 다른 셀을 선택해야 하는 불편함 때문이지요.

    End With
    Unload Me
End Sub

(3) 공통 상수와 폼 호출

Const ID As String = "//Exceller"

Sub ShowTextBoxForm()
    UserForm1.Show
End Sub

마무리

이렇게 해서 또 하나의 편리한 툴을 하나 만들어 보았습니다. 여러분이 하시는 업무 중에서 반복적이고 많은 시간을 요하는 작업들을 하나씩 하나씩 자동화시켜 나가 보시기 바랍니다.

그럼…

정리 — 자동 TextBox 핵심

구분 사용한 코드 역할
위치 지정 RefEdit1.Text = Selection.Cells(1).Address 기본 위치
상자 그리기 ActiveSheet.TextBoxes.Add(i, j, w, h) 텍스트 상자
색상 지정 .Interior.ColorIndex = intColor 배경색
옵션 처리 If chkShadow Then .Shadow = True 그림자 등
선택 해제 Range(.TopLeftCell.Address).Select 셀 선택 복귀

자주 묻는 질문 (FAQ)

Q1. Selection.Address 대신 Selection.Cells(1).Address를 쓰는 이유는 무엇인가요?

여러 셀을 선택했더라도 지정한 범위의 맨 왼쪽 위 셀을 기준으로 삼기 위해서입니다.

Q2. RefEdit 컨트롤은 무엇인가요?

유저폼에서 워크시트의 범위를 직접 선택해 입력받을 수 있는 컨트롤입니다.

Q3. 작업을 마친 뒤 TopLeftCell을 선택하는 이유는 무엇인가요?

텍스트 상자가 선택된 상태로 남아 있으면 미관상 좋지 않고 사용자가 다시 셀을 선택해야 하기 때문입니다.

마치며

반복적이고 시간이 많이 드는 업무부터 하나씩 자동화해 보시기 바랍니다.