我有一个用Access VBA编写的函数。此函数的目的是执行简单的线性插值。它为指定日期插入"ZeroRate"值,使用从输入记录集中提取的最接近"MaturityDates"日期的ZeroRates。功能如下:
Function CurveInterpolateRecordset(rsCurve As Recordset, InterpDate As
Date) as Double
Dim Q As Long
Dim x1 As Date, x2 As Date, y1 As Double, y2 As Double, x As Date
CurveInterpolateRecordset = Rnd()
If rsCurve.RecordCount <> 0 Then
Q = 1
rsCurve.MoveFirst
x1 = CDate(rsCurve.Fields("MaturityDate"))
y1 = CDbl(rsCurve.Fields("ZeroRate"))
If InterpDate = CDate(rsCurve.Fields("MaturityDate")) Then CurveInterpolateRecordset = CDbl(rsCurve.Fields("ZeroRate")): Exit Function
rsCurve.MoveNext
Do While (CDate(rsCurve.Fields("MaturityDate")) <= InterpDate)
If rsCurve.EOF Then CurveInterpolateRecordset = CDbl(rsCurve.Fields("ZeroRate")): Exit Function
If InterpDate = CDate(rsCurve.Fields("MaturityDate")) Then CurveInterpolateRecordset = CDbl(rsCurve.Fields("ZeroRate")): Exit Function
If InterpDate > CDate(rsCurve.Fields("MaturityDate")) Then
x1 = CDate(rsCurve.Fields("MaturityDate"))
y1 = CDbl(rsCurve.Fields("ZeroRate"))
End If
rsCurve.MoveNext
If rsCurve.EOF Then CurveInterpolateRecordset = y1: Exit Function
Loop
x2 = CDate(rsCurve.Fields("MaturityDate"))
y2 = CDbl(rsCurve.Fields("ZeroRate"))
CurveInterpolateRecordset = y1 + (y2 - y1) * CDate((InterpDate - x1) / (x2 - x1))
End If
End Function
现在,该函数从rsCurve.MoveFirst定义的记录集的开头开始,并从那里移动到记录集rsCurve.EOF的末尾。它在这些值上进行插值。但是,我不希望它总是从记录集的开头开始。
相反,我希望它从记录集中的某个特定点开始。我在记录集中有一列日期,名为"MarkAsOfDate"。我希望它只在MarkAsofDate等于某个用户输入值的地方进行插值,而不是在整个记录集上进行插值。因此,对于2015年7月31日,我希望它使用MarkAsofDate列等于2015年7日31日的行中的值进行插值。如何更改rsCurve.MoveFirst以完成此操作?我尝试使用Do While命令,但没有成功。
试试这样的东西:
Set rsCurve = db.OpenRecordset("SELECT * FROM MyTable WHERE MyDate >= #" & txtUserInputDate.Value & "# ORDER BY MyDate ASC")
您将不得不更改明显的信息,如表名、文本框名和字段名,但这只是一般的想法。