在Access VBA中将一个子例程应用于一系列date

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

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 MarkAsOfDate = #7/31/2015# BucketTermAmt = 3 BucketTermUnit = "m" BucketDate = DateAdd(BucketTermUnit, BucketTermAmt, MarkAsOfDate) InterpRate = CurveInterpolateRecordset(rs, BucketDate) Debug.Print BucketDate, InterpRate End If End Sub 

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

但是,我想改变这个函数,以便它在过去的76个date中执行相同的过程,而不是仅仅一个硬编码date。 因此,我不想只适用于MarkAsOfDate =#7/31/2015#,我想自动运行它为7/30/2015,7/29/2015,7/28/2015等等76指定之前的date。 现在,我可以做到这一点的唯一方法是手动更改MarkAsofDate线,并为每个date运行76个单独的时间。

我怎样才能改变这个函数,使它适用于指定的MarkAsOfDate和之前的76个date?

请尝试下面的代码。

 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 

您需要将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