☰
Excel/WPS网络函数库:用VBA与JS宏将HTTP请求变成单元格公式
2026/10/8 2:56:05 网站建设 项目流程

简介:整合包面向Excel与WPS用户,用于在电子表格中直接调用网络函数库,从而完成请求发送、接口数据抓取与结果回写,解决了原生表格软件无法直接访问网络资源的痛点。压缩包共67个文件,大小约55.44MB,主要类型包括31个DLL动态库(涉及HTTP通信、Excel解析、PDF处理等)、10个XML配置/描述文件、7个JS脚本及多个XLSX示例工作簿,另附可执行的安装卸载工具,便于一键部署环境。针对VBA二次开发场景,包内给出MSXML、Winsock等库的调用示例,同时整理有公式大全、翻译工具、快递查询模板等可直接复用,并配有常见错误的处理思路,帮助开发者快速完成从配置到联调的流程。已有2572人学习下载,适合具备一定表格使用基础、希望为Excel或WPS扩展实时网络数据能力的办公人员与VBA初学者。

1. 网络函数库是什么:把网页请求变成Excel单元格里的一个公式

运营同事每天上午要花半小时去网页上复制价格、汇率、接口返回的JSON,再粘贴进表格做日报。用这份网络函数库之后,这条链路变成在单元格里写=HTTP_GET("https://example.com/api"),回车,数据直接落进格子。所谓网络函数库,是一组把HTTP请求封装成自定义函数的VBA模块(同时提供WPS JS宏版本),让Excel和WPS用户不需要写任何网络底层代码,就能在表格里完成GET、POST、JSON提取、URL编码这些操作。适合三类人:每天手工搬运网页数据的运营和财务、要做接口联调但又不想开编程工具的分析师、以及想给老表格加自动化能力但不想碰Python的VBA用户。它有门槛,但门槛低到会写公式就能用。

2. 装进Excel/WPS:加载宏文件、信任中心与两种宏环境

2.1 资源包里有什么:从模块文件到加载宏,先认清文件格式

这份网络函数库拆开之后,核心是四个文件,我先说清楚每个文件是干什么的,避免你一股脑全部启用,最后不知道哪个生效。

文件用途在哪个环境用
NetworkFunc.basVBA标准模块,包含全部函数的源码Excel VBA编辑器手动导入
NetworkFunc.xlam已打包好的Excel加载宏,双击启用即可Excel 2010及以上
NetworkFunc.jsWPS JS宏代码,文本格式WPS表格的JS宏编辑器
README.md函数清单、参数表和调用示例全平台通用

我的建议是:在Excel里优先用.xlam加载宏,因为加载宏装一次之后,所有工作簿都能直接调用函数,不用每个文件都复制一遍代码。.bas模块文件留着做备份,哪天加载宏加载不了,还能手动导入救急。在WPS里则分两条路:如果装了VBA兼容插件,可以把.bas导进去;如果不想装插件,就直接用JS宏跑NetworkFunc.js。

2.2 在Excel里装载:信任中心三处设置,缺一处都白搭

加载宏无法工作的十有八九不是代码问题,而是信任中心把宏拦了。装NetworkFunc.xlam之前,先把下面三个设置打开。

提示:路径是 文件 → 选项 → 信任中心 → 信任中心设置。

设置项如下:

  1. 启用所有宏:如果不启用,加载宏里的代码根本不会执行,函数会直接返回#NAME?。
  2. 启用VBA宏:仅对当前的Excel实例生效,我建议不改,因为生成环境改它容易翻车。
  3. 信任对VBA项目对象模型的访问:这项必须勾选。网络函数库里的部分代码要用到对象模型控制请求对象,不勾选会莫名报错,而且这个报错没有明显提示,查起来很费劲。

之后回到Excel主界面,按下Alt+F11打开VBA编辑器,在工程资源管理器里右键任意位置,选择导入文件,选中NetworkFunc.bas。配好之后,在任意单元格输入=HTTP_GET("https://www.baidu.com"),如果返回的是HTML片段,说明装载成功。

2.3 在WPS里装载:VBA兼容插件与JS宏,哪个省事选哪个

WPS的情况比Excel复杂一点。WPS官方有些版本不自带VBA组件,直接导入.bas会提示找不到工程或运行库。常见做法是装第三方VBA兼容插件,装完以后VBA代码沿用率很高,热词里提到的vba插件7.1就是这路方案。但我更推荐用WPS的JS宏引擎,原因很现实:JS宏是WPS原生支持的,不需要额外装插件,也不怕插件和WPS版本不兼容闹脾气。

打开WPS表格,按Ctrl+Shift+F11打开JS宏编辑器,新建一个全局代码段,把NetworkFunc.js的内容粘贴进去。JS版本的HTTP_GET代码示意如下:

function HTTP_GET(url, timeout) { var xhr = new XMLHttpRequest(); xhr.open("GET", url, false); xhr.timeout = timeout || 5000; xhr.send(); if (xhr.status == 200) { return xhr.responseText; } return "HTTP_ERROR:" + xhr.status; }

这段代码的核心逻辑是创建一个XMLHttpRequest对象,用同步模式发送GET请求,成功后返回响应文本,失败时按HTTP_ERROR:状态码的格式返回。参数里url是必填的接口地址,timeout是超时毫秒数,默认5000毫秒——我通常会把超时调成8000,因为很多公网接口首次请求需要建立连接,5秒经常不够。JS宏和VBA版在WPS里不能混用,VBA代码用VBA插件跑,JS宏代码用JS宏编辑器跑,两个引擎之间不互通。

3. 函数拆解:GET、POST与JSON提取的参数控制

3.1 HTTP_GET:把整张网页变成单元格里的字符串

这个函数是整个函数库的地基。它的完整VBA实现如下:

Function HTTP_GET(url As String, Optional timeout As Long = 5000) As String Dim req As Object Set req = CreateObject("MSXML2.XMLHTTP.6.0") req.Open "GET", url, False req.setTimeouts timeout, timeout, timeout, timeout req.Send If req.Status = 200 Then HTTP_GET = req.responseText Else HTTP_GET = "HTTP_ERROR:" & req.Status End If Set req = Nothing End Function

这里必须解释几个关键点。CreateObject("MSXML2.XMLHTTP.6.0")是Windows系统自带的XMLHTTP组件,从Office 2010到现在的365版本都内置,不需要额外引用库文件,这是保证搬运代码就能跑的前提。req.Open的第三个参数False表示同步请求——也就是说,Excel会停在这里等服务器返回,期间界面处于忙碌状态。超时的四个timeout分别对应DNS解析、TCP连接、发送数据和接收响应的超时时间,我这里简化成同一个值,实际项目中可以拆开调。

单元格里的调用方式是:

=HTTP_GET("https://api.example.com/list")

返回的是一整段文本。如果接口返回的是HTML,你会看到带标签的源码;如果是JSON,你会看到一串带大括号的字符。怎么从这一段里提取需要的字段,是后面EXTRACT_PATTERN函数的活。这里有个容易忽视的约定:所有网络函数在失败时返回的字符串都以HTTP_ERROR:开头,而不是抛出#VALUE!。这样做的好处是,你可以在公式外面套一层IF(ISNUMBER(SEARCH("HTTP_ERROR",A1)),"请求失败",A1),把错误当成数据分析输出,而不是让整个公式崩掉。

3.2 HTTP_POST:带Body调接口,登录态和表单提交就靠它

GET只能拿静态数据,遇到要提交参数、带JSON Body的接口就抓瞎了。POST函数补上这块:

Function HTTP_POST(url As String, body As String, _ Optional contentType As String = "application/json", _ Optional timeout As Long = 5000) As String Dim req As Object Set req = CreateObject("MSXML2.XMLHTTP.6.0") req.Open "POST", url, False req.setRequestHeader "Content-Type", contentType req.setTimeouts timeout, timeout, timeout, timeout req.Send body If req.Status = 200 Then HTTP_POST = req.responseText Else HTTP_POST = "HTTP_ERROR:" & req.Status End If Set req = Nothing End Function

调用示例:

=HTTP_POST("https://api.example.com/login", '{"user":"demo","pass":"123456"}', "application/json")

注意VBA字符串里的单引号问题,单元格公式中JSON字符串的引号必须用两个""转义,否则公式直接报语法错误。这个函数最常见的翻车点是Content-Type忘改:明明是表单提交,还在用application/json,接口会返回415 Unsupported Media Type。如果是表单格式,把第三个参数改成application/x-www-form-urlencoded,Body写name=demo&age=18,别写JSON。

3.3 从响应里取数:正则提取的局限,复杂JSON交给JS宏

网络请求返回的是字符串,要真正把数据喂给表格,还得从字符串里抠字段。VBA里没有内置JSON解析器,常见做法分两种:简单键值对用正则硬扣,复杂嵌套结构用WPS JS宏里的JSON.parse处理。

正则提取函数:

Function EXTRACT_PATTERN(text As String, pattern As String, _ Optional idx As Long = 1) As String Dim reg As Object Set reg = CreateObject("VBScript.RegExp") reg.Global = True reg.Pattern = pattern Dim matches As Object Set matches = reg.Execute(text) If matches.Count >= idx Then EXTRACT_PATTERN = matches(idx - 1).Value Else EXTRACT_PATTERN = "" End If End Function

逻辑说明:用VBScript.RegExp把传入的pattern编译成正则,然后去text里找匹配项,idx决定取第几个匹配结果。比如接口返回{"name":"tom","age":18},要提取name字段的值,可以在B1单元格写:

=EXTRACT_PATTERN(A1, "\"name\":\"([^\"]+)\"", 1)

但注意正则只能拿到完整匹配,上面这行取出来的是"name":"tom"整段,要去掉键名还得再套一层SUBSTITUTE。这块很啰嗦。我的实际习惯是:只在VBA里用正则处理简单格式,遇到真正的嵌套JSON,直接切到WPS JS宏,用JSON.parse把对象解析出来后逐字段读写,代码简洁得多。Excel 64位版本里ScriptControl组件不可用,这也是我不推荐在Excel里解析复杂JSON的原因,不是不能做,是坑太多。

4. 进阶参数:请求头、超时机制与批量防卡死

4.1 请求头设置:UA不是玄学,是接口风控的第一道门

很多接口裸用XMLHTTP请求返回403,加上浏览器UA就正常了。问题往往不在代码,而在请求头缺了东西。我给HTTP_GET增加一个可选请求头参数的版本:

Function HTTP_GET_HEADERS(url As String, headers As String, _ Optional timeout As Long = 5000) As String Dim req As Object Set req = CreateObject("MSXML2.XMLHTTP.6.0") req.Open "GET", url, False Dim headerArr As Variant headerArr = Split(headers, "|") Dim i As Long For i = 0 To UBound(headerArr) Dim kv As Variant kv = Split(headerArr(i), ":") req.setRequestHeader Trim(kv(0)), Trim(kv(1)) Next i req.setTimeouts timeout, timeout, timeout, timeout req.Send If req.Status = 200 Then HTTP_GET_HEADERS = req.responseText Else HTTP_GET_HEADERS = "HTTP_ERROR:" & req.Status End If Set req = Nothing End Function

调用方式:

=HTTP_GET_HEADERS("https://api.example.com/data", "User-Agent:Mozilla/5.0|Referer:https://example.com/")

请求头用竖线|分隔多组键值对,冒号分隔键和值。这个设计比较粗暴,好处是单元格里就能写,不用VBA代码重新编译。有几个头值得特别注意:User-Agent部分接口必须带Mozilla/5.0前缀,否则识别成爬虫直接拒绝;Accept字段最好明确写application/json,有些API会根据这个字段决定返回JSON还是XML。我写请求头时有个原则:只带本次请求必要的字段,不需要塞Cookie或Token这种敏感信息到公式里,不然工作簿分享出去,账号凭据也一起泄漏了。

4.2 超时参数:setTimeouts四个值的含义与调整策略

req.setTimeouts方法接收四个参数,很多教程一句话带过,但恰恰是这里没调好,导致请求卡死几分钟。

参数位置参数名含义默认建议值
第一个ResolveTimeoutDNS解析超时,单位毫秒5000
第二个ConnectTimeoutTCP连接建立超时5000
第三个SendTimeout发送请求数据超时5000
第四个ReceiveTimeout等待服务器响应超时5000

我一般会把ReceiveTimeout单独调大,比如10000毫秒,因为很多公共服务接口在生成报表时响应会超过5秒。ConnectTimeout反而可以调小到3000,防止内网IP不通时干等。注意WPS JS宏里的XMLHttpRequest对象没有这么细的拆分,只有一个xhr.timeout属性,JS宏里统一设置即可,这个差异是平台限制导致的,不是函数库的问题。

4.3 批量请求的防卡死:DoEvents、延迟与请求频率边界

同步请求在批量处理时有个致命问题:每个请求发出后,Excel主线程都在等待,界面变成白屏假死。处理思路不是改成异步——VBA异步回调复杂度太高——而是用小批量加界面让出机制,代码如下:

Sub BatchFetch() Dim i As Long Dim lastRow As Long lastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row For i = 2 To lastRow Cells(i, 2).Value = HTTP_GET(Cells(i, 1).Value, 8000) DoEvents Application.Wait Now + TimeValue("00:00:01") Next i End Sub

这段代码假设A列是URL列表,结果写入B列。DoEvents的作用是让出控制权给操作系统和Excel界面,这样用户至少能拖动窗口、看到进度。Application.Wait强制每次请求间隔1秒,这是在服务器友好度和执行速度之间折中的结果。如果你抓的是自己公司的内网接口,间隔可以缩到200毫秒;如果是公网接口,建议至少1秒,不然请求频率上去之后,轻则接口返回429限流,重则IP被防火墙封一段时间。

注意:批量请求前,先目测一遍A列URL有没有空值和明显错误。之前有人把A列一个错误链接循环了500遍,每遍等足8秒超时,跑完差不多一个小时,全是白等。

5. 避坑指南:乱码、假死、加载失败与安全拦截

5.1 宏被禁用,函数返回#VALUE!而不是文本

现象:第一次用=HTTP_GET(...),单元格报错#VALUE!或者#NAME?,但没有弹出任何宏安全提示。

原因:Excel默认的安全级别是禁用所有宏,加载宏被当成不可信文件处理了。另一种可能是工作簿保存格式不支持宏,比如另存成.xlsx而不是.xlsm,VBA代码直接被丢弃了。

解决:先确认文件后缀是.xlsm或.xlam,再回信任中心把启用所有宏打开,最后确认勾选了信任对VBA项目对象模型的访问。装完加载宏要完全关闭Excel重新打开,只点击启用弹窗有时不生效。你如果遇到“每次打开Excel都要进行配置”这类现象,多半也是信任中心写入注册表失败,用管理员身份运行一次Excel再设置,就能固化下来。

5.2 返回的中文全是乱码或问号

现象:接口返回的英文正常,但中文变成???或者一堆奇怪字符。

原因:responseText始终按UTF-8解码,如果一个页面或接口返回的是GBK/GB2312编码,直接读文本必然乱码。很多政府网站和老系统的接口到现在还是GBK,这个问题很现实。

解决:放弃读responseText,改用responseBody字节流配合ADODB.Stream显式指定字符集:

Function HTTP_GET_GBK(url As String) As String Dim req As Object Set req = CreateObject("MSXML2.XMLHTTP.6.0") req.Open "GET", url, False req.Send If req.Status <> 200 Then HTTP_GET_GBK = "HTTP_ERROR:" & req.Status Exit Function End If Dim stream As Object Set stream = CreateObject("ADODB.Stream") stream.Type = 1 stream.Open stream.Write req.responseBody stream.Position = 0 stream.Type = 2 stream.Charset = "GBK" HTTP_GET_GBK = stream.ReadText stream.Close End Function

这段代码把响应当二进制读入内存,再用GBK字符集重新解码。如果换了GBK还乱码,试试GB2312或GB18030,GB18030覆盖字符更全,兼容生僻字。

5.3 同步请求卡死,Excel报“服务未响应”

现象:请求一个很慢或有问题的URL,整个Excel卡住,标题栏出现“未响应”,过几分钟系统弹出恢复窗口。

原因:同步请求把UI线程和网络等待绑在一起。ReceiveTimeout如果没设或者设得太大,一个超时请求能拖死整个表。网络波动时,DNS解析本身也可能卡几十秒。

解决:三个办法叠加使用。第一,所有URL填超时并不超过10秒。第二,在批量循环里加DoEvents。第三,如果某个URL已知不稳定,先用一个小单元格单独测通再跑批量。卡死后优先用任务管理器结束Excel进程,别反复点恢复按钮。

5.4 WPS里导入VBA模块失败

现象:在WPS中打开VBA编辑器,导入.bas文件时报错,或者函数在单元格里提示未定义。

原因:WPS个人版默认不带VBA引擎,没有VBA兼容插件的情况下,.bas文件根本无处加载。

解决:两个选择。装VBA兼容插件,装完后VBA函数库在WPS里直接沿用,兼容性比社区里传的vba插件7.1支持版本要新;或者放弃VBA路线,使用WPS JS宏——按Ctrl+Shift+F11打开发布脚本编辑器,把JS版代码粘贴进去。我现在的习惯是:在WPS环境里默认走JS宏,避免装插件带来的崩溃风险和技术支持后续问题。

5.5 接口返回HTTP_ERROR:403或449,请求被拦截

现象:同一个接口,浏览器打开正常,Excel里请求却返回403、449甚至499。

原因:服务器校验了请求头、频率或者登录态。XMLHTTP发出的请求头太干净,没有UA和Referer,部分服务商直接拒绝。另外,办公网络出网口是公共IP,同一IP下多人批量请求会触发频率拦截。

解决:用HTTP_GET_HEADERS补上浏览器UA和Referer。如果已经带了头还403,说明接口需要登录Cookie或签名参数,这种情况函数库解决不了,先确认接口的鉴权方式再决定要不要接。别拿网络函数库硬怼有严格风控的接口,它是用表格自动化提高效率的,不是绕过鉴权用的。

6. 落地验证:把网络函数库跑成一个自动刷新的小型报表

装好、测通、躲过坑之后,这份函数库才算真正落地。我通常在一个真实的迷你项目里验证整套链路——比如每天早上自动拉取一个公开汇率接口,生成汇率报表放在公司共享盘里。做法是:先建一张参数表,A列放接口URL,B列放函数公式,然后配Application.OnTime定时刷新。

Sub AutoRefresh() Dim targetTime As Date targetTime = TimeValue("09:30:00") Application.OnTime targetTime, "DoRefresh" End Sub Sub DoRefresh() Range("B2:B20").Calculate Application.OnTime TimeValue("09:30:00"), "DoRefresh" End Sub

第一个宏在文件打开时注册每天的刷新时间,第二个宏负责重算指定区域并注册第二天的刷新。这里有个细节:Range.Calculate只重算你圈定的区域,而不是CalculateFull全工作簿重算,能省不少时间,特别是当工作簿里有大量无关公式时。为了不让刷新失败影响报表使用,我会在B列结果外面套一层IF(ISNUMBER(SEARCH("HTTP_ERROR",B2)),"抓取失败",B2),把错误转成可见文案。

我还习惯在DoRefresh开头加一行Cells(1, 10).Value = Now()记录最近一次刷新时间,排查问题时能看清是没触发还是触发了但请求失败。性能上另一个有用的小技巧是,在VBA里给HTTP_GET包一个简易缓存,用Dictionary对象把URL和响应记下来,同一个URL一天内重复请求时直接读缓存,避免服务器压力也避免自己等网络。这套验证跑一礼拜不出问题,函数库基本就是稳的了。

我从那次全公司报表因为一个超时参数卡了二十分钟之后,就养成一个习惯:任何网络函数库上线前,强制换两台不同配置的机器重装一次,用8秒超时全量跑一遍,再检查错误单元格有没有被当成有效数据带入汇总。先确认失败可见,再追求成功可用,顺序不能反。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询