Поле ввода VBA для предотвращения десятичных дробей - PullRequest
1 голос
/ 05 ноября 2019

Я пытаюсь разработать инструмент, который поможет стандартизировать описание каталога товаров. Я хочу, чтобы окно ввода подсказало пользователю ввести размер. Я хочу поощрять записи размера, такие как "5-1 / 2", и запрещать пользователям вводить "5.5". В идеале, если размер был введен с десятичной дробью, а не с дробной чертой, я хочу, чтобы всплыло окно с сообщением, что они не могут этого сделать. Затем нужно будет снова показать поле ввода.

Вот что у меня есть -

Private Sub CS_Other_Click()
Unload Me
Sheets("Fill In").Activate
Worksheets("Fill In").Range("C2").NumberFormat = "@"
Dim other_casing_size As Variant
other_casing_size = InputBox("Fill in the casing size. Syntax MUST be in the form of X-X/X", "New Casing Size")
Range("C2") = other_casing_size

Я просто не знаю код, чтобы предотвратить ввод с десятичными знаками. Еще лучше, если бы я знал, как кодировать точный синтаксис, чтобы включить или исключить все, что я хотел, это было бы идеально.

Спасибо

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

Цикл while, который проверяет входную строку на наличие точки или запятой, будет работать вполне нормально, я думаю:

Sub TestMe()

    Dim inputString As String
    Dim inputNumeric As Boolean

    inputString = InputBox("Please, enter a number!")
    inputNumeric = isNumeric(Evaluate(inputString))

    Do While InStr(1, inputString, ".") Or _
            InStr(1, inputString, ",") Or _
            Not inputNumeric

        If Not CBool(inputNumeric) Then
            MsgBox "You tried to cancel or entered empty value!"
            Exit Do
        End If

        MsgBox "Please, do not write dot or comma!"

        inputString = InputBox("Please, enter a number!")
        inputNumeric = isNumeric(Evaluate(inputString))
    Loop

End Sub

isNumeric() проверяет ввод для возможности преобразования в числовое значение. Таким образом, 5-1/2 должно быть в порядке.

Относительно отмены или ввода пустого значения из InputBox() - это действительно зависит от бизнес-логики «приложения», но в случае выше - есть msgbox ион выходит из цикла.

0 голосов
/ 06 ноября 2019

Напишите отдельную функцию, отвечающую за это приглашение, и используйте ее, например, следующим образом:

Dim casingSize As String
If GetCasingSize(casingSize) Then
    ActiveSheet.Range("C2").Value = casingSize
End If

Функция должна вернуть Boolean, чтобы это работало - она ​​возвращает True, если входдопустимо, False, если нет действительного ввода для работы (например, приглашение было отменено). Что делает эту работу, так это передачу результата в виде аргумента ByRef, например:

Public Function GetCasingSize(ByRef outResult As String) As Boolean
    Do            
        Dim raw As Variant
        raw = InputBox("Casing size?")
        If VarType(raw) = vbBoolean Then
            'handle cancelled prompt:
            Exit Do
        End If

        If ValidateFractional(raw) Then
            'handle valid input:
            outResult = CStr(raw)
            GetCasingSize = True
            Exit Do
        End If

        'handle invalid input:
        If MsgBox("The value '" & raw & "' is not valid. Try again?", vbYesNo) = vbNo Then
            Exit Do
        End If
    Loop
End Function

Обратите внимание, что функция ValidateFractional сама по себе важна - отдельная функция Private будет работать, ноЯ бы порекомендовал сделать его Public и модульное тестирование , чтобы убедиться, что он работает, как и предполагалось, с учетом широкого разнообразия вводов в крайнем случае - и наличие его в отдельной функции означает, что логика в GetCasingSize не нужно менять, если требуется точная настройка проверки;например, эта наивная реализация использует оператор Like и будет работать для 5-1/4, но не для, например, 15-5/8:

Public Function ValidateFractional(ByVal value As String) As Boolean
    ValidateFractional = value Like "#[-]#/#"
End Function

Использование Регулярных выражений для этого, вероятно, будетхорошая идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...