You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

VBA宏登录Activobank网页报错462:远程服务器未找到,请求排查

解决Activobank网页自动登录VBA宏的错误462及数据下载问题

首先,你的错误462「远程服务器机器未找到」大概率是因为页面未完全加载就操作DOM对象,或者登录后手动跳转第二页导致会话失效(毕竟登录后网站会生成会话Cookie,直接navigate新URL可能丢失认证状态)。另外无法填充账号密码,也是因为页面DOM还没准备好就去获取元素了,Application.Wait是固定等待,不靠谱——网络慢的时候页面还没加载完,快的时候又浪费时间。

下面是修复后的完整代码,我会逐段解释改动点:

Sub ExtractActivo()
    Dim IE As Object
    Dim pagina1 As HTMLDocument
    Dim pagina2 As HTMLDocument
    Dim loginBtn As Object
    
    Set IE = CreateObject("InternetExplorer.Application")
    IE.Visible = True
    
    ' 打开登录页,等待页面完全加载
    IE.navigate "https://www.activobank.com/cs/Satellite/BC/"
    WaitForIE IE ' 用自定义等待函数替代固定等待
    
    Set pagina1 = IE.document
    
    ' 填充账号:等待元素加载完成再赋值
    WaitForElement pagina1, "userDNI"
    pagina1.getElementById("userDNI").Value = Range("M1").Value
    
    ' 填充密码
    WaitForElement pagina1, "pinNif"
    pagina1.getElementById("pinNif").Value = Range("M2").Value
    
    ' 点击登录:先找到按钮,等待可点击状态
    WaitForElementByClass pagina1, "btn tipo4", 0
    Set loginBtn = pagina1.getElementsByClassName("btn tipo4")(0)
    loginBtn.Click
    
    ' 等待登录跳转完成,不要手动navigate!
    WaitForIE IE
    
    ' 现在已经在登录后的页面,直接获取当前文档作为第二页
    Set pagina2 = IE.document
    
    ' --- 处理第二页表格:先展开折叠的"Cuentas a la vista"模块 ---
    Dim expandBtn As Object
    ' 找到展开按钮(img的id是_CC)
    WaitForElement pagina2, "_CC"
    Set expandBtn = pagina2.getElementById("_CC")
    ' 点击展开(因为按钮在a标签里,点击a标签或者img都可以)
    expandBtn.ParentNode.Click ' 点击父级a标签更可靠
    
    ' 等待展开的表格加载
    Application.Wait Now + TimeValue("00:00:01") ' 这里可以换成等待_CC0元素显示
    
    ' --- 提取表格数据示例:以展开后的表格为例 ---
    Dim targetTable As HTMLTable
    Set targetTable = pagina2.getElementById("_CC0").getElementsByTagName("table")(0)
    ' 将表格数据复制到Excel工作表(比如Sheet1)
    Dim rng As Range
    Set rng = Sheet1.Range("A1")
    rng.CopyFromRecordset GetTableAsRecordset(targetTable)
    
    ' 清理对象
    IE.Quit
    Set IE = Nothing
    Set pagina1 = Nothing
    Set pagina2 = Nothing
    Set loginBtn = Nothing
    Set expandBtn = Nothing
    Set targetTable = Nothing
End Sub

' 自定义函数:等待IE完全加载
Private Sub WaitForIE(IE As Object)
    Do While IE.Busy Or IE.ReadyState <> 4 ' ReadyState=4表示已完成
        DoEvents ' 释放CPU资源,避免假死
    Loop
End Sub

' 自定义函数:等待指定ID的元素出现
Private Sub WaitForElement(doc As HTMLDocument, elementId As String)
    Dim elem As Object
    Do
        Set elem = doc.getElementById(elementId)
        DoEvents
    Loop Until Not elem Is Nothing
End Sub

' 自定义函数:等待指定Class的元素出现(支持索引)
Private Sub WaitForElementByClass(doc As HTMLDocument, className As String, index As Integer)
    Dim elems As Object
    Do
        Set elems = doc.getElementsByClassName(className)
        DoEvents
    Loop Until elems.Length > index
End Sub

' 辅助函数:将HTMLTable转换为Recordset,方便复制到Excel
Private Function GetTableAsRecordset(table As HTMLTable) As Object
    Dim rs As Object
    Dim row As HTMLTableRow
    Dim cell As HTMLTableCell
    Dim colIndex As Integer
    
    Set rs = CreateObject("ADODB.Recordset")
    ' 添加字段(表头)
    For Each cell In table.Rows(0).Cells
        rs.Fields.Append cell.innerText, 200, 255 ' 200=adVarChar
    Next cell
    rs.Open
    
    ' 添加数据行
    For Each row In table.Rows
        If row.RowIndex > 0 Then ' 跳过表头行
            rs.AddNew
            colIndex = 0
            For Each cell In row.Cells
                rs.Fields(colIndex).Value = cell.innerText
                colIndex = colIndex + 1
            Next cell
            rs.Update
        End If
    Next row
    
    Set GetTableAsRecordset = rs
End Function

关键改动说明:

  • 替换了不靠谱的Application.Wait,改用等待IE加载完成等待元素出现的自定义函数,从根源避免错误462(因为DOM对象未就绪时操作会导致对象失效)。
  • 登录后不再手动navigate第二页:点击登录按钮后,网站会自动跳转到账户页面,手动跳转可能丢失登录会话,导致无法访问目标页面。
  • 处理第二页的折叠表格:先找到展开按钮(_CC对应的img),点击其父级a标签展开内容,确保能获取到完整的表格数据。
  • 增加了表格数据提取的示例:把HTML表格转换为Recordset,方便快速复制到Excel工作表。

额外注意事项:

  • 确保你的Excel启用了Microsoft HTML Object LibraryMicrosoft ActiveX Data Objects 6.1 Library(在VBA编辑器的工具→引用里勾选)。
  • 如果网站有反爬机制(比如验证码、会话超时),这个宏可能需要进一步调整,但目前的代码能解决你当前的错误462和登录问题。

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

火山引擎 最新活动