배움터  
  HOME > 배움터 > Daily Tip
Daily Tip

제품:   Excel 버전:   공통
검색어:   텍스트상자
제목:   특정한 입력만 받는 텍스트상자
     
 

STEP

  STEP> 살펴보기


프로그래머는 사용자가 어떠한 동작을 할지 미리 예상해두어야 합니다. 가령 숫자만 입력하라는 텍스트 상자에는 분명히 문자(영문,한글,특수문자)를 입력하는 사용자가 있을 것입니다.

텍스트 상자에 숫자만을 입력하도록 만들려면 키가 입력될 때 마다 발생하는 다음과 같은 KeyPress이벤트 프로시져를 적성해야 합니다.
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

그리고 무슨 키가 들어 오는지는 매개변수인 KeyAscii를 이용하여 알 수 있습니다. 원하는 키가 아니면 중간에 매개변수인 KeyAscii값을 0값으로 바꾸어 버리면 됩니다.

다음은 이러한 논리를 함수로 정의해본 것입니다. 매개변수로는 KeyPress이벤트 프로시져의 KeyAscii와 허용할 문자열(AcceptCharacters), 거부할 문자열(DenyCharacters As String)이 있습니다.

허용할 문자열과 거부할 문자열 매개변수 앞에는 Optional을 붙여 사용하지 않을 수도 있습니다. AcceptCharacters 매개변수를 사용한다면 허용하는 문자 외에는 모두 거부할 것이도 DenyCharacters 매개변수를 사용한다면 거부하는 문자가 아니라면 모두 허용할 것입니다. 즉 자신의 편의에 맞게 사용하면 됩니다.

Function FilterKeyPress(ByVal KeyAscii As Integer, _
    Optional AcceptCharacters As String, _
    Optional DenyCharacters As String) As Integer
//---------------------------------------------------------------
// Name Function FilterKeypress(...)
// Description 텍스트박스(TextBox)에서 특정한 입력만 허용
// Arguments
... ByVal KeyAscii As Integer  TextBox 컨트롤의 KeyAscii매개변수
... Optional AcceptCharacters As String 허용할 문자열
... Optional DenyCharacters As String 무시할 문자열
// Returns Ascii 키값
//--------------------------------------------------------------- 

    // DEL키에 대한 Ascii값 정의
    Const DEL As Integer = 8 

    // 돌려줄 값으로 일단 KeyAscii을 저장합니다
  
 // 허용여부는 나중에 판단합니다
    FilterKeyPress = KeyAscii 

    // DEL키인 경우 그냥 허용합니다
    If KeyAscii = DEL Then Exit Function   

    // 허용할 키인 경우
    If Len(AcceptCharacters) Then   

        // 허용할 키를 찾을 수 없다면 0값을 돌려주어
      
  // 키 입력을 무시하도록 합니다
        If InStr(1, AcceptCharacters, Chr$(KeyAscii)) = 0 Then
            FilterKeyPress = 0
            Beep
        End If       

    // 거부할 키인 경우
    ElseIf Len(DenyCharacters) Then   

       // 거부할 키가 있는 경우 0값을 돌려주어
       // 키 입력을 무시하도록 합니다
        If InStr(1, DenyCharacters, Chr$(KeyAscii)) > 0 Then
            FilterKeyPress = 0
            Beep
        End If
    End If

End Function

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    KeyAscii = FilterKeypress(KeyAscii, AcceptCharacters:="1234567890")

End Sub

위와 같이 AcceptCharacters 매개변수로 "1234567890"를 준다면 숫자만 입력 받게 됩니다.

그러나 한 가지 흠이 있습니다. 소수점을 포함한 실수의 경우 소수점(.)은 문자이지만 허용해야 합니다. 그래서 AcceptCharacters:="1234567890." 같이 소수점(.)을 허용목록에 넣었습니다.

그런데 소수점(.) 여러 번 사용하는 것이 아니라 한 번만 사용해야 합니다. 이것을 해결해야 됩니다. 안 그러면 다음과 같이 소수점이 여러 번 들어갑니다.

이것을 해결하는 것은 여러분의 숙제입니다. 숙제 푸시고 다음 주에 뵙도록 하겠습니다.