VBA: Как проверить, что 2 переменные имеют тип Integer? - PullRequest
0 голосов
/ 15 декабря 2018

Я хотел бы позволить пользователю вводить два целых числа (два текстовых поля). Хотя это условие не выполняется, я хочу, чтобы пользователь снова заполнил текстовые поля.

Вот то, что я пробовал, но этоне правильный ответ:

Sub verif_type(n1, n2)


    If TypeName(n1) = "Integer" And TypeName(n2) = "Integer" Then
        MsgBox ("C'est bon !")

    Else
        MsgBox ("C'est pas bon, recommencez !")
        Unload UserForm1
        Call verif_type(n1, n2)
    End If

End Sub

Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 15 декабря 2018

Ваш код вызывает себя рекурсивно, если введенные переменные имеют неправильный тип.Это создаст бесконечный цикл.

Логически любая функция проверки должна возвращать простое «Да» или «Нет».Либо это проверено, либо нет.Это означает возврат простого Boolean - что, в свою очередь, означает, что это должно быть Function вместо Sub.

И всегда use Option Explicit.

Function verif_type(n1 as Variant, n2 as Variant) as Boolean
    If TypeName(n1) = "Integer" And TypeName(n2) = "Integer" Then
        verif_type = True
        'MsgBox ("C'est bon !")
    Else
        verif_type = False
        'MsgBox ("C'est pas bon, recommencez !")
        'Unload UserForm1
        'Call verif_type(n1, n2)
    End If
End Function

Но это само по себе может быть еще более упрощено как

Function verif_type(n1 as Variant, n2 as Variant) as Boolean
    verif_type = TypeName(n1) = "Integer" And TypeName(n2) = "Integer"
End Function

Теперь вся ваша логика ответа находится в вашем основном коде (я полагаю, в вашем UserForm).

If verif_type(a,b) then
    ' Do something
Else
    ' Do something else
End If
0 голосов
/ 15 декабря 2018

вы можете проверить длину строки до и после преобразования в Long:

Function IsInteger(n1 As Variant)
    If IsNumeric(n1) Then IsInteger = Len(n1) = Len(CStr(CLng(n1)))
End Function

, поэтому ваш код события нажатия кнопки UserForm1 может быть:

Private Sub CommandButton1_Click() ' change "CommandButton1" to your actual command button name
    If IsInteger(Me.TextBox1) And IsInteger(Me.TextBox2) Then
        MsgBox ("C'est bon !")
        Me.Hide
    Else
        MsgBox ("C'est pas bon, recommencez !")
    End If
End Sub

в то время как ваш "основной" код вызова может быть:

Sub main()

    ...

    With New UserForm1
        ...
        (possible code to pre-set UserForm1 controls to show to user)
        ...

        .Show

        ...
        (code to exploit UserForm1 controls values after user interaction)
        ...

    End With

    ...

End Sub
0 голосов
/ 15 декабря 2018

Во-первых, проверьте, что содержимое текстового поля можно интерпретировать как число, используя IsNumeric Во-вторых, убедитесь, что значение этого содержимого равно округленному значению этого содержимого

if IsNumeric(n1) then
       if val(n1) = floor(val(n1)) then
              ' number is good, take appropriate action
       else
              ' Inform user and take appropriate action
       end if
else 
       'Inform user and take appropriate action
end if

Из опыта ярекомендовал бы разместить проверку достоверности в событии изменения в текстовом поле и передать его пользователю, используя текстовое поле или метку, содержащую сообщение о состоянии.

0 голосов
/ 15 декабря 2018

Чтение из текстового поля, скорее всего, будет возвращать строку каждый раз.Таким образом, для проверки целочисленного значения убедитесь, что число числовое и в нем нет , или ..Чтобы убедиться, что это целое число VBA, вы также можете увидеть, находится ли оно в пределах от -32768 до 32767.

Option Explicit

Sub TestMe()

    verifType InputBox("Please enter value")

End Sub

Sub verifType(n1)

    If IsNumeric(n1) _
            And InStr(1, n1, ",") = 0 _
            And InStr(1, n1, ".") = 0 Then

        Debug.Print "Numeric!"
    Else
        Debug.Print "Not Numeric!"
        TestMe
    End If

End Sub

Код выше вызывается через TestMe() и получает только одну переменную (проще написать чем 2).Если это не Integer, то он вызывается снова.Следуйте некоторой похожей логике, чтобы построить ваше дело.

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