[VAB] InputBox 완벽 가이드
이 포스트는 Excel Macro Mastery 사이트의 'VBA Inputbox – A Complete Guide(by Paul Kelly)'의 내용을 다시 정리한 것입니다.
들어가며
InputBox는 사용자로부터 단일 텍스트 또는 값을 입력을 받을 수 있는 대화 상자를 제공합니다. 여러분은 사용자로 부터의 입력 타입을 지정할 수 있으며 여기에는 숫자, 문자열, 날짜 및 Range가 포함됩니다.
다음 코드는 사용자에게 이름을 묻고 '직접 실행창(Ctrl + G)'에 사용자의 입력을 출력합니다.
Sub GetValue()
Dim name As String
name = Application.InputBox("이름을 입력하세요")
Debug.Print name
End Sub
중요
혼란스럽게도 VBA에는 두 종류의 InputBox가 있습니다.
- Application.InputBox
- InputBox(VBA.InputBox라고도 함)
위 두 InputBox 함수는 거의 비슷하지만 다음과 같은 차이가 있습니다.
- Application.InputBox를 사용하면 리턴 값의 타입을 지정할 수 있습니다(eg. String, Integer, Date, Range...)
- Application.InputBox의 Left, Top 인자를 사용하지 않습니다.
다음 예에서 Application.InputBox는 타입을 지정할 수 있지만 VBA.InputBox에서는 불가능합니다.
number = Application.InputBox( "숫자 입력" , Type:=1) ' 유형은 숫자입니다.
number = VBA.InputBox("숫자 입력")
본 포스트에서는 주로 Application.InputBox에 대해서 다루도록 합니다.
InputBox 구문
InputBox (Prompt, Title, Default, Left, Top, HelpFile, HelpContextID, Type)
파라메터는 아래와 같습니다.
Name | 필수/선택 | 타입 | 설명 |
Prompt | 필수 | String | InputBox에서 표시되는 텍스트 입니다. 이것은 integer, string, date 또는 boolean 타입이 될 수 있습니다. 최대 길이 255글자 제한이 있으며 넘을 시 프롬프트 다이얼로그가 뜨지 않습니다. Application.InputBox의 경우엔 2015에러를 리턴합니다. |
Title | 선택 | Variant | InputBox의 제목 표시출에 출력되는 텍스트. 이 인자를 누락하는 경우 기본값이 사용됩니다. |
Default | 선택 | Variant | InputBox 다이얼로그가 최초 보여질때 입력값에 기본으로 셋팅 되는 값. 만일 사용자의 입력이 없는 경우 입력값으로 사용된다. 문자열 뿐만아니라 Range 타입도 사용가능하다. |
Left | 선택 | Variant | InputBox 다이얼로그의 x 좌표를 지정합니다. Application.InputBox에서는 무시합니다. |
Top | 선택 | Variant | InputBox 다이얼로그의 y 좌표를 지정합니다. Application.InputBox에서는 무시합니다. |
HelpFile | 선택 | Variant | InputBox에 대한 도움말 파일의 이름입니다. 만일 HelpFile과 HelpContextID 매개변수를 사용하면 다이얼로그에 도움말 버튼이 나타납니다. |
HelpContextID | 선택 | Variant | HelpFile에 있는 도움말 항목 컨텍스트 ID 번호 입니다. |
Type | 선택 | Variant | 반환 데이터 타입을 지정합니다. 이 매개변수를 생략하면 다이얼로그에서 텍스트를 반환합니다. |
위의 매개변수들 중 실제로 자주 사용되는 것은 prompt, title, default, type 정도 입니다.
선택적 매개변수 사용
앞 섹션에서 보았듯이 InputBox는 많은 선택적 매개변수를 가지고 있습니다. 우리는 경우에 따라 매개변수를 선택하여 사용할 수 있습니다. 이는 다음 두가지 방법 중 하나로 수행 가능합니다.
- 다른 선택적 매개변수들은 빈 상태로 둡니다.
- 매개변수의 이름을 사용하여 인자를 넘깁니다.
' 방법 1: 사용하지 않는 매개변수를 빈상태로 두기
Number = Application.InputBox("Enter number", , 99)
Number = Application.InputBox("Enter number", , 99, , , , , 1)
' 방법 2: 매개변수의 이름을 지정하여 넘기기
Number = Application.InputBox("Enter number", Default:=99)
Number = Application.InputBox("Enter number", Default:=99, Type:=Number)
개인적으로는 매개변수의 이름을 지정하는 것이 코드의 가독성을 높여주고, 많은 콤마들로 인한 오류 상황을 줄여주기 때문에 2번 방법을 선호합니다.
InputBox Title 매개변수 예
Title 매개변수를 사용하면 InputBox 대화 상자의 제목을 지정할 수 있습니다.
Dim name As String
name = Application.InputBox(Prompt:="이름을 입력하세요", Title:="고객 리포트")
InputBox Default 매개변수 예
Default 값은 InputBox 다이얼로그가 처음 뜰 때 입력 필드에 입력 되어 있으며, 사용자가 아무런 입력을하지 않고 확인을 클릭하는 경우 입력값으로 반환 됩니다.
Dim name As String
name = Application.InputBox(Prompt:="이름을 입력하세요", Default:="김진수")
InputBox Type 매개변수 옵션
Application.InputBox의 경우 Type 매개변수를 통해 리턴 타입을 지정할 수 있다. 각 리턴 타입에 대한 인덱스는 아래와 같다.
값 | 타입 |
0 | 공식 |
1 | 숫자 |
2 | 문자열 |
4 | Boolean - 참 또는 거짓 |
8 | Range |
16 | #N/A와 같은 오류 값 |
64 | 배열 |
공식에 대해서 추가 설명이 필요할것 같습니다. 타입 값이 0인경우, InputBox는 '=2*PI()/360'과 같은 텍스트 형태의 '공식'을 리턴합니다. 만일 리턴 되는 공식에서 셀이나 Range에 대한 참조가 있다면 A1-과 같은 스타일의 참조로 리턴됩니다.
코드를 좀 더 읽기 쉽게하기 위해 열거형을 통해 Type 매개변수에 대해 고요 상수를 만들 수 있습니다.
Public Enum appInputBox
IBFormula = 0
IBNumber = 1
IBString = 2
IBBoolean = 4
IBRange = 8
IBError = 16
IBArray = 64
End Enum
위 열거된 값은 아래와 같이 사용 가능합니다.
Dim name As String
name = Application.InputBox(Prompt:="이름을 입력하세요", Default:="김진수", Type:=IBString)
Dim year As Integer
year = Application.InputBox(Prompt:="년도를 입력하세요", Type:=IBNumber)
InputBox로 부터 Range 얻기
사용자로 부터 Range를 얻기 위해 Type을 8로 설정 하도록 합니다(만일 여러분이 반환 변수를 Range를 설정했다면 객체를 사용하는 것이므로 반드시 Set 키워드를 사용해야만 합니다. 자세한 사항은 [여기]를 참고하세요).
Dim rg As Range
Set rg = Application.InputBox("년을 입력하세요", Type:=8)
VBA에서는 런타임에 타입을 결정할 수 있도록하기 위해 Variant 타입을 사용할 수 있습니다. 만일 우리가 Variant타입을 선언하고 InputBox로 부터 리턴 되는 Range 값을 저장할 때 Set 키워드를 사용하지 않는다면 Range 객체가 아닌 배열 형태로 저장 되게 됩니다. Set을 사용한다면 위의 예제와 동일하게 Range 객체를 저장합니다.
Dim rg As Variant
' 배열 형태로 저장
rg = Application.InputBox("Enter the Year", Type:=8)
' Range객체 형태로 저장
Set rg = Application.InputBox("Enter the Year", Type:=8)
InputBox Range 취소하기
Range 입력의 한가지 문제는 사용자가 값을 취소를 클릭하면 VBA에서 '424' 런타임 오류가 발생하였습니다. 개체가 필요합니다 오류를 발생시킨 다는 것입니다.
이 문제를 해결하기위해서는 오류가 발생하더라도 무시하도록하고 InputBox의 반환 값을 확인해야 합니다. VBA의 에러 처리에 대한 자세한 사항은 [여기]를 참고하시면 됩니다.
아래 코드는 InputBox 다이얼로그에서 취소를 클릭하더라도 오류를 발생 시키지 않도록 합니다.
Sub UseInputBox()
Dim rg As Range
' 에러 캐치 끄기
On Error Resume Next
Set rg = Application.InputBox("Please enter Range", Type:=8)
' 다시 에러 캐치 켜기
On Error Goto 0
' Display the result
If rg Is Nothing Then
MsgBox "The range was cancelled"
Else
MsgBox "The selected range is " & rg.Address
End If
End Sub