Я пытаюсь получить доступ к элементам таблицы в Access VBA как часть функции. Однако я получаю сообщение об ошибке «Ошибка преобразования типа данных». Я не могу понять, что я делаю неправильно здесь.Ошибка преобразования данных в VBA
Следующая подпрограмма заполняет элементы таблицы, к которой я пытаюсь получить доступ, «HolderTable».
Sub SampleReadCurve()
Dim rs As Recordset
Dim rs2 As Recordset
Dim iRow As Long, iField As Long
Dim strSQL As String
Dim CurveID As Long
Dim MarkRunID As Long
Dim MaxOfMarkAsofDate As Date
Dim userdate As String
DoCmd.RunSQL "DELETE * FROM HolderTable"
'Clears out the old array from the holder table.
CurveID = 15
Dim I As Integer
Dim x As Date
userdate = InputBox("Please Enter the Date (mm/dd/yyyy)")
x = userdate
For I = 0 To 150
MaxOfMarkAsofDate = x - I
strSQL = "SELECT * FROM VolatilityOutput WHERE CurveID=" & CurveID & " AND MaxOfMarkAsofDate=#" & MaxOfMarkAsofDate & "# ORDER BY MaxOfMarkasOfDate, MaturityDate"
Set rs = CurrentDb.OpenRecordset(strSQL, Type:=dbOpenDynaset, Options:=dbSeeChanges)
Set rs2 = CurrentDb.OpenRecordset("HolderTable")
If rs.RecordCount <> 0 Then
rs.MoveFirst
rs.MoveLast
Dim BucketTermAmt As Long
Dim BucketTermUnit As String
Dim BucketDate As Date
Dim MarkAsOfDate As Date
Dim InterpRate As Double
BucketTermAmt = 3
BucketTermUnit = "m"
BucketDate = DateAdd(BucketTermUnit, BucketTermAmt, MaxOfMarkAsofDate)
InterpRate = CurveInterpolateRecordset(rs, BucketDate)
Debug.Print BucketDate, InterpRate
rs2.AddNew
rs2("BucketDate") = BucketDate
rs2("InterpRate") = InterpRate
rs2.Update
End If
Next I
Dim vol As Long
vol = EWMA(0.94)
Debug.Print vol
End Sub
Это функция, EWMA, которая дает мне сообщение об ошибке. В основном это просто установка серии простых операций над элементами HolderTable, которые заполняются значениями, полученными в подпрограмме SampleReadCurve.
Function EWMA(Lambda As Double) As Double
Dim Price1 As Double, Price2 As Double
Dim vInterpRate() As Variant
Dim SumWtdRtn As Double
Dim I As Long
Dim m As Double
Dim rec As Recordset
Dim BucketTermAmt As Long
BucketTermAmt = 3
Dim LogRtn As Double, RtnSQ As Double, WT As Double, WtdRtn As Double
m = BucketTermAmt
Set rec = CurrentDb.OpenRecordset("SELECT InterpRate FROM HolderTable")
Do While rec.EOF = False
rec("InterpRate") = vInterpRate
Price1 = Exp(vInterpRate(I - 1, 1) * (m/12))
Price2 = Exp(vInterpRate(I, 1) * (m/12))
LogRtn = Log(Price1/Price2)
RtnSQ = LogRtn^2
WT = (1 - Lambda) * Lambda^(I - 2)
WtdRtn = WT * RtnSQ
SumWtdRtn = SumWtdRtn + WtdRtn
Loop
EWMA = SumWtdRtn^(1/2)
End Function
HolderTable имеет два поля, BucketDate и InterpRate, оба из которых имеют тип данных «Краткий текст». Я получаю сообщение об ошибке Тип данных преобразования на линии
Price1 = Exp(vInterpRate(I - 1, 1) * (m/12))
Изменение типа данных по-прежнему приводит в то же сообщение об ошибке при запуске. Что я делаю не так?
Теперь, когда я вижу это, я не уверен, что vInterpRate (I - 1, 1) имеет смысл. Если vInterpRate были ** функцией **, это было бы. Но vInterpRate является ** переменной **. Если вы замените номер 5 для vInterpRate, это не имеет смысла. 5 (I - 1, 1). Вам нужно выяснить, что вы пытаетесь сделать там, и внести коррективы. –