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
关键修正点
- JSON格式修正:确保
fields对应的值是JSON对象(用{}包裹键值对),移除冗余括号和错误的字符串包裹 - VBA调用语法修正:调用
.Send方法时去掉参数外的括号,避免强制传值导致的崩溃
内容的提问来源于stack exchange,提问作者OrigamiEye
相关产品推荐
相关产品推荐

