본문 바로가기

진리는어디에/VBA

[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가 있습니다.

  1. Application.InputBox
  2. InputBox(VBA.InputBox라고도 함)

위 두 InputBox 함수는 거의 비슷하지만 다음과 같은 차이가 있습니다.

  1. Application.InputBox를 사용하면 리턴 값의 타입을 지정할 수 있습니다(eg. String, Integer, Date, Range...)
  2. 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. 다른 선택적 매개변수들은 빈 상태로 둡니다.
  2. 매개변수의 이름을 사용하여 인자를 넘깁니다.
' 방법 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

부록 1. 같이 읽으면 좋은 글

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!