Excel abrufen Börsenkurse mit einer Tabellenformel
Einige Finanzmodelle brauchen Aktienkurse zu bestimmten Terminen zu verweisen. Statt diese als hartcodierte Eingangsdaten verwenden, können Sie eine Excel-Formel erstellen, die die Aktienkurse für einen bestimmten Zeitpunkt abrufen werden.
Dieses Tutorial verwendet das Konzept der benutzerdefinierten Funktionen (UDF) - für eine Einführung, diesen Artikel lesen. Lange Rede kurzer Sinn, können Sie eine VBA-Funktion entwickeln, die als Excel-Tabelle Formel verwendbar ist.
Der Code in diesem Tutorial können Sie die Aktienkurse von Yahoo! abrufen Finanzen. Einmal enthalten ist, können Sie die Formel wie folgt verwenden:

Excel: "Stockquote" Formula

Der Code, die Sie brauchen, in einem VBA-Code-Modul zu setzen, ist wie folgt:
Funktion Stockquote (strTicker As String, Optional dtDate As Variant)
'Datum ist optional - wenn weggelassen, heute verwenden. Wenn der Wert kein Datum ist, werfen Fehler.
Wenn IsMissing (dtDate) Then
dtDate = Datum
Sonst
Wenn nicht (IsDate (dtDate)) Then
Stockquote = CVErr (xlErrNum)
End If
End If
Dim dtPrevDate As Date
Dim strURL As String, strCSV As String, strRows () As String, strColumns () As String
Dim Dbclose As Double
dtPrevDate = dtDate - 7
Stellen Sie http = Create ( "MSXML2.XMLHTTP")
http.Open "GET", strURL False
http.Send
strCSV = http.responseText
'Die letzte Information ist in Zeile 2, knapp unterhalb der Tabellenüberschriften.
"Der Preis in der Nähe ist der fünfte Eintrag
strRows () = Split (strCSV, Chr (10)) 'spaltete die CSV in Reihen
strColumns = Split (strRows (1) "") "aufgeteilt, um die entsprechende Zeile in Spalten. 1 bedeutet, 2. Reihe, bei Index beginnend 0
'Dbclose = strColumns (4) 4 bedeutet: 5. Position, beginnend bei Index 0
"Debug.Print vbLf
'Debug.print strRows (1)
"Debug.Print "Dbclose:" - Dbclose
Stellen Sie http = Nothing
Darüber hinaus hat Financial-Modelling.net Leser René ein Lehr-Video hochgeladen, das zeigt, wie dieses Skript zu implementieren.
hallo, sparte ich das Makro als „Stockquote“, aber wenn ich in Excel-Blatt zurückkehren und in der Formel ausgedrückt, es erkennt nicht die Makro- und sagt #NAME in der Zelle, wo ich versucht, die Funktion aufzurufen? In VB, ich war in der Lage, das Projekt zu nennen und natürlich die Funktion Stockquote, aber es ist immer noch sagen, dass das Modul wird Module1 genannt. Zurück in dem Arbeitsblatt, wo ich es genannt wird, sehe ich nicht „Stockquote“ oder alle Makros unter „Ansicht Macros“. Vielen Dank
Kann mir jemand erklären, warum ich das Modul nicht ausgeführt werden kann? Ich habe den Code in das VBA-Modul coppied aber wenn ich versuche, es zu laufen, das Modul ist nicht sichtbar in de MACRO Finder. Kann mir jemand eine kurze Anleitung geben, wie es läuft zu machen?
Gibt es trotzdem, können wir Preis für einen bestimmten Zeitpunkt bekommen Schließung, die so eingestellt ist aufgeteilt?
Sehr schön. Diese Funktion gibt den tatsächlichen schließen. Ich ziehe die eingestellte Nähe (bereinigt um Splits und Dividenden) zu verwenden. Die Veränderung war ziemlich einfach. Suchen Sie die Zeile
Ich hoffe, das hilft
Vielen Dank für diesen großen Makro! Ich vereinfacht das Programm und entfernt, um die Datumseingabe. So ist meine Version gibt nur den aktuellen Aktienkurs ( „l1“). Ich denke, das ist das, was Rupesh und Mike oben weiter gefragt. Der Eingang hat wie folgt aussehen: = Stockquote ( „TICKER_SYMBOL“).
Ich hatte Schwierigkeiten mit diesem Makro Wechselkurse zeigen (zum Beispiel EURUSD = X). Deshalb habe ich die URL in meiner Version zu „download.finance.yahoo.com“ geändert. Irgendwie gibt es funktioniert.
Hier ist der Code:
Funktion Stockquote (strTicker As String)
Dim strURL As String, strCSV As String
Dim Dbclose As Double
Stellen Sie http = Create ( "MSXML2.XMLHTTP")
http.Open "GET", strURL False
http.Send
strCSV = http.responseText
"Debug.Print vbLf
"Debug.Print "Dbclose:" - Dbclose
Stellen Sie http = Nothing
Eine andere Sache, die ich gelernt: Die Linie
sollte ersetzt mit
dann wird der Wert der Ausgabe Ihrer locale unabhängig ist, das heißt, egal, ob Sie ein Komma oder Punkt als Nummer Trennzeichen verwenden, wird der Wert wie erwartet.
Rene, groß bearbeiten! Das ist genau das, was ich denn aus diesem Makro suchen. Rene, was ist erfrischend?
Sie können das Aktualisierungsintervall ändern (Linie 8. Es wird auf 5 Minuten jetzt). Ich würde allerdings nicht eine sehr kleine Zeit einzustellen empfehlen. Yahoo scheint zu viele Anfragen von demselben Benutzer zu sperren. Also, wenn Sie viele Ticker-Symbole und / oder ein kurzes Update-Intervall das Makro hängt schon seit geraumer Zeit.
Noch ein Hinweis: Nachdem Sie den Code in Ihre Excel-Datei zu kopieren, kann es notwendig sein, zu speichern, schließen und öffnen Sie die Datei, um die automatische Aktualisierung zu starten.
Sub auto_open ()
rufen Sie ScheduleUpdateAll
End Sub
Sub ScheduleUpdateAll ()
TimeToRun = Now + ZeitWert ( „00.05.00“) ‚das Aktualisierungsintervall einstellen
Application.OnTime TimeToRun "UpdateAll"
End Sub
Sub UpdateAll ()
Application.CalculateFull
rufen Sie ScheduleUpdateAll
End Sub
Sub Auto_schließen ()
On Error Resume Next
Application.OnTime TimeToRun "UpdateAll". Falsch
End Sub
Funktion Stockquote (strTicker As String)
Dim strURL As String, strCSV As String
Dim Dbclose As Double
Stellen Sie http = Create ( "MSXML2.XMLHTTP")
http.Open "GET", strURL False
http.Send
strCSV = http.responseText
Dbclose = Val (strCSV)
Stockquote = Dbclose
Stellen Sie http = Nothing
Danke noch einmal,
Merle
Warum gibt es keine einfache Funktion einen Aktienkurs in Excel wie Google bietet mit seiner Online-Tabelle (= Finanzierung (MSFT)) zu ziehen.
Ich erhalte einen #VALUE Fehler, wenn ich diese verwenden. Wer weiß, warum? Im‘mit Rene modifizierte Version.
Kann es nicht herausgefunden. Ich habe das Val (.)
der Code funktioniert gut, danke! Eine Frage, kann ich nicht scheinen SPX Arbeit zu bekommen. Yahoo Finance hat als Ticker ^ SPXPM spx, und es Fehler jedes Mal heraus. Andere Futures wie ^ VIX gut funktionieren. Jedes hat eine Idee, wie dieses Problem beheben?
Vielen Dank
Rene, Vielen Dank für das Makro! Es funktioniert großartig und war genau das, was ich brauchte.
Würden Sie eine Idee, wie ein weiteres Stück von Yahoo Finance Daten zum Vergleich abzurufen?
Mein Makro / VBA Verständnis reicht nicht aus, um herauszufinden, wie Sie Ihren Code anzupassen, diese zusätzliche Funktion auszuführen.
Wenn Sie irgendwelche Ideen haben, würde ich dankbar sein.
(Ich habe auch ein Investor für eine lange Zeit und denken gewesen, es wird Ihnen helfen, Geld in Aktien zu machen.)
Ein paar Indizes ich versucht habe, funktionieren auch nicht wie ^ DJI und ^ SSEC.
Ich versuche MyYahoo Aktie Berichterstattung zu ersetzen. Wie kann ich herausfinden, was die Felder wie Tageswechsel und Prozent sind, von Yahoo Finance?
Ich mag die Funktion aber war etwas besorgt, eine Funktion auf meiner Tabelle zu verwenden, wo ich historische Daten zu verfolgen. Ich würde nicht wollen, um ein Blatt zu aktualisieren, die Werte für eine vorherige Periode hat. Also schrieb ich ein kleines Makro, das ich einmal ausgeführt wird, wird es mein Blatt mit den aktuellen Werten für die Bestände aktualisieren. Dann kann ich die Tabelle speichern und wenn ich es sechs Monate später öffnen wird es nicht durch Senden des Befehls zu Yahoo wieder neu zu berechnen versuchen.
Das Makro wird auf der Annahme basiert, dass die Ticker-Symbole in der Zelle A5 starten; es können so viele wie 40 Symbole sein (Leerzeichen werden übersprungen). Der Wert von der Funktion zurückgegeben wird in der Zelle drei Spalten rechts von dem Ticker-Symbol setzen.
Hier einige Beispieldaten (so können Sie das Format sehen, ich habe):
Ticker Name Aktien Preis Gesamt
CAH Cardinal Health, Inc. 100 69,73 $ 6,973.00
Z Zillow, Inc. 200 92,27 $ 18,454.00
T AT-T, Inc 300 35,09 $ 10,527.00
Sub update ()
'
'Nach unten Liste von Symbolen und zu aktualisieren Preisspalte
'
Dim Symbol As String
OrigAdd = ActiveCell.Address
Range ( "A5"). Wählen
Symbol = ActiveCell.Value
Für Count = 1 bis 40
Do While Symbol ""
x = Stockquote (Symbol)
ActiveCell.Offset (0, 3) = x .Wert
ActiveCell.Offset (1, 0) .Activate
Symbol = ActiveCell.Value
Schleife
ActiveCell.Offset (1, 0) .Activate
Symbol = ActiveCell.Value
Weiter Count
Hoffe, dass jemand hilft.
Sub Test ()
Dim Seite As Byte
Dim queryTableObject Als Abfragetabellen
Dim url As String
Für page = 1 Um NUMBER_OF_PAGES
url = VBA.Strings.Replace (URL_TEMPLATE, „“, Seite)
Set queryTableObject = ActiveSheet.QueryTables.Add (Anschluss: = URL, Ziel:. = ThisWorkbook.Worksheets.Add [a1])
queryTableObject.WebSelectionType = xlSpecifiedTables
queryTableObject.WebTables = „3"
queryTableObject.Refresh
Folgeseite
Ich mag Renee Idee mit dem Auto-Updater und Larry Idee der Verwendung eines x = Stockquote (Symbol) und x = Wert der angegebenen Zelle
Aber ich würde gerne wissen, ob es möglich ist, etwas beides zu kombinieren und Preise geholt von Yahoo zu verwenden. ohne dass die vollständige Formel in Excel jedes Mal einzugeben.
Z.B. Ich möchte die Formel in die Zelle gebaut haben, und alles, was ich geben müssen, ist der Code AAPL, die in den Preis umwandelt (anstatt eingeben: Stockquote ( „AAPL“)
Ist das möglich??
Vielen Dank, Jungs, hat dieser Makro bereits meine Tage viel einfacher!
Vielen Dank. Sowohl für den Original-Artikel und Code und für Rene Mods.
Microsoft sollte wirklich als die Aktienkurse setzen eine integrierte Funktion für eine solche häufig verwendeten Daten. Und das nicht nur für die offene schließen hoch niedrig. Aber für viele der anderen Parameter als auch. Wie P / E, PEG, bid, fragen etc. Für beide aktuelle live und historischen Daten.
Nochmals vielen Dank alle für diesen sehr nützlich VBA-Makro.
Option hinzugefügt, für die Angabe, welcher Wert zurückzukehren (strFieldName As String):
Datum
Öffnen
Hoch
Niedrig
Schließen
Volumen
Adj Schließen
Oder Zellen Referenzen über die Parameter zur Verfügung zu stellen.
Option Compare Text
Funktion StockQuoteHistory (strTicker As String, Optional strFieldName As String, Optional dtDate As Variant)
'Datum ist optional - wenn weggelassen, heute verwenden. Wenn der Wert kein Datum ist, werfen Fehler.
Wenn IsMissing (dtDate) Then
dtDate = Datum
Sonst
Wenn nicht (IsDate (dtDate)) Then
StockQuoteHistory = CVErr (xlErrNum)
End If
End If
Wenn IsMissing (strFieldName) Oder strFieldName "=" Dann
strFieldName = "Schließen"
End If
Dim dtPrevDate As Date
Dim strURL As String, strCSV As String, strRows () As String, strColumns () As String
Dim Dbclose As Double
dtPrevDate = dtDate - 7
Stellen Sie http = Create ( "MSXML2.XMLHTTP")
http.Open "GET", strURL False
http.Send
strCSV = http.responseText
'Feldpositionen Index
Wenn (strFieldName = "Datum") Dann intFieldIndex = 0
Wenn (strFieldName = "Open") Dann intFieldIndex = 1
Wenn (strFieldName = "High") Dann intFieldIndex = 2
Wenn (strFieldName = "Low") Dann intFieldIndex = 3
Wenn (strFieldName = "Close") Then intFieldIndex = 4
Wenn (strFieldName = "Volume") Dann intFieldIndex = 5
Wenn (strFieldName = "Adj Close") Then intFieldIndex = 6
'Die letzte Information ist in Zeile 2, knapp unterhalb der Tabellenüberschriften.
"Der Preis in der Nähe ist der fünfte Eintrag
strRows () = Split (strCSV, Chr (10)) 'spaltete die CSV in Reihen
strColumns = Split (strRows (1) "") "aufgeteilt, um die entsprechende Zeile in Spalten. 1 bedeutet, 2. Reihe, bei Index beginnend 0
Dbclose = Val (strColumns (intFieldIndex)) '4 bedeutet: 5. Position, bei Index beginnend 0
"Debug.Print vbLf
'Debug.print strRows (1)
"Debug.Print "Dbclose:" - Dbclose
Stellen Sie http = Nothing
Funktion Stockquote (strTicker As String)
Rufen StockQuote2 (strTicker, ActiveCell.Offset (0, 1) .Address)
Funktion StockQuote2 (strSymbol As String, strDest As String)
Dim strURL As String
Mit ActiveSheet.QueryTables.Add (Anschluss: = "URL;" - strURL, Destination: = Range (strDest))
.PostText = ""
.RefreshStyle = xlOverwriteCells
.Savedata = True
.auffrischen
Ende mit
Ich bin mit zwei Makros 1 für die Preisentwicklung und einen für aktuellen Preis, mit was ich oben gesehen habe.
Alles lief gut, bis heute. Mein aktueller Preis (Stockquote) verlassen für mich arbeiten, und gibt nur 0. Ist das ein yahoo Problem? Hat sich etwas ändern? Noch nie hatte, bevor dieses Problem. Unten ist mein Code, den ich laufen:
Sub auto_open ()
rufen Sie ScheduleUpdateAll
End Sub
Sub ScheduleUpdateAll ()
TimeToRun = Now + ZeitWert ( "05: 0: 00") ‚Stellen Sie das Aktualisierungsintervall
Application.OnTime TimeToRun "UpdateAll"
End Sub
Sub UpdateAll ()
Application.CalculateFull
rufen Sie ScheduleUpdateAll
End Sub
Sub Auto_schließen ()
On Error Resume Next
Application.OnTime TimeToRun "UpdateAll". Falsch
End Sub
Funktion Stockquote (strTicker As String)
Dim strURL As String, strCSV As String
Dim Dbclose As Double
Stellen Sie http = Create ( "MSXML2.XMLHTTP")
http.Open "GET", strURL False
http.Send
strCSV = http.responseText
Dbclose = Val (strCSV)
Stockquote = Dbclose
Stellen Sie http = Nothing
Ich benutze auch diesen Code für historische Preise:
Funktion Stockprice (strTicker As String, Optional dtDate As Variant)
'Datum ist optional - wenn weggelassen, heute verwenden. Wenn der Wert kein Datum ist, werfen Fehler.
Wenn IsMissing (dtDate) Then
dtDate = Datum
Sonst
Wenn nicht (IsDate (dtDate)) Then
Stockprice = CVErr (xlErrNum)
End If
End If
Dim dtPrevDate As Date
Dim strURL As String, strCSV As String, strRows () As String, strColumns () As String
Dim Dbclose As Double
dtPrevDate = dtDate - 7
Stellen Sie http = Create ( "MSXML2.XMLHTTP")
http.Open "GET", strURL False
http.Send
strCSV = http.responseText
'Die letzte Information ist in Zeile 2, knapp unterhalb der Tabellenüberschriften.
"Der Preis in der Nähe ist der fünfte Eintrag
strRows () = Split (strCSV, Chr (10)) 'spaltete die CSV in Reihen
strColumns = Split (strRows (1) "") "aufgeteilt, um die entsprechende Zeile in Spalten. 1 bedeutet, 2. Reihe, bei Index beginnend 0
'Dbclose = strColumns (4) 4 bedeutet: 5. Position, beginnend bei Index 0
"Debug.Print vbLf
'Debug.print strRows (1)
"Debug.Print "Dbclose:" - Dbclose
Stellen Sie http = Nothing
Jede Hilfe, warum meine Stockquote Arbeits verlassen würde geschätzt.
Vielen Dank!