将子例程应用于Access VBA中的日期范围

时间:2015-12-21 16:27:59

标签: excel vba ms-access access-vba

我在Access VBA中编写了以下子程序:

1234567

正如现在所写,此子程序适用于指定的MarkAsOfDate值,即#7/31/2015#。现在,这个日期是硬编码的。

但是,我想更改此功能,以便它将对过去76个日期执行相同的过程,而不仅仅是一个硬编码日期。因此,我不想仅仅应用于MarkAsOfDate =#7/31/2015#,而是希望自动运行2015年7月30日,2015年7月29日,2015年7月28日等等,直到指定的日期之前的76个日期。现在,我能做到这一点的唯一方法是手动更改MarkAsofDate行并为每个日期分别运行76次。

如何更改此功能以使其适用于之前指定的MarkAsOfDate和76个日期?

2 个答案:

答案 0 :(得分:2)

您需要在代码中添加For ... Next循环:

Sub SampleReadCurve()

    Dim rs As Recordset
    Dim iRow As Long, iField As Long
    Dim strSQL As String
    Dim CurveID As Long
    Dim MarkRunID As Long
    Dim ZeroCurveID As String

    CurveID = 124
    MarkRunID = 10167
    ZeroCurveID = "'" & CurveID & "-" & MarkRunID & "'"

    strSQL = "SELECT * FROM VolatilityOutput WHERE ZeroCurveID=" & ZeroCurveID & " ORDER BY MaturityDate"
    Set rs = CurrentDb.OpenRecordset(strSQL, Type:=dbOpenDynaset, Options:=dbSeeChanges)

    If rs.RecordCount <> 0 Then
        rs.MoveFirst
        Debug.Print vbCrLf
        Debug.Print "First", rs.Fields("ZeroCurveID"), rs.Fields("MaturityDate"), rs.Fields("ZeroRate"), rs.Fields("DiscountFactor")
        rs.MoveLast
        Debug.Print "Last", rs.Fields("ZeroCurveID"), rs.Fields("MaturityDate"), rs.Fields("ZeroRate"), rs.Fields("DiscountFactor")
        Debug.Print "There are " & rs.RecordCount & " records and " & rs.Fields.Count & " fields."

        Dim BucketTermAmt As Long
        Dim BucketTermUnit As String
        Dim BucketDate As Date
        Dim MarkAsOfDate As Date
        Dim InterpRate As Double
        Dim i As Integer
        Dim d As Date

        MarkAsOfDate = #7/31/2015#

        For i = 0 To 76
            d = VBA.DateAdd("d", -i, MarkAsOfDate)
            BucketTermAmt = 3
            BucketTermUnit = "m"
            BucketDate = DateAdd(BucketTermUnit, BucketTermAmt, d)
            InterpRate = CurveInterpolateRecordset(rs, BucketDate)
            Debug.Print BucketDate, InterpRate
        Next i

    End If

End Sub

答案 1 :(得分:1)

请尝试以下代码。

Sub SampleReadCurve()

Dim rs As Recordset
Dim iRow As Long, iField As Long
Dim strSQL As String
Dim CurveID As Long
Dim MarkRunID As Long
Dim ZeroCurveID As String

CurveID = 124
MarkRunID = 10167
ZeroCurveID = "'" & CurveID & "-" & MarkRunID & "'"

strSQL = "SELECT * FROM VolatilityOutput WHERE ZeroCurveID=" & ZeroCurveID & " ORDER BY MaturityDate"
Set rs = CurrentDb.OpenRecordset(strSQL, Type:=dbOpenDynaset, Options:=dbSeeChanges)

If rs.RecordCount <> 0 Then
    rs.MoveFirst
    Debug.Print vbCrLf
    Debug.Print "First", rs.Fields("ZeroCurveID"), rs.Fields("MaturityDate"), rs.Fields("ZeroRate"), rs.Fields("DiscountFactor")
    rs.MoveLast
    Debug.Print "Last", rs.Fields("ZeroCurveID"), rs.Fields("MaturityDate"), rs.Fields("ZeroRate"), rs.Fields("DiscountFactor")
    Debug.Print "There are " & rs.RecordCount & " records and " & rs.Fields.Count & " fields."

    Dim BucketTermAmt As Long
    Dim BucketTermUnit As String
    Dim BucketDate As Date
    Dim MarkAsOfDate As Date
    Dim InterpRate As Double
    Dim i As Integer
    Dim userdate As String


    userdate = InputBox("Enter Date in as per your system date format eg 31/07/2015 in the system date is in dd/mm/yyyy format")

For i = -75 To 0

    MarkAsOfDate = DateAdd("d", i, userdate)
    BucketTermAmt = 3
    BucketTermUnit = "m"
    BucketDate = DateAdd(BucketTermUnit, BucketTermAmt, MarkAsOfDate)
    InterpRate = CurveInterpolateRecordset(rs, BucketDate)
    Debug.Print BucketDate, InterpRate
    Next
End If
End Sub