- 최초 작성일: 2001-10-25
- 최종 수정일: 2026-09-30
- 조회수: 15 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 콤보박스 활용 테크닉3
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
이번 시간에는 게시판에 올라온 두 가지 질문을 살펴봅니다.
질문 하나
안녕하세요. 항상 감사드립니다.
오늘도 도움을 받고자 이렇게 몇자 적습니다.
dim rngcell as range
dim rngtarget as range
set rngtarget = sheets("목록").columns(1).specialcells(xltextvalues)
for each rngcell in rngtarget
combobox1.additem rngcell
next rngcell
이렇게 해서 콤보박스에 아이템들을 추가하기는 했거든요.
그런데 제가 원하는 것은 rngtarget이라는 변수에 담아둔 값들을 오름차순으로
정렬한 후 콤보박스에 추가하는 방법을 알고 싶습니다.
도움말에서 sort라는 메서드를 찾긴 했는데 잘 모르겠더라구요…
부탁드립니다.
질문 두울
안녕하세요?
유저폼에서 같은 화일내에 있는 rowsource 지정은 잘 알겠는데,
타 화일에 있는 범위는 어떻게 지정하는지요?
아무리 해도 안되네요. 추가기능 화일로 만들어서 쓰려고 하는데 콤보상자에
리스트가 나타나질 않습니다.
Help me !!!
콤보박스에 대한 강좌가 나간 이후로도 질문이 끊이질 않는군요. 미처 설명드리지 못한 것들도 지난 강좌들을 잘 살펴보시면 해결책이 나올테니까 열심히 복습하시기 바랍니다. ^^
콤보박스 활용 테크닉3
핵심 요약: 정렬·중복 제거 콤보 박스
셀 값을 배열에 담아 정렬한 뒤 콤보 박스에 채우고, Collection의 Key 중복 오류를 이용해 고유 항목만 남기면 오름차순의 중복 없는 목록이 됩니다.
- 1단계: 셀 값을 배열 변수에 담습니다.
- 2단계: 임시 변수로 인접한 값의 자리를 바꾸며 오름차순으로 정렬합니다.
- 3단계: Collection에 Key로 추가하면 중복은 오류로 걸러집니다.
Step 1: 콤보 박스에 정렬해서 채우기
왼쪽과 같은 데이터가 있습니다. 우선 이것을 콤보박스에 채워넣어 보도록 하지요. 버튼을 누르세요.
이것은 지난 시간에 설명을 드린 것이니까 그냥 넘어가도록 하고…
문제는 단순히 콤보박스에 채워넣는 것이 아니라 정렬을 해서 채워넣고 싶다는 (혹은 채워넣은 다음 정렬) 것이지요. 다시 아래의 버튼을 눌러 보세요.
어떻습니까? 바로 이렇게 되도록 하고 싶다는 질문이신 듯 합니다. 어떻게 하면 될까요? 코드를 보시기 전에 머리 속으로 과정을 먼저 그려보시기 바랍니다. 학교에서 수학 문제를 풀 때에도 그렇지요. 약간 어렵다고 무조건 풀이과정부터 읽어 나가면 당장은 편할 지 모르지만 효과가 반감되지 않습니까? 프로그래밍을 할 때에도 마찬가지입니다.
FillComboAscendingOrder 프로시저
Sub FillComboAscendingOrder()
Dim rngCell As Range, rngTarget As Range
Dim i As Integer, j As Integer, intNum As Integer
Dim strItem() As String, Msg As String
Dim cmbCombo As DropDown
Dim varTemp As Variant
Set cmbCombo = Sheets("Preface").DropDowns("MyCombo2")
Set rngTarget = [Item].SpecialCells(xlTextValues)
intNum = rngTarget.Cells.Count
ReDim strItem(1 To intNum)
MsgBox "기존의 리스트들을 지웁니다", , "리스트 제거//By Exceller"
cmbCombo.RemoveAllItems
For Each rngCell In rngTarget
i = i + 1
strItem(i) = rngCell
Next rngCell
'''배열 변수 strItem에 rngTarget, 즉 Item 영역 중에서 값이 들어있는 셀의 모든 값을 하나씩
'''담아둡니다.
For i = intNum - 1 To 1 Step -1
For j = 1 To i
If strItem(j) > strItem(j + 1) Then
varTemp = strItem(j)
strItem(j) = strItem(j + 1)
strItem(j + 1) = varTemp
End If
Next j
Next i
'''strItem이라는 배열 변수에 저장된 값들을 하나씩 비교하면서 가나다순으로 정렬하는
'''과정입니다. 아주 오래 전에 토끼와 거북이 위치 바꾸기를 하는 예제를 하나 보여드린
'''기억이 납니다. 아래의 버튼을 누를 때마다 토끼와 거북이가 서로 자리를 바꿉니다.
'''코드는 보시는 바와 같이 간단합니다.
'''임시 저장공간(변수)에 토끼라는 값을
'''담아 둡니다.
'''거북이를 토끼가 있던 자리로 옮깁니다.
'''마지막으로 임시저장 공간에 담아두었던
'''토끼를 거북이가 있던 자리로 옮깁니다.
'''바로 이 원리입니다.
For i = 1 To intNum
cmbCombo.AddItem strItem(i)
'''strItem에 들어있는 값들을 콤보박스에 추가합니다.
Next i
Msg = Msg & "콤보 박스에 아이템을 오름차순으로 채워 넣었습니다" & vbCr
Msg = Msg & "콤보 박스를 클릭해 보세요"
MsgBox Msg, , "작업 완료//By Exceller"
End Sub
Step 2: 중복 없이 정렬해서 채우기
그런데 이 코드도 문제가 있습니다. 어떤 문제일까요? 위의 목록에서 빨간 색으로 표시한 셀에 기존에 입력되어 있는 값을 넣어보세요. 예를 들어 강남, 부산, 제주를 입력한 다음 다시 버튼을 눌러 보세요. 콤보박스에 아이템이 중복되어 나타나지요? 이런 프로그램을 만들어서 팔아먹었다간 테러 당합니다. ^^; 아래 버튼을 눌러 보세요.
이제 제대로 나타나지요? 코드를 보도록 합니다.
FillComboAscendingOrder2 프로시저
Sub FillComboAscendingOrder2()
Dim rngCell As Range, rngTarget As Range
Dim i As Integer, j As Integer, intNum As Integer
Dim strItem() As String, Msg As String
Dim cmbCombo As DropDown
Dim varTemp As Variant
Dim X As New Collection
Set cmbCombo = Sheets("Preface").DropDowns("MyCombo3")
Set rngTarget = [Item2].SpecialCells(xlTextValues)
On Error Resume Next
'''반드시 이 구문을 넣어 주어야 합니다.
MsgBox "기존의 리스트들을 지웁니다", , "리스트 제거//By Exceller"
cmbCombo.RemoveAllItems
For Each rngCell In rngTarget
X.Add rngCell.Value, CStr(rngCell.Value)
'''중복되는 데이터 중에서 고유한 것만 골라내기 위해 바로 Collection 오브젝트를
'''사용하였습니다.
'''컬렉션 오브젝트의 기본적인 사용형태는
'''[오브젝트명.Add Item, key, (before), (after)] 입니다.
'''여기서 key는 중복되지 않는 값일 경우에만 유효하게 됩니다. 즉 중복되는 값이 나타날
'''경우에는 에러가 발생하게 되어 아이템에 추가가 되지 않게 됩니다.
'''컬렉션 오브젝트에 대한 보다 자세한 설명 및 예제는 VB0029, VB0030 강좌를 참고하세요.
'''나머지 코드는 위에서 설명드린 것과 거의 비슷합니다.
Next rngCell
On Error GoTo 0
intNum = X.Count
ReDim strItem(1 To intNum)
For i = 1 To intNum
strItem(i) = X(i)
Next i
For i = intNum - 1 To 1 Step -1
For j = 1 To i
If strItem(j) > strItem(j + 1) Then
varTemp = strItem(j)
strItem(j) = strItem(j + 1)
strItem(j + 1) = varTemp
End If
Next j
Next i
For i = 1 To intNum
cmbCombo.AddItem strItem(i)
Next i
Msg = Msg & "콤보 박스에 아이템을 중복없이, 오름차순으로 채워 넣었습니다" & vbCr
Msg = Msg & "콤보 박스를 클릭해 보세요"
MsgBox Msg, , "작업 완료//By Exceller"
End Sub
Step 3: 다른 파일의 범위를 콤보 박스에 지정하기
두번째 질문하신 것은 해당 파일, 해당 시트로 이동한 다음에 작업을 하시면 되겠습니다. 아래의 코드를 응용해 보세요.
Private Sub UserForm_Initialize()
Workbooks.Open Filename:="C:\Temp.xls"
Application.Goto Sheets("Sheet1").Range("a1"), True
ComboBox1.RowSource = "a1:a10"
End Sub
마무리
콤보박스에 대한 여러 가지 응용 방법들을 확실하게 정리해 두시기 바랍니다.
다음 시간에…
정리 — 콤보 박스 정렬·중복 제거 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 범위 지정 | [Item].SpecialCells(xlTextValues) | 텍스트가 있는 셀만 대상 |
| 배열 저장 | ReDim strItem(1 To intNum) | 값을 배열에 저장 |
| 정렬 | If strItem(j) > strItem(j + 1) Then … | 임시 변수로 자리 바꿈 |
| 중복 제거 | X.Add rngCell.Value, CStr(rngCell.Value) | Key 중복 시 오류로 제외 |
| 다른 파일 범위 | Workbooks.Open / Application.Goto | 대상 파일·시트로 이동 후 RowSource 지정 |
자주 묻는 질문 (FAQ)
Q1. 콤보 박스에 항목을 정렬해서 채우려면 어떻게 하나요?
셀 값을 배열에 담아 정렬한 다음 순서대로 AddItem 하면 됩니다.
Q2. Collection으로 중복을 어떻게 걸러 내나요?
Add 메서드의 Key는 중복될 수 없으므로 같은 값이 오면 오류가 발생해 추가되지 않고, On Error Resume Next로 이 오류를 무시하면 고유한 값만 남습니다.
Q3. 다른 파일에 있는 범위를 RowSource로 지정하려면?
해당 파일을 열고 대상 시트로 이동한 다음 RowSource를 지정합니다.
마치며
배열 정렬과 Collection 오브젝트를 조합하면 콤보 박스에 정렬되고 중복 없는 목록을 채울 수 있습니다.