2017-11-11 207 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'的链接,你可以下载一个工具,它应该做你想要的一切。

相关问题