使用urlmon API函数从Quandl.com下载数据以访问数据库,使用VBA

使用urlmon API函数从Quandl.com下载数据以访问数据库,使用VBA,vba,ms-access,quandl,urlmon,Vba,Ms Access,Quandl,Urlmon,概述 我正在使用www.quandl.com免费金融数据来预测资产价格的变动 接近 我已经构建了一个使用QuandlAPI下载数据的函数。我正在声明位于urlmon.dll system 32文件夹中的windows API函数 代码 问题 这段代码很有效,它会将数据下载到正确的文件目的地,我想知道是否有办法代替直接下载到文件位置;直接运行到Access DB表?我知道这个函数明确声明它直接下载到一个文件中,但最好有一种直接访问DB的方法。此外,我对这些api函数几乎一无所知,因此请大家放心下面

概述 我正在使用www.quandl.com免费金融数据来预测资产价格的变动

接近 我已经构建了一个使用QuandlAPI下载数据的函数。我正在声明位于urlmon.dll system 32文件夹中的windows API函数

代码

问题
这段代码很有效,它会将数据下载到正确的文件目的地,我想知道是否有办法代替直接下载到文件位置;直接运行到Access DB表?我知道这个函数明确声明它直接下载到一个文件中,但最好有一种直接访问DB的方法。此外,我对这些api函数几乎一无所知,因此请大家放心

下面是一个数组代码,该数组可提取单个数据点52周的性能:

    ' save 52 week performance for any scored quarter not saved yet
Set rs = CurrentDb.OpenRecordset("Select * from qryQuarterlyStockDataMissing")
If Not rs.EOF Then
    ' some 52 week performance scores for scored companies are missing.
    rs.MoveLast
    rs.MoveFirst
    intI = rs.RecordCount
    Do While rs.EOF = False
        StatBar_Msg "Updating 52 Week Performance Data for " & intI & " scored periods..."
        strLink = GetQuandl52WeekPerformanceLink(rs![Ticker], rs![Active_Period])
        dbl52WeekPerformance = Nz(GetQuandl52WeekPerformance(strLink), "NULL")
        strSQL = "INSERT INTO tblQuarterlyStockData (SDF_Details_ID, 52WeekPerformance, QuandlLink) " & _
                "VALUES(" & rs![SDF_Details_ID] & "," & CStr(dbl52WeekPerformance) & _
                ",'" & strLink & "')"
        CurrentDb.Execute strSQL
        rs.MoveNext
        intI = intI - 1
    Loop
    rs.Close
    Set rs = Nothing
End If

Public Function GetQuandl52WeekPerformanceLink(strTicker As String, dtDate As Date)
Dim strLink As String
Dim strStartDate As Date
Dim strEndDate As Date
Dim strResponse As String
Dim objHttp As Object
Dim LArray() As String
Dim dtEndDate As Date
Dim dtStartDate As Date

' find nearest weekday date
dtEndDate = GetNearestStockDay(dtDate)
dtStartDate = dtEndDate - 367 ' make it slightly more than a year in case the previous year date falls on a Sunday

GetQuandl52WeekPerformanceLink = "https://www.quandl.com/api/v3/datasets/WIKI/" & strTicker & _
            ".csv?column_index=4&start_date=" & Format(dtStartDate, "yyyy-mm-dd") & _
            "&end_date=" & Format(dtEndDate, "yyyy-mm-dd") & "&collapse=annual&transform=rdiff&api_key=ryCL1ih7fJ1eTH8y9U7E"
End Function



Public Function GetQuandl52WeekPerformance(strLink As String)
Dim strResponse As String
Dim objHttp As Object
Dim LArray() As String

Set objHttp = CreateObject("MSXML2.XMLHTTP")

objHttp.Open "Get", strLink, False
objHttp.send
strResponse = objHttp.responseText
Set objHttp = Nothing

LArray = Split(strResponse, ",")

GetQuandl52WeekPerformance = Null
If LArray(0) = "code" Then
    ' no data returned
Else
    If Len(strResponse) > 12 Then
        GetQuandl52WeekPerformance = LArray(2)
    Else
        ' This stock doesn't have a full year's worth of data
    End If
End If
End Function

Public Function GetNearestStockDay(dtDate As Date) As Date
If Weekday(dtDate) = 1 Then
    GetNearestStockDay = dtDate - 2
ElseIf Weekday(dtDate) = 7 Then
    GetNearestStockDay = dtDate - 1
Else
    GetNearestStockDay = dtDate
End If
End Function

用于导入csv以访问表。一旦完成,删除csv文件。我看了一下这样做,这将是我采取的路线,其他一切都失败了。我主要关心的是,当我计划将10000个或更多数据集下载到多个数据库时,就速度而言,我对Docmd.transfettext不太确定??这似乎是一个额外的步骤,创建一个文件然后删除它??尝试通过MSXML2.XMLHTTP检索CSV内容,将其解析到数组2d或通过拆分嵌套,创建一个表,并将数组中的数据逐行放入循环中的表中。我将使用数组对其进行演示
    ' save 52 week performance for any scored quarter not saved yet
Set rs = CurrentDb.OpenRecordset("Select * from qryQuarterlyStockDataMissing")
If Not rs.EOF Then
    ' some 52 week performance scores for scored companies are missing.
    rs.MoveLast
    rs.MoveFirst
    intI = rs.RecordCount
    Do While rs.EOF = False
        StatBar_Msg "Updating 52 Week Performance Data for " & intI & " scored periods..."
        strLink = GetQuandl52WeekPerformanceLink(rs![Ticker], rs![Active_Period])
        dbl52WeekPerformance = Nz(GetQuandl52WeekPerformance(strLink), "NULL")
        strSQL = "INSERT INTO tblQuarterlyStockData (SDF_Details_ID, 52WeekPerformance, QuandlLink) " & _
                "VALUES(" & rs![SDF_Details_ID] & "," & CStr(dbl52WeekPerformance) & _
                ",'" & strLink & "')"
        CurrentDb.Execute strSQL
        rs.MoveNext
        intI = intI - 1
    Loop
    rs.Close
    Set rs = Nothing
End If

Public Function GetQuandl52WeekPerformanceLink(strTicker As String, dtDate As Date)
Dim strLink As String
Dim strStartDate As Date
Dim strEndDate As Date
Dim strResponse As String
Dim objHttp As Object
Dim LArray() As String
Dim dtEndDate As Date
Dim dtStartDate As Date

' find nearest weekday date
dtEndDate = GetNearestStockDay(dtDate)
dtStartDate = dtEndDate - 367 ' make it slightly more than a year in case the previous year date falls on a Sunday

GetQuandl52WeekPerformanceLink = "https://www.quandl.com/api/v3/datasets/WIKI/" & strTicker & _
            ".csv?column_index=4&start_date=" & Format(dtStartDate, "yyyy-mm-dd") & _
            "&end_date=" & Format(dtEndDate, "yyyy-mm-dd") & "&collapse=annual&transform=rdiff&api_key=ryCL1ih7fJ1eTH8y9U7E"
End Function



Public Function GetQuandl52WeekPerformance(strLink As String)
Dim strResponse As String
Dim objHttp As Object
Dim LArray() As String

Set objHttp = CreateObject("MSXML2.XMLHTTP")

objHttp.Open "Get", strLink, False
objHttp.send
strResponse = objHttp.responseText
Set objHttp = Nothing

LArray = Split(strResponse, ",")

GetQuandl52WeekPerformance = Null
If LArray(0) = "code" Then
    ' no data returned
Else
    If Len(strResponse) > 12 Then
        GetQuandl52WeekPerformance = LArray(2)
    Else
        ' This stock doesn't have a full year's worth of data
    End If
End If
End Function

Public Function GetNearestStockDay(dtDate As Date) As Date
If Weekday(dtDate) = 1 Then
    GetNearestStockDay = dtDate - 2
ElseIf Weekday(dtDate) = 7 Then
    GetNearestStockDay = dtDate - 1
Else
    GetNearestStockDay = dtDate
End If
End Function