Различайте ввод 0 и нажатие кнопки отмены в application.inputbox - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть макрос, который принимает значение от Application.InputBox, а затем пытается убедиться, что в него было введено числовое значение и что отмена не была нажата.

Sub test()
    Dim testvalue As Variant

    testvalue = Application.InputBox(Prompt:="Whatever", Title:="Whatever", Default:=10, Type:=1)

    If testvalue <> False Then
        MsgBox ("Test != False")
    Else
        MsgBox ("Test = False")
    End If

    If VarType(testvalue) = vbInteger Or VarType(testvalue) = vbLong Then
        MsgBox ("Numerical value")
    Else
        MsgBox ("Nonnumerical value")
    End If
End Sub

Однако онКажется, есть проблемы с дифференциацией между положением 0 в InputBox и отменой нажатия.В обоих случаях операторы if возвращают Test = False и Test is a nonnumerical value.Чтобы быть справедливым, вторые операторы if делают то же самое и для других целых чисел, но я подумал, что может быть небольшая вероятность разграничения между целыми числами, хранящимися в варианте, и логическим значением, хранящимся в нем, с использованием метода VarType.

Есть ли способ различить 0 и отменить, являясь возвращаемым значением для поля ввода, или мне придется создавать собственную форму?

Попытка использовать VBA InputBox в соответствии с рекомендациямив комментариях возвращает «Строка», независимо от того, какое значение введено в нее или какая кнопка нажата:

Sub test2()
    Dim testvalue As Variant

    testvalue = InputBox("Test")

    Select Case VarType(testvalue)
        Case vbBoolean:
            Debug.Print "Boolean"
        Case vbInteger:
            Debug.Print "Integer"
        Case vbLong:
            Debug.Print "Long"
        Case vbString:
            Debug.Print "String"
        Case vbVariant:
            Debug.Print "Variant"
    End Select
End Sub

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

Видимо, double также является числовым типом> _> Признайте, что я глупый, проверяю не то, что нужно, и делаю неправильные предположения.Спасибо Рори в комментариях за то, что он заставил меня проверить, какие типы возвращают различные функции.

Чтобы быть более точным, когда числовое значение вводится в Application.InputBox, оно возвращает Double, поэтомуэто то, что я должен проверить при желании обеспечить числовое значение.

0 голосов
/ 26 сентября 2018

Вы можете настроить свой тип на 1 + 4 и проверить Vartype

Sub test()
    Dim testvalue As Variant

    testvalue = Application.InputBox(Prompt:="Whatever", Title:="Whatever", Default:=10, Type:=5)

    If VarType(testvalue) <> vbBoolean Then
        MsgBox ("Test != False")

    Else
        MsgBox ("Test = False")
    End If

End Sub
0 голосов
/ 26 сентября 2018

Вместо VarType вы можете использовать StrPtr, который будет давать только 0, если поле ввода было отменено, хотя я не уверен, как оно реагирует на Application.InputBox().Если вы используете только стандартный InputBox(), однако он работает отлично, поэтому для обнаружения отмененного InputBox вы должны добавить это в свой код:

If StrPtr(testvalue) = 0 Then
    Call MsgBox("Input cancelled.", "Cancelled")
End If

* Что-то, что нужно знать при использовании этого методав том, что он работает с ошибками в InputBox.Microsoft не собирается это исправлять, поскольку это нарушит код многих людей, но на это стоит обратить внимание.

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