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