如何在Excel VBA函数中将日期作为参数传递

3
我正在尝试编写一个函数,该函数将以单元格中的日期作为参数,然后使用该日期查找值。要传递的日期将在变量EffDate中。然后,函数应该转到工作表RateChgs,检查NewPymtEffDateRange是否包含EffDate,并在找到它后,转到EscrowPymtAmtRange(一列宽度),并返回同一行中的值。
我只测试了在立即窗口中键入GetEscrowPymt(8/1/2000)(或其他日期)。从Position变量的值可以看出,尽管日期存在,但函数无法找到它。这是我传递日期的方式有问题吗?
Function GetEscrowPymt(EffDate As Date)
Dim PymtEffDateRange As Range 
Dim EscrowPymtAmtRange As Range 
Dim Position As Integer 

Set PymtEffDateRange = Worksheets("RateChgs").Range("NewPymtEffDate")
Set EscrowPymtAmtRange = Worksheets("RateChgs").Range("EscrowPymt")

Position = Application.WorksheetFunction.Match(EffDate, PymtEffDateRange, 1)
MsgBox (Position)

End Function
1个回答

3
< p > 在 Match 函数中的最后一个参数允许返回近似匹配。如果您需要精确匹配,则应使用最后一个参数 0 来要求精确匹配。否则,使用参数 1-1 将返回近似匹配,并假定数据已按升序排序。 < /p >
Position = Application.WorksheetFunction.Match(EffDate, PymtEffDateRange, 0)
< p >如果在查找数组中未找到< code > effDate 值,则< code > Match 函数将出错,因此您可能需要错误处理逻辑来处理这种情况。我可能会使用< code > Application.Match 函数,该函数可以接受错误类型,而工作表类中的< code > Match 函数仅接受长/整数值,并且如果未找到该值,将引发错误:

Dim Position as Variant
Position = Application.Match(EffDate, PymtEffDateRange, 0)
If IsError(Position) Then
    MsgBox EffDate & " not found!", vbInformation

    Exit Function
    '   -- OR --
    '  assign some other return value for the function, etc.
End If

一些函数在处理日期值时也会出现困难,如果这不能解决问题,请告诉我。
此外,VBA 与各种系统区域设置不兼容。如果您期望“2000年8月1日”代表的是除了美国日期格式之外的其他日期格式(例如,在英国该日期将是2000年1月8日),那么您可能会遇到更多问题。在这种情况下,最好将日期视为文本,并基于文本进行匹配,而不是基于日期。

谢谢。你的回答确实有帮助。但我认为它让我相信我需要尝试另一种方法来解决这个问题。所以我会发表另一个问题。 - OutThere

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接