2015-10-26 29 views
0

我有一個使用Excel VBA計算波動率的簡單函數。它將一列數字(零)和兩個日期作爲輸入。代碼是:在Access VBA中移動Recordset

Function EWMA(Zeros As Range, Lambda As Double, MarkDate As Date, MaturityDate As Date) As Double 

    Dim vZeros() As Variant 
    Dim Price1 As Double, Price2 As Double 
    Dim SumWtdRtn As Double 
    Dim I As Long 
    Dim m As Double 

    Dim LogRtn As Double, RtnSQ As Double, WT As Double, WtdRtn As Double 

vZeros = Zeros 

m = Month(MaturityDate) - Month(MarkDate) 

For I = 2 To UBound(vZeros, 1) 

    Price1 = Exp(-vZeros(I - 1, 1) * (m/12)) 

    Price2 = Exp(-vZeros(I, 1) * (m/12)) 

    LogRtn = Log(Price1/Price2) 

    RtnSQ = LogRtn^2 

    WT = (1 - Lambda) * Lambda^(I - 2) 

    WtdRtn = WT * RtnSQ 

    SumWtdRtn = SumWtdRtn + WtdRtn 

Next I 

EWMA = SumWtdRtn^(1/2) 

End Function 

啓用函數的主要功能是For循環。我想在Access VBA中使用記錄集對象重新創建它。記錄集與Excel電子表格具有相同的字段。雖然我不確定如何轉換代碼。這是我到目前爲止:

Function EWMA(rsCurve As Recordset, InterpRate As Double, Lambda As Double) As Double 

    Dim vZeros() As Variant 
    Dim Price1 As Double, Price2 As Double 
    Dim SumWtdRtn As Double 
    Dim I As Long 
    Dim mat As Date 
    Dim mark As Date 

    Dim LogRtn As Double, RtnSQ As Double, WT As Double, WtdRtn As Double 


    CurveInterpolateRecordset = Rnd() 

    If rsCurve.RecordCount <> 0 Then 

    vZeros = CVar(rsCurve.Fields("CurveInterpolateRecordset")) 

    mat = CDate(rsCurve.Fields("MaturityDate")) 
    mark = CDate(rsCurve.Fields("MarkDate")) 

    m = Month(mat) - Month(mark) 

For I = 2 To UBound(vZeros, 1) 

    Price1 = Exp(-vZeros(I - 1, 1) * (m/12)) 

    Price2 = Exp(-vZeros(I, 1) * (m/12)) 

    LogRtn = Log(Price1/Price2) 

    RtnSQ = LogRtn^2 

    WT = (1 - Lambda) * Lambda^(I - 2) 

    WtdRtn = WT * RtnSQ 

    SumWtdRtn = SumWtdRtn + WtdRtn 

Next I 

EWMA = SumWtdRtn^(1/2) 

End If 

     Debug.Print EWMA 

End Function 

函數在Access中的一個較早的子例程中調用。爲了在Access中移動記錄集,我錯過了什麼,類似於在Excel VBA中循環顯示電子表格?

回答

1

最簡單的方法是使用GetRows從您的記錄拉數組:

Recordset.GetRows Method

Th恩新代碼將幾乎你證明代碼的副本正貼開始基本上是這樣的:

vZeros = rsCurve.GetRows(rsCurve.RecordCount) 

作爲一個側面說明,你就不需要CDATE這裏:

mat = rsCurve.Fields("MaturityDate").Value 
1

以下是關於使用記錄集的一些基本知識。

Dim rs As New ADODB.Recordset 

'Add fields to your recordset for storing data. 
With rs 
    .Fields.Append "Row", adInteger 
    .Fields.Append "ColumnName2", adChar, 30 
    .Fields.Append "ColumnName3", adInteger 
    .Open 
End With 

記錄添加到它手動

rs.AddNew 
rs.Fields("Row").Value = 1 
rs.Fields("ColumnName2").Value = "Put some value in" 
rs.Update 

rs.AddNew 
rs.Fields("Row").Value = 2 
rs.Fields("ColumnName2").Value = "Put another value in" 
rs.Update 

你也可以用表的查詢來填充它。

移動到記錄

If rs.EOF = False Then 
    rs.MoveFirst 
End If 

循環的開始時,通過記錄

Do While rs.EOF = False 

     msgbox(rs.Fields("ColumnName2").Value) 

rs.MoveNext 
Loop 
+0

謝謝。儘管我有一點困惑。如果我想循環訪問特定時間間隔的記錄集[I = 2到UBound(vZeros,1)],只需移動到記錄集的開始處並循環遍歷就足夠了嗎? – beeba

+0

這只是一般記錄集導航的一個例子。你可以做任何你想要的東西。 – MatthewD

+0

@varunchandra:通常情況下,您對記錄集使用SELECT查詢,該查詢通過使用適當的WHERE條件完全返回**要循環訪問的記錄**。 – Andre