• 최초 작성일: 2001-01-02
  • 최종 수정일: 2026-09-30
  • 조회수: 11 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 모든 것은 뿌린대로 거두기 마련입니다

들어가기 전에

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

2001년 새해가 밝았습니다. 새해벽두에 좋은 꿈, 좋은 계획 많이들 세우셨는지요? Exceller도 2001년도에 꼭 이루고 싶은, 그리고 이루어야만 할 일들을 정리해서 리스트로 만들어 두었습니다. 이름하야 Exceller's To Do List in 2001!!!

"오랫동안 꿈을 그리는 사람은 마침내 그 꿈을 닮아간다!"

아주 오래 전에 읽은 책중에서 이런 구절이 생각납니다. 책 이름은 기억이 나지 않고 저자는 주홍글씨로 유명한 나다니엘 호오도온 이었던 것 같습니다. 누구 정확한 출전을 아시는 분은 알려주시면 고맙겠습니다. ^^

Exceller도 한때는 "성공학"과 관련된 책들을 탐독하던 때가 있었습니다. 지그 지글러의 저서들과 클라우드 브리스톨의 The Magic Of Believing 등과 같은 이 분야의 왠만한 고전들은 본 것 같은데 이 책들의 공통점 한 가지가 바로 "자기가 바라는 바를 얼마나 구체화시켜 자주 Remind를 시키느냐" 하는 것이었습니다.

올 한해동안 반드시 이루고 싶은 것이 있다면 그 목표를 달성한 후의 자기 모습, 목표를 달성한 이후의 득의만만한 자기 자신의 모습을 항상 떠올려 보세요. 벽두에 얘기가 길어지면 잔소리처럼 들리실 테니까 이쯤에서 접습니다. ^^; (Exceller가 잔소리 할 처지도 아니지요 ^^)

이번 시간에는 질문 하나를 살펴봅니다.

안녕하세요?
내용이 단순하지 않은 것 같지만 저의 업무에 반드시 필요한 것이라
염치불구하고 도움 요청합니다.
저야 이것저것 해보고 싶었지만 error가나오면 어디에서 잘못되었는지
알 수가 없고 시간은 급해 도움을 바라고 E-mail 보냅니다.
부디 도와주시면 너무도 고맙겠습니다.

(1) sheet는 여러 개가 있습니다.
그 중 A열에 국가 이름으로 콤보박스를 자동으로 만들어 줍니다.
(2) 콤보박스의 리스트 항목은 B열의 데이터로 채우고, 그 중 1개를 선택하여
그것에 해당하는 열의 맨 아래 데이터(예: 국어, 영어, 수학)를 새로운 시트를
만들어 복사합니다.
(3) 만약 미국의 샌프란시스코를 선택하면 시트의 F열 맨아래 데이터와 E열의
맨 아래 데이터를 연속해서 새로운 시트에 한 개의 열로 붙여 나열하기입니다.

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

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

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


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

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

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

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

모든 것은 뿌린대로 거두기 마련입니다

핵심 요약: 연동 콤보박스와 자료 추출

ListIndex에 따라 RowSource를 바꿔 콤보박스를 연동하고, 선택한 도시의 데이터를 Temp 시트로 모읍니다.

  • 1단계: Change 이벤트에서 ListIndex로 국가를 판별해 도시 목록을 바꿉니다.
  • 2단계: OK 버튼에서 AllCities 영역을 순환하며 선택한 도시를 찾습니다.
  • 3단계: 해당 열의 데이터를 복사해 Temp 시트에 이어 붙입니다.

Step 1: 데이터베이스 구조부터 생각하기

EXCEL로 자료를 정리하시는 분이 많으신 것 같습니다. 이것은 아주 바람직한 현상이라고 할 수 있습니다. 그런데 문제는… 데이터베이스를 작성하기 전에 어떤 식으로 테이블을 구성할 것인가, 작성된 DB를 이용해서 어떤 형태로 자료를 가공/분석할 것인가 하는 것과 관련해서 많은 생각을 해야한다는 것입니다.

EXCEL에서 사용하는 1차원의 평면적인 데이터베이스(이것을 Flat Database 라고 부릅니다)라면 덜하지만 ACCESS와 같이 좀더 형태가 복잡한 관계형 DB (Relational Database)나 SyBase, Oracle 같은 회사의 기간 DB를 구축하고자 하는 경우에는 이 부분에 훨씬 많은 시간과 노력을 들여야 합니다. 마치 훌륭한 영화를 만들기 위해서는 탄탄한 시나리오가 있어야 하는 것처럼…

오늘 질문하신 분의 경우에도 마찬가지라고 할 수 있습니다. 애초에 DB(사실은 DB라고 할 것까지도 없이 간단한 형태입니다만)를 구축할 때 이러한 점을 고려하지 않으셨기 때문에 이런 곤란한 일이 생기는 것입니다. 아래 버튼을 눌러 예제를 실행시켜보고 오시기 바랍니다.

Step 2: 유저폼 만들기

(1) VB Editor 상태에서 UserForm을 하나 삽입하고 아래와 같이 컨트롤들을 작성합니다.

국가 선택과 도시 선택 콤보박스, OK와 Close 버튼이 있는 자료 검색 유저폼
아이엑셀러

Step 3: cmbNation_Change 이벤트

(2) 어느 국가를 선택하느냐에 따라서 서로 다른 도시명이 Listing되도록 하기 위해 cmbNation 컨트롤을 더블클릭하여 코드 입력 창을 띄운 후, Change 이벤트를 선택하고 아래의 코드를 입력합니다.

Private Sub cmbNation_Change()
    Dim i As Integer
    i = cmbNation.ListIndex
    '//I는 첫번째 콤보박스에서 몇 번째 항목, 그러니까 어느 나라가 선택되었는지 결과값을
    '//담아두기 위한 변수입니다.

    With UserForm1
    '//아래의 코드는 첫번째 콤보박스에서 어떤 국가가 선택되었느냐에 따라 그 다음
    '//콤보박스에 서로 다른 도시가 리스팅되도록 하기 위한 부분입니다. 이것은 예전에
    '//이미 설명을 드렸고 코드도 별로 까다로운 것이 없으므로 설명은 생략합니다.
    '//첫번째 항목이 선택되면 그 값이 1이 아니고 0이 할당된다는 점에 유의!

        Select Case i
            Case 0
                .lblCity = "미국의 도시"
                .cmbCity.Value = ""
                cmbCity.RowSource = "USA"
            Case 1
                .lblCity = "유럽의 국가"
                .cmbCity.Value = ""
                cmbCity.RowSource = "Europe"
            Case 2
                .lblCity = "동남아시아의 국가"
                .cmbCity.Value = ""
                cmbCity.RowSource = "Asia"
            Case 3
                .lblCity = "러시아의 도시"
                .cmbCity.Value = ""
                cmbCity.RowSource = "Russia"
        End Select
    End With
End Sub

Step 4: OK 버튼 Click 이벤트

(3) Shift + <F7>키를 눌러 다시 유저폼으로 돌아간 다음, 이번에는 OK버튼을 더블클릭하고 Click 이벤트 프로시저에 아래와 같은 코드를 작성합니다.

Private Sub btnOK_Click()
    Dim rngTarget As Range
    Dim rngCell As Range
    Dim shtSheet As Worksheet
    Dim i As Integer
    Dim r As Long
    Dim intNum As Integer
    Set rngTarget = Range("AllCities")
    intNum = rngTarget.Columns.Count
    '//먼저 등장인물들과 배역을 설정해 주고…

    For Each shtSheet In Sheets
    '//만약 Temp라는 시트가 이미 있으면 지웁니다.

        If shtSheet.Name = "Temp" Then
            Application.DisplayAlerts = False
            shtSheet.Delete
        End If
    Next shtSheet
    Worksheets.Add.Name = "Temp"
    Range("a1") = "검색 결과"

    For Each rngCell In rngTarget
    '//이제 지정된 영역을 돌면서 콤보박스에 의해 선택되어진 도시명과 값이 같으면
    '//해당 셀의 맨 아래 부분으로 가서 거기있는 내용들을 복사/붙여넣기 합니다.
    '//이름 상자(Name Box)로 가서 AllCities, Start라고 이름지어준 영역이 어디인지
    '//확인해 보시기 바랍니다.

        If rngCell.Value = UserForm1.cmbCity.Value Then
            Application.Goto Range("Start")
            Range("Start").Offset(0, rngCell.Column - 1).Select
            Range(Selection, Selection.End(xlDown)).Copy
            Sheets("Temp").Select
            r = Application.CountA(Range("a:a")) + 1
            '//rngTarget 셀을 차례대로 검색해서 콤보박스에서 선택한 값과 같은 것이 발견되면
            '//Temp 시트에 있는 자료의 마지막 부분에 계속 추가해 나갑니다.

            Sheets("Temp").Cells(r, 1).Select
            ActiveSheet.Paste
        End If
    Next rngCell
    Application.CutCopyMode = False
    Unload Me
    Range("a1").Select
    Columns(1).AutoFit
    MsgBox "자료추출을 완료하였습니다", , "작업 완료//Exceller"
    Application.DisplayAlerts = True
End Sub

Step 5: UserForm_Initialize 이벤트

한 가지가 빠졌는데… 유저폼이 처음 화면에 나타날 때 각 컨트롤의 초기값들을 설정해 주기 위해 아래와 같은 Initialize 이벤트를 사용했습니다.

Private Sub UserForm_Initialize()
    With Me
        .cmbNation.Value = ""
        .cmbCity.Value = ""
        .lblCity.Caption = " 도시"
        .cmbNation.RowSource = "a13:a16"
    End With
End Sub

마무리

오늘 설명드린 예제는 사실 테이블만 잘 구성하셨다면 별도의 VBA 코딩없이 피벗테이블이나 다른 EXCEL 고유의 분석기능만으로도 충분히 가능했을 것입니다. 잘못 구성된 테이블에 대한 예제를 하나를 보내주셔서 좋은 경험 했습니다. ^^

다음 시간에 또…

정리 — 연동 콤보박스 핵심

구분 사용한 코드 역할
국가 판별 cmbNation.ListIndex 선택한 항목 번호
도시 목록 교체 cmbCity.RowSource = "USA" 이름 정의된 영역 연결
초기화 UserForm_Initialize 컨트롤 초기값 설정
임시 시트 Worksheets.Add.Name = "Temp" 결과 시트 만들기
데이터 복사 Range(Selection, Selection.End(xlDown)).Copy 열 데이터 복사

자주 묻는 질문 (FAQ)

Q1. 국가에 따라 도시 목록이 바뀌게 하려면?

첫 번째 콤보박스의 Change 이벤트에서 ListIndex를 확인해 두 번째 콤보박스의 RowSource를 해당 영역 이름으로 바꿉니다.

Q2. ListIndex의 첫 번째 값은 얼마인가요?

첫 번째 항목이 선택되면 1이 아니라 0입니다.

Q3. 데이터베이스 표는 어떻게 구성하는 것이 좋은가요?

분석이나 가공 방법을 미리 생각해 구성해야 하며, 잘 만들면 VBA 없이 피벗 테이블만으로도 해결되는 경우가 많습니다.

마치며

표를 잘 설계하는 것이 우선이며, 잘못 구성된 표는 VBA로도 해결할 수 있지만 훨씬 번거롭습니다.