Я хотел бы воссоздать оператор IF, показанный как пользовательская функция - PullRequest
0 голосов
/ 09 ноября 2019

У меня есть приведенный ниже оператор IF OR, который выполняет работу, которую я хочу, но я бы предпочел, чтобы я мог создать ее как пользовательскую функцию,

По сути, у меня есть 2 столбца данныхстолбцы будут иметь только красный янтарь или зеленый в качестве значений, и я хочу, чтобы UDF мог просматривать обе ячейки в столбцах и возвращать сценарий наихудшего случая, например, если один столбец - желтый, а другой - зеленый,UDF вернет Amber, так как это хуже, чем зеленый

=IF(OR(AZ8="Red",AY8="Red"),"Red",IF(OR(AZ8="Amber",AY8="Amber"),"Amber","Green"))

Это то, что у меня есть до сих пор

Function CalculateOverallRAG(CellRef1 As Range, CellRef2 As Range,RAGStatus As String) As String

  If CellRef1 = "Red" Or CellRef2 = "Red" Then
    RAGStatus = "Red"
  ElseIf CellRef1 = "Amber" Or CellRef2 = "Amber" Then
    RAGStatus = "Amber"
  Else
    RAGStatus = "Green"
  End If

  CalculateOverallRAG = RAGStatus

End Function

1 Ответ

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

Код OP выглядит хорошо работает. Но что, если на входе будет несколько ячеек, а не одна ячейка? Или что, если вместо ссылки на ячейку был передан текстовый литерал типа «Зеленый»?

Если вы хотите открыть конечный пользователь UDF, вам нужно сделать его безопасным для любого возможного ввода.

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

Option Explicit

Public Function CalculateOverallRAG( _
    ByVal Color1 As Variant, _
    ByVal Color2 As Variant _
) As Variant

    Dim ValidColor1 As Variant
    Dim ValidColor2 As Variant

    If Not TryConvertColorArg(Color1, ValidColor1) Then
        CalculateOverallRAG = CVErr(xlErrValue)
        Exit Function
    End If

    If Not TryConvertColorArg(Color2, ValidColor2) Then
        CalculateOverallRAG = CVErr(xlErrValue)
        Exit Function
    End If

    If ValidColor1 = "Red" Or ValidColor2 = "Red" Then
        CalculateOverallRAG = "Red"
    ElseIf ValidColor1 = "Amber" Or ValidColor2 = "Amber" Then
        CalculateOverallRAG = "Amber"
    Else
        CalculateOverallRAG = "Green"
    End If

End Function

Private Function TryConvertColorArg(ByVal Color As Variant, ByRef Out As Variant) As Boolean

    'Single Cell is acceptable
    If TypeOf Color Is Range Then
        If Color.Count = 1 Then
            Color = Color.Value
        Else
            TryConvertColorArg = False
            Exit Function
        End If
    End If

    'String value is acceptable
    If VarType(Color) = vbString Then
        Out = Color
    Else
        TryConvertColorArg = False
        Exit Function
    End If

    If Out = "Red" Or Out = "Amber" Or Out = "Green" Then
        TryConvertColorArg = True
    Else
        TryConvertColorArg = False
    End If

End Function
...