Excel VBA实现网页全选复制粘贴至工作表代码异常求助
问题根因
原代码的复制粘贴逻辑存在本质错误:
XMLHTTP60是纯HTTP请求组件,仅负责发送请求、接收响应报文,本身不提供SelectAll、Copy这类DOM操作、剪贴板操作的方法,直接调用必然抛出运行时错误- 代码中提前声明的
HTMLDocument网页解析对象未被使用,没有完成网页响应内容的解析步骤 - 模拟全选、复制、粘贴的操作逻辑是IE浏览器自动化场景的写法,和XMLHTTP静态请求的场景完全不匹配
修正方案
不需要走模拟选中、剪贴板中转的不稳定流程,直接通过已声明的HTMLDocument对象解析HTTP请求返回的网页源码,提取目标内容直接写入指定单元格即可,运行效率更高,也不会触发剪贴板占用、焦点丢失导致的粘贴失败问题。
你已配置的VBA引用项完全满足运行要求,无需额外调整:
修正后可直接运行的代码如下:
Sub Horse10() Dim ws As Worksheet Dim http As New XMLHTTP60 Dim html As New HTMLDocument Dim targetTable As Object Dim tr As Object, td As Object, rowIdx As Long, colIdx As Long ' 绑定数据写入的目标工作表 Set ws = ThisWorkbook.Worksheets("Sheet1") With http .Open "GET", "https://www.racingandsports.com.au/Jockey/GetJockeyStats?jockeyIdStr=18658&discipline=T&season=All%20Seasons&hemisphere=S&_=1629813279071", False ' 补充常规浏览器请求头,避免被站点反爬规则拦截 .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" .send ' 将HTTP请求返回的网页源码加载到HTML解析对象中 html.body.innerHTML = .responseText End With ' 定位页面中存储骑师统计数据的表格(页面核心数据均存放在第一个table元素中) Set targetTable = html.getElementsByTagName("table")(0) ' 从J2单元格(即Cells(2,10)位置)开始逐行写入表格内容 rowIdx = 2 For Each tr In targetTable.Rows colIdx = 10 ' J列对应列号为10 For Each td In tr.Cells ws.Cells(rowIdx, colIdx).Value = td.innerText colIdx = colIdx + 1 Next rowIdx = rowIdx + 1 Next ' 释放占用的对象 Set http = Nothing Set html = Nothing Set targetTable = Nothing End Sub
补充说明
- 如果运行后发现单元格内容为空,可在
.send代码后添加Debug.Print .responseText,在立即窗口查看返回内容是否为正常网页源码,若被反爬拦截可适当调整请求头参数 - 该写法直接操作DOM写入单元格,稳定性远高于模拟选中+剪贴板粘贴的方案,不会受其他程序占用剪贴板、窗口焦点丢失等问题影响
内容的提问来源于stack exchange,提问作者NewGuy1
相关产品推荐
相关产品推荐

