在Access中移动记录集中的特定点



我有一个用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")

您将不得不更改明显的信息,如表名、文本框名和字段名,但这只是一般的想法。

最新更新