我看到它的方式,有两种可能性让雅虎!-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
函数,但这似乎只能获取当前数据,而不是历史数据。
答案 0 :(得分:1)
我找到了一种使用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);".")
现在,这可以同样向右和向下拖动,以便在更多日子里为更多公司获取数据。
但是,如果有更优雅的解决方案,我会很高兴看到它!
答案 1 :(得分:0)
如果您的问题是要从YF将实时报价和历史数据导入Excel,那么有一种比使用vba更为简单的方法,这种方式很可能由于YF自11月起已关闭其api服务而无法使用2017。 您可以使用几乎免费的Deriscope外接程序,将这些数据检索到Excel中。 免责声明:我是Deriscope的开发人员。