夜雨聆风学习资料网

ARTICLE · 996055

从0学Excel VBA编程 · 番外篇11:用 VBA-JSON 搞定 64 位——让 ScriptControl 失效的电脑也能拆 JSON

从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 代码,自然通行。

怎么装(一次性的事)

  1. 打开浏览器,访问 https://github.com/VBA-tools/VBA-JSON,下载仓库里的 JsonConverter.bas 文件(也可直接打开 raw 文本全选复制)。
  2. 回到 Excel 按 Alt+F11 打开 VBA 编辑器,菜单「文件 → 导入文件」,选中 JsonConverter.bas。你会看到一个叫 JsonConverter 的标准模块。
  3. 在 VBE 菜单「工具 → 引用」里,勾选 Microsoft Scripting Runtime(为了用 Dictionary)。

装好之后,全篇只需记住一个入口函数:JsonConverter.ParseJson(文本)。

它返回什么

ParseJson 看到 {...} 就返回 字典(Dictionary),看到 [...] 就返回 集合(Collection):

JSON 长相
ParseJson 返回
怎么取数据
单个对象 {"姓名":"张三"}
字典
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(获取天气预报)。

相关学习资料