지난 포스팅에서 공공데이터 포털에 가입을 하고 OpenAPI 사용신청까지 했습니다.
이번 포스팅에서는 신청한 OpenAPI를 이용해 엑셀 시트에 실시간 경락 정보를 불러와 보도록 하겠습니다.
정보를 불러오는 코드는 2가지 방법을 사용해 보겠습니다.
우선 첫번째 방법은 xml로 불러와서 각각의 노드값을 셀로 뿌려주는 방식입니다.
Sub CallOpenAPI()
Dim strURL As String
Dim strResult As String
Dim objHttp As New XMLHTTP60
Dim apiKey$, sNumber$, eNumber$, searchName$, searchDate$, coName$, productName$
'한글 url 인코딩
Static objHtmlfile As Object
If objHtmlfile Is Nothing Then
Set objHtmlfile = CreateObject("htmlfile")
With objHtmlfile.parentWindow
.execScript "function encode(s) {return encodeURIComponent(s)}", "jscript"
End With
End If
apiKey = 인증키
sNumber = "1"
eNumber = "50"
searchName = "부산반여도매시장"
searchDate = "20210211"
coName = "부산중앙청과"
productName = "부추"
strURL = "http://211.237.50.150:7080/openapi/" & apiKey & "/xml/Grid_20151127000000000314_1/" & sNumber & "/" & eNumber
strURL = strURL + "?DELNG_DE=" & searchDate
strURL = strURL + "&WHSAL_MRKT_NM=" & objHtmlfile.parentWindow.encode(searchName)
strURL = strURL + "&INSTT_NM=" & objHtmlfile.parentWindow.encode(coName)
strURL = strURL + "&STD_PRDLST_NM=" & objHtmlfile.parentWindow.encode(productName)
objHttp.Open "GET", strURL, False
objHttp.Send
If objHttp.Status = 200 Then '성공했을 경우
strResult = objHttp.ResponseText
'XML로 연결
Dim objXml As MSXML2.DOMDocument60
Set objXml = New DOMDocument60
objXml.LoadXML (strResult)
'노드 연결
Dim nodeList As IXMLDOMNodeList
Dim nodeRow As IXMLDOMNode
Dim nodeCell As IXMLDOMNode
Dim nRowCount As Integer
Dim nCellCount As Integer
Set nodeList = objXml.SelectNodes("/Grid_20151127000000000314_1/row")
nRowCount = 1
For Each nodeRow In nodeList
nRowCount = nRowCount + 1
nCellCount = 0
For Each nodeCell In nodeRow.ChildNodes
nCellCount = nCellCount + 1
'엑셀에 값 반영
Cells(nRowCount, nCellCount).Value = nodeCell.Text
Next nodeCell
Next nodeRow
Else
MsgBox "접속에 에러가 발생했습니다"
End If
End Sub
차후에 검색에 사용하기 위해서 각 요청변수 부분은 String 변수로 우선 설정을 해두었습니다.
인증키 부분은 각자 받은 인증키를 입력하시고 변수부분들도 원하는 값으로 변경해 사용해 보시면 되겠습니다.
html주소의 한글 부분은 objHtmlfile.parentWindow.encode를 이용해 인코딩을 해주셔야 제대로 데이터를 가져올수 있습니다.
코드는 21년 2월 11일자 부산반여도매시장의 부산중앙청과의 부추에 대한 실시간 경락 정보를 가져오는 코드가 되겠습니다.
두번째 방법은 XmlImport를 사용하는 방법입니다.
이 방법이 코드도 간단하고 사용하기도 쉬우며 데이터도 깔끔하게 표시가 됩니다.
Sub CallOpenAPI2()
Dim strURL As String
Dim strResult As String
Dim objHttp As New XMLHTTP60
Dim apiKey$, sNumber$, eNumber$, searchName$, searchDate$, coName$, productName$
'한글 url 인코딩
Static objHtmlfile As Object
If objHtmlfile Is Nothing Then
Set objHtmlfile = CreateObject("htmlfile")
With objHtmlfile.parentWindow
.execScript "function encode(s) {return encodeURIComponent(s)}", "jscript"
End With
End If
apiKey = 인증키
sNumber = "1"
eNumber = "50"
searchName = "부산반여도매시장"
searchDate = "20210211"
coName = "부산중앙청과"
productName = "부추"
strURL = "http://211.237.50.150:7080/openapi/" & apiKey & "/xml/Grid_20151127000000000314_1/" & sNumber & "/" & eNumber
strURL = strURL + "?DELNG_DE=" & searchDate
strURL = strURL + "&WHSAL_MRKT_NM=" & objHtmlfile.parentWindow.encode(searchName)
strURL = strURL + "&INSTT_NM=" & objHtmlfile.parentWindow.encode(coName)
strURL = strURL + "&STD_PRDLST_NM=" & objHtmlfile.parentWindow.encode(productName)
objHttp.Open "GET", strURL, False
objHttp.Send
If objHttp.Status = 200 Then '성공했을 경우
ActiveWorkbook.XmlImport Url:=strURL, ImportMap:=Nothing, overwrite:=True, Destination:=Range("$A$1")
Else
MsgBox "접속에 에러가 발생했습니다"
End If
End Sub
저는 여기서 필요한 부분만 가져와 사용할 예정이기 때문에 첫번째 방법을 조금 더 가공해서 사용할 예정입니다.
두가지 코드 모두 사용해 보시고 알맞은 코드로 선택해 사용하시면 되겠습니다.
'엑셀 vba > 실시간 경락 정보' 카테고리의 다른 글
실시간 경락 정보 #5 데이터 표 만들기 (0) | 2021.02.23 |
---|---|
실시간 경락 정보 #4 OpenAPI 교체 (0) | 2021.02.15 |
실시간 경락 정보 #3 데이터 가공 & 표시 (0) | 2021.02.13 |
실시간 경락 정보 #1 오픈 API 신청하기 (0) | 2021.02.12 |