- 최초 작성일: 2001-10-23
- 최종 수정일: 2026-09-30
- 조회수: 12 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 콤보박스 활용 테크닉2
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
지난 일요일에는 춘천 마라톤에 참석하였습니다. Exceller는 10Km에 참석(물론 완주 ^^)하였는데 풀 코스 참석자만 1만명이 넘는 큰 대회였습니다.
여러 가지 할 얘기가 많지만, Refresh 중에 최고의 Refresh는 몸을 혹독하게 움직이는 것, 바로 마라톤이 아닌가 생각합니다. 땀을 비오듯이 흘리며 대자연의 기운을 온 몸으로 맞아들일 때의 그 기분... 몸과 마음을 동시에 Refresh 하는데 이보다 더 좋은 운동은 없다고 생각됩니다. 혹시 '무슨 운동을 할까?' 망설이는 분이 있다면 일단 가까운 공원에라도 가서 한 30분 만이라도 달려 보세요. 도적놈 소굴(과격한 표현을 써서 죄송… 하지만 사실이 그런 것을… ^^)같이 어둠침침한 노래방이나 나이트 클럽 같은 데서 방황하는 것보다는 열배 백배 생산적인 생각들이 마구 솟아날 것입니다.
지난 시간에 이어지는 내용… 콤보박스를 활용한 예제 한 가지를 더 살펴보도록 합니다. (이번 예제는 UNO21님의 아이디어에서 힌트를 얻은 것입니다) '검색 방법'과 해당 조건을 선택하신 다음 "요약시트 만들기" 버튼을 눌러 보세요. 해당되는 조건에 맞는 데이터만 별도의 시트에 정리가 될 것입니다.
콤보박스 활용 테크닉2
핵심 요약: 콤보 박스 조건으로 데이터 추출
콤보 박스의 선택값을 공통 프로시저로 읽어 Select Case로 년도별·분기별·월별 조건을 나누고, 조건에 맞는 행을 새 시트에 복사한 뒤 합계를 구합니다.
- 1단계: 공통 변수를 모듈 수준에 선언하고 콤보 박스 값을 읽는 프로시저를 분리합니다.
- 2단계: 검색 방법에 따라 두 번째 콤보 박스의 목록과 표시 여부를 바꿉니다.
- 3단계: 조건에 맞는 행을 FilterSheet에 복사하고 MakeSum으로 합계를 넣습니다.
Step 1: 예제 데이터와 이름 정의
"검색 방법"(년도별/분기별/월별)과 그에 해당하는 조건을 콤보 박스로 선택하고 요약시트를 만드는 예제입니다. 아래 데이터(A33:D81)를 사용하며 다음과 같은 이름이 정의되어 있습니다.
| 이름 | 참조 범위 | 용도 |
|---|---|---|
| Criteria | B31 | 선택한 검색 방법 표시 |
| Title | A33:D33 | 제목 행 |
| 날짜 | B34:B81 | 검색 대상 날짜 |
| 기준 | K7:K9 | 검색 방법 목록(년도별/분기별/월별) |
| 년도 | L7:L10 | 1998~2001 |
| 분기 | M7:M10 | 1분기~4분기 |
| 월 | N7:N18 | 1~12 |
예제 데이터 펼쳐 보기 (전문점명 / 일자 / 판매수량 / 판매금액)
| 전문점명 | 일자 | 판매수량 | 판매금액 |
|---|---|---|---|
| 칼라파워 | 1999-01-10 | 13 | 130,000 |
| 스킨피아 | 1999-02-10 | 7 | 70,000 |
| 마이웨이 | 2000-03-10 | 25 | 250,000 |
| 홈마트 | 2000-04-10 | 10 | 100,000 |
| 클럽칼라 | 1999-05-10 | 38 | 380,000 |
| 칼라파워 | 2000-06-10 | 20 | 200,000 |
| 스킨피아 | 2000-07-10 | 13 | 130,000 |
| 클럽칼라 | 2000-08-10 | 7 | 70,000 |
| 칼라파워 | 2000-09-10 | 50 | 500,000 |
| 스킨피아 | 2000-10-10 | 40 | 400,000 |
| 마이웨이 | 2000-11-10 | 33 | 330,000 |
| 홈마트 | 2000-12-10 | 45 | 450,000 |
| 칼라파워 | 2001-01-15 | 13 | 130,000 |
| 스킨피아 | 2001-02-15 | 7 | 70,000 |
| 마이웨이 | 2001-03-15 | 25 | 250,000 |
| 홈마트 | 2001-04-15 | 10 | 100,000 |
| 클럽칼라 | 2001-05-15 | 38 | 380,000 |
| 칼라파워 | 2001-06-15 | 20 | 200,000 |
| 스킨피아 | 2001-07-15 | 13 | 130,000 |
| 클럽칼라 | 2001-08-15 | 7 | 70,000 |
| 칼라파워 | 2001-09-15 | 50 | 500,000 |
| 스킨피아 | 1998-10-15 | 40 | 400,000 |
| 마이웨이 | 1998-11-15 | 33 | 330,000 |
| 홈마트 | 1998-12-15 | 45 | 450,000 |
| 칼라파워 | 2000-01-03 | 13 | 130,000 |
| 스킨피아 | 2000-02-03 | 7 | 70,000 |
| 마이웨이 | 2000-03-03 | 25 | 250,000 |
| 홈마트 | 2000-04-03 | 10 | 100,000 |
| 클럽칼라 | 2000-05-03 | 38 | 380,000 |
| 칼라파워 | 2000-06-03 | 20 | 200,000 |
| 스킨피아 | 2000-07-03 | 13 | 130,000 |
| 클럽칼라 | 2000-08-03 | 7 | 70,000 |
| 칼라파워 | 2000-09-03 | 50 | 500,000 |
| 스킨피아 | 2000-10-03 | 40 | 400,000 |
| 마이웨이 | 2000-11-03 | 33 | 330,000 |
| 홈마트 | 2000-12-03 | 45 | 450,000 |
| 칼라파워 | 2001-01-24 | 13 | 130,000 |
| 스킨피아 | 2001-02-24 | 7 | 70,000 |
| 마이웨이 | 2001-03-24 | 25 | 250,000 |
| 홈마트 | 2001-04-24 | 10 | 100,000 |
| 클럽칼라 | 2001-05-24 | 38 | 380,000 |
| 칼라파워 | 2001-06-24 | 20 | 200,000 |
| 스킨피아 | 2001-06-29 | 13 | 130,000 |
| 클럽칼라 | 2001-08-24 | 7 | 70,000 |
| 칼라파워 | 2001-09-24 | 50 | 500,000 |
| 스킨피아 | 2001-10-24 | 40 | 400,000 |
| 마이웨이 | 2001-11-24 | 33 | 330,000 |
| 홈마트 | 2001-12-24 | 45 | 450,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 프로시저에서 시트를 순환하며 이름을 확인해 있으면 삭제한 뒤 새로 만듭니다.
마치며
공통 변수와 프로시저 분리를 활용하면 콤보 박스로 조건을 고르고 요약시트를 만드는 긴 코드도 깔끔하게 구성할 수 있습니다.