2016-01-14 3 views
1

Я пытаюсь получить доступ к элементам таблицы в 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)) 

Изменение типа данных по-прежнему приводит в то же сообщение об ошибке при запуске. Что я делаю не так?

+0

Теперь, когда я вижу это, я не уверен, что vInterpRate (I - 1, 1) имеет смысл. Если vInterpRate были ** функцией **, это было бы. Но vInterpRate является ** переменной **. Если вы замените номер 5 для vInterpRate, это не имеет смысла. 5 (I - 1, 1). Вам нужно выяснить, что вы пытаетесь сделать там, и внести коррективы. –

ответ

3

Оригинал: Вы уверены, что это не должно быть:

vInterpRate = rec("InterpRate") 

вместо

rec("InterpRate") = vInterpRate() 

После доработки:

dim x as integer 
Set rec = CurrentDb.OpenRecordset("SELECT InterpRate FROM HolderTable") 
x = 0 
Do While rec.EOF = False 
redim(vInterpRate, x+1) 'need to preserve don't remember if this is default in vba 
    vInterpRate(x) = rec("InterpRate") 
    x = x + 1 
    rec.next 
Loop 

for i = 1 to x do 

    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 
next i 

Есть, вероятно, ошибки в коде, как я у меня нет компилятора vba, и я долго работал с ним, но я hink это должно указывать на вас в правильном направлении, если я интерпретирую то, что вы ищете правильно.

+0

Вы правы, это должно быть без скобок. Я все равно получаю то же сообщение об ошибке. – beeba

+0

Без круглых скобок, а также это было назад. Также попробуйте обернуть вариант (который на этом этапе представляет собой строку) с CInt: Цена1 = Exp (cint (vInterpRate (I - 1, 1)) * (m/12)) –

+1

Извините, тем больше я смотрю на код, тем больше я смущен - что вы ожидаете от этой строки 'rec (« InterpRate ») = vInterpRate' сделать именно? –

Смежные вопросы