我看到它的方式,有两种可能性来获得雅虎!-Finance数据到excel。第一个是实时数据,第二个是历史数据。
我需要历史数据。我目前的VBA代码如下:
firstcolumn = 2
lastcolumn = 6
For n = firstcolumn To lastcolumn
Ticker = Worksheets(1).Cells(3, n).Value
ActiveWorkbook.Worksheets.Add After:=Worksheets(Worksheets.Count)
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;http://ichart.finance.yahoo.com/table.csv?s=" & Ticker & "&d=" & Month(Date) & "&e=" & Day(Date) & "&f=" & Year(Date) & "&g=d&" _
& "a=" & Month(Date) & "&b=" & Day(Date) & "&c=" & Year(Date) - 1 & "&ignore=.csv" _
, Destination:=Range("$A$1"))
.Name = "table.csv?s=BMW.DE&d=6&e=31&f=2012&g=d&a=0&b=1&c=2003&ignore="
.FieldNames = True
.RowNumbers = True
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlOverwriteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 850
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(5, 1, 1, 1, 1, 1, 1)
.TextFileDecimalSeparator = "."
.TextFileThousandsSeparator = ","
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
ActiveSheet.Name = Ticker
MsgBox "status ende"
ActiveWorkbook.Connections("table.csv?s=" & Ticker & "&d=" & Month(Date) & "&e=" & Day(Date) & "&f=" & Year(Date) & "&g=d&a=" & Month(Date) & "&b=" _
& "" & Day(Date) & "&c=" & Year(Date) - 1 & "&ignore=").Delete
ActiveSheet.QueryTables.Item(ActiveSheet.QueryTables.Count).Delete
ActiveSheet.ListObjects.Add(xlSrcRange, ActiveSheet.Range(ActiveSheet.Cells(1, 1), ActiveSheet.Cells(1, 7).End(xlDown)), , xlYes).Name = Ticker
'MsgBox "The data for " & Ticker & " were downloaded to a new sheet."
Next n
Exit Sub
ERR:
MsgBox "Error. Please check."
其中列出了股票代码清单,并创建了一个新的工作表,并以股票的股票代码作为名称,下载的历史数据如下:
然后由我提取相关列,日期和收盘价,并将其复制到工作表中我需要的位置。
我找到了我在线使用的VBA代码,但我无法确定如何使其只显示数据和收盘价格列。据我所知,代码不包含任何关于“open”,“high”,“low”,“close”的查询,我可以排除这些查询只接收我想要的数据。我也看不到行.Name =“table.csv?s = BMW.DE&d = 6&e = 31&f = 2012&g = d&a = 0&b = 1&c = 2003&ignore =”可能适用,因为这些日期没有反映在我的数据中。最后,即使我要求从今天到一年前的每日数据,数据仍会追溯到3.1.2000。
总而言之,这种不灵活的方式是我发现获得必要数据的唯一途径。但是,我想要的是以下形式:
即不同之处在于我可以调整我需要的数据(而不是全部打开,高,低......),以及将其插入现有工作表的位置(而不是新工作表中的$ A $ 1)。
或者,如果建议,我会使用任何其他数据库。 Excel的版本是2013.我查看了Webservice
函数,但这似乎只是获取当前数据,而不是历史数据。
我找到了一种使用Webservice功能的方法(并且很难实现)。
在表中,列A包含日期值,C1包含自动收报机。单元格C2包含:
=WEBSERVICE("http://ichart.finance.yahoo.com/table.csv?s="&C$1&"&a="&MONTH($A2)-1&"&b="&DAY($A2)&"&c="&YEAR($A2)&"&d="&MONTH($A2)-1&"&e="&DAY($A2)&"&f="&YEAR($A2)&"&g=d&ignore=.csv")
这将导入数据(在问题中可视化),但以.csv格式导入一天。使用给定单元格引用$ A2表示日期,C $ 1表示股票代码,此公式可以拖到更多公司的右侧,向下拖动更多日期。
然后,单元格C2的内容为:
“日期,开盘价,最高价,最低价,收盘价,成交量,收盘价2016-01-07,153.15,154.95,151.55,153.75,2454400,138.63”
接下来,单元格C8包含第十个逗号的位置,因为结束价格在字段C2中的第十个逗号之后开始:
=FIND("X";SUBSTITUTE(C2;",";"X";10))
接下来,单元格C9是第10个逗号后面的剩余字符串。
=RIGHT(C2;LEN(C2)-C8)
接下来,C10是C9中第一个逗号的所有内容:
=LEFT(C9;FIND(",";C9)-1)
接下来,C11是C10,使用给定的小数分隔符转换为十进制:
=NUMBERVALUE(C10;".")
最后,为了节省空间,我们可以按顺序组合所有这些功能,并将其放入C2中以获得相同的功能。它看起来像这样(C13):
=NUMBERVALUE(LEFT(RIGHT(WEBSERVICE("http://ichart.finance.yahoo.com/table.csv?s="&C$1&"&a="&MONTH($A2)-1&"&b="&DAY($A2)&"&c="&YEAR($A2)&"&d="&MONTH($A2)-1&"&e="&DAY($A2)&"&f="&YEAR($A2)&"&g=d&ignore=.csv");LEN(WEBSERVICE("http://ichart.finance.yahoo.com/table.csv?s="&C$1&"&a="&MONTH($A2)-1&"&b="&DAY($A2)&"&c="&YEAR($A2)&"&d="&MONTH($A2)-1&"&e="&DAY($A2)&"&f="&YEAR($A2)&"&g=d&ignore=.csv"))-FIND("X";SUBSTITUTE(C2;",";"X";10)));FIND(",";RIGHT(WEBSERVICE("http://ichart.finance.yahoo.com/table.csv?s="&C$1&"&a="&MONTH($A2)-1&"&b="&DAY($A2)&"&c="&YEAR($A2)&"&d="&MONTH($A2)-1&"&e="&DAY($A2)&"&f="&YEAR($A2)&"&g=d&ignore=.csv");LEN(WEBSERVICE("http://ichart.finance.yahoo.com/table.csv?s="&C$1&"&a="&MONTH($A2)-1&"&b="&DAY($A2)&"&c="&YEAR($A2)&"&d="&MONTH($A2)-1&"&e="&DAY($A2)&"&f="&YEAR($A2)&"&g=d&ignore=.csv"))-FIND("X";SUBSTITUTE(WEBSERVICE("http://ichart.finance.yahoo.com/table.csv?s="&C$1&"&a="&MONTH($A2)-1&"&b="&DAY($A2)&"&c="&YEAR($A2)&"&d="&MONTH($A2)-1&"&e="&DAY($A2)&"&f="&YEAR($A2)&"&g=d&ignore=.csv");",";"X";10))))-1);".")
现在,这可以同样向右和向下拖动,以便在更多天内为更多公司获取数据。
但是,如果有更优雅的解决方案,我会很高兴看到它!
如果你的问题是关于从YF获取实时报价和历史数据到Excel,那么有一个比使用vba更简单的方法,顺便说一下,由于YF在2017年11月关闭了他们的api服务,这很可能无法工作。你。可以使用几乎免费的Deriscope插件将这些数据检索到Excel中。免责声明:我是Deriscope的开发人员。