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

如何通过IE VBA关闭网页弹出提示框?

解决BCB网页抓取中弹窗无法关闭的问题

针对你在抓取巴西央行(BCB)网页时遇到的弹窗无法通过SendKeys关闭的问题,以下是几种可行的解决方法:

方法1:提前覆盖网页的alert弹窗函数

网页弹窗通常由window.alert()触发,我们可以在点击按钮前用VBA执行JavaScript代码覆盖这个方法,直接屏蔽弹窗:

Sub atualizacao_valores()
    Dim data_base_ipcae As String
    Dim data_atualizacao_ipcae As String
    Dim valor_face As String
    Dim drp As HTMLFormElement
    Dim html As HTMLDocument
    Dim ie As Object

    Set ie = CreateObject("internetexplorer.application")
    ie.navigate "https://www3.bcb.gov.br/CALCIDADAO/publico/exibirFormCorrecaoValores.do?method=exibirFormCorrecaoValores&aba=1"
    ie.Visible = True
    Do While ie.Busy Or ie.readyState <> 4 ' READYSTATE_COMPLETE = 4
        DoEvents
    Loop

    data_base_ipcae = "01/2022"
    data_atualizacao_ipcae = "12/2022"
    valor_face = "100000"

    Application.Wait (Now + TimeValue("00:00:02"))
    Set html = ie.document
    Set drp = html.getElementById("selIndice")

    drp.selectedIndex = 4

    html.getelementsbytagname("input")(1).Value = data_base_ipcae
    html.getelementsbytagname("input")(2).Value = data_atualizacao_ipcae
    html.getelementsbytagname("input")(3).Value = valor_face

    ' 关键:覆盖alert函数,阻止弹窗弹出
    ie.document.parentWindow.execScript "window.alert = function(){};"

    html.getelementsbyclassname("botao")(0).Click

    ' 后续处理逻辑...
End Sub

方法2:用Windows API捕获并关闭弹窗

如果弹窗是系统级消息框,可以通过API函数找到窗口并发送点击指令:

首先在模块顶部添加API声明(兼容32/64位Office):

Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr
Private Const BM_CLICK = &HF5

然后修改主代码:

' ... 前面代码不变 ...

html.getelementsbyclassname("botao")(0).Click

' 等待弹窗加载
Application.Wait Now + TimeValue("00:00:01")

' 查找弹窗窗口(替换为实际弹窗标题,可通过窗口Spy工具获取)
Dim hwndDialog As LongPtr
hwndDialog = FindWindow(vbNullString, "提示") ' 需确认弹窗实际标题

If hwndDialog <> 0 Then
    ' 发送点击"确定"按钮的消息
    SendMessage hwndDialog, BM_CLICK, 0, 0
End If

' ... 后续处理逻辑...

方法3:直接发送POST请求绕过IE(推荐)

最稳定的方式是跳过IE浏览器,直接用XMLHTTP发送表单请求,完全避免弹窗问题:

Sub PostDirectly()
    Dim xmlhttp As Object
    Set xmlhttp = CreateObject("MSXML2.XMLHTTP")
    
    Dim url As String
    url = "https://www3.bcb.gov.br/CALCIDADAO/publico/corrigirPorIndice.do?method=corrigirPorIndice"
    
    ' 构造表单参数(需与网页表单参数名完全一致)
    Dim postData As String
    postData = "selIndice=4" & _
               "&dataBase=01%2F2022" & _
               "&dataAtualizacao=12%2F2022" & _
               "&valorCorrecao=100000" & _
               "&submit=Corrigir+Valor"
    
    xmlhttp.Open "POST", url, False
    xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    xmlhttp.send postData
    
    ' 解析返回的HTML结果
    Dim html As HTMLDocument
    Set html = New HTMLDocument
    html.body.innerHTML = xmlhttp.responseText
    
    ' 示例:提取修正后的值(需根据网页实际结构调整选择器)
    Dim correctedValue As String
    correctedValue = html.querySelector(".resultado span").innerText ' 假设结果在该位置
    MsgBox "修正后的值:" & correctedValue
End Sub

方法对比

  • 方法1:简单快捷,适用于弹窗为alert的场景,但如果网页使用其他弹窗方式则无效。
  • 方法2:适用于系统级消息框,但需要准确获取弹窗标题,兼容性稍差。
  • 方法3:最可靠,不依赖IE,执行速度更快,适合长期维护的抓取脚本。

内容的提问来源于stack exchange,提问作者Rogério Siqueira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 03:55:20