VBA调用Open-Meteo API在Excel显示天气遇类型不匹配错误求助
排查VBA处理Open-Meteo API JSON时的「类型不匹配」错误
核心问题定位
Open-Meteo API返回的hourly字段下的windspeed_180m是数组类型,而非单个数值。你的错误大概率是把数组当作单个值进行类型判断或赋值导致的。
具体排查与修复步骤
1. 确认JSON解析库的处理逻辑
不同的VBA JSON解析库对数组的处理方式不同:
- VBA-JSON(第三方库):JSON数组会被解析为
Collection对象 - ScriptControl/Eval:JSON数组会被解析为
Variant()类型数组
在立即窗口(Ctrl+G)输入以下代码,确认windspeed_180m的实际类型:
Debug.Print TypeName(jsonObject("hourly")("windspeed_180m"))
2. 修正类型判断代码
如果你的错误代码是类似If TypeName(jsonObject("hourly")("windspeed_180m")) = "Double" Then,改成对应正确的判断:
- 数组类型判断:
If IsArray(jsonObject("hourly")("windspeed_180m")) Then ' 按数组处理逻辑执行 End If - Collection类型判断:
If TypeName(jsonObject("hourly")("windspeed_180m")) = "Collection" Then ' 按集合处理逻辑执行 End If
3. 修正变量赋值与遍历逻辑
错误示例(直接赋值单个数值类型):
Dim windSpeed As Double windSpeed = jsonObject("hourly")("windspeed_180m") ' 类型不匹配
正确处理方式:
若为Variant数组:
Dim windSpeedArr As Variant windSpeedArr = jsonObject("hourly")("windspeed_180m") ' 遍历数组写入工作表 Dim i As Integer For i = LBound(windSpeedArr) To UBound(windSpeedArr) Sheet1.Cells(i + 2, 3).Value = windSpeedArr(i) ' 第三列写入风速数据 Next i
若为Collection:
Dim windSpeedCol As Collection Set windSpeedCol = jsonObject("hourly")("windspeed_180m") ' 遍历集合写入工作表 Dim rowNum As Integer: rowNum = 2 Dim wsItem As Variant For Each wsItem In windSpeedCol Sheet1.Cells(rowNum, 3).Value = wsItem rowNum = rowNum + 1 Next wsItem
4. 验证JSON结构完整性
如果仍有问题,先将API返回的完整JSON打印到立即窗口,确认windspeed_180m字段存在且结构正常:
Debug.Print IIf(TypeName(jsonObject("hourly")("windspeed_180m")) = "Collection", _ jsonObject("hourly")("windspeed_180m").Count, _ UBound(jsonObject("hourly")("windspeed_180m")) + 1)
内容的提问来源于stack exchange,提问作者Nattapat Samitakasettrin
相关产品推荐
相关产品推荐

