- 최초 작성일: 2000-08-04
- 최종 수정일: 2026-09-30
- 조회수: 15 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 복수 Item 선택하기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
이번 강좌에서 설명드릴 내용은 UserForm 상에서 복수 개의 아이템들을 선택할 수 있도록 하는 방법에 대한 것입니다. "백문이 불여일견!" 이니까 아래 버튼을 눌러 예제를 실행해 보고 오시기 바랍니다.
무엇을 만들고자 하는지 아시겠습니까?(당연히(?) 모르시겠다구요? ^^)
보통 리스트 박스를 사용할 때, 한번에 한 개의 리스트만을 선택하도록 되어 있는 경우가 많습니다(물론 그렇지 않은 경우도 간혹 있긴 하지만…). 리스트 박스에는 MultiSelect 속성(프로퍼티)이라는 것이 있는데 이 속성의 조절을 통해 "Today's Sample"에서 살펴보신 것과 같은 것을 만들 수가 있는 것입니다.
복수 Item 선택하기
핵심 요약: 리스트박스 복수 선택
MultiSelect 속성 값에 따라 단일, 복수, 확장 선택이 결정되며 Selected(i)로 각 항목의 선택 여부를 확인합니다.
- 1단계: MultiSelect를 0, 1, 2(또는 fmMultiSelect 상수)로 지정합니다.
- 2단계: For 반복문으로 Selected(i)를 검사합니다.
- 3단계: 선택 항목을 vbCr로 이어 붙여 메시지 박스로 표시합니다.
Step 1: MultiSelect 속성 이해하기
MultiSelect 속성은 아래와 같이 세 가지가 있습니다.
fmMultiSelectSinglefmMultiSelectMultifmMultiSelectExtended
이제 실제로 만들어 보도록 하지요.
Step 2: 유저폼 만들기
(1) VB Editor 상태에서(Alt+<F11>) UserForm을 하나 삽입한 다음, 아래와 같이 컨트롤들을 만듭니다.
이제 유저폼만 척~ 보면 어떤 어떤 컨트롤들이 사용되었는지 아시겠지요?(아셔야 하옵니다 ^^) 이 유저폼에는 5종류, 12개의 컨트롤이 사용되었습니다.
① ListBox 컨트롤
| 컨트롤명 | 변경할 속성 | 변경 내용 |
|---|---|---|
| ListBox1 | 없음 | 없음(크기는 적당히 조절) |
② OptionButton 컨트롤
| 컨트롤명 | 변경할 속성 | 변경 내용 |
|---|---|---|
| OptionButton1 | Caption | 단일 선택 |
| Name | optSingle | |
| OptionButton2 | Caption | 복수 선택 |
| Name | optMulti | |
| OptionButton3 | Caption | 확장 선택 |
| Name | optExtend |
③ Frame 컨트롤
| 컨트롤명 | 변경할 속성 | 변경 내용 |
|---|---|---|
| Frame1 | Caption | 종류 선택 |
| Frame2 | Caption | 캡션을 지움 |
④ CommandButton
| 컨트롤명 | 변경할 속성 | 변경 내용 |
|---|---|---|
| CommandButton1 | Caption | 확인 |
| Name | btnOK | |
| CommandButton2 | Caption | 종료 |
| Name | btnClose | |
| CommandButton3 | Accelerator | H |
| Caption | Help>> | |
| Name | btnHelp |
⑤ Label 컨트롤
| 컨트롤명 | 변경할 속성 | 변경 내용 |
|---|---|---|
| Label1, Label2, Label3 | 없음 | 없음(크기는 적당하게 조절) |
이제 필요한 컨트롤들은 다 만들었습니다. 각 컨트롤에 IQ를 심어주는 일만 남았군요.
Sheet2의 A50:A61 범위에는 "월" 목록이 입력되어 있고 범위명 "월"로 지정되어 있습니다.
Step 3: 코드 작성하기
(1) 초기화 이벤트
(2) 유저폼 내에서 컨트롤이 없는 빈 공간을 더블클릭 합니다. 그러면 코드입력창이 나타나면서 UserForm_ Click 이벤트 프로시저가 나타날 것인데, 코드창 우측 상단의 "이벤트 선택 메뉴"의 드롭다운 버튼을 눌러서 Initialize(즉 초기화) 이벤트 프로시저를 선택합니다. 이 상태에서 아래의 코드를 입력합니다.
Private Sub UserForm_Initialize()
ListBox1.RowSource = "월"
Label1.Caption = "<단일> 한번에 한개씩 선택"
Label2.Caption = "<복수> 클릭할 때마다 모두 선택"
Label3.Caption = "<확장> Ctrl, Shift키를 누를 때만 복수 선택"
UserForm1.Height = 163
'//다른 부분은 별로 설명드릴 것이 없겠고… ListBox1.RowSource값으 "월"이라고 주었지요? 이처럼
'//RowSource를 지정해 줄 때에는 "A1:A10"과 같이 범위를 직접 줄 수도 있고, 범위명을 줄 수도 있다
'//는 것을 아시면 좋겠군요.
End Sub
(2) 옵션버튼 클릭 이벤트
(4) 이번에는 옵션버튼 중에서 "단일 선택" 버튼을 더블클릭하고 해당 코드를 입력합니다.
Private Sub optSingle_Click()
ListBox1.MultiSelect = fmMultiSelectSingle
'//MultiSelect 속성값을 fmMultiSelectSingle 대신에 그냥 0을 써 주어도 됩니다.
End Sub
(5) Shift + <F7>을 눌러 유저폼으로 돌아간 다음 "복수 선택" 옵션버튼을 더블클릭한 다음에 다음과 같은 코드를 입력합니다.
Private Sub optMulti_Click()
ListBox1.MultiSelect = fmMultiSelectMulti
'//MultiSelect 속성값을 fmMultiSelectMulti 대신에 그냥 1을 써도 됩니다.
End Sub
(6) Shift + <F7>을 눌러 유저폼으로 돌아간 다음 "확장 선택" 옵션버튼을 더블클릭한 다음에 아래의 코드를 입력합니다.
Private Sub optExtend_Click()
ListBox1.MultiSelect = fmMultiSelectExtended
'//짐작하신 대로 MultiSelect 속성값을 fmMultiSelectMulti 대신에 2를 써도 됩니다.
End Sub
(3) 확인 버튼
(6) Shift + <F7>을 눌러 유저폼으로 돌아간 다음 "확인" 버튼을 더블클릭하고 해당 코드를 입력해야지요. 이 부분이 오늘 강좌의 핵심입니다.
Private Sub btnOK_Click()
Dim Msg As String
Dim i As Integer
If ListBox1.ListIndex = -1 Then
Msg = "아무 것도 선택하지 않으셨군요!"
'//ListIndex는 0부터 시작이 되었지요? 따라서 ListIndex가 -1이라는 것은 아무 것도 선택되지 않았
'//다는 의미이므로 그럴 경우에는 에러 메시지를 띄우기 위한 문자열을 지정합니다.
Else
For i = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(i) Then _
Msg = Msg & ListBox1.List(i) & vbCr
'//순환문을 돌면서 어떤 항목이 선택되었는지를 체크하여(List()에 의해…) Msg라는 문자열에
'//행을 바꾸어 가면서(vbCr) 계속 담아두는 구문입니다.
Next i
End If
MsgBox "선택하신 목록: " & vbCr & vbCr & Msg, , "//Exceller"
'//선택한 항목을 모두 담았으면 메시지 박스에 그 값을 뿌려주면 되겠지요?
End Sub
(4) 종료 버튼
(7) Shift + <F7>을 눌러 유저폼으로 돌아가서 "종료" 버튼을 다음 코드를 입력합니다. 이 코드는 이제 더 이상의 설명이 필요없으실 것이고…
Private Sub btnClose_Click()
Unload Me
End Sub
(5) Help 버튼
(8) Shift + <F7>을 눌러 유저폼으로 돌아간 다음 "Help"버튼을 더블클릭하고 코드를 입력합니다. 이 코드는 VB0025 강좌에선가… 복수 개의 시트를 선택한 다음 출력하는 방법에 대해 설명을 드릴 때 이미 알려드린 것과 거의 비슷합니다.
Private Sub btnHelp_Click()
With UserForm1
If btnHelp.Caption = "Help>>" Then
.Height = 250
btnHelp.Caption = "<<Help"
'//btnHelp 버튼의 캡션이 "Help>>"이면 유저폼의 크기(높이)를 크게하고 캡션을 변경시켜
'//주었군요. 그래야 되겠지요?
Else
.Height = 163
.btnHelp.Caption = "Help>>"
'//그렇지 않은 경우, 즉 유저폼이 이미 확장된 상태라면 유저폼 크기(높이)를 줄여주고 버튼의
'//캡션도 바꾸어 줍니다.
End If
End With
End Sub
(6) 유저폼 호출
이제 각 컨트롤에 대해 거의 필요한 지능을 다 부여해 준 것 같군요. 혹시 빠진 것이 있나요? 아! 이 유저폼을 불러 낼 프로시저를 하나 만들어 주어야 하는군요.
(9) 일반 VBA 모듈을 한 장 삽입한 다음에 아래의 코드를 입력합니다.
Sub ShowMetheForm()
UserForm1.Show
End Sub
마무리
이번 강좌는 코드 상으로는 그다지 어려운 부분은 없으리라 생각됩니다. 그동안 강좌를 충실히 따라해 오신 분이라면 오늘 설명드린 내용 정도는 쉽게 하실 것입니다(이거 꼭 대입수능고사에서 출제위원들이 TV 나와서 하는 얘기와 비슷한 듯도 하네요 ^^ "정상적인 고교교육 과정을 이수한 학생이라면 누구나 쉽 게 풀 수 있는 평이한 문제들로 출제했고… 어쩌구 저쩌구…" 하는…)
어떤 일이든 본질적인 몇 가지만 잘 익혀놓으면 나머지 것은 거기서 파생되어 나오는 것이지요?
날이 무덥습니다. 어느 책에선가 본 내용인데… 건강을 유지하려면 입이 원하는 것과 반대의 것을 섭취하라고 하더군요. 덥다고 너무 찬 것만 찾지 말고 건강관리 잘 하시기를..
다음 시간에…
정리 — 복수 선택 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 단일 선택 | fmMultiSelectSingle (0) | 한 번에 하나 |
| 복수 선택 | fmMultiSelectMulti (1) | 클릭할 때마다 선택 |
| 확장 선택 | fmMultiSelectExtended (2) | Ctrl, Shift 사용 |
| 선택 확인 | ListBox1.Selected(i) | 항목 선택 여부 |
| 크기 조절 | UserForm1.Height | Help 확장/축소 |
자주 묻는 질문 (FAQ)
Q1. MultiSelect 속성에는 어떤 값이 있나요?
fmMultiSelectSingle(0), fmMultiSelectMulti(1), fmMultiSelectExtended(2)의 세 가지가 있습니다.
Q2. 아무 것도 선택되지 않았는지는 어떻게 알 수 있나요?
ListIndex가 -1이면 선택된 항목이 없는 것입니다.
Q3. RowSource에 범위명도 쓸 수 있나요?
네, "A1:A10" 같은 범위를 직접 지정할 수도 있고 범위명을 지정할 수도 있습니다.
마치며
본질적인 몇 가지만 잘 익혀 두면 나머지는 거기서 파생되어 나옵니다.