Ver2.5 VBA와 외부 API 연동: 엑셀, 날씨 데이터를 삼키다 🌦️

VBA와 외부 API 연동: 엑셀, 날씨 데이터를 삼키다 🌦️
단순 반복 작업은 이제 그만! 엑셀 VBA와 API로 만드는 나만의 날씨 데이터 자동 수집기, 지금 바로 시작합니다!
안녕! 👋 혹시 매일 아침, 혹은 매주 월요일마다 특정 웹사이트에 들어가서 데이터를 긁어와 엑셀에 붙여넣는, 그런 영혼 없는 '복붙' 작업을 하고 있진 않아? 주식 시세, 환율 정보, 혹은 오늘 우리가 다룰 날씨 데이터까지. 생각만 해도 벌써부터 손목이 시큰거리는 기분이지. 😥
엑셀 좀 다룬다 하는 사람들은 '매크로'나 'VBA'를 들어봤을 거야. 맞아, 바로 그 VBA(Visual Basic for Applications)가 오늘 우리의 주인공이야. 하지만 그냥 평범한 VBA가 아니야. 인터넷 세상의 무궁무진한 데이터를 엑셀 시트로 직접 '소환'하는, 그야말로 마법 같은 스킬을 장착한 VBA를 만나게 될 거야.
바로 'API 연동'이라는 치트키를 통해서 말이지! 🚀
이 글을 끝까지 따라오면, 넌 더 이상 단순 데이터 수집에 시간을 낭비하지 않게 될 거야. 대신 버튼 클릭 한 번, 혹은 정해진 시간이 되면 엑셀이 스스로 최신 날씨 정보를 쫙~ 가져와서 정리해 주는, 그야말로 '자동화의 신세계'를 경험하게 될 거야. "이거 완전 핵인싸 스킬 아니야?" 맞아. 바로 그 스킬, 지금부터 하나씩 차근차근 내 걸로 만들어 보자고!
1. 도대체 API가 뭔데? 왜 VBA랑 쓰면 좋은 건데?
좋아, 시작하기 전에 가장 근본적인 질문부터 해결하고 가자. API, 대체 이게 뭘까? 개발자들만 쓰는 어려운 용어 같다고? 전혀! 아주 쉽게 비유해 줄게.
당신이 근사한 레스토랑에 갔다고 상상해 봐. 🍽️
주방에는 최고의 셰프들과 신선한 재료들이 가득하지만, 당신이 직접 주방에 들어가서 요리할 수는 없지. 대신 뭘 하지? 맞아, 메뉴판을 보고 웨이터에게 주문을 하잖아.
"여기 채끝 스테이크 미디엄 레어로 주시고요, 와인은 이걸로 주세요."
여기서 API(Application Programming Interface)는 바로 그 '메뉴판'과 '웨이터'의 역할을 하는 거야.
인터넷 세상 어딘가에 있는 거대한 데이터베이스(주방)에 우리가 원하는 데이터(요리)가 있어. 우리는 그 데이터베이스의 구조를 몰라도 돼. 그냥 API라는 메뉴판에 적힌 '규칙'대로 "서울 날씨 정보 주세요"라고 주문(요청)만 하면, API가 주방에 가서 데이터를 예쁘게 포장해서 우리에게 가져다주는(응답) 거지.
이게 왜 VBA랑 만나면 시너지가 폭발할까? 💣
- VBA: 엑셀이라는 '내부' 세계의 황제. 시트를 만들고, 셀에 값을 쓰고, 차트를 그리는 등 엑셀 안의 모든 것을 자동화할 수 있어.
- API: 엑셀 '외부'의 데이터를 가져오는 문. 인터넷 세상의 모든 정보를 엑셀로 불러올 수 있는 통로야.
즉, API로 외부 데이터를 가져와서, VBA로 그 데이터를 입맛에 맞게 가공하고 분석하고 보고서까지 만드는, 그야말로 데이터 처리의 '풀코스'를 자동화할 수 있게 되는 거야. 이건 단순히 시간을 아끼는 수준을 넘어, 업무의 퀄리티 자체를 바꿔버리는 강력한 무기가 될 수 있어.
💡 잠깐! 어떤 데이터를 가져올 수 있는데?
상상하는 거의 모든 것! 우리가 오늘 다룰 날씨 정보는 기본이고,
- 금융: 실시간 주가, 환율, 암호화폐 시세
- 공공 데이터: 미세먼지 농도, 부동산 실거래가, 전국 병원 정보
- 마케팅: 구글/페이스북 광고 성과, 소셜 미디어 언급량
- 쇼핑: 특정 상품 가격 변동 추이
이 모든 게 API를 통해 가능해. 오늘 날씨 데이터 수집기를 성공적으로 만들고 나면, 이 모든 영역에 도전할 수 있는 기본기를 갖추게 되는 셈이야. 완전 설레지 않아? 😉
2. 전투 준비: 엑셀 설정과 API 키 발급받기
자, 이제 본격적으로 코딩에 들어가기 전에, 전쟁터에 나갈 준비를 해야지. 비장한 마음으로 엑셀을 켜고, 우리의 비밀 무기인 API 키를 발급받아 보자. 하나도 어렵지 않으니 겁먹지 말고 따라와!
(1) 엑셀 개발 도구 탭 활성화하기
VBA 코드를 작성하려면 먼저 '개발 도구'라는 숨겨진 메뉴를 꺼내야 해. 기본적으로는 비활성화되어 있거든. 마치 게임에서 히든 캐릭터를 꺼내는 느낌이랄까?
- 엑셀을 켠다.
- [파일] 탭 클릭 → [옵션] 클릭
- Excel 옵션 창이 뜨면 왼쪽 메뉴에서 [리본 사용자 지정] 클릭
- 오른쪽 '기본 탭' 목록에서 '개발 도구' 체크박스를 찾아서 ✔️ 체크!
- [확인] 버튼을 누르면 끝!
이제 엑셀 상단 메뉴에 '개발 도구' 탭이 짠! 하고 나타났을 거야. 이걸 눌러서 왼쪽 끝에 있는 'Visual Basic'을 클릭하거나, 간단하게 단축키 Alt + F11을 누르면... 드디어 VBA 코드를 작성할 수 있는 VBE(Visual Basic Editor) 창이 열려. 여기가 바로 우리의 작업실이야. 💻
(2) 우리의 웨이터, OpenWeatherMap API 키 발급받기
이제 레스토랑(데이터 서버)에 주문을 넣기 위한 '특별 회원증' 같은 걸 발급받을 차례야. 이게 바로 API 키(Key)라는 건데, "이 요청은 허가받은 사용자 '아무개'가 보내는 겁니다"라는 걸 증명해 주는 고유한 문자열이야. 대부분의 API는 무분별한 사용을 막기 위해 이 키를 요구해.
우리는 전 세계적으로 가장 유명하고, 개인 사용자에게는 무료 플랜을 제공하는 착한 날씨 API, 'OpenWeatherMap'을 사용할 거야.
API 키 발급 절차 (완전 쉬움 주의!):
- 브라우저를 열고 `openweathermap.org` 로 접속해.
- 오른쪽 위에 있는 'Sign in'을 클릭하고, 계정이 없다면 'Create an Account'를 눌러서 회원가입을 진행해. (이메일, 비밀번호만 있으면 됨!)
- 로그인을 하면, 사용자 이름 옆에 'API keys'라는 탭이 보일 거야. 그걸 클릭!
- 'Create key' 부분에 원하는 키 이름을 아무거나 입력하고 (예: MyExcelWeather) 'Generate' 버튼을 눌러.
- 짠! ✨ 아래 'API key' 목록에 방금 만든 이름과 함께 길고 복잡한 문자열이 생성됐을 거야. 그게 바로 너만의 소중한 API 키야. 이 키는 다른 사람에게 절대 보여주면 안 돼! 일단 메모장 같은 곳에 잘 복사해 둬.
🚨 중요! API 키 활성화 시간
API 키를 막 생성했다면 바로 사용할 수 없을 수도 있어. OpenWeatherMap의 경우, 서버에 키가 등록되고 활성화되기까지 몇 분에서 최대 2시간 정도 걸릴 수 있다고 해. 만약 나중에 코드를 다 작성했는데 "Invalid API key" 같은 에러가 뜬다면, 커피 한 잔 마시면서 조금만 기다렸다가 다시 시도해 봐. ☕
3. 코드의 심장부: VBA로 인터넷에 말 걸기
자, 모든 준비는 끝났다. 이제 진짜 코드를 작성해서 엑셀이 인터넷 세상과 소통하게 만들어 보자. 조금 복잡해 보일 수 있지만, 각 코드가 어떤 역할을 하는지 내가 옆에서 조목조목 설명해 줄 테니 걱정 마.
(1) 외부 라이브러리 참조 추가하기
VBA는 기본적으로 엑셀 내부 작업에 특화되어 있어서, 인터넷 통신(HTTP 요청) 같은 외부 작업을 하려면 약간의 도움이 필요해. '이런 기능도 쓸 수 있게 허락해 줘!'라고 알려주는 과정이라고 생각하면 돼.
- VBE 창(Alt + F11)에서 상단 메뉴의 [도구(T)] → [참조(R)...]를 클릭해.
- '참조' 창이 뜨면 스크롤을 내려서 `Microsoft XML, v6.0`을 찾아서 체크해 줘.
- 만약 `v6.0`이 없다면 `v3.0`이라도 괜찮아. 둘 다 없다면? 그럴 땐 `Microsoft WinHTTP Services, version 5.1`을 체크해도 동일한 기능을 수행할 수 있어. (오늘은 `XML v6.0` 기준으로 설명할게)
- [확인]을 누르면 끝!
이 과정을 통해 우리는 VBA에게 "이제부터 인터넷 주소로 데이터를 요청하고 받아오는 기능을 사용할 거야!"라고 선언한 셈이야.
(2) 모듈 삽입하고 첫 코드 작성하기
VBE 창 왼쪽을 보면 '프로젝트 탐색기'가 있을 거야. 여기서 마우스 오른쪽 버튼을 클릭하고 [삽입(I)] → [모듈(M)]을 선택해. 그럼 하얀 도화지 같은 코드 창이 하나 생길 거야. 여기에 우리의 마법 주문을 적어 넣을 거야.
자, 아래 코드를 그대로 복사해서 붙여넣어 봐.
' VBA와 외부 API 연동: 날씨 데이터 자동 수집기
' 1단계: 기본 HTTP 요청 보내고 응답 받기
Sub GetWeatherData()
' 변수 선언: 코딩의 가장 기본! 데이터를 담을 그릇을 만드는 과정
Dim oHttp As Object ' 인터넷 통신을 담당할 객체
Dim sURL As String ' 우리가 요청을 보낼 API 주소
Dim sAPIKey As String ' 아까 발급받은 나만의 소중한 API 키
Dim sCity As String ' 날씨를 조회할 도시 이름
Dim sResponse As String ' API 서버가 우리에게 보내주는 응답 데이터 (JSON 형태)
' 변수에 실제 값 할당하기
sAPIKey = "여기에_아까_복사한_API_키를_붙여넣으세요"
sCity = "Seoul" ' 일단 서울로 테스트 해보자!
' API 요청을 위한 URL 조합하기
' OpenWeatherMap의 Current Weather Data API 엔드포인트를 사용하는 거야.
sURL = "https://api.openweathermap.org/data/2.5/weather?" _
& "q=" & sCity _
& "&appid=" & sAPIKey _
& "&units=metric" ' 온도를 섭씨(Celsius)로 받기 위한 옵션
' 인터넷 통신 객체 생성
Set oHttp = CreateObject("MSXML2.XMLHTTP")
' 이제 진짜로 요청을 보낸다!
' "GET" 방식: 단순히 정보를 '가져오는' 요청
' sURL: 어느 주소로?
' False: 동기 방식 (응답이 올 때까지 다음 코드로 넘어가지 않고 기다림)
oHttp.Open "GET", sURL, False
oHttp.send
' 서버로부터 받은 응답을 변수에 저장
sResponse = oHttp.responseText
' 일단 응답이 잘 오는지 확인해보자!
' Debug.Print는 VBE의 '직접 실행 창'에 결과를 출력해주는 명령어.
' 직접 실행 창이 안 보이면 Ctrl+G를 눌러봐.
Debug.Print sResponse
' 사용한 객체는 메모리에서 해제해주는 게 좋은 습관!
Set oHttp = Nothing
End Sub
코드에 `sAPIKey = "여기에_아까_복사한_API_키를_붙여넣으세요"` 부분에 진짜 네 API 키를 넣었어?
좋아, 이제 VBE 창에서 이 코드 아무데나 커서를 두고 F5 키를 눌러서 실행해 봐! 아무 일도 안 일어나는 것 같다고? 아니, VBE 창 하단에 '직접 실행 창'(`Ctrl+G`로 켜고 끌 수 있음)을 봐봐. 거기에 뭔가 알 수 없는 외계어 같은 텍스트가 좌르륵 출력되지 않았어? 👇
{"coord":{"lon":126.9778,"lat":37.5683},"weather":[{"id":800,"main":"Clear","description":"clear sky","icon":"01d"}],"base":"stations","main":{"temp":28.56,"feels_like":31.9,"temp_min":26.11,"temp_max":29.48,"pressure":1009,"humidity":66},"visibility":10000,"wind":{"speed":2.06,"deg":240},"clouds":{"all":0},"dt":1658469901,"sys":{"type":1,"id":8105,"country":"KR","sunrise":1658435561,"sunset":1658486937},"timezone":32400,"id":1835848,"name":"Seoul","cod":200}
만약 이런 식의 텍스트가 보인다면... 축하해! 🎉 넌 방금 VBA로 인터넷 서버와 첫 대화에 성공한 거야! 이게 바로 OpenWeatherMap 서버가 우리에게 보내준 서울의 실시간 날씨 데이터야. 이 이상한 텍스트의 정체가 바로... JSON이라는 친구지.
4. 외계어 해독 작전: JSON 데이터 파싱하기
서버가 보내준 JSON 데이터. 생긴 건 좀 낯설지만, 사실 굉장히 규칙적이고 논리적인 구조를 가지고 있어. 이걸 '파싱(Parsing)'해서 우리가 원하는 정보만 쏙쏙 골라내는 방법을 알아볼 거야. 파싱은 쉽게 말해 '데이터를 분해하고 해석하는 과정'이야.
(1) JSON 101: 기본 구조 이해하기
JSON은 'JavaScript Object Notation'의 약자야. 이름은 거창하지만 구조는 딱 두 가지만 기억하면 돼.
- 객체(Object): 중괄호
{ }로 감싸여 있고, '키(Key)'와 '값(Value)'이 한 쌍으로 이루어져 있어."키": "값"이런 식으로. 위 예시에서"name": "Seoul"이 바로 그런 거야. 'name'이라는 키에 'Seoul'이라는 문자열 값이 담겨있지. - 배열(Array): 대괄호
[ ]로 감싸여 있고, 여러 개의 값을 순서대로 나열한 거야. 위 예시에서"weather"키의 값은[ { ... } ]형태로 되어 있지? 이건 날씨 정보가 여러 개일 수 있다는 뜻이야 (예: 구름 조금, 약한 비).
우리가 원하는 데이터는 바로 이 구조 속에 숨어있어. 예를 들어 현재 온도를 알고 싶다면? 전체 JSON 객체에서 'main'이라는 키를 찾아. 그 값도 객체지? 그 안에서 다시 'temp'라는 키를 찾으면, 우리가 원하는 온도 값 28.56을 얻을 수 있는 거야!
(2) VBA-JSON 라이브러리: 우리의 똑똑한 번역가
이런 JSON 구조를 VBA에서 직접 다루려면 `InStr`, `Mid` 같은 문자열 함수로 낑낑대며 잘라내야 하는데... 이건 너무 힘들고 실수하기도 쉬워. 그래서 우린 천재 개발자들이 미리 만들어 놓은 'JSON 파서(Parser)' 라이브러리를 쓸 거야. 그중 가장 유명하고 쓰기 편한 `VBA-JSON`을 사용해 보자.
VBA-JSON 라이브러리 설치하기:
- 구글에 `VBA-JSON github` 이라고 검색하거나, 주소창에 `github.com/VBA-tools/VBA-JSON` 을 직접 입력해서 접속해.
- 페이지 중간쯤에 `JsonConverter.bas` 라는 파일이 보일 거야. 이걸 클릭해.
- 파일 내용이 쭉 보이면, 오른쪽 위에 있는 'Raw' 버튼을 눌러. 그럼 순수한 코드 텍스트만 보일 거야.
- 이 텍스트 전체를 복사해 (Ctrl + A, Ctrl + C).
- 다시 우리의 VBE 창으로 돌아와서, 아까처럼 프로젝트 탐색기에서 마우스 오른쪽 클릭 → [삽입(I)] → [모듈(M)]을 선택해서 새 모듈을 하나 더 만들어.
- 새로 생긴 모듈 창에 방금 복사한 코드를 그대로 붙여넣어 (Ctrl + V).
- 그리고 이 모듈의 이름을 바꿔주면 좋아. VBE 창 왼쪽 아래 '속성 창'에서 `(이름)` 부분을 `Module2`에서 `JsonConverter`로 변경해 줘. 그래야 나중에 코드를 알아보기 편하거든.
이걸로 끝! 이제 우리 VBA 프로젝트는 JSON이라는 외계어를 완벽하게 해독할 수 있는 번역가를 고용한 셈이야. 👨🎓
(3) 코드를 업그레이드하여 데이터 추출하기
자, 이제 아까 작성했던 `GetWeatherData` 코드를 업그레이드해서, JSON을 파싱하고 원하는 데이터만 쏙쏙 뽑아내 보자. 기존 코드를 아래 내용으로 수정하거나 새로 작성해 봐.
Sub GetWeatherData_Final()
' --- 변수 선언 부분 (이전과 거의 동일) ---
Dim oHttp As Object
Dim sURL As String
Dim sAPIKey As String
Dim sCity As String
Dim sResponse As String
' JSON 파싱을 위한 새로운 변수 선언!
Dim json As Object ' 파싱된 JSON 데이터 전체를 담을 그릇
' 추출한 데이터를 담을 변수들
Dim temp As Double
Dim humidity As Long
Dim weatherDesc As String
Dim cityName As String
' --- 값 할당 및 URL 조합 부분 (이전과 동일) ---
sAPIKey = "YOUR_API_KEY_HERE" ' ★★★★★ 여기에 꼭 본인 API 키를 넣으세요! ★★★★★
sCity = "London" ' 이번엔 런던 날씨를 가져와볼까?
sURL = "https://api.openweathermap.org/data/2.5/weather?" _
& "q=" & sCity _
& "&appid=" & sAPIKey _
& "&units=metric" _
& "&lang=kr" ' ★ 추가: 날씨 설명을 한국어로 받기 위한 옵션!
' --- HTTP 요청 부분 (이전과 동일) ---
Set oHttp = CreateObject("MSXML2.XMLHTTP")
oHttp.Open "GET", sURL, False
oHttp.send
sResponse = oHttp.responseText
' --- 여기가 바로 하이라이트! JSON 파싱 시작! ---
' 1. JsonConverter를 이용해서 응답 문자열(sResponse)을 파싱한다.
Set json = JsonConverter.ParseJson(sResponse)
' 2. 파싱된 json 객체에서 원하는 데이터를 키(key)를 이용해 추출한다.
' json("키")("하위키") 이런 식으로 접근하면 돼!
' 에러 방지: 도시 이름이 틀리는 등 API가 에러 코드를 보낼 경우를 대비
If Not json.Exists("main") Then
MsgBox "도시 이름을 찾을 수 없거나 API 호출에 실패했습니다." & vbCrLf & _
"에러 메시지: " & json("message"), vbCritical, "오류"
Exit Sub
End If
cityName = json("name")
temp = json("main")("temp")
humidity = json("main")("humidity")
' weather는 배열([ ]) 형태이므로, 첫 번째 항목(1)에 접근해야 함
weatherDesc = json("weather")(1)("description")
' --- 추출한 데이터 확인하기 ---
' MsgBox로 결과를 깔끔하게 보여주자.
MsgBox "도시: " & cityName & vbCrLf & _
"현재 온도: " & temp & " °C" & vbCrLf & _
"습도: " & humidity & " %" & vbCrLf & _
"날씨: " & weatherDesc, vbInformation, "날씨 정보"
' --- 마무리 ---
Set oHttp = Nothing
Set json = Nothing
End Sub
어때? 코드가 훨씬 더 똑똑해졌지?
`Set json = JsonConverter.ParseJson(sResponse)` 이 한 줄이 마법을 부리는 핵심이야. 이 코드를 거치고 나면, 그저 길기만 하던 문자열 `sResponse`가, 우리가 `json("main")("temp")`처럼 키 이름으로 쉽게 접근할 수 있는 똑똑한 `json` 객체로 변신하는 거지.
이제 이 코드를 실행(F5)하면? `Debug.Print` 대신, 깔끔한 메시지 박스가 떠서 런던의 날씨 정보를 보여줄 거야. "맑음" 대신 "구름 조금" 같은 한국어 설명이 나온다면 `&lang=kr` 옵션도 성공적으로 적용된 거고! 😉
5. 실전 투입! 엑셀 시트와 연동하여 자동화 시스템 구축하기
지금까지는 VBE 창 안에서만 놀았지만, VBA의 진짜 힘은 엑셀 시트와 상호작용할 때 발휘돼. 이제 우리가 만든 이 똑똑한 코드를 엑셀 시트와 연결해서, 누가 봐도 "와" 소리 나오는 자동화 도구를 만들어 보자. 최종 목표는 이거야:
1. 엑셀 시트에 도시 이름을 입력한다.
2. '날씨 가져오기' 버튼을 누른다.
3. 지정된 셀에 해당 도시의 날씨 정보가 자동으로 착착 입력된다.
(1) 엑셀 시트 디자인하기
먼저 엑셀 시트를 예쁘게(?) 꾸며보자. 기능만 되면 장땡이지만, 그래도 보기 좋은 떡이 먹기도 좋으니까!
- 새로운 엑셀 시트를 하나 열어.
- B열에는 레이블(설명)을, C열에는 실제 값(입력 또는 출력)을 넣을 거야.
-
아래처럼 내용을 입력하고 꾸며봐. (셀 주소는 예시일 뿐, 원하는 대로 바꿔도 돼!)
- B5 셀:
도시 이름 (영문)→ 오른쪽 정렬 - C5 셀: 여기에 도시 이름을 입력할 거야. (예:
Tokyo) ← 이 셀은 사용자가 입력하는 곳이니 노란색 배경으로 칠해주면 더 좋겠지? - B8 셀:
조회 도시→ 오른쪽 정렬 - B9 셀:
현재 온도→ 오른쪽 정렬 - B10 셀:
습도→ 오른쪽 정렬 - B11 셀:
날씨 설명→ 오른쪽 정렬 - C8 ~ C11 셀: 이 셀들에는 VBA 코드가 결과를 출력해 줄 거야. 초록색 배경으로 칠해볼까?
- B5 셀:
이렇게 해두면 어디에 뭘 입력하고, 어디에 결과가 나오는지 한눈에 파악하기 쉬워.
(2) 엑셀 시트와 연동하는 VBA 코드 작성
이제 마지막으로, 코드를 수정해서 C5 셀에서 도시 이름을 읽어오고, C8~C11 셀에 결과를 뿌려주도록 만들자. `GetWeatherAndPutOnSheet` 라는 이름으로 새로운 프로시저를 만들어 볼게.
Sub GetWeatherAndPutOnSheet()
' --- 변수 선언 부분 ---
Dim oHttp As Object, sURL As String, sAPIKey As String, sResponse As String
Dim json As Object
Dim temp As Double, humidity As Long, weatherDesc As String, cityName As String
' 시트와 셀을 다루기 위한 변수 추가!
Dim ws As Worksheet
Dim cityInputCell As Range, cityOutputCell As Range, tempCell As Range, humidityCell As Range, descCell As Range
' --- 초기 설정 ---
' 작업할 시트를 변수에 할당하면 코드가 깔끔해져.
Set ws = ThisWorkbook.Sheets("Sheet1") ' 시트 이름이 다르다면 바꿔주세요!
' 각 셀을 변수에 할당
Set cityInputCell = ws.Range("C5")
Set cityOutputCell = ws.Range("C8")
Set tempCell = ws.Range("C9")
Set humidityCell = ws.Range("C10")
Set descCell = ws.Range("C11")
' API 키 설정
sAPIKey = "YOUR_API_KEY_HERE" ' ★★★★★ 마지막으로 한번 더! 본인 키로! ★★★★★
' --- 1. 엑셀 시트에서 도시 이름 읽어오기 ---
' cityInputCell (C5셀)의 값이 비어있는지 확인
If IsEmpty(cityInputCell.Value) Then
MsgBox "C5 셀에 조회할 도시 이름을 입력해주세요.", vbExclamation, "입력 오류"
Exit Sub ' 코드를 여기서 중단
End If
' --- 2. API 요청 및 JSON 파싱 (이전 코드와 거의 동일) ---
sURL = "https://api.openweathermap.org/data/2.5/weather?" _
& "q=" & cityInputCell.Value _ ' 하드코딩된 도시 이름 대신 셀 값을 사용!
& "&appid=" & sAPIKey _
& "&units=metric&lang=kr"
On Error GoTo ApiErrorHandler ' 만약 인터넷 연결 등 HTTP 요청 자체에 에러가 나면?
Set oHttp = CreateObject("MSXML2.XMLHTTP")
oHttp.Open "GET", sURL, False
oHttp.send
sResponse = oHttp.responseText
On Error GoTo 0 ' 에러 핸들러 해제
Set json = JsonConverter.ParseJson(sResponse)
If Not json.Exists("main") Then
MsgBox "도시 이름을 찾을 수 없거나 API 호출에 실패했습니다." & vbCrLf & _
"에러 메시지: " & json("message"), vbCritical, "API 오류"
Exit Sub
End If
cityName = json("name")
temp = json("main")("temp")
humidity = json("main")("humidity")
weatherDesc = json("weather")(1)("description")
' --- 3. 파싱한 결과를 엑셀 시트에 착착! 쓰기 ---
' 이전 결과가 남아있을 수 있으니 먼저 깨끗하게 지워주자.
Range(cityOutputCell, descCell).ClearContents
cityOutputCell.Value = cityName
tempCell.Value = temp & " °C"
humidityCell.Value = humidity & " %"
descCell.Value = weatherDesc
MsgBox cityName & "의 날씨 정보를 성공적으로 가져왔습니다!", vbInformation, "성공"
' --- 마무리 ---
Set oHttp = Nothing
Set json = Nothing
Set ws = Nothing
Exit Sub ' 정상 종료
' --- 에러 처리 구간 ---
ApiErrorHandler:
MsgBox "API 서버에 연결할 수 없습니다." & vbCrLf & _
"인터넷 연결을 확인하거나 잠시 후 다시 시도해주세요.", vbCritical, "연결 오류"
Set oHttp = Nothing
End Sub
이 코드의 핵심은 `ws.Range("C5").Value` 처럼 시트의 셀 값을 직접 읽고, `tempCell.Value = temp` 처럼 변수에 담긴 값을 셀에 직접 써넣는 부분이야. 이제 정말 자동화 도구의 모습을 갖췄지?
(3) 버튼 만들고 매크로 연결하기
마지막 화룡점정! 매번 F5를 누를 순 없으니, 시트에 근사한 버튼을 만들어서 클릭 한 번으로 이 모든 과정이 실행되게 만들어 보자.
- 엑셀 시트로 돌아와서, [개발 도구] 탭 → [삽입] → '양식 컨트롤' 그룹에 있는 [단추(버튼)] 아이콘을 클릭해.
- 시트의 적당한 위치에 드래그해서 버튼을 그려.
- 버튼을 그리는 순간 '매크로 지정' 창이 자동으로 뜰 거야. 여기서 우리가 방금 만든 `GetWeatherAndPutOnSheet`를 선택하고 [확인]을 눌러.
- 생성된 버튼에 마우스 오른쪽 클릭 → [텍스트 편집]을 눌러서 '날씨 가져오기 🚀' 같은 멋진 이름으로 바꿔줘.
이제 모든 준비가 끝났어! C5 셀에 `Paris`, `New York`, `Sydney` 등 원하는 도시 이름을 영어로 입력하고, 방금 만든 버튼을 클릭해 봐. 과연 어떻게 될까? 아마 몇 초 뒤, C8~C11 셀이 최신 날씨 정보로 채워지는 놀라운 광경을 목격하게 될 거야! ✨
💡 프로 팁: 에러 핸들링의 중요성
위 코드에 `On Error GoTo ApiErrorHandler` 라는 구문이 추가된 걸 봤을 거야. 이건 일종의 '보험'이야. 만약 인터넷이 끊겼거나, API 서버가 잠시 다운되는 등 예기치 못한 에러가 발생했을 때 프로그램이 그냥 멈춰버리는 걸 막고, `ApiErrorHandler:` 부분으로 점프해서 사용자에게 친절한 안내 메시지를 보여준 뒤 코드를 안전하게 종료시키는 역할을 해.
내가 만든 프로그램을 다른 사람도 쓴다면, 이런 예외 처리는 정말 중요해. "이거 왜 안돼요?" 라는 질문을 훨씬 줄여줄 수 있거든. 😉
6. 레벨 업! 더 강력한 기능들을 향하여
축하해! 넌 이제 VBA와 API를 연동해서 원하는 데이터를 자동으로 가져오는 핵심 원리를 완벽하게 마스터했어. 여기서 멈춰도 충분히 훌륭하지만, 이왕 배운 거 몇 가지 아이디어를 더해서 프로그램을 더 강력하게 만들어보면 어떨까?
-
여러 도시 한 번에 조회하기:
A열에 조회하고 싶은 도시 목록(`Seoul`, `Tokyo`, `London`...)을 쭉 나열해. 그리고 VBA 코드에 `For` 반복문을 추가해서 A열의 마지막 데이터까지 하나씩 읽어오면서 날씨 정보를 B, C, D... 열에 순서대로 착착 채워 넣는 거야. 수십 개 도시의 날씨를 단 몇 초 만에 비교 분석할 수 있게 되겠지? -
자동으로 새로고침하기:
VBA의 `Application.OnTime` 메서드를 사용하면, 특정 매크로를 원하는 시간에 자동으로 실행하도록 예약할 수 있어. 예를 들어, "매일 아침 9시에 `GetWeatherAndPutOnSheet` 매크로를 실행해라" 라고 설정해두면, 넌 그냥 엑셀 파일만 켜두면 되는 거야. 출근해서 커피 한 잔 마시고 오면 오늘의 날씨 브리핑이 끝나있는 거지. ☕ -
데이터 시각화:
여러 도시의 온도를 가져왔다면, 이 데이터를 기반으로 막대그래프나 꺾은선 그래프를 자동으로 생성하는 코드를 추가해 봐. 어떤 도시가 가장 덥고 추운지 한눈에 파악할 수 있는 '일일 세계 날씨 대시보드'가 탄생하는 순간이야. -
다른 API에 도전하기:
오늘 배운 원리는 날씨 API에만 국한되지 않아. 환율 정보를 제공하는 API, 주식 시세를 알려주는 API, 심지어 내가 좋아하는 K-POP 아이돌의 트위터 소식을 가져오는 API까지! API 키를 발급받고, 요청 URL의 구조를 파악하고, JSON 응답을 파싱하는 이 3단계 프로세스는 거의 모든 API에 동일하게 적용돼. 이제 넌 어떤 데이터든 엑셀로 가져올 수 있는 만능 열쇠를 손에 쥔 셈이야. 🔑
물론 이런 고급 기능들을 구현하려면 더 많은 학습이 필요할 거야. 하지만 걱정 마. 세상에는 뛰어난 실력자들이 정말 많고, 그들의 지식과 경험을 빌리는 것도 현명한 방법이야. 특히 재능넷 같은 재능 공유 플랫폼에 가보면, 복잡한 VBA 자동화나 API 연동 프로젝트를 전문적으로 해결해 주는 전문가들을 쉽게 만날 수 있어. 막히는 부분이 있다면 전문가의 도움을 받아 프로젝트를 완성하고, 그 코드를 분석하며 배우는 것도 실력을 빠르게 키우는 좋은 전략이 될 수 있지.
마치며: 이제 당신은 '자동화'라는 무기를 손에 넣었다
오늘 우리는 엑셀이라는 익숙한 도구를 가지고, VBA와 API 연동이라는 조금은 낯선 세계를 탐험해 봤어. 처음엔 VBE의 하얀 화면과 알 수 없는 코드들이 막막하게 느껴졌을지도 몰라. 하지만 차근차근 따라오다 보니, 어느새 버튼 클릭 한 번으로 인터넷 세상의 데이터를 내 엑셀 시트로 불러오는 강력한 도구를 완성했지.
이게 바로 '응용 프로그래밍'의 진짜 매력이야. 단순히 정해진 기능을 쓰는 걸 넘어, 여러 기술(VBA, API, JSON...)을 창의적으로 엮어서 세상에 없던 나만의 도구를 만들어내는 것. 오늘 만든 날씨 수집기는 그 위대한 첫걸음일 뿐이야.
기억해. 당신이 오늘 배운 것은 단순히 '날씨 데이터를 가져오는 방법'이 아니야. '반복적인 문제를 발견하고, 기술을 조합하여, 자동화된 해결책을 만들어내는 능력' 그 자체를 배운 거야. 이 능력은 당신의 업무와 일상에서 마주치는 수많은 비효율을 해결해 줄 강력한 무기가 될 거야.
이제 엑셀을 켤 때 한숨 대신 설렘을 느껴봐. "오늘은 또 어떤 반복 작업을 자동화해서 없애버릴까?" 하는 즐거운 고민을 시작해 보라고! 당신의 손끝에서 시작될 자동화의 여정을 진심으로 응원할게! 🚀
댓글 작성
이 글에 대한 여러분의 생각을 들려주세요
로그인이 필요합니다
댓글을 작성하려면 먼저 로그인해주세요.
댓글 0
지식인의 숲 - 지적 재산권 보호 고지
지적 재산권 보호 고지
- 저작권 및 소유권: 본 컨텐츠는 재능넷의 독점 AI 기술로 생성되었으며, 대한민국 저작권법 및 국제 저작권 협약에 의해 보호됩니다.
- AI 생성 컨텐츠의 법적 지위: 본 AI 생성 컨텐츠는 재능넷의 지적 창작물로 인정되며, 관련 법규에 따라 저작권 보호를 받습니다.
- 사용 제한: 재능넷의 명시적 서면 동의 없이 본 컨텐츠를 복제, 수정, 배포, 또는 상업적으로 활용하는 행위는 엄격히 금지됩니다.
- 데이터 수집 금지: 본 컨텐츠에 대한 무단 스크래핑, 크롤링, 및 자동화된 데이터 수집은 법적 제재의 대상이 됩니다.
- AI 학습 제한: 재능넷의 AI 생성 컨텐츠를 타 AI 모델 학습에 무단 사용하는 행위는 금지되며, 이는 지적 재산권 침해로 간주됩니다.
아직 댓글이 없습니다.