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

VBA调用IBB iSpark ParkDetay API返回空值及报错问题求助

问题排查与解决:调用IBB iSpark ParkDetay API返回空值/报错问题

问题概述

调用https://api.ibb.gov.tr/ispark/ParkDetay?id=45接口时,代码添加On Error Resume Next后返回空值,移除该语句则触发“Invalid procedure call or argument”错误,但接口实际有有效数据返回。

核心问题原因

  1. JSON结构解析错误:该API返回的是数组包裹的单个对象(格式为[{...}]),而非直接的JSON对象。原代码直接用response("locationName")访问,相当于从数组中按键取值,必然触发错误。
  2. 数组定义与赋值错误:parkArray被定义为String类型数组,但需要存储数字、日期等多种类型数据;且ReDim parkArray(0 To 0)后直接赋值parkArray(15),存在数组索引越界问题。
  3. 错误处理掩盖问题:On Error Resume Next屏蔽了所有错误,导致无法发现JSON结构解析失败的核心问题,最终所有变量赋值失败返回空值。
  4. 数据类型强转风险:部分字段可能为空或格式不符合目标类型(如updateDate的字符串格式),直接赋值给强类型变量会触发错误。

修正后的代码

Sub dataxx()
    Dim request As New WinHttpRequest
    request.Open "GET", "https://api.ibb.gov.tr/ispark/ParkDetay?id=45"
    request.Send

    If request.Status <> 200 Then
        MsgBox "请求失败:" & request.ResponseText
        Exit Sub
    End If

    ' 解析JSON响应
    Dim response As Variant
    Set response = JsonConverter.ParseJSON(request.ResponseText)
    
    ' 判断是否为数组(API返回数组结构)
    If Not response Is Nothing And response.Count > 0 Then
        Dim parkData As Variant
        Set parkData = response(1) ' 取数组第一个元素(VBA-JSON数组索引从1开始)
        
        ' 定义Variant数组存储多类型数据
        Dim parkArray() As Variant
        ReDim parkArray(0 To 15) ' 对应16个字段
        
        ' 赋值并处理可能的空值
        parkArray(0) = IIf(IsNull(parkData("locationName")), "", parkData("locationName"))
        parkArray(1) = IIf(IsNull(parkData("parkID")), 0, parkData("parkID"))
        parkArray(2) = IIf(IsNull(parkData("parkName")), "", parkData("parkName"))
        parkArray(3) = IIf(IsNull(parkData("lat")), 0, parkData("lat"))
        parkArray(4) = IIf(IsNull(parkData("lng")), 0, parkData("lng"))
        parkArray(5) = IIf(IsNull(parkData("capacity")), 0, parkData("capacity"))
        parkArray(6) = IIf(IsNull(parkData("emptyCapacity")), 0, parkData("emptyCapacity"))
        
        ' 处理日期字段,避免格式错误
        Dim updateDateStr As String
        updateDateStr = IIf(IsNull(parkData("updateDate")), "", parkData("updateDate"))
        parkArray(7) = IIf(updateDateStr = "", Empty, CDate(updateDateStr))
        
        parkArray(8) = IIf(IsNull(parkData("workHours")), "", parkData("workHours"))
        parkArray(9) = IIf(IsNull(parkData("parkType")), "", parkData("parkType"))
        parkArray(10) = IIf(IsNull(parkData("freeTime")), 0, parkData("freeTime"))
        parkArray(11) = IIf(IsNull(parkData("monthlyFee")), 0, parkData("monthlyFee"))
        parkArray(12) = IIf(IsNull(parkData("tariff")), "", parkData("tariff"))
        parkArray(13) = IIf(IsNull(parkData("district")), "", parkData("district"))
        parkArray(14) = IIf(IsNull(parkData("address")), "", parkData("address"))
        parkArray(15) = IIf(IsNull(parkData("areaPolygon")), "", parkData("areaPolygon"))
        
        ' 可添加后续处理逻辑,比如写入工作表
        ' Sheets("Sheet1").Range("A1").Resize(1, 16).Value = parkArray
    Else
        MsgBox "未获取到有效数据"
    End If
End Sub

关键修正点

  • 针对API返回的数组结构,先通过response(1)获取单个对象数据;
  • 将parkArray改为Variant类型,支持存储多种数据类型;
  • 用IIf处理空值,避免因字段为空导致的赋值错误;
  • 单独处理日期字段,防止字符串格式错误触发转换异常;
  • 移除On Error Resume Next,改为显式判断与错误处理,便于定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 10:01:43