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

时间:2015-04-29 03:03:36

标签: excel vba excel-vba

我正在尝试创建一个将单元格中的日期作为参数的函数,然后使用该日期来查找值。要传递的日期将在变量EffDate中。然后该函数应该转到工作表RateChgs,检查EffDate的NewPymtEffDateRange,并在找到它之后,转到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 个答案:

答案 0 :(得分:3)

Match函数中的最后一个参数允许返回近似匹配。如果您需要完全匹配,那么您应该使用0的最后一个参数来要求完全匹配。否则,使用参数1-1将返回近似匹配,并假设数据按升序排序。

Position = Application.WorksheetFunction.Match(EffDate, PymtEffDateRange, 0)

如果在查找数组中找不到Match值,effDate函数将会出错,因此您可能需要错误处理逻辑来解释这种可能性。我可能会使用可以接受错误类型的Application.Match函数,其中Worksheet类中的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也不能很好地适应各种系统区域设置,如果你期望“8/1/2000”不是2000年8月1日之外的其他任何东西,那么你可能会遇到更多问题,因为VBA会解释这个问题。日期格式,而不是系统区域设置(例如,在英国,该日期将是2000年1月8日)。在这种情况下,最好将日期视为文本,并根据文本而不是日期进行匹配。