Использование IsNumeric в функции - PullRequest
1 голос
/ 21 июня 2019

Я написал функцию, которая генерирует «счет» (1,0, -1) на основе входной ячейки, которая должна содержать число.Однако иногда поле ввода может не быть числовым, и тогда функция должна возвращать вывод «0».

Function ScoreRoE(RoE_Field As Range, goodval As Range, badval As Range)

    Dim RoE As Double, result As Double

    RoE = RoE_Field.Value

        If IsNumeric(RoE_Field.Value) = False Then
            result = "0"
        Else:
            If RoE >= goodval.Value Then
                result = "1"
            ElseIf RoE <= badval.Value Then
                result = "-1"
            Else:
                result = "0"
            End If
        End If

    ScoreRoE = result

End Function

Когда ячейка ввода числовая, функция работает правильно.Однако, когда это не так, он просто возвращает ошибку «#VALUE!»

Заранее большое спасибо!

Ответы [ 2 ]

4 голосов
/ 21 июня 2019

Объявить RoE как вариант:

Function ScoreRoE(RoE_Field As Range, goodval As Range, badval As Range)

    Dim RoE As Variant, result As Double

    RoE = RoE_Field.Value

        If Not IsNumeric(RoE) Then
            result = 0
        Else
            If RoE >= goodval.Value Then
                result = 1
            ElseIf RoE <= badval.Value Then
                result = -1
            Else
                result = 0
            End If
        End If

    ScoreRoE = result

End Function

Вы не можете присвоить текстовое значение двойному.


Лично я не вижу необходимости ни в одной из переменных:

Function ScoreRoE(RoE_Field As Range, goodval As Range, badval As Range)

    If Not IsNumeric(RoE_Field.Value) Then
        ScoreRoE = 0
    Else
        If RoE_Field.Value >= goodval.Value Then
            ScoreRoE = 1
        ElseIf RoE_Field.Value <= badval.Value Then
            ScoreRoE = -1
        Else
            ScoreRoE = 0
        End If
    End If

End Function
2 голосов
/ 21 июня 2019

Это интерпретация намерений кода:

Function ScoreRoe(roeInput As String, goodVal As String, badVal As String) As String

    If Not IsNumeric(roeInput) Or Not IsNumeric(goodVal) Or Not IsNumeric(badVal) Then
        ScoreRoe = "0"
    Else
        Dim goodValNumeric As Double: goodValNumeric = goodVal
        Dim badValNumeric As Double: badValNumeric = badVal
        Dim roeInputNumeric As Double: roeInputNumeric = roeInput

        If roeInputNumeric >= goodValNumeric Then
            ScoreRoe = "1"
        ElseIf roeInputNumeric <= badValNumeric Then
            ScoreRoe = "-1"
        Else
            ScoreRoe = "0"
        End If
    End If

End Function

Основная идея заключается в том, что входные данные берутся за String, а затем преобразуются в Double для сравнения. Затем, если ввод не числовой, возвращаемое значение равно 0, и если это так, мы проходим через If-Else.

В общем, было бы неплохо избегать : в VBA If-Else, чтобы избежать нежелательных проблем, подобных этой - VBA - Как двоеточие `:` работает в коде VBA с условием

...