VBA函数-如何将函数参数类型设置为条件?

kel*_*ong 2 excel vba

我创建了一个函数searchRow来获取目标值的行。

对于参数来说value,如何设置这个参数作为判断标准呢?所以我可以使用 excel 中的函数searchRow(<3, A1:A100),而不是仅像这样的值searchRow(10, A1:A100)

Function searchRow(value As String, targetRange As range) As Double
    
    Dim currentRange As range
    
    For Each currentRange In targetRange.Cells
        If currentRange.value = value Then
            searchRow = currentRange.Row
            Exit For
        End If
    Next currentRange
    
End Function

Run Code Online (Sandbox Code Playgroud)

Mat*_*don 6

您可以利用Worksheet.Evaluate此处,并在每次迭代时完成表达式,以便在该工作表的上下文中对其进行评估:

Public Function SearchRow(ByVal Value As Variant, ByVal TargetRange As Range) As Variant

    If IsError(Value) Then
        SearchRow = Value
        Exit Function
    End If

    Dim Context As Worksheet
    Set Context = TargetRange.Parent

    Dim CurrentRange As Range

    Dim ValueExpression As String
    Dim ExpressionResult As Variant

    Dim Operators As Variant
    Operators = Array("<", "<=", "=", "!=", "=>", ">")

    Dim LocalValue As String
    Dim ValueString As String
    Dim HasOperator As Boolean
    
    For Each CurrentRange In TargetRange.Cells

        LocalValue = Value
        ValueString = CurrentRange.Value
        ValueExpression = vbNullString
        ExpressionResult = Empty
        HasOperator = False

        Dim CurrentOperator As Long
        For CurrentOperator = LBound(Operators) To UBound(Operators)
            If Len(ValueString) > Len(CurrentOperator) Then
                If Left$(ValueString, Len(CurrentOperator)) = CurrentOperator Then
                    HasOperator = True
                    Exit For
                End If
            End If
        Next

        'if there's no operator, assume equals and still evaluate:
        If Not HasOperator And IsNumeric(Value) Then LocalValue = "=" & Value
        
        If ValueString <> vbNullString Then
            ValueExpression = ValueString & LocalValue
        
            On Error Resume Next
            ExpressionResult = CBool(Context.Evaluate(ValueExpression))
            On Error GoTo 0
        
            If Err.Number <> 0 Then
                SearchRow = CVErr(xlErrValue)
                Exit Function
            End If
            
            If Not IsEmpty(ExpressionResult) Then
                'now we know the result is safe to meaningfully treat as a Boolean:
                If ExpressionResult Then
                    SearchRow = CurrentRange.Row
                    Exit Function
                End If

            End If

        End If
    Next CurrentRange
    SearchRow = CVErr(xlErrNA)
End Function
Run Code Online (Sandbox Code Playgroud)

请注意如何Variant利用返回类型为工作表生成一些有意义的错误代码。

由于第一个参数是 a,String当我们打算给它一个字符串文字时,我们需要用双引号将第一个参数括起来,因此用法看起来像=SearchRow("<3",A1:A100), 但也可以处理42or SomeNamedRange,并且会像SUM给定 a那样失败输入中的错误值。