2017-02-01 95 views
0

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

其中通过股票行情的例子不胜枚举,并创建了股票的股票代码为名称的新表,并下载的历史数据如下:

enter image description here

然后由我来提取相关的列,日期和结束价格,并将其复制到工作表中我需要的地方。

我发现了我在线使用的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。

总之,这种不灵活的方式是我发现获得必要数据的唯一办法。我想,然而,一些看起来以下形式:

enter image description here

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

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

回答

1

我找到了一种使用Webservice功能的方法(并且很难做到这一点)。

enter image description here

在表中,列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和ticker的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);".") 

而这现在同样可以拖动到右下方获得更多天多的企业数据。

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