이전 글에서 목록 상자(ListBox) 컨트롤에 대해 알아보았습니다. 이번에는 숫자를 입력할 때 키보드로 직접 타이핑하여 입력하지 않고 스핀 단추(SpinButton)의 화살표를 클릭하여 값을 변경하거나, 스크롤 막대(ScrollBar)의 값을 마우스로 변경시켜 값을 입력하는 방법에 대해 알아보겠습니다.
1. 스크롤 막대(ScrollBar)
스크롤 막대(ScrollBar) 컨트롤은 윈도 창에서 화면을 위아래 혹은 좌우로 이동시킬 때 사용하는 스크롤바를 생각하시면 됩니다. VBA에서 이 스크롤 막대를 이용하면 값을 보다 편리하게 입력할 수 있습니다.
[그림 1]을 보시면 사용자 정의 폼의 도구 상자가 보이는데 빨간색 사각형으로 표시한 아이콘이 스크롤 막대 컨트롤입니다.
이 아이콘을 클릭하고 사용자 정의 폼 내에서 원하는 위치로 마우스를 이동하여 드래그로 크기를 설정한 후 생성할 수 있습니다.
2. 스핀 단추(SpinButton)
스핀 단추(SpinButton) 컨트롤 역시 값을 입력할 때 편리하게 사용할 수 있는 컨트롤로 화살표를 마우스로 클릭하여 값을 변경할 수 있습니다.
[그림 2]에 사용자 정의 폼의 도구 상자를 보실 수 있습니다. 빨간색 사각형으로 표시한 아이콘이 스핀 단추 컨트롤입니다.
3. 예제로 확인
엑셀을 여시고 VBE 창을 여시고 사용자 정의 폼(UserForm)을 생성합니다. [그림 3]과 같이 사용자 정의 폼을 구성합니다.
사용자 정의 폼에 글씨는 레이블(Label)을 생성하고 글을 입력하였습니다. 그리고 그 옆에 텍스트 상자(TextBox)를 생성하여 값을 입력할 수 있도록 하였습니다.
출생연도 텍스트 상자 아래에 스크롤 막대 1개를 생성하였으며, 출생월과 출생일의 텍스트 상자 옆에는 스핀 단추를 생성하였습니다.
사용자 정의 폼이 처음 열릴 때 초기 값을 표시하도록 하기 위해 Initialize 이벤트 코드를 다음과 같이 작성합니다.
Private Sub UserForm_Initialize()
TextBox2 = Year(Now)
TextBox3 = Month(Now)
TextBox4 = Day(Now)
With ScrollBar1
.Value = Year(Now)
.Max = 2100
.Min = 1900
.LargeChange = 10
End With
With ScrollBar2
.Value = Month(Now)
.Max = 12
.Min = 1
End With
With ScrollBar3
.Value = Day(Now)
.Max = 31
.Min = 1
End With
End Sub
TextBox2 = Year(Now)
: 출생연도 입력 텍스트 상자에 현재 연도를 표시합니다.
TextBox3 = Month(Now)
: 출생월 입력 텍스트 상자에 현재 월을 표시합니다.
TextBox4 = Day(Now)
: 출생일 입력 텍스트 상자에 현재 일을 표시합니다.
ScrollBar1.Max = 2100
: 스크롤 막대의 최댓값을 2100으로 세팅 (출생연도를 2100년까지 입력 가능)
ScrollBar1.Min = 1900
: 스크롤 막대의 최솟값을 1900으로 세팅 (출생연도에 입력할 수 있는 시작 연도를 1900년으로 설정)
ScrollBar1.LargeChange = 10
: 출생연도 입력 스크롤 막대 위를 마우스로 클릭할 때 변경되는 값의 크기로 10씩 변하도록 설정
텍스트 상자에 값을 입력하면 스크롤 막대도 값에 맞춰지도록 설정하기 위해 다음과 같이 코드를 작성합니다.
Private Sub TextBox2_AfterUpdate()
ScrollBar1 = TextBox2
End Sub
출생연도 입력 텍스트 상자의 이벤트에서 AfterUpDate 이벤트를 사용하여 텍스트 상자의 값 입력이 완료될 때 스크롤 막대 값에 텍스트 상자의 입력된 값을 적용하도록 하였습니다.
Change 이벤트를 사용하면 값을 입력하는 순간부터 스크롤 막대에 값이 적용되어 입력 최솟값으로 1900을 설정해 놓았기 때문에 에러가 발생하게 됩니다.
이번에는 스크롤 막대와 스핀 단추로 값을 변경할 경우 변경된 값이 텍스트 상자에도 표시되도록 하기 위하여 Change 이벤트를 사용하여 다음과 같이 코드를 작성합니다.
Private Sub ScrollBar1_Change()
TextBox2 = ScrollBar1
End Sub
Private Sub ScrollBar2_Change()
TextBox3 = ScrollBar2
End Sub
Private Sub ScrollBar3_Change()
TextBox4 = ScrollBar3
End Sub
이제 사용자 정의 폼에 생성한 확인 버튼을 더블 클릭하여 코드 창을 열고 다음과 같이 코드를 작성합니다.
Private Sub CommandButton1_Click()
Dim i As Integer
i = Range("B" & Application.Rows.Count).End(xlUp).Row + 1
Range("B" & i).Value = TextBox1
Range("C" & i).Value = TextBox2 & "-" & TextBox3 & "-" & TextBox4
End Sub
i = Range("B" & Application.Rows.Count).End(xlUp).Row + 1
: B열에 데이터가 입력되어 있는 행의 값을 찾아서 그 값에 1을 더하고 결괏값을 변수 i에 입력합니다.
1을 더한 이유는 데이터가 입력되어 있는 행 다음에 새로 입력된 데이터를 추가하기 위해서입니다.
사용자 정의 폼에 있는 취소 버튼을 더블 클릭하여 코드 창을 열고 다음과 같이 코드를 작성합니다.
Private Sub CommandButton2_Click()
Unload Me
End Sub
Unload Me
: Unload를 사용하여 사용자 정의 폼을 닫습니다. Me는 취소 버튼이 생성되어 있는 창을 가리키는 것으로 UserForm1과 동일합니다.
엑셀 시트에 ActiveX 버튼 하나를 생성하고 속성에서 Caption에 '입력'이라고 입력합니다. 버튼을 클릭하면 만들어 놓은 사용자 정의 폼을 화면에 나타나게 하기 위해 생성한 버튼을 더블 클릭하여 코드 창을 열고 다음과 같이 코드를 작성합니다.
Private Sub CommandButton1_Click()
UserForm1.Show
End Sub
'엑셀 > VBA' 카테고리의 다른 글
VBA 날자 계산 내장 함수 - DateAdd, DatePart, DateDiff (1) | 2022.01.19 |
---|---|
엑셀 VBA 값 찾기 메서드 Find 알아보기 (0) | 2022.01.18 |
엑셀 VBA ListBox 컨트롤 사용하기 (0) | 2022.01.13 |
엑셀 VBA 목록 만들기 - ComboBox (1) | 2022.01.11 |
엑셀 VBA 옵션 선택 컨트롤 - CheckBox, OptionButton (0) | 2022.01.10 |