2015-12-21 4 views
1

У меня есть следующие подпрограммы закодированы в Access VBA:Применения подпрограммы диапазона дат в 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 указанного, что #-/31/2015 #. Сейчас эта дата жестко закодирована.

Однако я хочу изменить эту функцию так, чтобы она выполняла ту же процедуру для последних 76 дат, а не только одну твердую кодированную дату. Поэтому вместо того, чтобы просто применять к MarkAsOfDate = # 7/31/2015 #, я хочу автоматически запускать его для 7/30/2015, 7/29/2015, 7/28/2015 и т. Д. За 76 дат, предшествующих указанному. Прямо сейчас, единственный способ сделать это - вручную изменить строку MarkAsofDate и запустить ее 76 раз для каждой даты.

Как я могу изменить эту функцию так, чтобы она применима к указанному значению MarkAsOfDate и 76 датам, предшествующим ему?

ответ

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 
+0

Отлично, это фантастическое решение, спасибо – beeba

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