Sub 与 Sheet 中 UDF 中的 VLookup
VLookup in UDF in Sub vs Sheet
我有一个简单的 UDF,应该在找不到值的情况下更改 VLookUp 函数的值。
Function get_value(what,where) 'what -> e.g. 01/31/2020,02/28/2020
'where -> Sheet2!A:B
jump:
If IsError(Application.VLookup(what,where,2,False)) Then
what = what - 1
GoTo jump
Else
get_value = Application.VLookup(what,where,2,False)
EndIf
End Function
在子程序中调用函数时一切正常!
但是,在工作表中调用函数(即 =get_value(A2,Sheet2!A;B)
,只要 A2 的日期没有值并且 what
应该在循环中更改(查找新日期的值,即 02/28/2020
到 02/27/2020
)
函数 returns #VALUE!
而不是 02/27/2020
的实际值
我尝试使用 Do While
循环代替 GoTo
但这并不能解决问题。
我来自 Python,VBA 中的这种迂回让我感到困惑...
使用 Do
循环(并指定最大迭代次数以防找不到 what
):
Function get_value( _
ByVal what As Date, _
ByVal where As Range _
) As Variant
Const maxIterations As Long = 100 ' change as needed
Do
get_value = Application.VLookup(CLng(what), where, 2, False)
what = what - 1
Dim counter As Long
counter = counter + 1
Loop While IsError(get_value) And counter < maxIterations
End Function
在 what
上使用 CLng
似乎是这里的诀窍。在测试中,您的版本是一个无限循环; what
从未被发现。 VLookup
日期可能很挑剔。但是,通常要避免使用 GoTo
,因为它是通向意大利面条代码的滑坡。
我有一个简单的 UDF,应该在找不到值的情况下更改 VLookUp 函数的值。
Function get_value(what,where) 'what -> e.g. 01/31/2020,02/28/2020
'where -> Sheet2!A:B
jump:
If IsError(Application.VLookup(what,where,2,False)) Then
what = what - 1
GoTo jump
Else
get_value = Application.VLookup(what,where,2,False)
EndIf
End Function
在子程序中调用函数时一切正常!
但是,在工作表中调用函数(即 =get_value(A2,Sheet2!A;B)
,只要 A2 的日期没有值并且 what
应该在循环中更改(查找新日期的值,即 02/28/2020
到 02/27/2020
)
函数 returns #VALUE!
而不是 02/27/2020
我尝试使用 Do While
循环代替 GoTo
但这并不能解决问题。
我来自 Python,VBA 中的这种迂回让我感到困惑...
使用 Do
循环(并指定最大迭代次数以防找不到 what
):
Function get_value( _
ByVal what As Date, _
ByVal where As Range _
) As Variant
Const maxIterations As Long = 100 ' change as needed
Do
get_value = Application.VLookup(CLng(what), where, 2, False)
what = what - 1
Dim counter As Long
counter = counter + 1
Loop While IsError(get_value) And counter < maxIterations
End Function
在 what
上使用 CLng
似乎是这里的诀窍。在测试中,您的版本是一个无限循环; what
从未被发现。 VLookup
日期可能很挑剔。但是,通常要避免使用 GoTo
,因为它是通向意大利面条代码的滑坡。