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

들어가기 전에

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

행복할 수 밖에 없는 99가지 이유를 가졌지만 그다지 행복해 하지 않는 사람들을 가끔 보면서 세상은 공평하다는 생각을 하게 됩니다. Exceller가 아는 사람 중에 흔히 말하는 부모를 잘 만나 아둥바둥 거리며 살 필요가 없는 사람이 있습니다. 누가 보아도 남 부러울 것이 없는 환경임에도 항상 투덜거리는 경향이 있어 '투덜이 스머프'라고 놀려대곤 합니다.

그런 사람을 보노라면, 조물주가 사람들마다 각기 다른 환경을 주고 어느 누가 그 환경에 잘 적응하며 최선을 다해 사는가를 테스트하는 것이 아닌가 하는 생각이 듭니다. 탈무드에 이런 말이 있지요. "이 세상에서 가장 부유한 사람은 누구냐? - 자신이 가진 것에 만족하는 사람이다"라고. 자기가 가진 것, 자기가 지금하는 일에 만족해 하며 계속 동기부여를 해 가며 사는 것이 중요하다는 생각을 새삼스레 해 봅니다.

그건 그렇고…

지지난 엑셀 강좌 시간에 동적 이름 정의를 사용해서 콤보박스를 채워넣는 방법에 대해 소개해 드렸습니다. 그 때 설명을 드릴까 하다가 VBA 강좌 시간에 따로 소개 드리는 편이 나을 것 같다는 생각에 별도로 강좌를 진행합니다.

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

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

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


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

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

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

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

콤보박스 활용 테크닉

핵심 요약: 콤보 박스 채우기와 활용

DropDown 오브젝트에 AddItem으로 항목을 넣고, 동적 배열로 중복을 걸러 내며, 선택한 항목을 다른 프로시저에 넘겨 시트를 만들 수 있습니다.

  • 1단계: RemoveAllItems로 기존 목록을 지우고 AddItem으로 채웁니다.
  • 2단계: 동적 배열에 담은 값과 비교해 중복 항목은 건너뜁니다.
  • 3단계: Application.Caller로 콤보 박스를 찾아 선택한 항목을 MakeSheet에 넘깁니다.

Step 1: 콤보 박스에 목록 채우기 (FillComboBox)

A열에는 강동, 강서, 강남, 강북, 부산, 대구, 대전, 광주, 제주가 입력되어 있습니다. 버튼을 누르면 왼쪽의 데이터가 콤보박스에 채워집니다.

Sub FillComboBox()
    Dim rngCell As Range
    Dim cmbComboBox As DropDown
    Dim Msg As String
    Set cmbComboBox = ActiveSheet.DropDowns("MyCombo")
    MsgBox "기존의 리스트들을 지웁니다", , "리스트 제거//By Exceller"
    cmbComboBox.RemoveAllItems

    For Each rngCell In Range("A:A").SpecialCells(xlTextValues)
        cmbComboBox.AddItem rngCell
    Next rngCell
    Msg = Msg & "콤보 박스가 채워졌습니다" & vbCr
    Msg = Msg & "콤보 박스를 클릭해 보세요"
    MsgBox Msg, , "작업 완료//By Exceller"
End Sub

코드는 그다지 어려운 부분이 없을 것입니다. 그런데 이 코드는 문제가 있어 보이는군요. 예를 들어 옆의 빨간 셀에 제주라고 입력한 다음 다시 위의 Click Me!!! 버튼을 눌러 보세요. 콤보 박스에 제주라는 항목이 두번 나타나지요? 즉 중복되는 값이 있을 경우, 리스트가 여러 번 반복되어 나타나는 문제가 있습니다. 이 문제를 해결해 보도록 하지요. 아래의 'Click Again!' 버튼을 누르신 다음 콤보 박스에 추가된 항목을 확인해 보세요.

Step 2: 중복 없이 채우기 (FillComboBoxWithUniqueItems)

잘 작동하지요? 코드를 볼까요? 하는 일이 많으니까 코드도 위의 것 보다는 좀 복잡합니다.

Sub FillComboBoxWithUniqueItems()
    Dim rngCell As Range, rngSource As Range
    Dim i As Integer, j As Integer
    Dim cmbCombo As DropDown
    Dim strItem() As String, Msg As String
    Set cmbCombo = ActiveSheet.DropDowns("MyCombo2")
    Set rngSource = ActiveSheet.Columns("A:A").SpecialCells(xlTextValues)
    MsgBox "기존의 리스트들을 지웁니다", , "리스트 제거//By Exceller"
    cmbCombo.RemoveAllItems

    For Each rngCell In rngSource
        If j > 0 Then
            For i = LBound(strItem) To UBound(strItem)
                If rngCell = strItem(i) Then GoTo StopScan
                '''rngSource는 A열 전체 중에서 값이 들어있는 모든 셀을 의미합니다.
                '''여기서 j>0이라는 것은 무엇을 뜻하는 것일까요? 현재로서는 알 수 없습니다만
                '''아래로 좀더 내려가서 살펴보면 값이 1개 이상, 그러니까 같은 값이 하나 이상
                '''있는 것을 의미합니다. 따라서 동적 배열 변수 strItem()에 기존에 들어있는 값과
                '''현재 셀의 값을 비교하여 같은 경우에는 StopScan이라는 조건 분기문으로 가라는
                '''의미입니다.

                '''이것은 초등학교 반장 선거를 할 때 어떻게 합니까? 먼저 후보자를 정하지요?
                '''그런 다음 홍길동, 갑동이, 을순이 등의 후보자를 칠판에 적어두고 투표를 합니다.
                '''개표를 할 때, 한 표씩 열어가며 이름을 부를 때마다 칠판에 있는 이름 밑에다 正자를
                '''적어 나갑니다. 이 과정과 크게 다를 것이 없습니다.

            Next i
            ReDim Preserve strItem(j)
            strItem(j) = rngCell
            cmbCombo.AddItem rngCell
            j = j + 1
        Else
            ReDim Preserve strItem(j)
            strItem(j) = rngCell
            cmbCombo.AddItem rngCell
            j = j + 1
        End If
StopScan:
    Next rngCell
    Msg = Msg & "Unique Item으로 콤보 박스를 채웠습니다" & vbCr
    Msg = Msg & "콤보 박스를 클릭해 보세요"
    MsgBox Msg, , "작업 완료//By Exceller"
End Sub

Step 3: 선택한 항목으로 시트 만들기 (DoingSomething)

개념을 조금 더 확장해 보도록 하지요. 그냥 콤보 박스에서 항목을 선택하면 선택된 내용을 보여주기만 할 것이 아니라 선택된 이름과 같은 시트를 만들어 보는 것입니다.

Sub DoingSomething()
    Dim cmbCombo As DropDown
    Dim Msg As String, strList As String
    Set cmbCombo = Sheets("Preface").DropDowns(Application.Caller)
    strList = cmbCombo.List(cmbCombo.ListIndex)
    '''콤보 박스를 통해 사용자가 선택한 값을 strList라는 문자열 변수에 담습니다.

    Msg = Msg & strList & "" & "을(를) 선택하셨습니다"
    MsgBox Msg, , "Item 선택//By Exceller"
    MakeSheet strList
    '''MakeSheet 프로시저를 호출할 때 strList라는 값을 건네주어 함께 실행시킵니다.

    Application.Goto cmbCombo.TopLeftCell
End Sub
Sub MakeSheet(XXX As String)
    Dim shtSheet As Worksheet

    For Each shtSheet In ThisWorkbook.Sheets
        If shtSheet.Name = XXX Then
            MsgBox "같은 시트가 이미 만들어져 있습니다", , "동일 시트 발견//By Exceller"
            Exit Sub
        End If
    Next shtSheet
    Worksheets.Add.Name = XXX
    MsgBox XXX & " 시트를 만들었습니다!", , "시트 생성//By Exceller"
End Sub

마무리

이번 시간에는 여기까지…

정리 — 콤보 박스 활용 핵심

구분 사용한 코드 역할
콤보 박스 참조 ActiveSheet.DropDowns("MyCombo") 양식 콤보 박스 지정
목록 비우기 .RemoveAllItems 기존 항목 제거
항목 추가 .AddItem rngCell 목록에 항목 추가
중복 검사 ReDim Preserve strItem(j) 이미 담은 값 기억
선택 항목 조회 .List(.ListIndex) 선택한 값 읽기

자주 묻는 질문 (FAQ)

Q1. 콤보 박스에 같은 항목이 여러 번 나타나는 문제는 어떻게 해결하나요?

동적 배열에 이미 추가한 항목을 저장해 두고, 새 값이 배열에 있으면 건너뛰도록 비교합니다.

Q2. 콤보 박스에서 선택한 값은 어떻게 읽나요?

DropDown 오브젝트의 List(ListIndex)로 선택된 항목을 읽을 수 있습니다.

Q3. 콤보 박스에 연결된 프로시저에서 그 콤보 박스를 알아내려면?

Application.Caller가 프로시저를 호출한 개체의 이름을 돌려주므로 DropDowns(Application.Caller)로 참조합니다.

마치며

콤보 박스의 목록 채우기, 중복 제거, 선택 항목 활용을 익혀 두면 사용자 인터페이스를 훨씬 편리하게 만들 수 있습니다.