我想编写一个用户定义的函数,该函数在给定系列ID和日期的范围内返回该值。
范围看起来像这样
我希望函数调用=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
答案 0 :(得分:2)
CDbl(StartDate)
WorksheetFunction.Match method因此返回Double
Dim IndexRow As Double, IndexColumn As Double
您需要为两个变量指定类型,否则第一个将自动为Variant
。
您最终得到…
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
,实际上意味着1
由7
划分为2005
,结果为{{ 1}},所以这是您实际尝试匹配的值。您必须使用0.0000712504453153…
才能获得真实日期。
作为最后的改进,我建议包括错误处理,以在日期或系列不匹配时返回错误。
如果其中之一不匹配,则会返回错误DATE(2005,7,1)
。
#NA