2017-02-01 101 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);".") 

而這現在同樣可以拖動到右下方獲得更多天多的企業數據。

但是,如果有更優雅的解決方案,我會很高興看到它!