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

Excel VBA字符串中多加{触发运行时错误-2147467260问题

Excel VBA调用Jira REST API的JSON格式问题排查与解决

问题现象

  • 当请求JSON字符串在fields:后添加{时(即ErrorData),执行.Send(ErrorData)会导致VBA崩溃,抛出错误代码-2147467260(80004004)
  • 使用无额外{的NoErrorData时,Jira返回Java错误:com.atlassian.jira.rest.v2.issue.IssueUpdateBean["fields"]

问题定位

1. NoErrorData的JSON格式错误

从打印结果可见,NoErrorData的实际内容存在语法错误:

{"fields": "customfield_13000":"2025-12-11"}}
  • fields的值被错误包裹在双引号中,Jira期望该字段是JSON对象而非字符串
  • 末尾多了一个冗余的},属于JSON语法错误

Jira的IssueUpdateBean要求fields必须是对象结构,因此返回格式错误提示。

2. ErrorData的VBA调用语法问题

ErrorData的JSON格式本身是正确的:

{"fields":{ "customfield_13000":"2025-12-11"}}

但VBA崩溃的原因是调用.Send时使用了多余括号:.Send(ErrorData)。在VBA中,方法参数加括号会强制按**传值(ByVal)**方式传递,而MSXML2.XMLHTTP60的Send方法对参数传递方式有要求,这种强制传值会引发内存访问中止错误(错误代码80004004对应E_ABORT)。

修正后的代码

Sub CurlyError_Fixed()
    Const URL = "https://jira.example.com/rest/api/latest/issue/issue-1111"
    Const vbDoubleQuote As String = """"
    Dim JiraService As New MSXML2.XMLHTTP60, ResponseTxt As String, sEncbase64Auth As String
    Dim validJsonData As String
       
    ' 生成Base64认证字符串
    sEncbase64Auth = EncodeBase64("USERNAME:PASSWORD")
   
    ' 拼接正确的JSON格式:fields的值为对象,无冗余符号
    validJsonData = "{" & vbDoubleQuote & "fields" & vbDoubleQuote & ":{" & vbDoubleQuote & "customfield_555" & vbDoubleQuote & ":" & vbDoubleQuote & "2025-12-11" & vbDoubleQuote & "}}"
    Debug.Print validJsonData
    
    With JiraService
        .Open "PUT", URL, False
        .SetRequestHeader "Content-Type", "application/json"
        .SetRequestHeader "Accept", "application/json"
        .SetRequestHeader "X-Atlassian-Token", "nocheck"
        .SetRequestHeader "Authorization", "Basic " & sEncbase64Auth
        ' 去掉Send方法的括号,按VBA默认传引用方式传递参数
        .Send validJsonData
        Debug.Print .ResponseText
    End With
End Sub

' Base64编码函数(保持原实现)
Public Function EncodeBase64(text As String) As String
    Dim arrData() As Byte
    arrData = StrConv(text, vbFromUnicode)
 
    Dim objXML As MSXML2.DOMDocument60
    Dim objNode As MSXML2.IXMLDOMElement
 
    Set objXML = New MSXML2.DOMDocument60
    Set objNode = objXML.createElement("b64")
 
    objNode.DataType = "bin.base64"
    objNode.nodeTypedValue = arrData
    EncodeBase64 = objNode.text
 
    Set objNode = Nothing
    Set objXML = Nothing
End Function

关键修正点

  1. JSON格式修正:确保fields对应的值是JSON对象(用{}包裹键值对),移除冗余括号和错误的字符串包裹
  2. VBA调用语法修正:调用.Send方法时去掉参数外的括号,避免强制传值导致的崩溃

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 15:55:03