首页 > 解决方案 > Excel从网站中提取多个表格

问题描述

我正在做一个项目来运行一些关于 NFL 球员统计数据的分析模型。我下面有一些代码,另一个用户传递给我。此代码获取我在 Sheet1 上名为“PlayerList”的链接列表,并为每个玩家创建一个新选项卡并获取他们的传球数据。所有链接都指向职业足球参考。我可以更改此代码以提取除四分卫以外的所有位置的所有必要数据。对于 QB,我想拉出传球统计表以及冲球和接球统计表。任何帮助将不胜感激。此处提供一些示例链接供参考:

https://www.pro-football-reference.com/players/R/RodgAa00.htm https://www.pro-football-reference.com/players/B/BreeDr00.htm

下面是代码:

Option Explicit
Public Sub GetInfo()
    Di  If InStr(links(link, 1), "https://") > 0 Then
            Set html = GetHTMLDoc(links(link, 1))
            Set hTable = html.getElementById("passing")
            If Not hTable Is Nothing Then
                playerName = GetNameAbbr(links(link, 1))
                Set ws = AddPlayerSheet(playerName)
                WriteTableToSheet hTable, ws
                FixTable ws
            End If
        End If
    Next
    Application.ScreenUpdating = True
End Sub

Public Function GetHTMLDoc(ByVal url As String) As HTMLDocument
    Dim sResponse As String, html As New HTMLDocument
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", url, False
        .send
        sResponse = StrConv(.responseBody, vbUnicode)
    End With
    sResponse = Mid$(sResponse, InStr(1, sResponse, "<!DOCTYPE "))
    html.body.innerHTML = sResponse
    Set GetHTMLDoc = html
End Function

Public Sub WriteTableToSheet(ByVal hTable As HTMLTable, ByVal ws As Worksheet)
    Dim x As Long, y As Long
    With hTable
        For x = 0 To .Rows.Length - 1
            For y = 0 To .Rows(x).Cells.Length - 1
                If y = 6 Or y = 7 Then
                    ws.Cells(x + 4, y + 1).Value = Chr$(39) & .Rows(x).Cells(y).innerText
                Else
                    ws.Cells(x + 4, y + 1).Value = .Rows(x).Cells(y).innerText
                End If
            Next y
        Next x
    End With
End Sub

Public Function GetNameAbbr(ByVal url As String)
    Dim tempArr() As String
    tempArr = Split(url, "/")
    GetNameAbbr = Left$(tempArr(UBound(tempArr)), 6)
End Function

Public Function AddPlayerSheet(ByVal playerName As String) As Worksheet
    Dim ws As Worksheet
    If SheetExists(playerName) Then
        Application.DisplayAlerts = False
        ThisWorkbook.Worksheets(playerName).Delete
        Application.DisplayAlerts = True
    End If
    Set ws = ThisWorkbook.Worksheets.Add
    ws.Name = playerName
    Set AddPlayerSheet = ws
End Function

Public Function SheetExists(ByVal playerName As String) As Boolean
    SheetExists = Evaluate("ISREF('" & playerName & "'!A1)")
End Function

Public Sub FixTable(ByVal ws As Worksheet)
    Dim found As Range, numSummaryRows As Long
    With ws
        Set found = .Columns("A").Find("Career")
        If found Is Nothing Then Exit Sub
        numSummaryRows = .Cells(.Rows.Count, "A").End(xlUp).Row - found.Row
        numSummaryRows = IIf(numSummaryRows = 0, 1, numSummaryRows + 1)
        Debug.Print found.Offset(, 1).Resize(numSummaryRows, 30).Address, ws.Name
        found.Offset(, 1).Resize(numSummaryRows, 30).Copy found.Offset(, 2)
        found.Offset(, 1).Resize(numSummaryRows, 1).ClearContents
    End With
End Subm html As New HTMLDocument, links(), link As Long, wsSourceSheet As Worksheet
    Dim hTable As HTMLTable, ws As Worksheet, playerName As String
    Set wsSourceSheet = ThisWorkbook.Worksheets("PlayerList")
    Application.ScreenUpdating = False
    With wsSourceSheet
        links = .Range("C2:C" & .Cells(.Rows.Count, "C").End(xlUp).Row).Value
    End With
    For link = LBound(links, 1) To UBound(links, 1)

标签: excelvba

解决方案


您是否有理由需要使用 VBA 执行此操作?Excel 非常有能力导入组织良好的数据,例如该页面上的 [几个] 表。

数据选项卡下,单击From Web然后输入网站 URL。

图像
点击图片放大

接下来,您将选择所需的表。不要发疯 - 只得到你需要的,但你可以通过启用复选框来选择多个表。

图像

解析和组织页面上的所有数据可能需要几分钟的时间...

图像

回到工作表后,您会在右侧看到查询。右键单击查询并选择Load To...,然后选择Table表数据的位置。您可以自定义大量其他属性;有一些教程描述了你可以做什么。

图像

更多要自定义的内容隐藏在两个功能区选项卡中,仅当您单击表格时才会出现设计查询

图像

我认为还有一种方法可以创建玩家列表,然后Advanced在输入 URL 时使用该选项以允许您动态选择所需的任何玩家,同时只添加一次表格......我从来没有想过那部分还没出来。

我不是体育迷,但我认为数据会在整个赛季中发生变化,使用这样的表格的一个好处是,一旦您按照自己的方式设置工作表,您可以选择自动设置一些设置 -每次打开工作簿时更新,或按计划更新,或手动更新,或从不更新;任何合适的。

谷歌“ Excel 网络查询”以了解更多关于使用查询(又名:“获取和转换”)提取和组织数据时可用的选项。

也许这可以作为替代方案来考虑,而不是已经内置在 Excel 中的编码功能。

祝你好运,“去运动!”

图像


推荐阅读