我使用两种技术来处理 "VBA"。我将逐一介绍它们。
1) 使用 FireFox / Firebug Addon / Fiddler
2) 使用 Excel 内置的从 Web 获取数据的功能
由于此帖子将被许多人阅读,因此我将涵盖显而易见的内容。如果您已经知道,请随意跳过相关部分。
1) 使用 FireFox / Firebug Addon / Fiddler
FireFox: http://en.wikipedia.org/wiki/Firefox
免费下载 (http://www.mozilla.org/en-US/firefox/new/)
Firebug Addon: http://en.wikipedia.org/wiki/Firebug_%28software%29
免费下载 (https://addons.mozilla.org/en-US/firefox/addon/firebug/)
Fiddler: http://en.wikipedia.org/wiki/Fiddler_%28software%29
免费下载 (http://www.fiddler2.com/fiddler2/)
安装 Firefox 后,再安装 Firebug Addon。Firebug Addon 可让您检查网页中的不同元素。例如,如果您想知道按钮的名称,只需右键单击该按钮,然后单击“使用 Firebug 检查元素”,它将为您提供所需的所有详细信息。
![enter image description here](https://istack.dev59.com/2r9fr.webp)
另一个例子是查找包含所需数据的网站上的表格名称。
我仅在使用 XMLHTTP 时使用 Fiddler。当您单击按钮时,它可以帮助您查看传递的确切信息。由于爬取网站的 BOT 数量增加,大多数网站现在都会捕获您的鼠标坐标并传递该信息,而 Fiddler 实际上可帮助您调试正在传递的信息。我不会在这里详细介绍它,因为这些信息可能被用于恶意行为。
现在让我们以您的问题发布的 URL 为例,演示如何简单地进行数据获取。
http://www.espncricinfo.com/big-bash-league-2011/engine/match/524915.html
首先让我们找到包含信息的表的名称。只需右键单击该表并单击“使用Firebug检查元素”,就会给您以下快照。
![enter image description here](https://istack.dev59.com/RGFct.webp)
现在,我们知道我们的数据存储在名为“inningsBat1”的表中。如果我们可以将该表的内容提取到Excel文件中,那么我们肯定可以处理数据以进行分析。这是一个示例代码,可将该表转储到Sheet1中
在继续之前,我建议关闭所有Excel并启动新实例。
启动VBA并插入Userform。放置一个命令按钮和一个webcrowser控件。您的Userform可能看起来像这样
![enter image description here](https://istack.dev59.com/A2h1w.webp)
将此代码粘贴到用户窗体代码区域中
Option Explicit
'~~> Set Reference to Microsoft HTML Object Library
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub CommandButton1_Click()
Dim URL As String
Dim oSheet As Worksheet
Set oSheet = Sheets("Sheet1")
URL = "http://www.espncricinfo.com/big-bash-league-2011/engine/match/524915.html"
PopulateDataSheets oSheet, URL
MsgBox "Data Scrapped. Please check " & oSheet.Name
End Sub
Public Sub PopulateDataSheets(wsk As Worksheet, URL As String)
Dim tbl As HTMLTable
Dim tr As HTMLTableRow
Dim insertRow As Long, Row As Long, col As Long
On Error GoTo whoa
WebBrowser1.navigate URL
WaitForWBReady
Set tbl = WebBrowser1.Document.getElementById("inningsBat1")
With wsk
.Cells.Clear
insertRow = 0
For Row = 0 To tbl.Rows.Length - 1
Set tr = tbl.Rows(Row)
If Trim(tr.innerText) <> "" Then
If tr.Cells.Length > 2 Then
If tr.Cells(1).innerText <> "Total" Then
insertRow = insertRow + 1
For col = 0 To tr.Cells.Length - 1
.Cells(insertRow, col + 1) = tr.Cells(col).innerText
Next
End If
End If
End If
Next
End With
whoa:
Unload Me
End Sub
Private Sub Wait(ByVal nSec As Long)
nSec = nSec + Timer
While Timer < nSec
DoEvents
Sleep 100
Wend
End Sub
Private Sub WaitForWBReady()
Wait 1
While WebBrowser1.ReadyState <> 4
Wait 3
Wend
End Sub
现在运行您的用户窗体并单击命令按钮。您会注意到数据被转储在Sheet1中。请参见快照
![enter image description here](https://istack.dev59.com/LeCHZ.webp)
同样,您也可以抓取其他信息。
2) 使用Excel内置的从Web获取数据功能
我相信您正在使用Excel 2007,因此我将以此为例来爬取上述链接。
导航到Sheet2。现在导航到数据选项卡,然后单击极右侧的“从Web”按钮。请参见快照。
![enter image description here](https://istack.dev59.com/Xb266.webp)
在“新网络查询窗口”中输入网址,然后点击“Go”
页面上传后,通过单击快照中显示的小箭头选择要导入的相关表格。完成后,单击“导入”
![enter image description here](https://istack.dev59.com/0PFhz.webp)
然后Excel会问您要将数据导入哪里。选择相关单元格,然后单击“确定”。你就完成了!数据将被导入到您指定的单元格中。
如果您希望,您可以记录宏并自动化此过程 :)
这是我记录的宏。
Sub Macro1()
With ActiveSheet.QueryTables.Add(Connection:= _
"URL;http://www.espncricinfo.com/big-bash-league-2011/engine/match/524915.html" _
, Destination:=Range("$A$1"))
.Name = "524915"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlSpecifiedTables
.WebFormatting = xlWebFormattingNone
.WebTables = """inningsBat1"""
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
End With
End Sub
希望这可以帮到你。如果你还有疑问,请告诉我。 Sid