• 최초 작성일: 2001-10-23
  • 최종 수정일: 2026-09-30
  • 조회수: 12 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 콤보박스 활용 테크닉2

들어가기 전에

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

지난 일요일에는 춘천 마라톤에 참석하였습니다. Exceller는 10Km에 참석(물론 완주 ^^)하였는데 풀 코스 참석자만 1만명이 넘는 큰 대회였습니다.

여러 가지 할 얘기가 많지만, Refresh 중에 최고의 Refresh는 몸을 혹독하게 움직이는 것, 바로 마라톤이 아닌가 생각합니다. 땀을 비오듯이 흘리며 대자연의 기운을 온 몸으로 맞아들일 때의 그 기분... 몸과 마음을 동시에 Refresh 하는데 이보다 더 좋은 운동은 없다고 생각됩니다. 혹시 '무슨 운동을 할까?' 망설이는 분이 있다면 일단 가까운 공원에라도 가서 한 30분 만이라도 달려 보세요. 도적놈 소굴(과격한 표현을 써서 죄송… 하지만 사실이 그런 것을… ^^)같이 어둠침침한 노래방이나 나이트 클럽 같은 데서 방황하는 것보다는 열배 백배 생산적인 생각들이 마구 솟아날 것입니다.

지난 시간에 이어지는 내용… 콤보박스를 활용한 예제 한 가지를 더 살펴보도록 합니다. (이번 예제는 UNO21님의 아이디어에서 힌트를 얻은 것입니다) '검색 방법'과 해당 조건을 선택하신 다음 "요약시트 만들기" 버튼을 눌러 보세요. 해당되는 조건에 맞는 데이터만 별도의 시트에 정리가 될 것입니다.

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

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

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


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

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

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

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

콤보박스 활용 테크닉2

핵심 요약: 콤보 박스 조건으로 데이터 추출

콤보 박스의 선택값을 공통 프로시저로 읽어 Select Case로 년도별·분기별·월별 조건을 나누고, 조건에 맞는 행을 새 시트에 복사한 뒤 합계를 구합니다.

  • 1단계: 공통 변수를 모듈 수준에 선언하고 콤보 박스 값을 읽는 프로시저를 분리합니다.
  • 2단계: 검색 방법에 따라 두 번째 콤보 박스의 목록과 표시 여부를 바꿉니다.
  • 3단계: 조건에 맞는 행을 FilterSheet에 복사하고 MakeSum으로 합계를 넣습니다.

Step 1: 예제 데이터와 이름 정의

"검색 방법"(년도별/분기별/월별)과 그에 해당하는 조건을 콤보 박스로 선택하고 요약시트를 만드는 예제입니다. 아래 데이터(A33:D81)를 사용하며 다음과 같은 이름이 정의되어 있습니다.

이름참조 범위용도
CriteriaB31선택한 검색 방법 표시
TitleA33:D33제목 행
날짜B34:B81검색 대상 날짜
기준K7:K9검색 방법 목록(년도별/분기별/월별)
년도L7:L101998~2001
분기M7:M101분기~4분기
월N7:N181~12
예제 데이터 펼쳐 보기 (전문점명 / 일자 / 판매수량 / 판매금액)
전문점명일자판매수량판매금액
칼라파워1999-01-1013130,000
스킨피아1999-02-10770,000
마이웨이2000-03-1025250,000
홈마트2000-04-1010100,000
클럽칼라1999-05-1038380,000
칼라파워2000-06-1020200,000
스킨피아2000-07-1013130,000
클럽칼라2000-08-10770,000
칼라파워2000-09-1050500,000
스킨피아2000-10-1040400,000
마이웨이2000-11-1033330,000
홈마트2000-12-1045450,000
칼라파워2001-01-1513130,000
스킨피아2001-02-15770,000
마이웨이2001-03-1525250,000
홈마트2001-04-1510100,000
클럽칼라2001-05-1538380,000
칼라파워2001-06-1520200,000
스킨피아2001-07-1513130,000
클럽칼라2001-08-15770,000
칼라파워2001-09-1550500,000
스킨피아1998-10-1540400,000
마이웨이1998-11-1533330,000
홈마트1998-12-1545450,000
칼라파워2000-01-0313130,000
스킨피아2000-02-03770,000
마이웨이2000-03-0325250,000
홈마트2000-04-0310100,000
클럽칼라2000-05-0338380,000
칼라파워2000-06-0320200,000
스킨피아2000-07-0313130,000
클럽칼라2000-08-03770,000
칼라파워2000-09-0350500,000
스킨피아2000-10-0340400,000
마이웨이2000-11-0333330,000
홈마트2000-12-0345450,000
칼라파워2001-01-2413130,000
스킨피아2001-02-24770,000
마이웨이2001-03-2425250,000
홈마트2001-04-2410100,000
클럽칼라2001-05-2438380,000
칼라파워2001-06-2420200,000
스킨피아2001-06-2913130,000
클럽칼라2001-08-24770,000
칼라파워2001-09-2450500,000
스킨피아2001-10-2440400,000
마이웨이2001-11-2433330,000
홈마트2001-12-2445450,000

Step 2: 공통 변수와 콤보 박스 값 읽기 (DefineVariableName)

Option Explicit
Dim cmbSearch As DropDown, cmbYear As DropDown, cmbWhen As DropDown
Dim strSearch As String
'여러 프로시저에서 공통적으로 사용되는 변수들을 프로시저 외부에 선언합니다.

Sub DefineVariableName()
    With Worksheets("Preface")
        Set cmbSearch = .DropDowns("cmbSearch")
        Set cmbYear = .DropDowns("cmbYear")
        Set cmbWhen = .DropDowns("cmbWhen")
    End With
    With cmbSearch
        strSearch = .List(.ListIndex)
    End With
    '''마찬가지로 각 프로시저에서 공통적으로 사용되는 콤보박스의 내용을 읽어오는 부분도
    '''별도의 프로시저로 나눕니다.
End Sub

Step 3: 검색 방법에 따라 화면 바꾸기 (FilterData)

Sub FilterData()
    DefineVariableName
    cmbYear.ListFillRange = "년도"
    '''cmbYear 콤보 박스의 내용을 "년도"라는 범위명 내에 있는 값으로 채웁니다.
    '''cmbSearch 콤보 박스에서 선택된 값에 따라 Select Case 분기문을 실행합니다.

    Select Case strSearch
        Case "년도별"
            With [Criteria]
                .ClearContents
                cmbWhen.Visible = False
                .Interior.ColorIndex = 19
            End With
            '''cmbSearch 콤보 박스에서 선택된 값이 "년도별"일 경우, cmbWhen 콤보 박스를
            '''숨기고 셀 내부 ColorIndex 속성값을 19(연한 미색)로 만듭니다. 왜 이렇게 하는
            '''것일까요? 년도별 데이터를 선택할 경우, 분기별 또는 월별 이라는 콤보 박스는
            '''불필요할 것이므로 일시적으로 화면상에서 숨기기 위한 것입니다.

        Case "분기별"
            With cmbWhen
                .ListFillRange = "분기"
                .Visible = True
            End With
            With [Criteria]
                .Value = "분기별"
                .Interior.ColorIndex = 16
            End With

        Case "월별"
            With cmbWhen
                .ListFillRange = "월"
                .Visible = True
            End With
            With [Criteria]
                .Value = "월별"
                .Interior.ColorIndex = 16
            End With
        End Select
End Sub

Step 4: 요약시트 만들기 (MakeFilterSheet)

이제 "요약시트 만들기" 버튼에 연결된 코드를 보도록 하지요. 코드가 좀 깁니다. 잘 따라 오세요.

Sub MakeFilterSheet()
    Dim rngCell As Range, rngDate As Range
    Dim strYear As String, strWhen As String, Msg As String
    Dim i As Integer
    Dim shtFilter As Worksheet
    Set shtFilter = Worksheets("FilterSheet")
    Set rngDate = [날짜]
    Msg = "해당되는 데이터가 없습니다"
    '''등장인물과 배역을 설정해 주었습니다.

    DefineVariableName
    With cmbYear
        strYear = .List(.ListIndex)
    End With
    '''필요한 변수들을 외부 프로시저에 한번 선언해 놓고 여러 프로시저에서 불러다
    '''사용합니다. 컴퓨터 프로그래밍이든 현실 세계에서든 중복되는 요소가 많다는 것은
    '''곧 비효율적인 것입니다.

    Select Case strSearch
        Case "년도별"
            For Each rngCell In rngDate
                If Year(rngCell) = strYear Then
                    If i = 0 Then MakeSheet
                    rngCell.EntireRow.Copy
                    Worksheets("FilterSheet").Paste Destination:=Worksheets("FilterSheet").Cells(i + 2, 1)
                    i = i + 1
                End If
            Next rngCell
            If i = 0 Then
                MsgBox Msg, , "작업 완료//By Exceller"
                Exit Sub
            End If
            MakeSum strYear & "년 ", i

        Case "분기별"
            With cmbWhen
                strWhen = .List(.ListIndex)
            End With

            For Each rngCell In rngDate
                If Year(rngCell) = strYear Then
                    If strWhen = Choose(Application.WorksheetFunction.RoundUp(Month(rngCell) / 3, 0), "1분기", "2분기", "3분기", "4분기") Then
                    '''분기별 데이터를 구하기 위해 어떤 수식을 사용했나 잘 살펴보세요.
                    '''워크시트 함수인 RoundUp 함수를 사용했지요? 예를 들어 1분기라는 것은
                    '''3으로 나누었을 때 1이하가 될 것입니다. 이것을 무조건 올림처리하면 1, 즉
                    '''1분기가 되는 것이지요.

                        If i = 0 Then MakeSheet
                        rngCell.EntireRow.Copy
                        Worksheets("FilterSheet").Paste Destination:=Worksheets("FilterSheet").Cells(i + 2, 1)
                        i = i + 1
                    End If
                End If
            Next rngCell
            If i = 0 Then
                MsgBox Msg, , "작업 완료//By Exceller"
                Exit Sub
            End If
            MakeSum strYear & "년 " & strWhen, i

        Case "월별"
            With cmbWhen
                strWhen = .List(.ListIndex)
            End With

            For Each rngCell In rngDate
                If Year(rngCell) = strYear Then
                    If strWhen = Month(rngCell) Then
                        If i = 0 Then MakeSheet
                        rngCell.EntireRow.Copy
                        Worksheets("FilterSheet").Paste Destination:=Worksheets("FilterSheet").Cells(i + 2, 1)
                        i = i + 1
                    End If
                End If
            Next rngCell
            If i = 0 Then
                MsgBox Msg, , "작업 완료//By Exceller"
                Exit Sub
            End If
            MakeSum strYear & "년 " & strWhen & "월 ", i

        End Select

End Sub

Step 5: 시트 만들기 (MakeSheet)

위의 MakeFilterSheet 프로시저에서 호출한 외부 프로시저입니다. 검색한 결과를 표시할 시트가 있는 지 확인한 다음 시트를 만드는 과정입니다.

Sub MakeSheet()
    Dim shtSheet As Worksheet

    For Each shtSheet In ThisWorkbook.Sheets
        If shtSheet.Name = "FilterSheet" Then
            Application.DisplayAlerts = False
            MsgBox "동일한 시트가 이미 있으므로 지우겠습니다", , "동일시트 삭제//By Exceller"
            shtSheet.Delete
        End If
    Next shtSheet

    With Worksheets.Add
        .Name = "FilterSheet"
        [Title].Copy
        .Paste .[A1]
    End With
    Application.DisplayAlerts = True
End Sub

Step 6: 합계 구하기 (MakeSum)

마지막으로, 추출한 데이터의 마지막 부분에 합계를 구하는 프로시저입니다.

Sub MakeSum(strX As String, intX As Integer)
    Dim i As Integer
    ActiveSheet.UsedRange.Columns.AutoFit
    With ActiveSheet.[A1]
        For i = 2 To 3
            With .Offset(intX + 1, i)
                .FormulaR1C1 = "=sum(r[-1]c:r[" & -intX & "]c)"
                .Interior.ColorIndex = 3
                .Font.ColorIndex = 2
            End With
        Next i
        .Offset(intX + 1) = strX & " 합계"
    End With

End Sub

마무리

코드가 좀 길어 졌습니다. 한번씩 해 보시고 이해가 안되는 부분이 있으면 질문하세요.

오늘은 여기까지…

정리 — 콤보 박스 조건 추출 핵심

구분 사용한 코드 역할
공통 변수 Dim cmbSearch As DropDown (모듈 수준) 여러 프로시저에서 공유
목록 채우기 .ListFillRange = "분기" 이름 정의 범위로 목록 채움
검색 방법 분기 Select Case strSearch 년도별·분기별·월별 처리
분기 계산 RoundUp(Month(rngCell) / 3, 0) 월을 분기로 변환
합계 입력 .FormulaR1C1 = "=sum(r[-1]c:r[-n]c)" 추출 행 합계

자주 묻는 질문 (FAQ)

Q1. 여러 프로시저에서 같은 콤보 박스 값을 쓰려면 어떻게 하나요?

변수를 프로시저 밖 모듈 수준에 선언하고, 값을 읽는 부분을 별도 프로시저로 만들어 각 프로시저에서 호출합니다.

Q2. 월을 분기로 바꾸려면 어떻게 하나요?

월을 3으로 나눈 값을 올림(RoundUp)하면 1~4의 분기 번호가 됩니다.

Q3. 이미 같은 이름의 시트가 있으면 어떻게 하나요?

MakeSheet 프로시저에서 시트를 순환하며 이름을 확인해 있으면 삭제한 뒤 새로 만듭니다.

마치며

공통 변수와 프로시저 분리를 활용하면 콤보 박스로 조건을 고르고 요약시트를 만드는 긴 코드도 깔끔하게 구성할 수 있습니다.