Ошибка выполнения 13 Несовпадение типов при передаче значения текстового поля пользовательской формы в функцию - PullRequest
0 голосов
/ 18 октября 2019

У меня есть пользовательская форма с текстовыми полями, и некоторые из них должны содержать целые числа. Я нашел где-то в Интернете (я думаю, на этом сайте) эту функцию IsInteger, которую я сохранил в модуле только для функций:

Function IsInteger()
If IsNumeric(testsubject) Then
    If testsubject - Int(testsubject) <> 0 Then
        integerYes = True
    Else: integerYes = False
    End If
End If
End Function

Следующий блок кода относится к одному из текстовых полей пользовательской формы:

  Private Sub IB_LoanTermYears_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    'Data validation
        If Me.IB_LoanTermYears.Value = "" Then
        ElseIf IsNumeric(Me.IB_LoanTermYears.Value) = False Then
            blahAnswer = MsgBox("Please enter a valid number.", , "Invalid Entry")
            Me.IB_LoanTermYears.SetFocus
        ElseIf IsInteger(Me.IB_LoanTermYears.Value) = False Then
            blahAnswer = MsgBox("Please enter a whole number.", , "Invalid Entry")
            Me.IB_LoanTermYears.SetFocus
        ElseIf Me.IB_LoanTermYears.Value < 0 Then
            blahanswer MsgBox("Please enter a positive number.", , "Invalid Entry")
            Me.IB_LoanTermYears.SetFocus
        End If
    End Sub

Когда я выхожу из текстового поля, я получаю ошибку времени выполнения 13 с выделенным ElseIf IsInteger(Me.IB_LoanTermYears.Value) = False Then. Что дает? Я видел очень похожий пост, в котором был сделан вывод о том, что другие пустые текстовые поля портят, но я не понимаю, как это может повлиять на это текстовое поле, поскольку они никак не связаны, за исключением того, что они в той же форме пользователя.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 18 октября 2019

Убедитесь, что Fuction принимает входные данные, а выход является логическим.

Поскольку логическим значением по умолчанию является FALSE, нам нужно изменить только на True

Function IsInteger(testsubject As Variant) As Boolean
If IsNumeric(testsubject) Then
    IsInteger = (testsubject - CInt(testsubject) = 0)
End If
End Function
0 голосов
/ 18 октября 2019

Ошибка появляется, потому что функция не принимает аргументы. Это лучший способ использовать функцию Integer, которая фактически проверяет, можно ли преобразовать проанализированный вариант в Long без потерь. Например: Clng(43.4) вернул бы 43, таким образом, появляется потеря:

Function ParseToLong(testSubject As Variant) As Boolean

    If IsNumeric(testSubject) Then
        If testSubject - CLng(testSubject) = 0 Then
            ParseToInteger = True
            Exit Function
        End If
    End If

    ParseToInteger = False

End Function

Просто имейте в виду, что ParseToLong("32") вернет True, насколько может быть строка "32"преобразован в числовой 32.

...