在Excel中选择Case(Switch)公式

时间:2017-03-23 10:22:41

标签: excel vba switch-statement select-case

在Office16之前(https://support.office.com/en-us/article/SWITCH-function-47ab33c0-28ce-4530-8a45-d532ec4aa25e),没有Switch的公式。我以前使用多个IF公式或VLOOKUP。所以我为这些案例创建了一个UDF,它就在答案中。这是我的第一个UDF,我已多次测试过它。如果您有兴趣,请看一下,并告诉我,是否有任何需要修改的内容。

1 个答案:

答案 0 :(得分:-2)

Function MySwitch(ParamArray a() As Variant)
Dim d As Integer
Dim result As Variant

d = UBound(a)


myexp = a(0)
On Error GoTo ErrHandler
If d Mod 2 <> 0 Then
    For i = 1 To d - 1
        If a(i) Like ">#*" Then
            a(i) = CInt(Replace(a(i), ">", ""))
            Select Case myexp
                Case Is > a(i)
                    result = a(i + 1)
                End Select
        ElseIf a(i) Like "<#*" Then
            a(i) = CInt(Replace(a(i), "<", ""))
            Select Case myexp
                Case Is < a(i)
                    result = a(i + 1)
            End Select
        ElseIf a(i) Like "=#*" Then
            a(i) = CInt(Replace(a(i), "=", ""))
            Select Case myexp
                Case a(i)
                    result = a(i + 1)
            End Select
        ElseIf a(i) Like "<>#*" Then
            a(i) = CInt(Replace(a(i), "<>", ""))
            Select Case myexp
                Case Is <> a(i)
                    result = a(i + 1)
            End Select
         ElseIf a(i) Like "><#*" Then
            a(i) = CInt(Replace(a(i), "><", ""))
            Select Case myexp
                Case Is <> a(i)
                    result = a(i + 1)
            End Select
         ElseIf a(i) Like "=>#*" Then
            a(i) = CInt(Replace(a(i), "=>", ""))
            Select Case myexp
                Case Is >= a(i)
                    result = a(i + 1)
            End Select
         ElseIf a(i) Like ">=#*" Then
            a(i) = CInt(Replace(a(i), ">=", ""))
            Select Case myexp
                Case Is >= a(i)
                    result = a(i + 1)
            End Select
         ElseIf a(i) Like "=<#*" Then
            a(i) = CInt(Replace(a(i), "=<", ""))
            Select Case myexp
                Case Is <= a(i)
                    result = a(i + 1)
            End Select
        ElseIf a(i) Like "<=#*" Then
            a(i) = CInt(Replace(a(i), "<=", ""))
            Select Case myexp
                Case Is <= a(i)
                    result = a(i + 1)
            End Select
        Else
            Select Case myexp
                Case a(i)
                    result = a(i + 1)
            End Select
        End If
    If Not result = vbNullString Then
        MySwitch = result
        Exit Function
    End If
    i = i + 1
    Next i
    result = a(d)
ElseIf d Mod 2 = 0 Then
    For i = 1 To d
        If a(i) Like ">#*" Then
            a(i) = CInt(Replace(a(i), ">", ""))
            Select Case myexp
                Case Is > a(i)
                    result = a(i + 1)
                End Select
        ElseIf a(i) Like "<#*" Then
            a(i) = CInt(Replace(a(i), "<", ""))
            Select Case myexp
                Case Is < a(i)
                    result = a(i + 1)
            End Select
        ElseIf a(i) Like "=#*" Then
            a(i) = CInt(Replace(a(i), "=", ""))
            Select Case myexp
                Case a(i)
                    result = a(i + 1)
            End Select
        ElseIf a(i) Like "<>#*" Then
            a(i) = CInt(Replace(a(i), "<>", ""))
            Select Case myexp
                Case Is <> a(i)
                    result = a(i + 1)
            End Select
         ElseIf a(i) Like "><#*" Then
            a(i) = CInt(Replace(a(i), "><", ""))
            Select Case myexp
                Case Is <> a(i)
                    result = a(i + 1)
            End Select
         ElseIf a(i) Like "=>#*" Then
            a(i) = CInt(Replace(a(i), "=>", ""))
            Select Case myexp
                Case Is >= a(i)
                    result = a(i + 1)
            End Select
         ElseIf a(i) Like ">=#*" Then
            a(i) = CInt(Replace(a(i), ">=", ""))
            Select Case myexp
                Case Is >= a(i)
                    result = a(i + 1)
            End Select
         ElseIf a(i) Like "=<#*" Then
            a(i) = CInt(Replace(a(i), "=<", ""))
            Select Case myexp
                Case Is <= a(i)
                    result = a(i + 1)
            End Select
        ElseIf a(i) Like "<=#*" Then
            a(i) = CInt(Replace(a(i), "<=", ""))
            Select Case myexp
                Case Is <= a(i)
                    result = a(i + 1)
            End Select
        Else
            Select Case myexp
                Case a(i)
                    result = a(i + 1)
            End Select
        End If
    If Not result = vbNullString Then
        MySwitch = result
        Exit Function
    End If
    i = i + 1
    Next i
End If

MySwitch = result
Exit Function
ErrHandler:
If Err.Number <> 0 Then
    Msg = "Error # " & Str(Err.Number) & " was generated by " _
         & Err.Source & Chr(13) & "Error Line: " & Erl & Chr(13) & Err.Description
    MsgBox Msg, , "Error", Err.HelpFile, Err.HelpContext
MySwitch = Err.Description
End If
End Function