You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用JsonConverter解析API响应时VBA报错‘438’:对象不支持该属性或方法

解决VBA-JSON解析时的运行时错误438

核心问题定位

错误438的根源是混淆了两种JSON解析实现:

  • 你已导入官方VBA-JSON的JsonConverter.bas模块,该模块本身提供ParseJson方法,无需通过CreateObject创建ScriptControl对象模拟解析功能。
  • 错误地将ScriptControl对象命名为JsonConverter,但实际的JsonConverter是标准模块,两者类型不匹配,导致调用ParseJson时触发“对象不支持该属性或方法”。

修复步骤

  1. 移除ScriptControl相关冗余代码
    删除所有通过CreateObject创建ScriptControl的代码,包括添加parseJson函数的部分。例如,删除以下类似代码:

    Dim JsonConverter As Object
    Set JsonConverter = CreateObject("MSScriptControl.ScriptControl")
    JsonConverter.Language = "JScript"
    JsonConverter.AddCode "function parseJson(jsonStr) { return eval('(' + jsonStr + ')'); }"
    
  2. 直接调用VBA-JSON模块的ParseJson方法
    确认JsonConverter.bas已正确导入VBA工程,直接使用模块内置的方法:

    Dim http As Object
    Set http = CreateObject("MSXML2.XMLHTTP.6.0")
    ' 此处省略API请求相关代码...
    
    Dim json As Object
    ' 直接调用模块的ParseJson方法,无需创建额外对象
    Set json = JsonConverter.ParseJson(http.ResponseText)
    
  3. 验证基础配置状态

    • 确认已添加Microsoft Scripting Runtime引用(VBA编辑器→工具→引用)
    • 检查JsonConverter.bas模块存在于工程中,且未被重命名
    • 再次验证API返回的JSON格式(可复制响应文本到本地JSON校验工具确认)
  4. 64位环境适配检查
    若使用64位Excel:

    • 打开JsonConverter.bas,确认模块顶部包含#If VBA7 Then和PtrSafe声明,若缺失则替换为官方最新版本的模块代码
    • VBA-JSON本身不依赖ScriptControl,无需保留Tablacus ScriptControl的相关配置(除非你有其他JS解析需求)

修正后代码示例

Sub GetAPIData()
    Dim http As Object
    Dim json As Object
    Dim ws As Worksheet
    Dim rowNum As Integer
    
    ' 初始化对象
    Set http = CreateObject("MSXML2.XMLHTTP.6.0")
    Set ws = ThisWorkbook.Sheets("Sheet1")
    rowNum = 2 ' 从第二行开始写入数据
    
    ' 发送API请求
    http.Open "GET", "https://api.example.com/target-data", False
    http.Send
    
    ' 解析并写入数据
    If http.Status = 200 Then
        Set json = JsonConverter.ParseJson(http.ResponseText)
        
        ' 遍历JSON数据写入单元格
        For Each item In json("items")
            ws.Cells(rowNum, 1).Value = item("id")
            ws.Cells(rowNum, 2).Value = item("title")
            rowNum = rowNum + 1
        Next item
    Else
        MsgBox "API请求失败,状态码:" & http.Status
    End If
    
    ' 释放对象
    Set http = Nothing
    Set json = Nothing
    Set ws = Nothing
End Sub

内容的提问来源于stack exchange,提问作者Travis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 05:25:18