2017-04-20 6 views
0

Ich habe ein kleines Excel VBA-Makro, das den Lagerwert für eine bestimmte Firma an einem bestimmten Tag abruft. Die Firma wird spezifiziert, indem ihr Aktiensymbol ("AZO" für AutoZone, "WMT" für Wal-Mart, usw.) übergeben wird, und das Datum ist ein tatsächlicher Datumswert, der von einer benachbarten Zelle abgerufen wird.Excel VBA-Makro funktioniert nicht mehr (Mögliches Problem mit http.Send)

Es hat seit 2,5 Jahren wunderbar funktioniert, aber diese Woche hat es einfach aufgehört zu arbeiten, obwohl ich überhaupt nichts geändert habe. Wenn das Makro einen Wert zurückgeben soll, wird jetzt nur #WERT zurückgegeben !. Wenn ich den Code durchgehe, funktioniert alles gut, bis ich zur .Send() komme, wo es einfach aufhört (keine Fehlermeldungen oder Hinweise darauf, was schief gelaufen ist; es hört einfach auf, als ob die Ausführung beendet wäre). Ich habe versucht, eine On Error-Klausel hinzuzufügen, aber es wird nicht getroffen. Hinweis: Ich denke, es macht keinen Unterschied, aber ursprünglich hatte ich http.Send ohne Klammern, aber ich sah viele Beispiele mit (""), also fügte ich hinzu, aber es scheint keinen Effekt zu haben.

Meine VBA-Erfahrung ist sehr begrenzt, so dass ich gehofft hatte, dass jemand mich in die richtige Richtung zeigen könnte.

Code:

Function StockQuote(strTicker As String, Optional dtDate As Variant) 
' Date is optional - if omitted, use today. If value is not a date, throw error. 
If IsMissing(dtDate) Then 
dtDate = Date 
Else 
If Not (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 

' Compile the request URL with start date and end date 
strURL = "http://ichart.finance.yahoo.com/table.csv?s=" & strTicker & _ 
"&a=" & Month(dtPrevDate) - 1 & _ 
"&b=" & Day(dtPrevDate) & _ 
"&c=" & Year(dtPrevDate) & _ 
"&d=" & Month(dtDate) - 1 & _ 
"&e=" & Day(dtDate) & _ 
"&f=" & Year(dtDate) & _ 
"&g=d&ignore=.csv" 

Set http = CreateObject("MSXML2.XMLHTTP") 
http.Open "GET", strURL, False 
http.Send ("") 
strCSV = http.responseText 

' The most recent information is in row 2, just below the table headings. 
' The price close is the 5th entry 
strRows() = Split(strCSV, Chr(10)) ' split the CSV into rows 
strColumns = Split(strRows(1), ",") ' split the relevant row into columns. 1 means 2nd row, starting at index 0 
dbClose = strColumns(4) ' 4 means: 5th position, starting at index 0 

StockQuote = dbClose 

Set http = Nothing 

End Function 
+0

scheint 'Yahoo' in 21. Jahrhundert angekommen ist und verwendet nun verschlüsselt' HTTP' - 'HTTPS'. Versuchen Sie 'strURL =" https://ichart.finance.yahoo.com/table.csv?s= "& strTicker & _' ... –

+0

Buchstäblich ein Buchstabe behebt alles ... Zahlen. Danke für die Hilfe! – jheaton3

Antwort

0

Ran in das gleiche Problem heute mit VBA-Code, der seit vielen Jahren gearbeitet hat, in Ordnung. Dank dieses Posts konnte ich es nicht nur mit https wieder zum Laufen bringen. Aber ich kann auch die zugrunde liegende Ursache kennen.

Glauben Sie, die zugrunde liegende Ursache kann vielleicht sein, dass finance.yahoo.com HSTS aktiviert hat. Dies würde bedeuten, dass die Website einmal mit https besucht wurde. Die Verwendung von https wird für alle zukünftigen Anfragen durchgesetzt.

HTTP Strict Transport Security https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security