我正在尝试创建一个将单元格中的日期作为参数的函数,然后使用该日期来查找值。要传递的日期将在变量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
答案 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日)。在这种情况下,最好将日期视为文本,并根据文本而不是日期进行匹配。