I am running a macro that grabs info from Yahoo. The macro is working fine except when it encounters two particular situations.
The macro is designed to grab a closing stock price for a date specified for a list of Symbols in column A and the date in column B. The closing price is then displayed in column D.
The problems (there are two that I found) I am running into is that when the Macro encounters a symbol in Column A and is not recognized, an error message pops up and the macro stops altogether. I want the macro to continue to run down the list but I can't figure out where in the macro it is stopping and, more importantly, how to make it continue. Any help is appreciated. I have attached a copy of file if needed (if opened, you can see it stops working after row 11). Thanks
The other issue, which is related to the first issue somewhat is if the macro runs into an invalid date in column B (e.g. the user may enter a date that is for a Saturday or Sunday in which Yahoo would not have any data). This also causes the macro to stop.
Private Sub CommandButton1_Click()
Application.ScreenUpdating = False
Dim HSDFY As HistoricalStockDataFromYahoo
Dim rs As ADODB.Recordset
Dim i As Long
Dim j As Integer
Dim lastrow As Integer
On Error GoTo Err_CommandButton1_Click
Range("C2:D" & Rows.Count).ClearContents
i = 2
lastrow = Range("A" & Rows.Count).End(xlUp).Row
For j = 2 To lastrow
Set HSDFY = New HistoricalStockDataFromYahoo
Set rs = HSDFY.GetHistoricalData(Cells(j, 1).Value, Cells(j, 2).Value, Cells(j, 2).Value)
rs.MoveFirst
Cells(j, 3).CopyFromRecordset rs
i = i + 1
Next j
Exit Sub
Err_CommandButton1_Click:
Select Case Err.Number
Case 10000
MsgBox Err.Description
Case 10001
'invalid interval
MsgBox Err.Description
Case 10002
'query failed
MsgBox Err.Description
End Select
Application.ScreenUpdating = True
End Sub
Option Explicit
'Grabs Yahoo historical stock data
'requires Microsoft ActiveX Data Objects 2.6 or later
Private pWinHttpRequest As WinHttp.WinHttpRequest
Friend Function GetHistoricalData(Symbol As String, _
Optional FromDate As Date = #12:00:00 AM#, _
Optional ToDate As Date = #12:00:00 AM#, _
Optional Interval As String = "Daily") As ADODB.Recordset
Dim URL As String, ResponseText As String
Dim pRecordSet As ADODB.Recordset
Dim DateString As String, IntervalString As String
Dim RTS() As String, RTFI
Dim x As Long
If FromDate <> #12:00:00 AM# Or ToDate <> #12:00:00 AM# Then
If FromDate = 0 And ToDate > 0 Then
FromDate = #1/1/1900#
ElseIf FromDate > 0 And ToDate = 0 Then
ToDate = Date
End If
DateString = "&a=" & Format(Month(FromDate) - 1, "00") & "&b=" _
& Format(FromDate, "DD") & "&c=" & Format(FromDate, "YYYY") & _
"&d=" & Format(Month(ToDate) - 1, "00") & "&e=" _
& Format(ToDate, "DD") & "&f=" & Format(ToDate, "YYYY")
End If
URL = "http://ichart.finance.yahoo.com/table.csv?s=" & Symbol & DateString & IntervalString
pWinHttpRequest.Open "GET", URL, False
pWinHttpRequest.Send
ResponseText = pWinHttpRequest.ResponseText
If InStr(ResponseText, "<title>Yahoo! - 404 Not Found</title>") Then
Err.Raise 10002, "HistoricalStockDataFromYahoo.GetHistoricalData", _
"Invalid Search Parameters or other error. No data was returned."
End If
Set pRecordSet = New ADODB.Recordset
pRecordSet.Fields.Append "Date", adDBDate
pRecordSet.Fields.Append "Close", adCurrency
pRecordSet.Open
RTS = Split(ResponseText, Chr(10))
For x = LBound(RTS) + 1 To UBound(RTS)
If RTS(x) <> "" Then
RTFI = Split(RTS(x), ",")
pRecordSet.AddNew Array("Date", "Close"), _
Array(RTFI(0), RTFI(4))
pRecordSet.Update
End If
Next x
pRecordSet.MoveFirst
Set GetHistoricalData = pRecordSet
End Function
Private Sub Class_Initialize()
On Error Resume Next
Set pWinHttpRequest = New WinHttpRequest
If pWinHttpRequest Is Nothing Then
Err.Raise 10000, "HistoricalStockDataFromYahoo.Class_Initialize", _
"Could not create WinHttp.WinHttpRequest object..."
End If
End Sub
Bookmarks