- 최초 작성일: 2000-06-27
- 최종 수정일: 2026-09-30
- 조회수: 10 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 화면크기 조절하기 & 시트 스크롤링
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
화면의 크기를 조절하고자 할 때, 아마 대부분의 사용자들은 "보기-확대/축소" 메뉴를 선택한 다음, "배율-사용자 정의" 란으로 가서 원하는 배율을 입력할 것입니다. 여러 단계를 거쳐야 하니까 좀 불편하지요? 이것을 좀더 편리한 형태로 만들 수 없을까요?
Necessity is the mother of convention! 이라고, 불편한 점을 느껴야 이것을 개선할 생각을 하게 되는 것이지요.
[Today's Sample]에서 살펴보신 바와 같이, 이번 강좌에서는 유저폼의 컨트롤을 통해 화면의 배율을 조정하는 방법과 시트를 상하좌우로 스크롤링 하는 방법, 이 두 가지에 대해 알아보도록 하겠습니다. 함수를 배울 때에도 그랬지만 어떤 일이든지 기초만 잘 익혀두면 그 다음은 응용의 문제입니다.
화면크기 조절하기 & 시트 스크롤링
핵심 요약: 스크롤바로 화면 제어하기
스크롤바의 Value를 ActiveWindow의 Zoom, ScrollColumn, ScrollRow에 대입하면 배율과 스크롤을 제어할 수 있습니다.
- 1단계: Initialize에서 스크롤바의 Min, Max, Value를 지정합니다.
- 2단계: Change 이벤트에서 Value를 ActiveWindow 속성에 대입합니다.
- 3단계: 변하지 않는 문자열은 Const로 모듈 맨 앞에 선언합니다.
Step 1: 유저폼 만들기
(1) VB Editor 상태에서(Alt + <F11>), 빈 유저폼(UserForm)을 하나 삽입합니다.
(2) 아래의 그림을 참고하여 컨트롤들을 삽입한 다음, 속성을 변경해 줍니다.
① Frame 컨트롤
| 컨트롤명 | 변경할 속성 | 변경 내용 |
|---|---|---|
| Frame1 | Caption | Sheet Zooming |
| Frame2 | Caption | Sheet Scrolling |
| Frame3 | Caption | 캡션을 없앰 |
② Label 컨트롤
| 컨트롤명 | 변경할 속성 | 변경 내용 |
|---|---|---|
| Label1 | Name | lblZoom |
③ ScrollBar 컨트롤
| 컨트롤명 | 변경할 속성 | 변경 내용 |
|---|---|---|
| ScrollBar1 | Name | scrZoom |
| ScrollBar2 | Name | scrColumns |
| ScrollBar3 | Name | scrRows |
④ CommandButton 컨트롤
| 컨트롤명 | 변경할 속성 | 변경 내용 |
|---|---|---|
| CommandButton1 | Accelerator | C |
| Caption | Close | |
| Name | btnClose |
Step 2: 코드 작성하기
(3) 이제 각 컨트롤에 지능을 부여하는 작업입니다.
(1) 모듈 맨 위의 상수 선언
먼저, 코드 창의 맨 위 부분에 아래의 한 줄을 첨가합니다.
Option Explicit
Const strZoom = "현재 화면 배율은 "
'//이처럼 모듈시트의 맨 앞부분에 즉, 프로시저가 시작되기 전에 변수(또는 상수)를 지정해 주면
'//그 모듈시트 내의 어느 프로시저에서든 Dim으로 별도 선언하지 않고서도 사용을 할 수가 있는
'//것입니다. 그런데 새로운 것이 하나 나왔지요? 지금까지는 변수를 선언할 때는 Dim으로 선언을
'//해 주었는데 이번에는 Const로 선언을 했군요. 변수란 Variable 즉, 변할 수 있는 값을 말합니다.
'//그런데 변화하지 않는 값에 대해서는 이렇게 Const(Constants, 상수)로 선언을 합니다. 변수가
'//아닌 상수를 선언해 주는 것입니다.
(2) 초기화 이벤트
다음으로, 유저폼 내에서 컨트롤이 없는 빈 영역을 더블클릭해서 코드 창을 불러 냅니다. 현재 상태에서는 Private Sub UserForm_Click()이라는 이벤트가 발생하게 될 것입니다. 이벤트 선택 버튼에서 Initialize를 선택하면 Private Sub UserForm_Initialize 이벤트가 나타나는데 이 이벤트는 아래의 코드를 입력합니다.
Private Sub UserForm_Initialize()
lblZoom.Caption = strZoom & ActiveWindow.Zoom & "% 입니다"
'//ActiveWindow, 즉 활성화 된 윈도우의 배율을 lblZoom이라는 Label 컨트롤의 캡션값에 집어
'//넣습니다.
With scrZoom
.Min = 50
.Max = 300
.SmallChange = 1
.LargeChange = 10
.Value = ActiveWindow.Zoom
'//scrZoom이라는 스크롤바 컨트롤의 최소값을 50, 최대값을 300으로 지정합니다.
'//그런 다음, SmallChange라는 것은 스크롤바의 좌/우 버튼을 한번 클릭할 때마다 변화하는
'//값을 지정하는 속성인데 이 값을 1로 지정해 줍니다.
'//LargeChange 속성은 스크롤바의 버튼 이외의 부분을 클릭할 때 변화하는 값을 지정하는
'속성으로 이 값은 10으로 지정을 해 줍니다.
End With
With scrColumns
'//시트 스크롤링과 관련된 컨트롤 중에서 가로 방향 스크롤과 관련된 컨트롤의 속성을 변경하는
'//부분입니다.
.Min = 1
.Max = Application.WorksheetFunction.Min(ActiveSheet.Columns.Count, 32767)
'//최대값은 현재 시트의 컬럼수와 같겠지요?
.SmallChange = 1
.LargeChange = 10
.Value = ActiveWindow.ScrollColumn
'//ScrollColumn 속성은 맨 좌측열의 열번호를 리턴해 줍니다. 따라서 현재 윈도우의 맨 좌측
'//열 값을 Value 속성에 담아둡니다.
End With
With scrRows
.Min = 1
.Max = Application.WorksheetFunction.Min(ActiveSheet.Rows.Count, 32767)
.SmallChange = 1
.LargeChange = 10
.Value = ActiveWindow.ScrollRow
'//ScrollRow 속성은 최상단 행값을 리턴합니다. 그러므로 현재 윈도우의 최상단 행값을
'//Value 속성에 저장을 해 둡니다.
End With
End Sub
(3) 화면 배율 스크롤바
(4) Shift + <F7> 키를 눌러 유저폼을 다시 불러 낸 다음, scrZoom 컨트롤을 더블클릭 하면 scrZoom_Click 이벤트가 나타나는데 아래의 코드를 입력합니다.
Private Sub scrZoom_Change()
With ActiveWindow
.Zoom = scrZoom.Value
lblZoom.Caption = strZoom & .Zoom & "% 입니다"
'//scrZoom이라는 스크롤바의 Value 속성값을 현재 윈도우의 Zoom 값으로 대치하였군요.
'//그런 다음, 현재 윈도우의 줌값에 "% 입니다"라는 문자열을 더하여 lblZoom이라는 레이블
'//컨트롤의 캡션값을 이것으로 대치합니다.
End With
End Sub
(4) 가로 스크롤바
(5) Shift + <F7> 키를 다시 눌러 유저폼을 호출한 다음, scrColumns 컨트롤을 더블클릭 하면 아래와 같은 Change 이벤트가 나타날 것입니다. 이 이벤트에 다음의 한 라인을 추가합니다.
Private Sub scrColumns_Change()
ActiveWindow.ScrollColumn = scrColumns.Value
'//scrColumns라는 스크롤바 컨트롤의 Value 값만큼 화면을 좌/우로 스크롤링 하게 되겠지요?
End Sub
(5) 세로 스크롤바
(6) Shift + <F7>을 누르고 이번에는 scrRows 컨트롤을 더블클릭한 다음 아래의 코드를 추가합니다.
Private Sub scrRows_Change()
ActiveWindow.ScrollRow = scrRows.Value
'//(5)와 거의 비슷한데 단지 방향만 틀릴 뿐이지요.
End Sub
(6) Close 버튼
(7) 다시 Shift + <F7>키를 누르고 이번에는 Close 버튼을 더블클릭 한 다음 코드를 삽입합니다.
Private Sub btnClose_Click()
Unload Me
End Sub
(7) 유저폼 호출
(8) 마지막으로, 이 유저폼을 호출할 프로시저를 일반 VBA 모듈에 만듭니다.
Sub ShowForm()
UserForm1.Show
End Sub
이제 워크시트 상에서 위 프로시저를 지정해 주면 실행이 될 것입니다. 이상 끄~읕!
마무리
다음 시간에…
정리 — 화면 제어 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 상수 선언 | Const strZoom = "현재 화면 배율은 " | 모듈 전체에서 사용 |
| 배율 | ActiveWindow.Zoom = scrZoom.Value | 화면 배율 |
| 가로 스크롤 | ActiveWindow.ScrollColumn | 맨 왼쪽 열 번호 |
| 세로 스크롤 | ActiveWindow.ScrollRow | 맨 위 행 번호 |
| 변화량 | .SmallChange / .LargeChange | 스크롤바 이동량 |
자주 묻는 질문 (FAQ)
Q1. Const와 Dim은 어떻게 다른가요?
Dim은 변할 수 있는 변수를 선언하고, Const는 변하지 않는 값(상수)을 선언합니다.
Q2. SmallChange와 LargeChange의 차이는 무엇인가요?
SmallChange는 스크롤바의 화살표 버튼을 한 번 누를 때, LargeChange는 버튼 이외의 부분을 클릭할 때 변하는 값입니다.
Q3. ScrollColumn과 ScrollRow는 무엇을 돌려주나요?
각각 현재 윈도우의 맨 왼쪽 열 번호와 맨 위쪽 행 번호를 돌려줍니다.
마치며
기초만 잘 익혀 두면 그 다음은 응용의 문제입니다.