通过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返回错误,先检查:
- API密钥是否有效、是否启用了Places API
- 查询词是否正确,比如城市名称拼写
- 是否超出了API的请求额度或频率限制
内容的提问来源于stack exchange,提问作者Vincent Tep
相关产品推荐
相关产品推荐

