2017-02-01 3 views
0

Die Art, wie ich es sehe, gibt es zwei Möglichkeiten, Yahoo! -Finance-Daten in Excel zu bekommen. Der erste ist für Echtzeitdaten, der zweite für historische Daten.yahoo! -finance (oder andere) historische Daten in Excel

Ich brauche historische Daten. Mein aktueller VBA-Code lautet wie folgt:

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." 

, die durch eine Liste von Börsentickern geht und schafft ein neues Blatt mit dem Ticker-Aktie als Namen ein, und die historischen wie folgt heruntergeladenen Daten:

enter image description here

Es liegt dann an mir, die relevanten Spalten, das Datum und den Schlusskurs zu extrahieren, und es zu kopieren, wo ich sie im Arbeitsblatt brauche.

Ich fand den VBA-Code, den ich online verwende, aber ich konnte nicht bestimmen, wie man es so macht, dass nur die Daten und die Close-Price-Spalte erscheinen. Soweit ich sehen kann, enthält der Code keine Abfrage auf "offen", "hoch", "niedrig", "schließen", die ich ausschließen könnte, nur die Daten zu erhalten, die ich will. Ich sehe auch nicht, was die Linie .Name = „table.csv? S = BMW.DE & d = 6 & e = 31 & f = 2012 & g = d & a = 0 & b = 1 & c = 2003 & ignore = " könnte für sein, da diese Daten nicht in meinen Daten enthalten sind. Last, obwohl ich für tägliche Daten von heute bis vor einem Jahr frage, gehen die Daten zurück bis 3.1.2000.

Zusammenfassend ist dieser unflexible Weg der einzige, den ich gefunden habe, um die notwendigen Daten zu erhalten. Was ich möchte, ist jedoch etwas, das in der folgenden Form aus:

enter image description here

dh mit dem Unterschied, dass ich, welche Daten ich brauche (anstatt alle offen, hoch, tief, anpassen kann. ..), und wo Sie es in das vorhandene Blatt einfügen (statt $ A $ 1 in einem neuen Blatt).

Alternativ würde ich jede andere Datenbank verwenden, falls dies vorgeschlagen wird. Die Version von Excel ist 2013. Ich schaute auf die Webservice Funktion, aber das scheint auch nur aktuelle Daten zu holen, keine historischen Daten.

Antwort

1

Ich habe einen Weg gefunden, um die Webservice-Funktion zu verwenden (und es auf die harte Tour).

enter image description here

In der Tabelle enthält die Spalte A Datumswerte und C1 enthält einen Ticker. Die Zelle C2 enthält:

=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") 

Diese Daten importiert (wie in der Frage sichtbar gemacht), aber im CSV-Format, für einen einzigen Tag. Mit den angegebenen Zellbezügen $ A2 für das Datum und C $ 1 für den Ticker kann diese Formel für mehr Firmen nach rechts und für weitere Daten nach unten gezogen werden.

Der Inhalt der Zelle C2 ist dann:

„Datum, Open, High, Low, Close, Volume, Adj Schließen 2016-01-07,153.15,154.95,151.55,153.75,2454400,138.63 "

Als nächstes enthält Zelle C8 die Position des zehnten Kommas, da der Schlusskurs nach dem zehnten Komma im Bereich C2 beginnt:

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

Als nächstes Zelle C9 ist die verbleibende Zeichenfolge nach . den 10. Komma

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

Als nächstes ist C10 alles bis zum ersten Komma in C9 bis:

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

Als nächstes C11 C10, umgesetzt mit einem gegebenen Dezimaltrennzeichens dezimal:

=NUMBERVALUE(C10;".") 

Und schließlich, Raum zu sparen, können wir all diese Funktionen in dieser Reihenfolge kombinieren und sie in C2 setzen, das gleiche zu bekommen . Es wird wie folgt aussehen (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);".") 

Und das kann nun ebenso nach rechts gezogen werden und nach unten Daten für mehr Firmen auf mehr Tage zu bekommen.

Wenn es jedoch eine elegantere Lösung gibt, werde ich mich sehr freuen, sie zu sehen!

Verwandte Themen