There is no WinHttopRequest in “References” on Mac version of Excel 2011. I have tried following approaches which I have seen in other posts:
Set HTTP = CreateObject("MSXML2.ServerXMLHTTP")
which gives me a ‘429’ runtime error: ActiveX controller can’t create object.
Is there a way to use WinHttpRequest or something similar on Mac Excel? I have had no luck with query tables either, and want to avoid that solution.
There should be a simple http GET solution to this problem I would think. Just cant find it out for Mac Excel.
I am trying to get data from Yahoo Finance api url:
Dim URL As String: URL = "http://finance.yahoo.com/d/quotes.csv?s=" & Symbols & "&f=snl1hg" Dim HTTP As New WinHttpRequest HTTP.Open "GET", URL, False HTTP.Send
I know this works on windows, but I am using a Mac. Please advise. Thanks!
You can use QueryTables in place of the HTTP Get call (WinHttopRequest), which evidently is not supported by Mac Excel 2011. The code below worked for me – enter the tickers in column, starting with A2, enter yahoo finance tags (i.e. a,b, r, n) in row starting with B1.
You can assemble the URL to call YF for the csv, then use a QueryTable to make the call and paste the results in your worksheet.
Code working on Mac Excel 2011:
Sub Yahoo_Finance_API_Call_MacExcel2011() Dim head As Range Set head = Range("A1") Dim wb As Workbook 'In the event that you'll use different workbooks Dim src As Worksheet 'In the event that you'll use different a source worksheet Dim tgt As Worksheet 'In the event that you'll use different a target worksheet Set wb = ThisWorkbook Set src = wb.Sheets("Sheet1") Set tgt = wb.Sheets("Sheet1") 'Assemble Symbols for API Call Set rng = Range(head.Offset(1, 0), head.Offset(1, 0).End(xlDown)) For Each cell In rng ' Starting from a cell below the head cell till the last filled cell Symbols = Symbols & cell.Value & "+" Next cell Symbols = Left(Symbols, Len(Symbols) - 1) ' Remove the last '+' 'Assemble Tags or API Call Set rng = Range(head.Offset(0, 1), head.Offset(0, 1).End(xlToRight)) For Each cell In rng ' Starting from a cell to the right of the head cell till the last filled cell tags = tags & cell.Value Next cell 'Build URL URL = "TEXT;http://finance.yahoo.com/d/quotes.csv?s=" 'Use TEXT to collect API data below URL = URL & Symbols & "&f=" & tags 'Range("A1").Value = URL 'This will output the assembled URL in a1 for QA if need be 'Call API With tgt.QueryTables.Add(Connection:= _ URL, _ Destination:=Range(head.Offset(1, 1), head.Offset(1, 1).End(xlDown))) .RefreshStyle = xlOverwriteCells .TextFileParseType = xlDelimited .TextFileCommaDelimiter = True .BackgroundQuery = True .TextFileCommaDelimiter = True .TablesOnlyFromHTML = True .Refresh BackgroundQuery:=False .TextFilePromptOnRefresh = False .TextFileStartRow = 1 .TextFileParseType = xlDelimited .TextFileTextQualifier = xlTextQualifierDoubleQuote .TextFileConsecutiveDelimiter = False .TextFileTabDelimiter = False .TextFileSemicolonDelimiter = False .TextFileSpaceDelimiter = False .TextFileTextQualifier = xlTextQualifierDoubleQuote .SaveData = False End With End Sub
I do not believe Macs have anything equivalent to MSXML.ServerXMLHTTP. A suggestion from another stackoverflow thread is to use QueryTables. In summary the thread suggests:
With ActiveSheet.QueryTables.Add(Connection:="URL;http://carbon.brighterplanet.com/flights.txt", Destination:=Range("A2")) .PostText = "origin_airport=MSN&destination_airport=ORD" .RefreshStyle = xlOverwriteCells .SaveData = True .Refresh End With