programing

VBA 양식 텍스트 상자에 숫자만 허용(+, - 및 . 포함)

subpage 2023. 7. 8. 10:54
반응형

VBA 양식 텍스트 상자에 숫자만 허용(+, - 및 . 포함)

저는 간단한 textBox를 가지고 있으며 "+", "-" 및 "."를 포함한 입력을 검증하고 싶습니다.

Private Sub DisplayValue_TextBox_Change()
If Not IsNumeric(DisplayValue_TextBox.Value) Then
               MsgBox "Only numbers allowed"

      End If
End Sub

그러나 숫자 0-9만 허용되며 음수, 양수 또는 부동 값은 허용되지 않습니다.

제 의견에 더 추가합니다.

텍스트 상자1과 명령 단추1이 있는 샘플 사용자 양식1을 고려합니다.

enter image description here

에 입력한 내용이 있을 때TextBox1변경 이벤트가 실행됩니다. 즉, 한 문자를 입력하면 실행됩니다.Change()이벤트가 발생하고 현재 값을 전달하므로 음수 기호를 입력해도 현재 논리가 실패합니다.

필요한 것은 다음과 같은 다른 이벤트를 사용하는 것입니다._AfterUpdate()또는_Exit()이벤트를 취소할 수 있기 때문에 두 번째 것에 대한 앰피시스와 함께 :)

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If Not IsNumeric(TextBox1.Value) Then
        MsgBox "only numbers allowed"
        Cancel = True
    End If
End Sub

이벤트는 여기에서 확인할 수 있습니다.

enter image description here

KeyPress 이벤트를 사용하고 숫자가 아닌 항목은 삭제합니다.

Private Sub txtShift1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Debug.Print KeyAscii
If KeyAscii >= 48 And KeyAscii <= 57 Then
    Debug.Print "number"
Else
    Debug.Print "other"
    KeyAscii = 0
End If
End Sub

이 일을 하기 위해 지금까지 문자열 구문 분석에 의존해 온 저는 다른 사람들이 어떻게 하는지 확인하고 보기로 결정하고 이 Q를 발견하게 되어 기쁩니다.

루벤 알바레즈의 훌륭한 답변을 다듬었습니다.아래는 숫자 입력만 허용하고 소수점은 하나만 허용합니다.

Private Sub txtShift1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

    Select Case KeyAscii
        Case 46
            If InStr(1, txtShift1, ".") > 0 Then KeyAscii = 0
        Case 48 To 57
        Case Else
            KeyAscii = 0
    End Select

End Sub

이는 필요에 따라 단일 "+", "-" 등만 허용하도록 더욱 개선될 수 있습니다.

저는 이거 써요.소수점 이하의 숫자만 허용됩니다.

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Select Case KeyAscii
        Case vbKey0 To vbKey9, vbKeyBack, vbKeyClear, vbKeyDelete, _
        vbKeyLeft, vbKeyRight, vbKeyUp, vbKeyDown, vbKeyTab
            If KeyAscii = 46 Then If InStr(1, TextBox1.Text, ".") Then KeyAscii = 0
        Case Else
            KeyAscii = 0
            Beep
    End Select
End Sub

사용 중:

Private Sub txtGiaNet_Change()
    If IsNumeric(txtGiaNet.Value) Then
        //if number do sth
    Else
        //if not, delete this character
        txtGiaNet.Value = Left(txtGiaNet.Value, Len(txtGiaNet.Value) - 1)
    End If

End Sub
If TextBox1.Value <> "" Then
    Dim N As Boolean
    N = True
    Do While N
        If Not IsNumeric(TextBox1.Value) Then
            TextBox1.Value = Left(TextBox1.Value, Len(TextBox1.Value) - 1)
        Else
            N = False
        End If
    Loop
End If
Private Sub TbCout_D_Edlp_Change()

Dim NotNumeric As Boolean

Dim TempValue As String

     If Not IsNumeric(TbCout_D_Edlp.Value) Then
 
        If TbCout_D_Edlp.Value <> "" Then
        
              NotNumeric = True
              
              MsgBox "Only numbers allowed"
              
              TempValue = Left(Me.TbCout_D_Edlp.Value, Len(Me.TbCout_D_Edlp.Value) - 1)
              
              While NotNumeric = True And TempValue <> ""
              
                   If Not IsNumeric(TempValue) Then
              
                        TempValue = Left(TempValue, Len(TempValue) - 1)
                        
                   
                   Else
                        
                        NotNumeric = False
                        
                   End If
        
              Wend
              
              Me.TbCout_D_Edlp.Value = TempValue
                
        End If
        
     End If

End Sub

참고로, 저는 허용된 값의 유형에 대한 OPS 제한은 괜찮았지만 메시지 상자가 부적절한 시간(백스페이스 사용 등)에 도착하는 것은 문제가 없었습니다.이를 해결하기 위해 입력한 데이터에 대해 ISNUMBER 함수를 사용하는 계산된 필드를 워크시트("Value_AnyGood")에 만들었습니다.그런 다음 데이터가 입력된 UF를 떠난 모든 이벤트에서 "True"에 대해 테스트했습니다.이로 인해 숫자가 아닌 항목을 검색했지만 합법적인 편집 작업을 위해 메시지를 표시하지 않는 프로세스가 발생했습니다.값이 False이면 사용자에게 알려준 다음 현재 UF가 표시된 상태에서 루틴을 종료합니다.

언급URL : https://stackoverflow.com/questions/26138833/making-vba-form-textbox-accept-numbers-only-including-and

반응형