ARTICLE · 996055
从0学Excel VBA编程 · 番外篇11:用 VBA-JSON 搞定 64 位——让 ScriptControl 失效的电脑也能拆 JSON
从0学Excel VBA编程 · 番外篇11:用 VBA-JSON 搞定 64 位——让 ScriptControl 失效的电脑也能拆 JSON
学习目标
弄清楚为什么 32 位才有的 ScriptControl在 64 位 Excel 上会报错。学会从 VBA-JSON 库导入 JsonConverter模块,并用它解析 JSON。掌握 ParseJson返回的字典 / 集合两种结果的遍历写法。
知识点精讲
在番外篇 11 里,我们用 ScriptControl(JScript) 来解析 JSON,但它有个硬伤:只有 32 位的 Excel 才带这个组件。很多人的电脑装的是 64 位 Office,一运行就报「ActiveX 部件不能创建对象」,卡死在那。
解决办法是用一个纯 VBA 写的开源库 VBA-JSON(作者是 VBA-tools 团队)。它不依赖任何系统组件,不管 32 位还是 64 位都能跑——因为它本身就是 VBA 代码,自然通行。
怎么装(一次性的事)
打开浏览器,访问 https://github.com/VBA-tools/VBA-JSON,下载仓库里的JsonConverter.bas文件(也可直接打开 raw 文本全选复制)。回到 Excel 按 Alt+F11打开 VBA 编辑器,菜单「文件 → 导入文件」,选中JsonConverter.bas。你会看到一个叫JsonConverter的标准模块。在 VBE 菜单「工具 → 引用」里,勾选 Microsoft Scripting Runtime(为了用 Dictionary)。
装好之后,全篇只需记住一个入口函数:JsonConverter.ParseJson(文本)。
它返回什么
ParseJson 看到 {...} 就返回 字典(Dictionary),看到 [...] 就返回 集合(Collection):
{"姓名":"张三"} | dict("姓名") | |
[{...},{...}] | For Each |
要点:取字段用 obj("键"),不是点号;嵌套就一层层套:obj("公司")("名称")。要判断一个东西是不是对象,用 IsObject。
三句核心用法
Set d = JsonConverter.ParseJson(s) ' 拆成一个字典 / 集合Debug.Print d("姓名") ' 取普通字段Set d2 = d("公司") ' 取内层对象再继续取实战案例
案例 1:解析内嵌 JSON(最简单,先练手)
功能说明:不联网,直接把一段 JSON 文本拆开,取出里面的字段,确认你装库成功。
Sub 解析内嵌JSON演示() Dim jsonText As String Dim dict As Object jsonText = "{""姓名"":""张三"",""年龄"":28,""城市"":""北京""}" ' 核心:一行拆成字典 Set dict = JsonConverter.ParseJson(jsonText) Debug.Print dict("姓名") ' 输出 张三 Debug.Print dict("年龄") ' 输出 28 Debug.Print dict("城市") ' 输出 北京End Sub操作步骤:把上面代码放进「标准模块」,确保已导入 JsonConverter 且勾选了引用,按 F5 运行,在立即窗口(Ctrl+G)看到三行结果即成功。
案例 2:解析真实接口(替代番外篇11 的 ScriptControl 方案)
功能说明:请求一个免费接口,用 VBA-JSON 解析嵌套对象(含「公司」内层),彻底摆脱 64 位限制。
Sub 请求接口并解析() Dim url As String Dim jsonText As String Dim dict As Object, company As Object ' ===== 公共函数:取网页文本(UTF-8 防乱码,来自番外篇10)===== Dim http As Object, stream As Object url = "https://jsonplaceholder.typicode.com/users/1" Set http = CreateObject("MSXML2.XMLHTTP") http.Open "GET", url, False http.Send Set stream = CreateObject("ADODB.Stream") stream.Type = 2 stream.Charset = "UTF-8" stream.Open stream.WriteText http.responseText stream.Position = 0 jsonText = stream.ReadText stream.Close ' ===== 用 VBA-JSON 解析 ===== Set dict = JsonConverter.ParseJson(jsonText) Debug.Print dict("name") Debug.Print dict("email") Set company = dict("公司") ' 取内层对象 Debug.Print company("名称")End Sub操作步骤:同案例1 环境要求;注意接口字段是英文(name/email/company/name),与公司中文键不同,读者按接口实际键名取即可。
案例 3:解析 JSON 数组批量写进工作表
功能说明:接口常返回「一组对象」。VBA-JSON 会把 [{...},{...}] 变成一个集合,用 For Each 逐条写入——同样可用于番外篇12 的天气预报数组。
Sub 解析数组写表() Dim jsonText As String Dim coll As Object, item As Object Dim i As Long jsonText = "[{""姓名"":""张三"",""城市"":""北京""}," & _ "{""姓名"":""李四"",""城市"":""上海""}," & _ "{""姓名"":""王五"",""城市"":""广州""}]" Set coll = JsonConverter.ParseJson(jsonText) ' 数组 → 集合 i = 1 For Each item In coll ' 每个 item 是一个字典 Cells(i, 1) = item("姓名") Cells(i, 2) = item("城市") i = i + 1 Next itemEnd Sub操作步骤:运行后,A、B 两列会依次出现三行「姓名 / 城市」。若想接番外篇12 的天气数组,只需把 jsonText 换成 获取网页文本(天气接口),字段名改成 temp、city 等即可。
本篇小结
64 位 Excel 用不了 ScriptControl,但 VBA-JSON 是纯 VBA、两边都通吃,装上后只用JsonConverter.ParseJson一个入口。记住「字典用 obj("键")取、集合用For Each取、嵌套一层层取」这三招,JSON 就不再可怕。本篇的 ParseJson直接替代番外篇11 的ScriptControl方案,案例 2、3 可无缝替换到番外篇12 的天气工具里。
下一篇预告
可选收尾篇:把 1~13 番外 + 主系列整理成《VBA 自动化工具箱》总目录(含速查表与索引)。 也可继续新主题(如正则 RegExp、调用 Python 等)。告诉我你想往哪走。
本文属于《从0学Excel VBA编程》番外系列,前序见:番外篇11(解析 JSON 接口)、番外篇12(获取天气预报)。