• 최초 작성일: 2000-11-07
  • 최종 수정일: 2026-09-30
  • 조회수: 13 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 콤보박스를 통한 자료추출

들어가기 전에

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

이번 강좌는 강좌 제목만으로도 짐작하시겠지만, 콤보박스에서 특정 부서를 선택하면 선택된 부서에 해당되는 자료들만 별도의 시트에 추출되도록 하는 방법에 대한 것입니다. 아래의 콤보 박스를 클릭한 다음, 아무 부서나 선택해 보세요.

Source 시트에는 다음과 같은 장비 구매 내역이 부서(공장)별로 들어 있습니다(위쪽 6건만 표시했습니다). 콤보박스에서 부서를 선택하면 연결된 셀에 목록의 순번이 담기고, 이름 정의(DeptName)에는 INDEX 함수로 해당 부서명이 표시됩니다.

일자부서명금액구매품목명관리번호
2000-01-07동서울공장87,000가스충전기 구매2000-001
2000-01-07동서울공장55,000카토너 개조2000-002
2000-01-07부산공장110,000제품 포장기 구매2000-003
2000-01-07부산공장200,000지게차 구입2000-004
2000-01-07대구공장15,000포크레인 구입2000-005
2000-01-10남서울공장14,604각 사업장 UPS Cell 교체2000-006

콤보박스를 통해 부서를 선택하니까 해당 부서의 장비 구매 내역만 추출될 것입니다. 이것을 만드는 방법에 대해 알아보도록 합니다.

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

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

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


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

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

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

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

콤보박스를 통한 자료추출

핵심 요약: 콤보박스로 자료 추출

콤보박스 선택값을 이름 정의로 읽어 Do~Loop로 원본을 검사하며 같은 부서의 행만 새 시트에 복사합니다.

  • 1단계: 이름 정의한 셀에서 선택된 부서명을 변수에 담습니다.
  • 2단계: 같은 이름의 시트가 있으면 확인 후 삭제하고 새 시트를 만듭니다.
  • 3단계: 부서가 같은 행만 복사하고 돌아가기 버튼을 만들어 OnAction을 지정합니다.

Step 1: 자료 추출 프로시저 작성하기

(1) VB Editor 상태에서 모듈시트를 하나 삽입하고 아래의 코드를 입력합니다.

Sub ExtractDept()
    Dim i As Integer
    Dim intCount As Integer
    Dim strDept As String
    Dim Msg As String
    Dim sht As Worksheet
    Dim rngCell As Range
    Dim strYesNo As String
    Application.DisplayAlerts = False

    strDept = Range("DeptName")
    '//Application.DisplayAlerts=False라고 설정을 하면 시트 삭제 등의 작업을 할 때,
    '//"이 작업은 취소할 수 없습니다. 계속 할까요? 말까요? 어쩔까요?…"
    '//등의 메시지가 나타나지 않게 됩니다.

    '//셀에 이름을 정의한 다음, 그 내용을 strDept라는 변수에 담아둡니다.
    '//범위에 이름을 정의하고 사용하는 것은 좋은 습관이니까 반드시 몸에 붙이시기를…

    For Each sht In Sheets
    '//워크북 내에 있는 모든 시트들을 검사하여 같은 이름의 시트가 이미 있으면 지우고 다시
    '//작성합니다(물론 사용자가 다시 만들고자 할 때만…).

        If sht.Name = strDept & "Sheet" Then
            Msg = "같은 시트가 이미 있습니다" & vbCr
            Msg = Msg & "지우고 다시 만들까요?"
            strYesNo = MsgBox(Msg, vbYesNo, "동일 시트 발견//Exceller")
            If strYesNo = vbNo Then
                Sheets(strDept & "Sheet").Select
                Exit Sub
            End If
            sht.Delete
        End If
    Next sht

    Set sht = Worksheets.Add
    sht.Name = strDept & "Sheet"
    Range("Title").Copy
    Sheets(strDept & "Sheet").Range("a1").Select
    ActiveSheet.Paste
    '//워크시트를 한장 삽입하고 이름을 "부서명" + Sheet로 지정합니다. 그리고 나서 Source
    '//시트에 있는 타이틀 부분을 새로 삽입한 워크시트로 복사합니다.

    Do While Range("start").Offset(i, 1) <> ""
        If Range("start").Offset(i, 1) = strDept Then
            Range(Range("start").Offset(i, 0), Range("start").Offset(i, 4)).Copy
            intCount = intCount + 1
            sht.Range("a1").Offset(intCount, 0).Select
            sht.Paste
        End If
        i = i + 1
        '//Do~Loop 반복문을 통해 소스시트의 부서명이 콤보박스에서 선택한 부서명과 같을 경우,
        '//새로 삽입한 시트에 차례로 복사해 넣습니다.
    Loop

    Columns.AutoFit
    ActiveWindow.DisplayGridlines = False
    Range("a1:a3").EntireRow.Insert
    Range("a1").Select
    With Selection
        .Value = "2000년 " & strDept & " 장비 구매내역"
        .Font.Size = 20
    End With
    Range("a3").Select
    Call MakeButton
    '//작업이 다 끝났으면 열폭 조정, 타이틀 삽입 등의 작업을 합니다. 그리고 나서 MakeButton
    '//이라는 또다른 프로시저를 호출합니다. 이 때 Call이라는 명령어는 쓰지 않아도 되지만
    '//예전 BASIC(Visual Basic말고 그냥 BASIC…) 때 하던 버릇이 남아 있어서 그냥 씁니다.
    '//Exceller의 개인적인 견해입니다만, 이렇게 해 주는 것이 덜 헷갈리더군요. ^^

End Sub

Step 2: 돌아가기 버튼 만들기

(2) 위에서 호출한 MakeButton 프로시저를 작성합니다. 이 프로시저는 선택한 부서의 자료추출이 끝난 다음에 종전 위치로 돌아가는 버튼을 만드는 것입니다.

Sub MakeButton()
    With ActiveCell
        ActiveSheet.Buttons.Add(.Left, .Top, .Width * 2, .Height).Select
    End With
    '//현재 셀 포인터가 위치한 곳에 버튼을 하나 그려 넣습니다.

    With Selection
        .Caption = "<<돌아가기"
        With .Characters.Font
            .Size = 10
            .ColorIndex = 3
        End With
        .OnAction = "GoBack"
    End With
    '//삽입한 버튼에 대해 Caption과 글자 크기, 글자 색상 등을 설정하고 OnAction 속성을
    '//지정합니다. OnAction 속성은 해당 개체를 클릭했을 때 실행되는 매크로를 설정하는
    '//속성입니다. 따라서 이 버튼을 클릭하면 GoBack이라는 또다른 프로시저를 실행하게
    '//되는 것이지요.

    Range("a5").Select
    ActiveWindow.FreezePanes = True
    MsgBox "작업이 끝났습니다", vbInformation, "작업 종료//Exceller"
End Sub

버튼에 연결된 GoBack 프로시저는 원래의 Preface 시트로 돌아가는 역할을 합니다.

Sub GoBack()
    Sheets("Preface").Select
End Sub

Step 3: 콤보박스 삽입하고 매크로 연결하기

프로시저 작성은 끝났고… 이제 콤보박스를 하나 삽입하고 VBA 코드를 콤보박스에 연결해 주는 작업을 해야 합니다.

(3) "보기-도구 모음-양식" 메뉴를 선택하고 "콤보 상자" 아이콘을 누른 다음, 워크시트에 콤보박스를 하나 그려 넣습니다. 이 때 Alt 키를 누르고 마우스 왼쪽 버튼을 눌러 드래그 하면 셀 크기에 꼭맞는 콤보박스가 그려집니다. 이것은 다른 개체를 그릴 때에도 마찬가지입니다.

(4) (3)에서 그린 콤보박스를 마우스 오른쪽 버튼으로 클릭하면 [그림 1]과 같은 단축 메뉴가 나타나는데 "매크로 지정" 메뉴를 클릭합니다.

콤보박스를 마우스 오른쪽 버튼으로 클릭하면 나타나는 단축 메뉴의 매크로 지정
아이엑셀러

(5) [그림 2]와 같이 좀전에 작성한 ExtractDept 프로시저를 선택하고 "확인" 버튼을 클릭하면 끝!

매크로 지정 대화상자에서 ExtractDept 프로시저를 선택한 화면
아이엑셀러

여기서 한 가지 주의하실 점은 (3) 단계에서 반드시 "양식" 도구모음에 있는 "콤보박스"를 선택한다는 점입니다. "양식" 도구모음과 아주 비슷하게 생긴 "컨트롤" 도구 모음에 있는 "콤보박스"를 선택하면 안됩니다. 아직도 이 두 가지를 혼동해서 질문을 하시는 분이 자주 계시더군요.

이 강좌의 콤보박스는 양식 컨트롤이며, 요즘 버전의 엑셀에서는 [개발 도구] 탭 > [삽입]에서 양식 컨트롤과 ActiveX 컨트롤을 구분해서 선택합니다. 또한 Buttons.Add는 옛 개체 모델로 지금도 동작하지만 새 코드에서는 Shapes.AddFormControl을 주로 사용합니다.

마무리

많이 응용해 보시기 바랍니다.

다음 시간에…

정리 — 콤보박스 자료 추출 핵심

구분 사용한 코드 역할
선택값 읽기 strDept = Range("DeptName") 이름 정의 셀에서 부서명 가져오기
경고 끄기 Application.DisplayAlerts = False 시트 삭제 메시지 생략
조건 복사 If ...Offset(i, 1) = strDept Then 같은 부서만 복사
버튼 생성 ActiveSheet.Buttons.Add(...) 돌아가기 버튼 만들기
매크로 연결 .OnAction = "GoBack" 클릭 시 실행할 프로시저

자주 묻는 질문 (FAQ)

Q1. 양식 콤보박스와 컨트롤 콤보박스는 어떻게 다른가요?

양식 도구 모음의 콤보상자는 매크로 지정으로 프로시저를 연결하며, 컨트롤 도구 모음의 콤보박스는 이벤트 프로시저를 쓰는 다른 종류라 혼동하면 안 됩니다.

Q2. OnAction 속성은 무엇인가요?

개체를 클릭했을 때 실행할 매크로 이름을 지정하는 속성입니다.

Q3. Application.DisplayAlerts = False는 왜 쓰나요?

시트 삭제 등의 작업에서 나타나는 확인 메시지를 표시하지 않도록 하기 위해서입니다.

마치며

콤보박스와 이름 정의를 활용하면 클릭 한 번으로 원하는 부서의 자료만 따로 추출할 수 있습니다.