엑셀 VBA로 도로명주소 우편번호 자동 조회하기 (Juso API 활용)
엑셀에 저장된 주소 데이터를 하나씩 검색하는 작업은 시간이 매우 많이 걸립니다. 이번 글에서는 행정안전부 주소기반산업지원서비스의 Juso API를 활용해, VBA에서 도로명주소 우편번호를 자동으로 가져오는 방법을 정리해보겠습니다.
Juso API 사이트
API 사용 전 반드시 승인 키(confmKey)를 발급받아야 합니다.
1. 주소 데이터 정제하기
Option Explicit
Sub 주소정제복사()
Dim 선택영역 As Range
Dim 셀 As Range
Dim 원본주소 As String
Dim 정제주소 As String
Dim 새열번호 As Long
If TypeName(Selection) <> "Range" Then
MsgBox "주소 열을 먼저 선택하세요.", vbExclamation
Exit Sub
End If
If Selection.Columns.Count > 1 Then
MsgBox "한 개 열만 선택하세요.", vbCritical
Exit Sub
End If
Set 선택영역 = Selection
선택영역.Columns(1).Offset(0, 1).EntireColumn.Insert
새열번호 = 선택영역.Column + 1
Cells(선택영역.Row, 새열번호).Value = "정제주소"
For Each 셀 In 선택영역.Cells
If 셀.Row > 선택영역.Row Then
원본주소 = Trim(셀.Value)
If 원본주소 <> "" Then
정제주소 = 원본주소
정제주소 = RemoveAfterChar(정제주소, "(")
정제주소 = RemoveAfterChar(정제주소, "[")
정제주소 = RemoveAfterChar(정제주소, ",")
Dim p As Long
p = InStr(정제주소, "외 ")
If p > 0 Then
정제주소 = Left(정제주소, p - 1)
End If
Do While InStr(정제주소, " ") > 0
정제주소 = Replace(정제주소, " ", " ")
Loop
정제주소 = Trim(정제주소)
Cells(셀.Row, 새열번호).Value = 정제주소
End If
End If
Next 셀
MsgBox "주소 정제 완료", vbInformation
End Sub
불필요한 괄호 및 추가 문자열이 제거된 정제 주소가 오른쪽 열에 자동 생성됩니다.
2. VBA에서 Juso API 호출하기
MSXML2.XMLHTTP 객체를 이용해 HTTP GET 요청을 보냅니다.
url = "https://business.juso.go.kr/addrlink/addrLinkApi.do?" & _
"confmKey=" & apiKey & _
"¤tPage=1" & _
"&countPerPage=1" & _
"&keyword=" & WorksheetFunction.EncodeURL(주소) & _
"&resultType=json"
Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "GET", url, False
http.Send
결과 = http.responseText
API 응답 JSON 데이터가 문자열 형태로 반환됩니다.
WorksheetFunction.EncodeURL()을 사용해야 한글 주소가 정상 전송됩니다.
3. JSON 응답에서 우편번호 추출하기
zipNo 항목이 포함되어 있습니다.
문자열 함수로 간단하게 추출할 수 있습니다.
시작위치 = InStr(결과, """zipNo"":""")
If 시작위치 > 0 Then
시작위치 = 시작위치 + 9
끝위치 = InStr(시작위치, 결과, """)
우편번호 = Mid(결과, 시작위치, 끝위치 - 시작위치)
Else
우편번호 = "검색실패"
End If
검색 성공 시 우편번호가 추출되어 엑셀 셀에 자동 입력됩니다.
4. 전체 자동화 매크로
Option Explicit
Sub 우편번호가져오기()
Dim 선택영역 As Range
Dim 셀 As Range
Dim http As Object
Dim url As String
Dim 결과 As String
Dim 시작위치 As Long
Dim 끝위치 As Long
Dim 우편번호 As String
Dim 주소 As String
Dim apiKey As String
apiKey = "발급받은 API KEY 입력"
Set 선택영역 = Selection
선택영역.Columns(선택영역.Columns.Count).Offset(0, 1).EntireColumn.Insert
선택영역.Cells(1, 선택영역.Columns.Count + 1).Value = "우편번호"
For Each 셀 In 선택영역.Cells
If 셀.Row > 선택영역.Row Then
If Trim(셀.Value) <> "" Then
주소 = CleanAddress(셀.Value)
url = "https://business.juso.go.kr/addrlink/addrLinkApi.do?" & _
"confmKey=" & apiKey & _
"¤tPage=1" & _
"&countPerPage=1" & _
"&keyword=" & WorksheetFunction.EncodeURL(주소) & _
"&resultType=json"
Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "GET", url, False
http.Send
결과 = http.responseText
시작위치 = InStr(결과, """zipNo"":""")
If 시작위치 > 0 Then
시작위치 = 시작위치 + 9
끝위치 = InStr(시작위치, 결과, """)
우편번호 = Mid(결과, 시작위치, 끝위치 - 시작위치)
Else
우편번호 = "검색실패"
End If
셀.Offset(0, 1).Value = 우편번호
End If
End If
Next 셀
MsgBox "우편번호 입력 완료", vbInformation
End Sub
선택한 주소 목록 전체에 우편번호가 자동 입력됩니다.
마무리 정리
VBA와 Juso API를 조합하면 대량 주소 데이터의 우편번호를 매우 빠르게 자동화할 수 있습니다. 특히 부동산 데이터, 고객 주소록, 배송지 목록 관리 업무에서 활용도가 높습니다.
```- 주소 정제를 먼저 해야 검색 성공률이 올라갑니다.
- MSXML2.XMLHTTP 객체로 API 호출이 가능합니다.
- JSON 응답의 zipNo 값을 추출해 우편번호를 자동 입력할 수 있습니다.

