Google의 지도 API를 사용하여 주소를 가져와 위도와 경도를 반환하는 환상적인 vba 스크립트를 발견했습니다. 그러나 Google에는 속도 제한 기능이 있으며 많은 수의 주소(약 3mil)에 대해 이 기능을 수행하고 싶습니다. 반면에 스크립트에는 속도 제한이 없으므로 호환되지 않습니다. 이전 요청이 완료될 때까지 다음 셀로 이동하지 않도록 이 스크립트를 편집할 수 있습니까?
Function MyGeocode(address As String) As String
Dim strAddress As String
Dim strQuery As String
Dim strLatitude As String
Dim strLongitude As String
strAddress = URLEncode(address)
'Assemble the query string
strQuery = "http://maps.googleapis.com/maps/api/geocode/xml?"
strQuery = strQuery & "address=" & strAddress
strQuery = strQuery & "&sensor=false"
'define XML and HTTP components
Dim googleResult As New MSXML2.DOMDocument60
Dim googleService As New MSXML2.XMLHTTP60
Dim oNodes As MSXML2.IXMLDOMNodeList
Dim oNode As MSXML2.IXMLDOMNode
'create HTTP request to query URL - make sure to have
'that last "False" there for synchronous operation
googleService.Open "GET", strQuery, False
googleService.send
googleResult.LoadXML (googleService.responseText)
Set oNodes = googleResult.getElementsByTagName("geometry")
If oNodes.Length = 1 Then
For Each oNode In oNodes
strLatitude = oNode.ChildNodes(0).ChildNodes(0).Text
strLongitude = oNode.ChildNodes(0).ChildNodes(1).Text
MyGeocode = strLatitude & "," & strLongitude
Next oNode
Else
MyGeocode = "Not Found (try again, you may have done too many too fast)"
End If
End Function
Public Function URLEncode(StringVal As String, Optional SpaceAsPlus As Boolean = False) As String
Dim StringLen As Long: StringLen = Len(StringVal)
If StringLen > 0 Then
ReDim result(StringLen) As String
Dim i As Long, CharCode As Integer
Dim Char As String, Space As String
If SpaceAsPlus Then Space = "+" Else Space = "%20"
For i = 1 To StringLen
Char = Mid$(StringVal, i, 1)
CharCode = Asc(Char)
Select Case CharCode
Case 97 To 122, 65 To 90, 48 To 57, 45, 46, 95, 126
result(i) = Char
Case 32
result(i) = Space
Case 0 To 15
result(i) = "%0" & Hex(CharCode)
Case Else
result(i) = "%" & Hex(CharCode)
End Select
Next i
URLEncode = Join(result, "")
End If
End Function
어떤 도움이라도 대단히 감사하겠습니다. 여러분은 최고입니다!
답변1
게시한 코드는 단순히 Excel에 Google 지도를 쿼리하는 방법을 알려줄 뿐 실제로는 그렇게 하지 않습니다. 함수를 호출 MyGeocode
하고 Excel에 쿼리할 주소를 알려 주어야 합니다.
먼저 Alt+를 눌러 F11VBE(Visual Basic Editor)에 액세스합니다. 왼쪽 패널에서 통합 문서 이름을 마우스 오른쪽 버튼으로 클릭하고끼워 넣다>기준 치수. VBA를 이 새 모듈에 붙여넣습니다.
이 코드를 실행하려면마이크로소프트 XML, v6.0도서관. VBE에서 클릭도구>참고자료, 아래로 스크롤하여 라이브러리 옆에 있는 상자를 선택합니다. 확인을 클릭하세요.
이제 Excel 자체로 돌아갑니다.
A:D 열에 300만 개의 주소 하위 집합이 있다고 가정해 보겠습니다.
E 열에서 모든 주소 필드를 연결하여 전체 주소를 하나의 셀에 표시합니다.
=A2&" "&B2&" "&C2&" "&D2
그런 다음 F열에서 다음과 같이 Google의 좌표를 호출할 수 있습니다.
=MyGeocode(E2)
호출 사이에 Excel에게 일시 중지를 지시할 필요가 없습니다. Excel에 실행을 지시한 횟수, =MyGeocode()
즉 Excel에서 수식을 복사한 행 수에 따라 이를 제어할 수 있습니다.
안전을 위해 하루에 2,500개 이하의 라인에서 이를 실행하여 규정을 준수하세요.Google 이용약관(Seth에게 감사드립니다) 하루에 걸 수 있는 통화 수를 100,000으로 늘리기 위해 현금을 기꺼이 쓰지 않는 한.
답변2
다음과 같이 VBA가 5초 동안 프로그램을 중지하도록 할 수 있습니다.
Application.Wait(Now + TimeValue("0:00:05"))
어느 것이 당신에게 도움이 될 수 있습니까?
답변3
300만 개의 주소가 있는 경우 속도 제한 없이 서비스를 사용할 수 있는 상업적 액세스를 얻는 것을 고려할 수 있습니다. 그렇지 않으면 다음과 같은 것을 사용하십시오:
Msgbox "Click to go on", , "Example"
에서와 같이이용약관:
디. API 제한
Google은 단독 재량에 따라 귀하의 API 사용에 대한 제한(예: 귀하가 수행할 수 있는 API 요청 수 또는 귀하가 제공할 수 있는 사용자 수 제한)을 설정하고 시행합니다. 귀하는 각 API에 문서화된 제한 사항에 동의하며 이를 회피하려고 시도하지 않습니다. 이러한 제한을 초과하여 API를 사용하려면 Google의 명시적인 동의를 받아야 합니다. Google은 해당 요청을 거부하거나 해당 사용에 대한 추가 약관 및/또는 요금에 대한 동의를 조건으로 수락할 수 있습니다. 승인을 받으려면 관련 Google API 팀에 문의하세요(예: Google 개발자 콘솔 사용).