【发布时间】:2019-07-07 14:52:37
【问题描述】:
我写了一个宏去 WU 来获取历史数据,而且大部分情况下,它可以工作。但是,我认为宏运行速度太快,无法从网站上获取数据。
https://www.wunderground.com/history/daily/us/tx/el-paso/KELP/date/2017-1-3 我想要获取的网站和表格是否可以进行tablesaw-sortable。
我尝试了以下方法:DoEvents 和 Application.Wait (Now + TimeValue("00:00:01")) 尝试减慢进程。
Sub BrowseToWU()
Dim IE As New SHDocVw.InternetExplorer
Dim HTMLDoc As MSHTML.HTMLDocument
Dim RowAddress As Integer
Dim WebAddress As String
Dim DateSheet As Date
Dim WkDay As Integer
Dim DateSheetName As String
'Application.ScreenUpdating = False
'Application.StatusBar = True
RowAddress = 2
IE.Visible = True
Do Until RowAddress = 60
WebAddress = Range("A" & RowAddress)
DateSheet = Right(WebAddress, 8)
DateSheetName = Right(WebAddress, 8)
WkDay = Weekday(DateSheet, vbSunday)
If WkDay < 3 Then
RowAddress = RowAddress + 1
ElseIf WkDay > 6 Then
RowAddress = RowAddress + 1
Else
IE.Navigate WebAddress
Do While IE.ReadyState <> READYSTATE_COMPLETE
Loop
Set HTMLDoc = IE.Document
DoEvents
Application.Wait (Now + TimeValue("00:00:05"))
DoEvents
ProcessHTMLPage HTMLDoc
DateSheet = Right(WebAddress, 8)
DoEvents
Application.Wait (Now + TimeValue("00:00:01"))
ActiveSheet.Name = DateSheetName
DoEvents
RowAddress = RowAddress + 1
'IE.Quit
Worksheets("Sheet1").Activate
End If
Loop
End Sub
Option Explicit
Sub ProcessHTMLPage(HTMLPage As MSHTML.HTMLDocument)
Dim HTMLTable As MSHTML.IHTMLElement
Dim HTMLTables As MSHTML.IHTMLElementCollection
Dim HTMLRow As MSHTML.IHTMLElement
Dim HTMLCell As MSHTML.IHTMLElement
Dim RowNum As Long, ColNum As Integer
'Dim IE As New SHDocVw.InternetExplorer
'Dim Ws As Worksheet
Set HTMLTables = HTMLPage.getElementsByClassName("tablesaw-sortable")
'DoEvents
For Each HTMLTable In HTMLTables
Worksheets.Add
DoEvents
Range("A1").Value = HTMLTable.className
Range("B1").Value = Now
RowNum = 2
For Each HTMLRow In HTMLTable.getElementsByTagName("tr")
'Debug.Print vbTab & HTMLRow.innerText
ColNum = 1
For Each HTMLCell In HTMLRow.Children
Cells(RowNum, ColNum) = HTMLCell.innerText
ColNum = ColNum + 1
Next HTMLCell
RowNum = RowNum + 1
Next HTMLRow
Next HTMLTable
DoEvents
'IE.Quit
End Sub
如果满足一周中某一天的条件,该宏应该通过 sheet1 获取历史数据的网址。
IE 将打开,然后跳转到下一个接收数据的模块。
创建一个新工作表并将数据粘贴到新工作表中。
工作表重命名为数据的日期。
网址表再次激活,流程重新开始。
我得到的错误是数据不是取自网站,所以For语句结束,网址表被重命名,出现错误。
【问题讨论】:
-
哪一行出现错误,错误信息是什么?是否可以将上面的代码减少到仅足以重现问题的行数?
-
我相信 ProcessHTMLPage HTMLDoc 启动时会发生错误。当它切换到该子程序时,什么也没有被拾取。我不确定是否可以减少代码。
-
所以没有错误信息?如果出现错误消息,则单击调试时应突出显示代码行(取决于您的错误处理设置)。
-
从使用适当的页面加载等待开始。 While ie.Busy 或 ie.readyState
-
这一切都取决于研究所需的数据。可能有一个月的周二至周四或一整年。