零基础搞定VBA JSON解析与转换:免费开源库VBA-JSON一次搞定
上周帮同事对接一个 Web API:Excel 里躺着一大段接口返回的 JSON 文本,他想把里面的"名称、价格、库存"填进表格,结果只能对着 {、: 和引号手工拆分,折腾一下午还时不时报"类型不匹配"。这个场景你应该不陌生——VBA 没有原生 JSON 解析功能,而开源库 VBA-JSON 恰好就是为这事生的:三行代码,搞定。
你从接口拿回 JSON,Excel 却说:类型不匹配
先想象一个画面。你费劲巴拉调通了 HTTP 请求,终于把数据拿回来了,结果是这样一串:
{"name":"laptop","price":5999,"stock":true}
接下来呢?用 Split 按冒号拆?用 InStr 找引号?数据一嵌套,比如再包个数组、套个对象,字符串函数瞬间变成一场灾难。
其实你的需求很简单:把 JSON 变成能像 对象("键") 这样随手取值的结构,取完还能再变回 JSON 发出去。这就是 VBA-JSON 存在的全部意义——它专门负责 VBA 里的 JSON 解析与转换。
它是什么?一个文件,解决一整类事
VBA-JSON 是个开源库,核心只有一个文件:JsonConverter.bas。
- 负责把 JSON 文本解析成 VBA 能用的对象(解析)
- 也负责把字典、集合、数组变回 JSON 文本(转换)
- 兼容 Excel、Access 等 Office 应用,Windows 和 Mac 都能跑
作者在 Windows Excel 2013 和 Excel for Mac 2011 上都测试过,2007 以上的版本基本通用。没有插件、没有安装包、没有环境配置,一个 .bas 文件就是全部家当。
先把第一个 JSON 跑起来(真的只要三步)
装它就像往书包里塞一本书,三步走:
- 把
JsonConverter.bas下载到本地 - 打开 VBA 编辑器(
Alt + F11),菜单"文件 → 导入文件",选它 - 配字典:Windows 用户在"工具 → 引用"里勾上 Microsoft Scripting Runtime;Mac 用户则导入 VBA-Dictionary 的
Dictionary.cls
然后,复制这段最小代码到模块里,按 F5:
Sub FirstJson()
Dim jsonText As String
jsonText = "{""name"":""laptop"",""price"":5999,""stock"":true}"
Dim parsed As Object
Set parsed = JsonConverter.ParseJson(jsonText)
Debug.Print parsed("name") ' 输出 laptop
Debug.Print parsed("price") ' 输出 5999
Debug.Print parsed("stock") ' 输出 True
End Sub
注意 VBA 字符串里表示双引号要写两个 "",这行代码的关键就是 ParseJson 这一个函数。跑通了?恭喜,你的 Office 已经会读 JSON 了。
三个真实场景,难度一点点加上去
场景一:把接口返回的行情填进表格
接口返回一个股票列表,你想逐行写进工作表:
Sub FillSheet()
Dim jsonText As String
jsonText = "{""items"":[{""code"":""000001"",""price"":15.23},{""code"":""000002"",""price"":25.67}]}"
Dim data As Object
Set data = JsonConverter.ParseJson(jsonText)
Dim r As Long: r = 2
Dim item As Variant
For Each item In data("items") ' 数组自动变成集合
Cells(r, 1).Value = item("code")
Cells(r, 2).Value = item("price")
r = r + 1
Next item
End Sub
为什么选它? 数组在 VBA 里被自动转成 Collection,For Each 直接遍历,不用再写正则去劈字符串。以前两小时的活,现在十分钟。
场景二:从 .json 配置文件读取设置
你的程序有一堆参数想存在文件里,而不是写死在代码中:
Sub LoadConfig()
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Dim ts As Object
Set ts = fso.OpenTextFile("C:\data\config.json", 1) ' 1 = 只读
Dim text As String
text = ts.ReadAll
ts.Close
Dim cfg As Object
Set cfg = JsonConverter.ParseJson(text)
MsgBox "主题是:" & cfg("theme") & ",端口:" & cfg("port")
End Sub
为什么选它? 对象解析后变成字典结构,取值像查字典一样直观。改配置不用动代码,发个新文件给用户就行,省事多了。
场景三:把 Excel 数据导出成 JSON 交给别的系统
反过来,把数据组装好再变回 JSON 文本:
Sub ExportJson()
Dim payload As Object
Set payload = CreateObject("Scripting.Dictionary")
payload.Add "title", "销售数据"
payload.Add "values", Array(120, 98, 156)
Dim output As String
output = JsonConverter.ConvertToJson(payload, Whitespace:=2)
Debug.Print output ' 带缩进的漂亮 JSON
End Sub
为什么选它? ConvertToJson 是解析的逆操作,传 Whitespace:=2 就能输出带缩进的格式,既方便调试,也方便别的系统直接消费。字典、数组、对象随便嵌套,它都接得住。
新手最容易踩的四个坑
- 报错"用户定义类型未定义" —— 八成是忘了勾 Microsoft Scripting Runtime 引用,回"工具 → 引用"补上即可。
- 身份证号、订单号超过 15 位被截断 —— VBA 只存 15 位有效数字。默认策略是:超过 15 位的纯数字自动当字符串保留,这其实是个保护机制,别急着开
UseDoubleForLargeNumbers,开了才会转成Double、丢掉精度。 - 键名忘了加引号 —— JSON 标准要求键必须带引号,
{name:"x"}这种写法解析会失败。真要容忍无引号键,才需要打开AllowUnquotedKeys。 - Mac 用户直接报找不到 Dictionary —— 别慌,Mac 上没有 Scripting Runtime,记得导入 VBA-Dictionary 的
Dictionary.cls类文件。
几个开关和日期函数,把上限再抬高一点
VBA-JSON 留了三个全局开关,在 JsonConverter.JsonOptions 里,按需打开即可:
| 开关 | 默认 | 作用 |
|---|---|---|
UseDoubleForLargeNumbers | False | 大数字用字符串还是 Double |
AllowUnquotedKeys | False | 是否允许不带引号的键名 |
EscapeSolidus | False | 输出时是否把 / 转义成 \/ |
还有一组日期函数:ParseIso / ConvertToIso 处理 ISO 时间字符串,ParseUtc / ConvertToUtc 处理 UTC 时间换算。对接口里的时间字段,这组函数能省掉不少手工格式化。
顺带一提,它本身是从 VBA-Web 项目里成长出来的,如果你之后想构建完整的 API 客户端,这两者搭配非常顺手。
下一步:把它装进你的工具箱
想立刻上手,打开命令行:
git clone https://gitcode.com/gh_mirrors/vb/VBA-JSON
然后按上面三步导入、加引用、复制第一段代码跑一遍。项目里还带着一份测试文件(specs/ 目录下的 Specs.bas),想验证自己对 API 的理解,直接读它比翻文档还快。
VBA-JSON 最打动我的一点是:整个库就一个文件,装进任何 Office 项目几乎零成本,却能把你从手工劈字符串的泥潭里彻底捞出来。下次再看到 JSON,别皱眉——你已经有趁手的工具了。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



