You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用VBA提取网页嵌套div内表格信息?解决类型不匹配错误

解决VBA错误13:类型不匹配并提取div内表格信息

首先,你遇到的错误13:类型不匹配大概率是因为点击查询按钮后,页面还没完成加载就尝试获取PPosition元素,或者变量声明不够严谨导致的。咱们一步步来修正代码,同时实现提取列车号、始发状态等信息的需求:

第一步:完善变量声明与页面等待逻辑

原代码里Doc没有指定类型,而且点击按钮后缺少等待页面加载的步骤,这会导致元素还未渲染就被调用,触发类型不匹配错误。建议添加明确的类型处理(后期绑定无需额外引用库),同时在点击后增加等待循环。

第二步:提取表格数据的核心逻辑

找到PPosition div后,它里面的表格是我们的目标。我们需要遍历表格的每一行和每一列,通过关键字筛选出列车号、始发状态等关键信息(根据示例集装箱号TCNU4171692的查询结果,这些信息在表格的特定行中)。

修正后的完整代码

Sub GetContainerStatus()
    Dim IE As Object
    Dim Doc As Object ' 后期绑定,无需引用HTML库;若提前引用可改为HTMLDocument
    Dim containerNo As String
    Dim targetDiv As Object
    Dim table As Object
    Dim row As Object
    Dim cell As Object
    
    ' 初始化IE对象
    Set IE = CreateObject("InternetExplorer.Application")
    IE.Visible = True
    
    ' 导航到目标页面
    IE.navigate "http://www.concorindia.com/containerquery.aspx"
    
    ' 等待页面初始加载完成
    Do While IE.Busy Or IE.readyState <> 4
        Application.Wait DateAdd("s", 1, Now)
    Loop
    
    Set Doc = IE.document
    containerNo = ThisWorkbook.Sheets("Status").Range("B3").Value
    
    ' 输入集装箱号并点击查询
    Doc.getElementById("contno").Value = containerNo
    Doc.getElementById("CONTButton1").Click
    
    ' 等待查询结果加载完成(关键!点击后页面会刷新,必须等渲染完成)
    Do While IE.Busy Or IE.readyState <> 4
        Application.Wait DateAdd("s", 1, Now)
    Loop
    
    ' 获取目标div,增加错误处理避免找不到元素时报错
    On Error Resume Next
    Set targetDiv = Doc.getElementById("PPosition")
    On Error GoTo 0
    
    If Not targetDiv Is Nothing Then
        ' 获取div内的第一个表格(假设目标数据在这个表格里)
        Set table = targetDiv.getElementsByTagName("table")(0)
        
        ' 遍历表格行,提取关键信息
        For Each row In table.Rows
            For Each cell In row.Cells
                ' 根据关键字定位列车号
                If InStr(cell.innerText, "Train No.") > 0 Then
                    ThisWorkbook.Sheets("Status").Range("C3").Value = row.Cells(1).innerText
                ' 根据关键字定位始发状态
                ElseIf InStr(cell.innerText, "Origin Status") > 0 Then
                    ThisWorkbook.Sheets("Status").Range("D3").Value = row.Cells(1).innerText
                End If
            Next cell
        Next row
    Else
        MsgBox "未找到查询结果,请检查集装箱号是否正确!"
    End If
    
    ' 清理对象,释放资源
    IE.Quit
    Set IE = Nothing
    Set Doc = Nothing
    Set targetDiv = Nothing
    Set table = Nothing
End Sub

关键说明

  • 页面等待:点击查询按钮后必须再次等待页面加载,因为按钮触发了新的请求,页面会重新渲染内容,这是原代码最容易忽略的核心点。
  • 健壮性处理:用On Error Resume Next防止找不到PPosition div时直接报错,让代码更稳定。
  • 灵活调整:如果表格结构有变化,你可以修改关键字判断逻辑或单元格索引,适配不同的信息位置。

内容的提问来源于stack exchange,提问作者user11669760

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:25:16