본문 바로가기

엑셀VBA

[엑셀VBA] 텍스트 박스에 숫자만 입력되도록 하기

반응형

[엑셀VBA] 텍스트 박스에 숫자만 입력되도록 하기

안녕하세요. 춤추는초코칩입니다.

 

엑셀을 사용하다 보면, 입력을 제한해야 하는 경우가 있습니다.

시트를 사용할 때에는 데이터 유효성 검사라는 기능을 이용해서 입력을 제한 또는 강제할 수 있습니다.

https://stat-and-news-by-daragon9.tistory.com/155

 

엑셀2010 기초과정: 데이터유효성 검사

[데이터 유효성 검사란?]잘 못된 데이터가 입력되는 것을 미연에 방지하거나 이미 잘 못 입력된 데이터를 확인하는 활동을 이야기 합니다. [데이터 유효성 검사의 규칙]첫번째, 미리 정의된 항목

stat-and-news-by-daragon9.tistory.com

그럼, 사용자 정의 폼의 컨트롤 중 하나인 텍스트 박스에서는 어떻게 입력을 제한할까요?

컨트롤의 이벤트를 살펴보면, KeyDown, KeyPress, KeyUp이라는 이벤트가 있습니다. 이 이벤트들을 통해서, 특정 키를 입력할 때 실행되도록 만들 수 있습니다. 각각 누른다, 누른다, 뗀다 정도로 번역할 수 있을 거 같은데요. 이벤트가 발생하는 순서를 보면, KeyDown → KeyPress → KeyUp 순서로 실행됩니다. KeyDown과 KeyPress는 유사한 혹은 똑같은 이벤트로 생각할 수 있지만, 키보드의 허용범위가 다릅니다. KeyPress는 탭, 엔터, 화살표 등에는 이벤트가 발생하지 않으므로, KeyDown 이벤트를 사용하도록 하겠습니다.

 

키보드의 입력을 제한하기 위해서는, 키를 구분해야 하는데요. 이때 사용할 수 있는 변수가 Keycode입니다. 우리는 키보드 입력을 제어하기 위해, Keycode를 사용하도록 하겠습니다. Keycode는 개별 키에 Constant와 Value가 할당되어 있습니다. 자세한 내용은 아래 사이트를 참고하시기 바랍니다.

https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/keycode-constants#see-also

 

Keycode constants

Office VBA reference topic

learn.microsoft.com

위에 내용도 좋지만 아래 사이트가 좀 더 보기는 편했으니 참고하셔도 좋을 거 같습니다.

https://godofexcel.tistory.com/85

 

[엑셀vba] 사용자 정의폼 KeyDown 이벤트 - KeyCode 파라미터

사용자 정의 폼을 사용하다보면 KeyDown 이벤트를 이용할 때가 있다. 특정 키를 눌렀을 때 작업을 수행 할 수 있도록 할 수 있는 이벤트이다. TextBox1을 생성하고 KeyDown 이벤트를 눌러보면 다음과 같

godofexcel.tistory.com

위의 내용을 우리가 필요한 내용만 가져와 보면, 아래와 같습니다. 숫자만 입력하기 때문에 숫자만 가져온다고 생각할 수 있지만, 실제 입력을 위해서는 잘 못 입력된 값을 지우기 위해 백스페이스 키, 삭제 키가 필요하고, 위치 정보를 수정하기 위한 방향키나 홈, 엔드, 쉬프트 키가 필요합니다. 경우에 따라서, 더 추가하거나 빼셔도 됩니다.

Description Constant Value
0 Key ~ 9 Key vbKey0 ~ vbKey9 48 ~ 57
0 Key ~ 9 Key(Numeric Keypad) vbKeyNumpad0 ~ vbKeyNumpad9 96 ~ 105
BACKSPACE Key vbKeyBack 8
DELETE Key vbKeyDelete 46
LEFT ARROW Key vbKeyLeft 37
RIGHT ARROW Key vbKeyRight 39
UP ARROW Key vbKeyUp 38
DOWN ARROW Key vbKeyDown 40
HOME Key vbKeyHome 36
END Key vbKeyEnd 35
SHIFT Key vbKeyShift 16

재료가 준비되었으니, 코딩을 해보도록 하겠습니다. 

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    
    If (KeyCode >= 48 And KeyCode <= 57) Or _
        (KeyCode >= 96 And KeyCode <= 105) Or _
        KeyCode = vbKeyBack Or _
        KeyCode = vbKeyDelete Or _
        KeyCode = vbKeyLeft Or _
        KeyCode = vbKeyRight Or _
        KeyCode = vbKeyUp Or _
        KeyCode = vbKeyDown Or _
        KeyCode = vbKeyHome Or _
        KeyCode = vbKeyEnd Or _
        KeyCode = vbKeyShift Then
    Else
        KeyCode = 0
        MsgBox "잘못 입력하셨습니다."
    End If
    
End Sub

숫자키는 연속된 자료로 Value를 입력하고, 나머지는 가독성을 위해 Constant를 사용했습니다. 백스페이스키를 8로 입력해 놓으면, 나중에 코딩한 내용을 봤을 때 직관적으로 인식하기 어렵기 때문입니다. 코딩된 텍스트 박스를 실행해 보면,

KeyDown 이벤트와 keycode를 통해서, 다양한 방법으로 키보드를 제어할 수 있습니다. 

반응형