- 최초 작성일: 2000-06-30
- 최종 수정일: 2026-09-30
- 조회수: 10 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 유저폼크기 조절 및 시트 출력하기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
대부분의 응용 프로그램에서는 다이얼로그 박스의 크기를 조절할 수 있도록 함으로써 사용자들로 하여금 조금이라도 더 편리하게 사용할 수 있도록 배려를 합니다.
먼 말인고 하니…
"서식-자동 서식" 메뉴를 클릭해 보세요. 그러면 Excel에 내장되어 있는 17가지의 각종 서식들이 다이얼로그 박스 내에 나타날 것입니다. 그런데 오른쪽 부분에 있는 "옵션" 버튼을 다시 클릭하면 다이얼로그 박스가 아래로 펼쳐지면서 "적용할 서식" 이라는 새로운 서브 메뉴가 나타납니다.
이렇게 함으로써 화면의 단순화는 물론, 사용자들이 조금이라도 덜 헷갈리도록 할 수 있는 것이지요. 이번 시간에 만들어 볼 유저폼이 바로 이와 같은 것입니다.
유저폼크기 조절 및 시트 출력하기
핵심 요약: 크기가 바뀌는 유저폼
옵션 버튼으로 UserForm의 Height를 바꾸어 화면을 단순하게 하고, 선택한 시트의 인쇄 방향을 지정해 미리 봅니다.
- 1단계: 시트 이름으로 ListBox를 채우고 MultiSelect를 2로 지정합니다.
- 2단계: 옵션선택 버튼에서 유저폼 Height를 163과 237로 오가게 합니다.
- 3단계: 선택한 시트에 Orientation을 지정하고 PrintPreview합니다.
Step 1: 유저폼 만들기
(1) VB Editor 상태에서(Alt+<F11>) UserForm을 하나 삽입하고, 아래와 같이 필요한 컨트롤들을 삽입합니다.
이 유저폼에는 5종류, 9개의 컨트롤들이 사용되었습니다. 캡션에는 신경쓰지 말고 컨트롤을 삽입하고 위치/크기를 적당히 조절한 다음, 각 컨트롤의 프로퍼티(속성)를 아래와 같이 변경합니다.
① Label 컨트롤
| 컨트롤명 | 변경할 속성 | 변경 내용 |
|---|---|---|
| Label1 | Caption | 출력할 시트를 선택하세요… |
| Label2 | Caption | * Shift키나 Ctrl키를 사용하여 여러 시트를 선택할 수 있습니다. |
② ListBox 컨트롤
| 컨트롤명 | 변경할 속성 | 변경 내용 |
|---|---|---|
| ListBox1 | 없음 | 없음 |
③ OptionButton 컨트롤
| 컨트롤명 | 변경할 속성 | 변경 내용 |
|---|---|---|
| OptionButton1 | Accelerator | L |
| Caption | 가로 방향(L) | |
| Name | optLandscape | |
| OptionButton2 | Accelerator | P |
| Caption | 세로 방향(P) | |
| Name | optPortrait |
④ Frame 컨트롤
| 컨트롤명 | 변경할 속성 | 변경 내용 |
|---|---|---|
| Frame1 | Caption | 출력 방향 선택 |
⑤ CommandButton
| 컨트롤명 | 변경할 속성 | 변경 내용 |
|---|---|---|
| CommandButton1 | Accelerator | O |
| Caption | OK | |
| Name | btnOK | |
| CommandButton2 | Accelerator | C |
| Caption | Cancel | |
| Name | btnCancel | |
| CommandButton3 | Caption | 옵션선택>> |
| Name | btnOption |
이렇게 해서 유저폼(다이얼로그 박스)의 겉모양은 다 만들었습니다. 이제 인공지능을 (너무 거창한가요? ^^) 심어주는 작업, 즉 코딩을 하면 되겠지요?
Step 2: 코드 작성하기
(1) 초기화 이벤트
(2) 유저폼 내에서 컨트롤이 없는 빈 공간을 더블클릭 합니다. 그러면 빈 코드창 화면이 나타나는데 코드창 우측 상단의 "이벤트 선택 메뉴"의 드롭다운 버튼을 눌러 Initialize, 즉 초기화 이벤트를 선택한 후, 아래의 코드를 입력합니다.
Private Sub UserForm_Initialize()
Dim sht As Worksheet
For Each sht In ThisWorkbook.Worksheets
'//ThisWorkbook이라는 것은 지금 보시는 이 워크북을 지정하는 것입니다.
'//우리가 사람의 이름을 부를 때, "홍길동"이라고 부를 때도 있고, "거기 너!"라고 부를 때도
'//있지요? 직접 이름을 부르지 않고 "거기 너!"와 비슷한 표현이 ThisWorkbook 인 것이지요.
With ListBox1
.AddItem sht.Name
.ListStyle = 1
.MultiSelect = 2
'//AddItem 속성을 통해 리스트 박스의 내용을 sht.Name 즉 시트이름으로 채웁니다.
'//ListStyle 속성은 시트이름 옆에 사각형 모양 또는 원모양을 나타내도록 하는 속성입니다.
'//MultiSelect는 리스트 박스 내의 항목들을 여러 개 선택할 수 있도록 해주는 속성입니다.
'//즉, MultiSelect=0이면 복수 개를 지정할 수 없도록 하는 것이고, 1이면 마우스로 클릭하는
'//모든 아이템이 지정, 2이면 Ctrl 또는 Shift키를 함께 누를 때에만 복수 개로 지정이 됩니다.
End With
Next sht
UserForm1.Height = 163
'//유저폼의 초기 높이를 163으로 지정하고
optPortrait.Value = True
'//수직 방향 인쇄를 디폴트값으로 지정을 합니다.
End Sub
(2) 옵션선택 버튼
(3) 코드 입력이 끝났으면 Shift + <F7>키를 눌러 유저폼으로 돌아갑니다.
(4) 이번에는 "옵션선택>>" 버튼을 누르고 아래의 코드를 입력합니다.
Private Sub btnOption_Click()
If btnOption.Caption = "옵션선택>>" Then
UserForm1.Height = 237
btnOption.Caption = "<<옵션선택"
'//유저폼의 크기가 최대화되어 있지 않은 경우의 처리 방법으로 btnOption 버튼의 캡션이
'//"옵션선택>>"이면 유저폼의 높이를 237로 하고 캡션도 "<<옵션선택"으로 바꾸어 줍니다.
Else
UserForm1.Height = 163
btnOption.Caption = "옵션선택>>"
'//그렇지 않은 경우라는 것은 유저폼의 크기가 최대로 되어 있는 경우를 나타내는 것이므로
'//이 때에는 유저폼 높이를 163으로, btnOption 버튼의 캡션을 "옵션선택>>"으로 고쳐 줍니다.
End If
End Sub
(3) OK 버튼
다시 Shift + <F7>을 누릅니다.
(5) 유저폼에서, OK 버튼을 더블클릭하고 해당 코드를 입력합니다.
Private Sub btnOK_Click()
Dim i As Integer
Me.Hide
For i = 0 To ListBox1.ListCount - 1
'//ListBox Item의 ListIndex 값은 0부터 시작되므로 ListCount에서 1을 빼 주었지요?
'//ListBox(그리고 나중에 설명드릴 콤보박스 등)에서 ListCount, ListIndex 등의 속성 지정시
'//헷갈리지 않도록 잘 기억하시기 바랍니다.
If ListBox1.Selected(i) Then
With Sheets(ListBox1.List(i))
If optLandscape Then
.PageSetup.Orientation = xlLandscape
Else
.PageSetup.Orientation = xlPortrait
End If
'//시트가 선택이 되면(ListBox1의 List 속성에 의해) 옵션 버튼 중에서 어느 것이 눌려져
'//있는지를 파악하여 Orientation(인쇄 방향)을 xlLandscape 또는 xlPortrait로 지정을 해
'//줍니다.
.PrintPreview
End With
End If
Next i
Unload Me
End Sub
(4) Cancel 버튼
(7) 취소 버튼을 더블클릭하고 아래의 코드를 삽입합니다.
Private Sub btnCancel_Click()
Unload Me
End Sub
(5) 유저폼 호출
(8) 끝으로, 이 유저폼을 호출할 프로시저를 일반 VBA 모듈에 하나 만들어 줍니다.
Sub ShowMetheForm()
UserForm1.Show
End Sub
이제 워크시트 상에서 위 프로시저를 지정해 주면 실행이 됩니다. 오늘 설명드린 내용은 조금만 가다듬으면 업무에 편리하게 사용하실 수 있을 것입니다.
마무리
오늘은 여기까지…
정리 — 크기 조절과 시트 출력 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 시트 목록 | For Each sht In ThisWorkbook.Worksheets | 시트 이름 나열 |
| 복수 선택 | .MultiSelect = 2 | Ctrl, Shift로 선택 |
| 크기 조절 | UserForm1.Height = 237 | 옵션 영역 펼치기 |
| 인쇄 방향 | .PageSetup.Orientation = xlLandscape | 가로 방향 |
| 미리 보기 | .PrintPreview | 인쇄 미리 보기 |
자주 묻는 질문 (FAQ)
Q1. ListCount에서 1을 빼는 이유는 무엇인가요?
ListBox 항목의 인덱스는 0부터 시작하기 때문입니다.
Q2. MultiSelect 값의 의미는 무엇인가요?
0은 복수 선택 불가, 1은 클릭하는 모든 항목이 선택, 2는 Ctrl 또는 Shift 키를 함께 누를 때만 복수 선택됩니다.
Q3. ThisWorkbook은 무엇을 가리키나요?
현재 코드가 들어 있는 이 워크북을 가리킵니다.
마치며
조금만 가다듬으면 업무에 편리하게 사용할 수 있는 예제입니다.