雅虎! – 财务(或其他)在Excel中的历史数据

我看到它的方式,有两种可能性让雅虎!金融数据到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." 

通过股票代号列表,创build一个以股票代号为名称的新表,并下载历史数据:

在这里输入图像说明

然后由我来提取相关的栏目,date和结算价格,并将其复制到工作表中我需要的地方。

我发现我在网上使用的VBA代码,但我无法确定如何使它只有数据和收盘价列出现。 据我所知,代码不包含任何查询“开放”,“高”,“低”,“closures”,我可以排除只接收我想要的数据。 我也没有看到什么线.Name =“table.csv?s = BMW.DE&d = 6&e = 31&f = 2012&g = d&a = 0&b = 1&c = 2003&ignore =”可以,因为这些date不反映在我的数据。 最后,即使我要求从今天到一年前的每日数据,数据可以追溯到3.1.2000。

总而言之,这种不灵活的方式是我发现获得必要数据的唯一途径。 然而,我想要的是以下forms的东西:

在这里输入图像说明

即不同的是我可以调整我需要的数据(而不是所有的开放,高,低,…),以及将其插入现有工作表(而不是在新工作表中$ A $ 1)的位置。

另外,我会使用任何其他数据库,如果build议。 Excel的版本是2013年。我查看了Webservicefunction,但也似乎只是获取当前数据,而不是历史数据。

我find了一种使用Webservicefunction的方法(并且很难做到这一点)。

在这里输入图像说明

在表中,A列包含date值,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为date,$ 1为ticker,这个公式可以拖到更多公司的权利,并向下更多的date。

单元格C2的内容是:

“date,开盘价,最高价,最低价,收盘价,成交量,调整closures2016-01-07,153.15,154.95,151.55,153.75,2454400,138.63”

接下来,单元格C8包含第十个逗号的位置,因为收盘价在字段C2中的第十个逗号之后开始:

 =FIND("X";SUBSTITUTE(C2;",";"X";10)) 

接下来,单元格C9是第10个逗号之后的剩余string。

 =RIGHT(C2;LEN(C2)-C8) 

接下来,C10直到C9中的第一个逗号为止:

 =LEFT(C9;FIND(",";C9)-1) 

接下来,C11是C10,用给定的小数分隔符转换为十进制:

 =NUMBERVALUE(C10;".") 

最后,为了节省空间,我们可以按照这个顺序把所有这些function组合起来,并把它们放到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);".") 

而现在,我们也可以同样将这一点向右下方拖延,以便在更多的日子里获得更多公司的数据。

但是,如果有一个更优雅的解决scheme,我会很高兴看到它!