在用户定义的函数中使用 VLOOKUP

Posted

技术标签:

【中文标题】在用户定义的函数中使用 VLOOKUP【英文标题】:Using a VLOOKUP in a user defined function 【发布时间】:2021-02-19 15:23:12 【问题描述】:

我正在尝试设置一个用户定义的函数,该函数从单元格中获取值,然后验证该值是否也在不同工作表上的值范围内。它可能在两个不同的工作表上,查看哪个工作表取决于另一个单元格的值,即“范围”。

到目前为止,我已经设置了以下内容:

Function reviewFun(input As Range, scope As Range)

    If scope.Value = "AAA" Then
        If IsError(Application.WorksheetFunction.VLookup(input.Value, Sheet3.Range("B:B"), 1, 0)) Then
            reviewFun = "PLEASE CHECK"
        Else
            reviewFun = "FINE"
        End If
    Else
        If IsError(Application.WorksheetFunction.VLookup(input.Value, Sheet4.Range("B:B"), 1, 0)) Then
            reviewFun = "PLEASE CHECK"
        Else
            reviewFun = "ALSO FINE"
        End If
    End If

End Function

但是,如果输入值在其他工作表上,它只会返回 #VALUE!而不是“请检查”。我该如何解决?我可以不使用 VLOOKUP 吗?

非常感谢!

编辑:

删除.WorksheetFunction 解决了问题,谢谢!

但是,我也有一个问题,如果input 或查找范围中的值之一是数字,它也会返回错误。

VBA 中有没有办法将某些内容作为字符串传递?我尝试了以下方法,但它不起作用。

IsError(Application.Match(input.Text, Sheet3.Range("B:B").Text, 0))

【问题讨论】:

使用Application.VLookup,放弃WorksheetFunction。请注意,您也可以在这里使用MatchCountIf @BigBen - 如果我理解正确,您的建议会因为晚/早绑定而有效吗?你能提供参考或解释吗?我想了解为什么一个有效而另一个无效 - 谢谢 @JohnnieL- 查看来自 Mathieu Guindon 的 this recent article。或this answer. MatchVLookup 应该与数字一起使用。什么是无效的样本编号? 在这种情况下是 168926103,但我认为问题在于,在一张纸上它被格式化为数字,而在另一张纸上却不是。 【参考方案1】:

要求:

设置一个用户定义的函数来验证给定的cell.value(输入)是否存在(作为数字或字符串)在由cell.value标识的预定义range中(范围)。返回一个字符串。

语法:Match_ƒLookup(rInput As Range, rScope As Range) As String

如果rInputrScope 是一个多单元格范围,该函数将使用范围第一个单元格的值转换为字符串。

为了确保所有数字都作为字符串进行比较,该函数使用此公式将范围转换为字符串数组:

=TRIM('#WSH'!#RNG)

地点:

#WSH = Worksheet.Name #RNG = Range.Address

UDF:

Function Match_ƒLookup(rInput As Range, rScope As Range) As String
Const kFml As String = "=TRIM('#WSH'!#RNG)"         'Formula to return Lookup Range as an Array of Strings
Dim sReturn As String                               'Function result
Dim sInput As String                                'Input converted to string
Dim aLookup As Variant                              'Lookup Array
Dim sFml As String                                  'Customized Formula
    
    sInput = rInput.Cells(1).Value                  'Input range as string
    sFml = Replace(kFml, "#RNG", "B:B")             'Update Lookup Range Formula with Common Range (change as required)
    
    Select Case rScope.Cells(1).Value

    Case "AAA"
        sReturn = "FINE"                            'Scope's Default Return
        sFml = Replace(sFml, "#WSH", Sheet3.Name)   'Update Lookup Range Formula with Worksheet Name

    Case Else
        sReturn = "ALSO FINE"                       'Scope's Default Return
        sFml = Replace(sFml, "#WSH", Sheet4.Name)   'Update Lookup Range Formula with Worksheet Name

    End Select

    aLookup = Application.Evaluate(sFml)                                                'Scope's Lookup Range to Array as Text
    If IsError(Application.Match(sInput, aLookup, 0)) Then sReturn = "PLEASE CHECK"     'Validate presence of Input in Lookup Array

    Match_ƒLookup = sReturn

End Function

【讨论】:

以上是关于在用户定义的函数中使用 VLOOKUP的主要内容,如果未能解决你的问题,请参考以下文章

如何在查询中使用变量和更改用户定义的函数

我可以在用户定义的函数中使用子查询吗

在带有 oracle 光标的过程中使用用户定义的函数

如何在 Spark SQL 中定义和使用用户定义的聚合函数?

在用户定义的 R 函数中使用现有函数 [即 max()] 创建变量

我可以在 oracle 中使用用户定义的函数删除行吗?