我在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个日期?
答案 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