2017-11-11 53 views
2

我是雅虎財經API難民(他們停止他們的API服務)嘗試切換到阿爾法華帝。 我修改了以前用於Yahoo Finance的以下代碼,但我在Excel中遇到了#VALUE錯誤。阿爾法華帝:使用Excel VBA拉從CSV文件中的數據

以下作品的網址本身(它會打開一個CSV如果你輸入到你的網頁瀏覽器),所以我想我真正的問題在於提取的CSV正確的數據到我的Excel電子表格。任何人都可以提供幫助嗎?

我試圖從CSV提取第2行,第5列數據(最後的收盤價)。提前謝謝了!

Function StockClose(Ticker As String) 

Dim URL As String, CSV As String, apikey As String, SCRows() As String, SCColumns() As String, pxClose As Double 

apikey = "*censored*" 

URL = "https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=" & Ticker & "&outputsize=full&" & apikey & "&datatype=csv" 

Set xmlhttp = CreateObject("MSXML2.XMLHTTP") 
    xmlhttp.Open "GET", URL, False 
    xmlhttp.Send 
    CSV = xmlhttp.responseText 

    'split the CSV into rows 
    SCRows() = Split(CSV, Chr(10)) 
    'split the relevant row into columns. 0 means 1st row, starting at index 0 
    SCColumns() = Split(SCRows(1), ",") 
    '6 means: 5th column; starting at index 0 - price close is in the 5th column 
    pxClose = SCColumns(6) 

    StockClose = pxClose 

Set http = Nothing 

End Function 

樣本數據的返回,如果我提取JSON而不是CSV:

{ 「元數據」:{ 「1信息」:「每日價格(開盤,高,低,「關閉」和「卷」 「2.符號」:「SGD = X」, 「3.最後刷新」:「2017-11-10」, 「4.輸出尺寸」:「全尺寸」, 「5.時區」:「美國/東部」 }, 「時間序列(每日)」:{ 「201 7-11-13「:{ 」1。打開「:」1.3588「, 」2。高「:」1.3612「, 」3。低「:」1.3581「, 」4。關閉「:」1.3587「, 」5。體積「:」0「 }, 」2017-11-10「:{ 」打開「:」1.3588「, 」2。高「:」1.3612「, 」3。低「:」1.3581「, 」4。關閉「:」1.3587「, 」5。卷「:‘0’ },

+0

檢查[這個答案](https://stackoverflow.com/a/43969543/2165759),它可以幫助你與雅虎財經的API來管理。 – omegastripes

回答

3

的‘從網站CSV’選項是一個可下載的文件,而不是文本文檔解析這樣一個簡單的辦法是使用該網站的JSON選項,而不是,這很容易裝入一個字符串。

因爲你只需要一個值,這是最簡單的只是搜索字符串「關閉」,並在其後返回值。

這裏有一個快速的解決方案,你可以爲適應需要:

Option Explicit 

Function StockClose(Ticker As String) As Double 

    Dim URL As String, json As String, apiKey As String, xmlHTTP As Object 
    Dim posStart As Integer, posEnd As Integer, strClose As String 

    apiKey = "demo" 
    URL = "https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=" & Ticker & "&outputsize=full&apikey=" & apikey 

    Set xmlHTTP = CreateObject("MSXML2.XMLHTTP") 
    xmlHTTP.Open "GET", URL, False 
    xmlHTTP.Send 
    json = xmlHTTP.responseText 
    Set xmlHTTP = Nothing 

    posStart = InStr(json, "4. close") + 12 
    posEnd = InStr(posStart, json, """") - 1 
    strClose = Mid(json, posStart, posEnd - posStart) 

    StockClose = Val(strClose) 

End Function 
+0

謝謝Ashlee,我試過上面的代碼,但函數總是返回0.你認爲這可能是因爲在json中有多個「4. close」?下面提取的樣品: 「時間序列(日報)」:{ 「2017年11月13日」:{ 「1.打開​​」: 「1.3588」, 「2高」: 「1.3612」, 「 3.「low」:「1.3581」, 「4. close」:「1.3587」, 「5. volume」:「0」 }, 「2017-11-10」:{ 「1. open」: 「1.3588」, 「2. high」:「1.3612」, 「3. low」:「1.3581」, 「4. close」:「1.3587」, 「5. volume」:「0」 – volvader

+0

hmm,它應該沒關係。它正在尋找第一次亮相。大寫/小寫可能或可能不重要。你的文件中的情況與代碼相同:'4。 close'? – ashleedawg

+0

您正在查看的代碼是什麼? – ashleedawg

-1

當雅虎結束他們的API服務時,這是一個悲傷的日子。儘管如此,還有很多選擇。您可以使用Python獲取股票的時間序列數據。你也可以使用R.我會讓你知道如何利用這些技術,因爲你是一名Excel-VBA用戶,如果你不想這些技術,我不想強​​迫你選擇這些技術。作爲替代方案,請考慮下面列出的這兩個選項之一。

http://finance.jasonstrimpel.com/bulk-stock-download/

http://investexcel.net/multiple-stock-quote-downloader-for-excel/

enter image description here

對於第二個網址,點擊名爲'Get Excel Spreadsheet to Download Bulk Historical Stock Data from Google Finance'的鏈接,你可以下載一個工具,它應該做你想要的一切。

相關問題