2017-09-26 36 views
0

概述
我使用www.quandl.com免费的财务数据,试图预测资产价格变动使用URLMON API函数从Quandl.com数据下载到访问数据库,用VBA

方法
我已经构建了一个函数来使用quandl API下载数据。我正在声明位于urlmon.dll系统32文件夹中的Windows API函数。

代码

Option Explicit 

#If VBA7 Then 
    Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (_ 
     ByVal pCaller As LongPtr, _ 
     ByVal szURL As String, _ 
     ByVal szFileName As String, _ 
     ByVal dwReserved As LongPtr, _ 
     ByVal lpfnCB As LongPtr) As LongPtr 
#Else 
    Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownLoadToFileA" (_ 
     ByVal pCaller As Long, _ 
     ByVal szURL As String, _ 
     ByVal szFileName As String, _ 
     ByVal dwReserved As Long, _ 
     ByVal lpfnCB As LongPtr) As Long 
#End If 

Sub DownloadSingleFile() 

    Dim FileURL As String 
    Dim DestinationFile As String 

    FileURL = "https://www.quandl.com/api/v3/datasets/WIKI/FB/data.csv?" 
    DestinationFile = "C:\Users\hueve\Desktop\TheSystem\Fb.csv" 

    URLDownloadToFile 0, FileURL, DestinationFile, 0, 0 

End Sub 

问题
此代码的工作,这将数据下载到正确的文件的目标,我想知道如果有一种方法,而不是直接下载到文件位置;直接运行它到Access数据库表?我知道该函数明确指出它直接下载到一个文件,但是直接访问Access DB将是一件好事。此外,我知道旁边没有这些API函数,所以请放轻松

+0

使用[DoCmd.TransferText]( https://msdn.microsoft.com/en-us/vba/access-vba/articles/docmd-transfertext-method-access)将csv导入Access表。完成后,删除csv文件。 – Parfait

+0

我看过这样做,那将是我采取的一切路线失败的路线。我主要关心的是我计划下载10,000个或更多数据集到多个dbs的时间,但我不确定Docmd.transfettext的速度如何? – ZacAttack

+0

这似乎是一个额外的步骤,创建一个文件,然后删除它? – ZacAttack

回答

1

这里是拉动一个数据点阵列(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