excel vba http请求从yahoo finance下载数据
我正在制作一个程序,我用excelvba写的更快 该程序从澳大利亚证券交易所下载股票市场数据 我想从2个URL获取数据: 我的代码excel vba http请求从yahoo finance下载数据,excel,vba,yahoo,yql,Excel,Vba,Yahoo,Yql,我正在制作一个程序,我用excelvba写的更快 该程序从澳大利亚证券交易所下载股票市场数据 我想从2个URL获取数据: 我的代码 url2 = "http://ichart.finance.yahoo.com/table.txt?s=bhp.ax" Set XMLHTTP = CreateObject("WinHttp.WinHttpRequest.5.1") XMLHTTP.Open "GET", url2, False XMLHTTP.send result = XMLHTTP.r
url2 = "http://ichart.finance.yahoo.com/table.txt?s=bhp.ax"
Set XMLHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
XMLHTTP.Open "GET", url2, False
XMLHTTP.send
result = XMLHTTP.responseText
ActiveCell.Value = result
Set XMLHTTP = Nothing
URL 1. http://ichart.finance.yahoo.com/table.txt?s=bhp.ax
我的问题。
这个文件很大。我认为我可以简单地存储这些http请求的结果,并将其打印到调试窗口或直接打印到单元格中。然而,这些方法似乎切断了部分数据
如果我从notepad++中的url 2下载txt文件,它几乎有200000个字符
但它的数量在3000到5000之间。处理这些请求的最佳方法是什么,以便捕获所有数据并在以后解析它们
网址2。从第一个URL中,我只需要YQL查询结果的JSON数据
我的问题
我不知道在您访问下面的链接时如何仅获取json数据,或者如何存储它以避免URL 1(缺少数据)出现问题
*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20%28%22bhp.ax%22%29
非常感谢,Josh。试试这个修改后的代码
Sub GetYahooFinanceTable()
Dim sURL As String, sResult As String
Dim oResult As Variant, oData As Variant, R As Long, C As Long
sURL = "http://ichart.finance.yahoo.com/table.txt?s=bhp.ax"
Debug.Print "URL: " & sURL
sResult = GetHTTPResult(sURL)
oResult = Split(sResult, vbLf)
Debug.Print "Lines of result: " & UBound(oResult)
For R = 0 To UBound(oResult)
oData = Split(oResult(R), ",")
For C = 0 To UBound(oData)
ActiveSheet.Cells(R + 1, C + 1) = oData(C)
Next
Next
Set oResult = Nothing
End Sub
Function GetHTTPResult(sURL As String) As String
Dim XMLHTTP As Variant, sResult As String
Set XMLHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
XMLHTTP.Open "GET", sURL, False
XMLHTTP.Send
Debug.Print "Status: " & XMLHTTP.Status & " - " & XMLHTTP.StatusText
sResult = XMLHTTP.ResponseText
Debug.Print "Length of response: " & Len(sResult)
Set XMLHTTP = Nothing
GetHTTPResult = sResult
End Function
这会将数据拆分为行,以便单元格中不会达到最大文本长度。此外,这还进一步将带有逗号的数据拆分为相应的列
您可能希望尝试以下源代码 我只是将qurl变量修改为您的url,它就工作了,它将4087行数据输入到我的excel工作表中,格式很好,没有任何问题。 只需将sheet1命名为Data
Sub GetData()
Dim DataSheet As Worksheet
Dim EndDate As Date
Dim StartDate As Date
Dim Symbol As String
Dim qurl As String
Dim nQuery As Name
Dim LastRow As Integer
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.Calculation = xlCalculationManual
Sheets("Data").Cells.Clear
Set DataSheet = ActiveSheet
' StartDate = DataSheet.Range("startDate").Value
' EndDate = DataSheet.Range("endDate").Value
' Symbol = DataSheet.Range("ticker").Value
' Sheets("Data").Range("a1").CurrentRegion.ClearContents
' qurl = "http://ichart.finance.yahoo.com/table.csv?s=" & Symbol
' qurl = qurl & "&a=" & Month(StartDate) - 1 & "&b=" & Day(StartDate) & _
' "&c=" & Year(StartDate) & "&d=" & Month(EndDate) - 1 & "&e=" & _
' Day(EndDate) & "&f=" & Year(EndDate) & "&g=" & Sheets("Data").Range("a1") & "&q=q&y=0&z=" & _
' Symbol & "&x=.csv"
qurl = "http://ichart.finance.yahoo.com/table.txt?s=bhp.ax"
Debug.Print qurl
QueryQuote:
With Sheets("Data").QueryTables.Add(Connection:="URL;" & qurl, Destination:=Sheets("Data").Range("a1"))
.BackgroundQuery = True
.TablesOnlyFromHTML = False
.Refresh BackgroundQuery:=False
.SaveData = True
End With
Sheets("Data").Range("a1").CurrentRegion.TextToColumns Destination:=Sheets("Data").Range("a1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
Semicolon:=False, Comma:=True, Space:=False, other:=False
Sheets("Data").Columns("A:G").ColumnWidth = 12
LastRow = Sheets("Data").UsedRange.Row - 2 + Sheets("Data").UsedRange.Rows.Count
Sheets("Data").Sort.SortFields.Add Key:=Range("A2"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With Sheets("Data").Sort
.SetRange Range("A1:G" & LastRow)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
.SortFields.Clear
End With
End Sub
(以上不是我的代码,它取自他们在上面的excel.net链接上发布的excel文件)问题出在拆分部分之前。也就是说,如果手动下载文档,则该文件中包含的数据(字符数类似于200k)比存储=XMLHTTP.ResponseText的sResult变量多。(其中字符数为18k)有什么想法吗?我刚刚测试了代码并从Chrome下载,长度是相同的(发表此评论时为188066行,共3927行)。您是如何测试代码的?我不能让这条线工作?oData=Split(oResult(R),“,”)谢谢我让代码正常工作,太好了!我通过修改以下代码使代码正常工作:将R=0修改为UBound(oArray)和oArray=Split(sResult,vbLf)