2010년 2월 19일 금요일

[VB] 특수문자 입력 못받게하기

 

텍스트박스로 입력을 받았을 때

그 텍스트박스에 특수문자가 포함되면 메시지박스로 "특수문자는 입력받을 수 없다" 고 해야합니다.

If Text1.Text >= Asc(" ") And Text1.Text <= Asc("~") Then
    msg = MsgBox("특수문자는 입력받을 수 없습니다.", vbCritical + vbOKOnly, "경고")
End if

전 이렇게 했는데 자꾸 오류가 나내요

형식에 어긋난다고 그러는데 뭐가 문제인지 답변해주세요

If Asc(Text1.Text) >= Asc(" ") And Asc(Text1.Text) <= Asc("~") Then
    msg = MsgBox("특수문자는 입력받을 수 없습니다.", vbCritical + vbOKOnly, "경고")
End If

이렇게 하시면 됩니다만 Space(32)와 "~"(126)사이에 알파벳이 포함되어있어 (65~122)

알파벳또한 "특수문자.."메시지 박스를 띄우게 되며 무엇때문에 오류가 발생되었냐하면

Asc()함수에는 한개의 스트링 값을 넣어 그에 대한 아스키 코드값으로 전환하는 함수인데

Text1.Text >= Asc(" ") 부분에서 Asc()함수가 반환하는 값은 32인 반면 Text1.text(공백이라면)의

값은 공백이으로 서로 값을 비교할 수 있는 대상이 되지 못해 생기는 오류입니다.

그리하여 IF문 다음에 Text1.text에도 Asc()함수를 씌어주어 서로 비교할 수 있는 대상으로 만들어줘야

합니다. 표현력이 부족하여 어찌 이해가 되셨는지 모르겠군요. 도움이 되셨나 모르겠네요

 

공백과 ~ 사이에는 알파벳도 포함됩니다. 따라서 알파벳도 저기서는 특수문자라고 출력이 될 것입니다.

우선 직접적인 원인은, 문자와 숫자의 대소관계를 비교하기 때문에 오류가 발생한 것 입니다.

가능한 케이스는 두가지입니다.

1. If Asc(Text1.Text) >= Asc(" ") And Asc(Text1.Text) <= "~" Then

이 절은 Text1.Text의 첫 글자에 대한 아스키 코드를 공백과 ~ 문자의 아스키코드와 비교합니다.

즉, 숫자는 숫자끼리 비교해야 올바른 답이 나옵니다.

2. If Text1.Text >= " " And Text1.Text <= "~" Then

이 절은 묵시적으로 아스키 코드를 비교합니다. 즉, 결국은 1번과 같은 역할을 합니다.

문자끼리 비교하는 구문은, '맨 첫 글자'의 아스키 코드끼리 비교합니다.

사족이지만, 그래서, 초보자분들이 많이 하시는 실수중에 하나가, If Text1.Text > Text2.Text Then 가

Text1.Text에 12, Text2.Text에다가 9를 넣었는데, 저것이 참이 된다고 하시는 경우가 종종 있는데,

이는 '9'가 '1'보다 아스키 코드가 크기(&H39 > &H31) 때문에 일어나는 현상입니다.

즉, 이 경우엔 If Val(Text1.Text) > Val(Text2.Text) Then 가 올바른 코딩이라고 할 수 있습니다.

추가로, 위는 첫 한 글자만 체크하는 것이였지만, 만약 텍스트 박스의 내용이 '숫자인지 체크'하실 이유이셨다면,

이것 보단 IsNumeric() 함수를 쓰는 것이 더욱 좋습니다. 즉, 아래와 같이 쓰시면 됩니다.

If IsNumeric(Text1.Text) Then
MsgBox "숫자일 때의 처리"
Else
MsgBox "문자 혹은 특수문자일때의 처리"
End If

물론 IsNumeric()보다 빠른 방법은, 질문자님이 사용하신 Asc() 함수를 모든 문자에 체크하는 방법입니다.

Asc()는 한 글자만 비교할 수 있고, Asc(Text1.Text)를 하면 첫 문자에 대한 아스키 코드만 반환하지만,

루프를 돌면서 하나씩 체크하면 가능합니다.

Dim i As Long, CurrentAscii As Integer
For i = 1 To Len(Text1.Text)
CurrentAscii = Asc(Mid$(Text1.Text, i, 1))
If CurrentAscii < &H30 Or CurrentAscii > &H39 Then ' &H30 = 0, &H39 = 9
         MsgBox "숫자가 아닙니다.", vbCritical, "오류"
Exit For
End If
Next

댓글 없음:

댓글 쓰기