Mac下CreateObject("MSXML2.ServerXMLHTTP")报Error 429问题求助
解决Mac系统VBA调用Bing Maps API的HTTP请求错误
问题根源
Windows上的MSXML2.ServerXMLHTTP是ActiveX专属组件,Mac系统的VBA不支持ActiveX对象,这就是Error 429的直接原因;Server.CreateObject依赖Windows ASP环境,Mac上同样无法生效。
解决方案:改用Mac兼容的HTTP请求对象
在Mac的VBA中,替换为XMLHTTP类的兼容实现,以下是修改后的GetDistance函数示例:
Function GetDistance(startAddr As String, endAddr As String, bingKey As String) As Double Dim objHTTP As Object Dim responseText As String Dim jsonResponse As Object ' 初始化Mac兼容的HTTP对象 On Error Resume Next Set objHTTP = CreateObject("XMLHTTP") If Err.Number <> 0 Then Set objHTTP = CreateObject("MSXML.XMLHTTP") Err.Clear End If On Error GoTo 0 If objHTTP Is Nothing Then GetDistance = -1 ' 返回错误标记 Exit Function End If ' 构造Bing Maps API请求URL Dim requestURL As String requestURL = "https://dev.virtualearth.net/REST/v1/Routes/DistanceMatrix?" & _ "origins=" & URLEncode(startAddr) & _ "&destinations=" & URLEncode(endAddr) & _ "&travelMode=driving" & _ "&key=" & bingKey ' 发送请求 objHTTP.Open "GET", requestURL, False objHTTP.Send ' 解析响应(需引入VBA-JSON库实现JSON解析) If objHTTP.Status = 200 Then responseText = objHTTP.ResponseText Set jsonResponse = JsonConverter.ParseJson(responseText) GetDistance = jsonResponse("resourceSets")(1)("resources")(1)("results")(1)("travelDistance") Else GetDistance = -1 ' 请求失败标记 End If ' 清理对象 Set objHTTP = Nothing Set jsonResponse = Nothing End Function ' 辅助函数:实现URL编码(Mac VBA无内置URLEncode) Function URLEncode(str As String) As String Dim bytes() As Byte Dim i As Integer Dim char As String bytes = StrConv(str, vbUnicode) For i = 0 To UBound(bytes) Step 2 char = Hex(bytes(i)) If Len(char) = 1 Then char = "0" & char URLEncode = URLEncode & "%" & char Next i End Function
额外注意事项
- JSON解析:Mac VBA无内置JSON解析能力,需将VBA-JSON库代码复制到你的VBA模块中使用,无需外部依赖。
- 早期绑定选项:若要使用早期绑定,在Mac Office的VBA编辑器中依次点击
工具->引用,勾选Microsoft XML, v6.0,之后可直接声明Dim objHTTP As MSXML2.XMLHTTP60。 - 网络权限:确保Mac Office拥有网络访问权限,前往
系统偏好设置->安全性与隐私->隐私->完全磁盘访问权限,添加对应Office应用。
内容的提问来源于stack exchange,提问作者CrustyCrustecean
相关产品推荐
相关产品推荐

