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,因为它是通向意大利面条代码的滑坡。