我有一個使用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中循環顯示電子表格?
謝謝。儘管我有一點困惑。如果我想循環訪問特定時間間隔的記錄集[I = 2到UBound(vZeros,1)],只需移動到記錄集的開始處並循環遍歷就足夠了嗎? – beeba
這只是一般記錄集導航的一個例子。你可以做任何你想要的東西。 – MatthewD
@varunchandra:通常情況下,您對記錄集使用SELECT查詢,該查詢通過使用適當的WHERE條件完全返回**要循環訪問的記錄**。 – Andre