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 Library和Microsoft ActiveX Data Objects 6.1 Library(在VBA编辑器的工具→引用里勾选)。
- 如果网站有反爬机制(比如验证码、会话超时),这个宏可能需要进一步调整,但目前的代码能解决你当前的错误462和登录问题。
内容的提问来源于stack exchange,提问作者germangp




