Как разрешить двойной тип данных только в текстовом поле? - PullRequest
2 голосов
/ 28 июня 2019

У меня есть пользовательская форма, где пользователи должны вводить измеренные размеры детали (поле «Управление качеством») в флажки. Это означает, что текст не допускается, ни несколько случайных цифр, только цифры.

Что у меня сейчас есть, это:

Private Sub TextBox25_AfterUpdate()    
    If Not IsNumeric(TextBox25.Value) Then
        MsgBox "Invalid data!"
        TextBox25.BackColor = RGB(255, 200, 200)
        Cancel = True
    End If
End Sub

Хотя это не идеально, пользователь все равно может вводить некоторые случайные цифры, например 09 вместо 0,9, и не получать сообщения об ошибке. Я считаю, что ключом является использование только данных двойного типа, но я попробовал приведенный ниже код, и он не работает (я получаю сообщение об ошибке каждый раз, независимо от типа данных). Есть идеи?

Private Sub TextBox19_AfterUpdate()
    If Not VarType(TextBox19.Value) = vbDouble Then
        MsgBox "Invalid data!"
        TextBox19.BackColor = RGB(255, 200, 200)
        Cancel = True
    End If
End Sub

Ответы [ 2 ]

2 голосов
/ 28 июня 2019

.Value TextBox - это всегда String, имя «TextBox» уже включает в себя то, что это «Text».Таким образом, он не может иметь тип Double, если вы не возьмете это String и не преобразуете его (неявное или явное) в Double.

VarType(TextBox19.Value) всегда будет возвращать vbString, поскольку оно возвращает типпеременной, а не тип данных внутри переменной.

Таким образом, вам действительно нужно проверить, является ли она десятичной (не целой).

Единственный способ проверить это правильно -проверьте, содержит ли String ровно один , (соответствующий . в зависимости от вашей локализации).И затем проверьте, является ли он числовым (в противном случае он также принял бы a,b).

Option Explicit

Public Sub TestForDecimalInput()
    Dim DecimalValue As Double
    Dim TextBoxValue As String

    TextBoxValue = "9" 'just for testing get your text box value here: TextBoxValue = TextBox19.Value

    'this replaces . and , with the actual decimal seperator of your operating system
    'so the user is allowed to either enter `0,9` or `0.9`
    TextBoxValue = Replace$(TextBoxValue, ".", Application.DecimalSeparator)
    TextBoxValue = Replace$(TextBoxValue, ",", Application.DecimalSeparator)

    'Check if there is exactly one! decimal seperator
    If Len(TextBoxValue) = Len(Replace$(TextBoxValue, Application.DecimalSeparator, "")) + 1 Then

        'we need to check for numeric too because yet it could be `a,b` too
        If IsNumeric(TextBoxValue) Then
            DecimalValue = CDbl(TextBoxValue)
        End If
    End If

    If DecimalValue <> 0 Then
        Debug.Print TextBoxValue, "->", DecimalValue
    Else
        Debug.Print TextBoxValue, "->", "Invalid Data"
    End If
End Sub

Это будет результат некоторых примеров ввода

0.9           ->             0,9 
09            ->            Invalid Data
0,9           ->             0,9 
0,9,0         ->            Invalid Data
0,0           ->            Invalid Data
9,0           ->             9 
9             ->            Invalid Data

Обратите внимание, что 9,0будет принят в качестве ввода, но 9 будет недействительным в качестве ввода.

1 голос
/ 28 июня 2019

Попробуй это.Это ограничит количество операций во время выполнения:)

'~~> Prevent anything other than numbers and decimals
Private Sub TextBox19_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, TextBox19.Text, ".") Then KeyAscii = 0
        Case Else
            KeyAscii = 0
            Beep
    End Select
End Sub

'~~> Allow only decimals
Private Sub TextBox19_AfterUpdate()
    If Int(Val(TextBox19.Value)) = TextBox19.Value And _
    InStr(1, TextBox19.Value, ".") = 0 Then
        MsgBox "Invalid data!"
        TextBox19.BackColor = RGB(255, 200, 200)
    End If
End Sub

Примечание : Если вы не хотите разрешать 9.0, удалите InStr(1, TextBox19.Value, ".") = 0 в _AfterUpdate()

И Если вы хотите отключить входы, такие как 0x.xx, то вы также можете использовать это

Private Sub TextBox19_AfterUpdate()
    If Int(Val(TextBox19.Value)) = TextBox19.Value And _
       InStr(1, TextBox19.Value, ".") = 0 Or _
       (Left(TextBox19.Value, 1) = 0 And Mid(TextBox19.Value, 2, 1) <> ".") Then
        MsgBox "Invalid data!"
        TextBox19.BackColor = RGB(255, 200, 200)
    End If
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...