[엑셀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가 할당되어 있습니다. 자세한 내용은 아래 사이트를 참고하시기 바랍니다.
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를 통해서, 다양한 방법으로 키보드를 제어할 수 있습니다.
'엑셀VBA' 카테고리의 다른 글
[엑셀VBA] 파일명 일괄 변경하기 Name As (0) | 2023.01.02 |
---|---|
[엑셀VBA] 리스트박스 안에 체크박스 만들기 (0) | 2022.12.27 |
[엑셀VBA] 스핀 단추(SpinButton) 초기값, 최소값, 최대값, 간격 설정 (0) | 2022.12.19 |
[엑셀VBA] 컨트롤 탭(tap) 순서 정렬하기 TapIndex (0) | 2022.12.07 |
[엑셀VBA] 명령 단추(버튼) 취소 기능 만들기 CommandButton (0) | 2022.12.05 |