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

批量导入Excel中GSTIN至指定网站,解决Captcha与数据提取难题

批量处理GSTIN电子发票资格查询优化方案

问题背景

需要从Excel批量读取GSTIN(如27AABCC6610Q1ZE、09AAFCS7675H1ZS等,数千条),在指定网站完成查询:

  • 自动填入GSTIN
  • 若无法自动处理验证码,预留15秒手动输入时间
  • 提取并保存查询结果

原代码问题

原代码存在多处逻辑缺陷:

  • 用Shell打开Chrome但后续调用IE对象,两者不兼容
  • 未初始化IE浏览器实例
  • 循环逻辑错误,未移动到下一个单元格
  • 无验证码等待后的确认步骤,未处理结果提取
  • 未处理页面加载等待,直接操作DOM会报错

优化后的VBA代码

Sub BatchGSTIN_EInvoiceCheck()
    Dim IE As Object
    Dim ws As Worksheet
    Dim currentRow As Long
    Dim gstinInput As Object
    Dim captchaWaitTime As Date
    Dim resultElements As Object
    Dim i As Integer
    
    ' 初始化工作表和起始行
    Set ws = ThisWorkbook.ActiveSheet
    currentRow = 2 ' GSTIN从A2开始
    
    ' 创建IE实例并打开目标网站
    Set IE = CreateObject("InternetExplorer.Application")
    With IE
        .Visible = True
        .Navigate "https://einvoice1.gst.gov.in/Others/EinvEnabled"
        ' 等待页面加载完成
        Do While .Busy Or .ReadyState <> 4
            DoEvents
        Loop
    End With
    
    ' 循环处理每一条GSTIN
    Do Until ws.Cells(currentRow, 1).Value = ""
        ' 定位GSTIN输入框并填入数据
        Set gstinInput = IE.document.getElementById("GSTIN")
        If Not gstinInput Is Nothing Then
            gstinInput.Value = ws.Cells(currentRow, 1).Value
        Else
            MsgBox "未找到GSTIN输入框,终止处理", vbCritical
            IE.Quit
            Set IE = Nothing
            Exit Sub
        End If
        
        ' 预留15秒手动输入验证码
        captchaWaitTime = Now + TimeValue("00:00:15")
        MsgBox "请在15秒内输入验证码并点击Next,完成后点击确定继续", vbInformation
        Do Until Now >= captchaWaitTime
            DoEvents
        Loop
        
        ' 等待结果页面加载
        Do While IE.Busy Or IE.ReadyState <> 4
            DoEvents
        Loop
        
        ' 提取结果数据(示例:提取页面关键信息,需根据实际页面结构调整)
        On Error Resume Next
        Set resultElements = IE.document.getElementsByTagName("td")
        If Not resultElements Is Nothing Then
            ' 将结果写入B列、C列等,根据实际字段调整
            For i = 0 To resultElements.Length - 1
                Select Case resultElements(i).innerText
                    Case "Legal Name": ws.Cells(currentRow, 2).Value = resultElements(i + 1).innerText
                    Case "E-Invoice Enabled": ws.Cells(currentRow, 3).Value = resultElements(i + 1).innerText
                    Case "Validity Period": ws.Cells(currentRow, 4).Value = resultElements(i + 1).innerText
                End Select
            Next i
        End If
        On Error GoTo 0
        
        ' 返回查询页面,准备下一条GSTIN
        IE.Navigate "https://einvoice1.gst.gov.in/Others/EinvEnabled"
        Do While IE.Busy Or IE.ReadyState <> 4
            DoEvents
        Loop
        
        ' 移动到下一行
        currentRow = currentRow + 1
    Loop
    
    ' 清理资源
    IE.Quit
    Set IE = Nothing
    MsgBox "批量处理完成", vbInformation
End Sub

代码说明

  • 浏览器实例统一:使用IE对象(若需Chrome可改用Selenium,但VBA原生支持IE更稳定),避免Shell与IE混用的冲突
  • 页面加载等待:每次导航后都等待ReadyState=4确保页面加载完成,防止DOM操作报错
  • 验证码处理:通过弹窗提示用户输入,同时设置15秒超时,兼顾手动操作和流程自动化
  • 结果提取:根据页面实际HTML结构(示例用表格td元素)提取关键信息并写入Excel对应列,可根据实际页面调整选择器
  • 循环逻辑:按行遍历GSTIN,处理完成后自动返回查询页面,无需手动操作
  • 错误处理:增加输入框不存在的判断,避免程序崩溃

注意:若网站页面结构更新,需调整DOM元素的定位方式(如getElementById、getElementsByTagName或querySelector)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 10:06:22