使用MATCH函数和VBA无法匹配范围内的日期

时间:2019-07-03 11:42:44

标签: excel vba

我想编写一个用户定义的函数,该函数在给定系列ID和日期的范围内返回该值。

范围看起来像这样

enter image description here

我希望函数调用=getParam("B",1/07/2005,Parameters)返回22

为此,我使用了两个=MATCH函数来查找正确的行和列,然后将使用=INDEX函数来返回正确的值。我的功能(未完成)如下。

问题:

当我在普通的Excel单元格中指定=MATCH(1/07/2005,A1:A11,0)时,我会得到正确的行索引6,但是当我按如下所示将其合并到VBA函数中时,我会得到#VALUE!错误。

有什么想法吗?

Function getParam(Series As String, StartDate As Date, Parameters As Range)

    Dim IndexRow, IndexColumn As Integer

    IndexRow = Application.WorksheetFunction.Match(StartDate, Parameters.Columns(1), 0)
    IndexColumn = Application.WorksheetFunction.Match(Series, Parameters.Rows(1), 0)

    getParam = IndexRow

End Function

1 个答案:

答案 0 :(得分:2)

  1. 您需要将日期转换为双精度以匹配CDbl(StartDate)
  2. WorksheetFunction.Match method因此返回Double

    Dim IndexRow As Double, IndexColumn As Double
    

    您需要为两个变量指定类型,否则第一个将自动为Variant

  3. 如果要调试UDF(用户定义的函数),请使用测试过程。

您最终得到…

Option Explicit

Public Sub Test_getParam()
    Debug.Print getParam("B", DateSerial(2019, 7, 5), Range("A1:E13"))
End Sub

Public Function getParam(Series As String, StartDate As Date, Parameters As Range) As Variant
    Dim IndexRow As Double, IndexColumn As Double

    IndexRow = Application.WorksheetFunction.Match(CDbl(StartDate), Parameters.Columns(1), 0)
    IndexColumn = Application.WorksheetFunction.Match(Series, Parameters.Rows(1), 0)

    getParam = Parameters.Cells(IndexRow, IndexColumn)
End Function

在您的公式中,您需要提交真实日期DATE(2019,7,5)

=getParam("B",DATE(2019,7,5),A1:E13) 'returns 10 with the data below

因为如果您提交=getParam("B",1/07/2005,Parameters),则“日期”为1/07/2005,实际上意味着17划分为2005,结果为{{ 1}},所以这是您实际尝试匹配的值。您必须使用0.0000712504453153…才能获得真实日期。

enter image description here


作为最后的改进,我建议包括错误处理,以在日期或系列不匹配时返回错误。

如果其中之一不匹配,则会返回错误DATE(2005,7,1)

#NA