在用户定义的函数中使用 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
。请注意,您也可以在这里使用Match
或CountIf
。
@BigBen - 如果我理解正确,您的建议会因为晚/早绑定而有效吗?你能提供参考或解释吗?我想了解为什么一个有效而另一个无效 - 谢谢
@JohnnieL- 查看来自 Mathieu Guindon 的 this recent article。或this answer.
Match
或 VLookup
应该与数字一起使用。什么是无效的样本编号?
在这种情况下是 168926103,但我认为问题在于,在一张纸上它被格式化为数字,而在另一张纸上却不是。
【参考方案1】:
要求:
设置一个用户定义的函数来验证给定的cell.value
(输入)是否存在(作为数字或字符串)在由cell.value
标识的预定义range
中(范围)。返回一个字符串。
语法:Match_ƒLookup(rInput As Range, rScope As Range) As String
如果rInput
或rScope
是一个多单元格范围,该函数将使用范围第一个单元格的值转换为字符串。
为了确保所有数字都作为字符串进行比较,该函数使用此公式将范围转换为字符串数组:
=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的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spark SQL 中定义和使用用户定义的聚合函数?