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

通过VBA HTTP查询从谷歌地图获取市政厅电话号码

嘿,我来帮你把这段VBA代码完善好,实现遍历城市列表、调用Google Places API获取市政厅电话号码的功能。先给你完整的可运行代码,再拆解关键细节:

完整VBA代码
Public Sub toGoogleMaps()
    Dim xmlhttp As Object
    Dim xmlDoc As Object
    Dim googleKey As String
    Dim cityRange As Range
    Dim cell As Range
    Dim query As String
    Dim apiUrl As String
    Dim phoneNode As Object
    
    ' 初始化API密钥(替换成你自己的有效密钥)
    googleKey = "XXXXXXXX" ' 你的API Key
    
    ' 假设城市列表在A列,从A2开始(A1是表头),可根据实际调整
    Set cityRange = ThisWorkbook.Sheets("Sheet1").Range("A2:A" & ThisWorkbook.Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row)
    
    ' 创建XMLHTTP对象和DOM文档对象
    Set xmlhttp = CreateObject("MSXML2.ServerXMLHTTP.6.0")
    Set xmlDoc = CreateObject("MSXML2.DOMDocument")
    
    On Error GoTo Cleanup ' 错误处理
    
    For Each cell In cityRange
        If Trim(cell.Value) <> "" Then
            ' 拼接查询词:市政厅(法语mairie)+城市名称
            query = "mairie+" & Replace(Trim(cell.Value), " ", "+")
            ' 构建API请求URL
            apiUrl = "https://maps.googleapis.com/maps/api/place/textsearch/xml?" & _
                     "query=" & query & "&key=" & googleKey
            
            ' 发送API请求
            xmlhttp.Open "GET", apiUrl, False
            xmlhttp.setRequestHeader "Content-Type", "application/xml"
            xmlhttp.send
            
            ' 加载返回的XML内容
            xmlDoc.LoadXML xmlhttp.ResponseText
            
            ' 查找电话号码节点
            Set phoneNode = xmlDoc.SelectSingleNode("//result/formatted_phone_number")
            
            ' 写入结果到B列对应单元格
            If Not phoneNode Is Nothing Then
                cell.Offset(0, 1).Value = phoneNode.Text
            Else
                cell.Offset(0, 1).Value = "未找到电话号码"
            End If
            
            ' 避免API请求频率过高(可选,根据Google API限制调整)
            Application.Wait Now + TimeValue("00:00:01")
        End If
    Next cell
    
    MsgBox "查询完成!", vbInformation
    
Cleanup:
    ' 释放对象
    Set xmlhttp = Nothing
    Set xmlDoc = Nothing
    Set phoneNode = Nothing
    Set cityRange = Nothing
    If Err.Number <> 0 Then
        MsgBox "发生错误:" & Err.Description, vbCritical
    End If
End Sub
关键细节说明
  • API密钥配置:一定要替换代码里的googleKey为你自己的有效Google Places API密钥,并且确保你的API项目已经启用了「Places API」,同时设置了正确的计费方式(Google API有免费额度,但超出后需要付费)
  • 城市列表范围:代码里默认城市在Sheet1的A列,你可以根据自己的表格修改工作表名称和单元格范围
  • 查询词拼接:因为是法语地区的市政厅,用mairie作为关键词,把城市名称里的空格替换成+适配URL编码
  • XML解析:通过DOM对象的SelectSingleNode方法定位到结果中的formatted_phone_number节点,提取电话号码
  • 防请求超限:添加了1秒的等待时间,避免短时间内发送过多请求触发Google API的频率限制
  • 错误处理:加入了错误捕获和对象释放逻辑,避免宏意外崩溃
注意事项

如果你遇到API返回错误,先检查:

  1. API密钥是否有效、是否启用了Places API
  2. 查询词是否正确,比如城市名称拼写
  3. 是否超出了API的请求额度或频率限制

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:23:12