엑셀 매크로(VBA) 보안 경고 끝! 파이썬으로 똑같은 작업 대체하기

이미지
엑셀 매크로(VBA) 보안 경고 끝! 파이썬으로 똑같은 작업 대체하기 (완성 코드 공개) "매크로가 포함된 파일을 다른 사람에게 보내면 보안 경고 때문에 매크로 사용 설정을 매번 따로 해야 한다", "VBA 코드가 회사 PC마다 다르게 작동해서 디버깅이 어렵다", "매크로를 쓰는 동료가 퇴사하면 그 파일을 아무도 수정하지 못한다"… VBA 매크로는 엑셀 안에서 바로 실행되는 장점이 있지만, 보안 정책으로 차단되거나, 회사 PC마다 설정이 달라 오작동하거나, 코드 관리가 어려운 한계가 있습니다. 이 글에서는 이 블로그에서 지금까지 소개한 파이썬 코드들이 VBA의 어떤 기능을 대체할 수 있는지 비교하고, 대표적인 매크로 작업을 파이썬으로 구현하는 방법을 소개합니다. VBA 매크로 vs 파이썬 비교 VBA 매크로 파이썬 실행 환경 엑셀 안에서만 동작 독립적으로 어디서나 동작 보안 경고 매번 발생, 차단 가능 해당 없음 배포 파일에 코드 포함 스크립트 파일만 공유 디버깅 엑셀 VBA 편집기 사용 다양한 코드 에디터 사용 가능 다른 프로그램 연동 제한적 (Win API 필요) 매우 풍부함 (이메일, 웹, DB 등) 버전 관리(깃 등) 거의 불가능 일반적인 코드처럼 관리 가능 배우는 난이도 엑셀에 특화된 문법 범용 프로그래밍 언어, 활용도 넓음 💡 언제 VBA가 더 나을까: 엑셀을 열자마자 버튼 클릭으로 즉시 실행하고 싶거나, 엑셀 전용 UI(사용자 정의 양식)가 필요한 경우는 VBA가 더 간단할 수 있습니다. 하지만 안정성, 보안, 확장성을 고려하면 대부분의 반복 작업은 파이썬이 더 유리합니다. 대표 매크로 작업 1 — 여러 시트 합치기 VBA로 흔히 작성하는 "모...

정부 공공데이터 무료로 자동 수집하기! 파이썬 공공데이터포털 API 활용법

정부 공공데이터 무료로 자동 수집하기! 파이썬 공공데이터포털 API 활용법 (완성 코드 공개)

파이썬으로 정부 공공데이터를 자동으로 수집하는 모습


"창업 전 상권 분석을 위해 지역별 인구·상가 데이터가 필요하다", "블로그 글에 신뢰할 수 있는 통계 자료를 넣고 싶다", "부동산 실거래가 데이터를 정기적으로 모니터링하고 싶다"…

대한민국 정부는 공공데이터포털(data.go.kr)을 통해 인구, 상가, 부동산, 교통, 기상 등 수천 개의 데이터를 무료 API로 제공합니다. 매번 사이트에 들어가 다운로드하는 대신, 파이썬으로 API를 호출하면 필요한 데이터를 자동으로 수집해 엑셀에 정리할 수 있습니다.


1단계: 공공데이터포털 API 키 발급 (최초 1회만)

공공데이터포털에서 사용할 API의 인증키를 발급받아야 합니다.

  1. data.go.kr에 접속해 회원가입 후 로그인합니다.
  2. 검색창에 원하는 데이터를 검색합니다. 예: "소상공인시장진흥공단 상가업소"
  3. 검색 결과에서 "OpenAPI" 탭의 데이터를 선택합니다.
  4. "활용신청" 버튼을 클릭하고 활용 목적을 간단히 작성합니다.
  5. 승인까지 즉시~1일 정도 소요됩니다. "마이페이지" → "데이터활용" → "Open API"에서 발급받은 인증키(Encoding/Decoding)를 확인합니다.
⚠️ 주의: 인증키는 EncodingDecoding 두 가지가 제공됩니다. requests 라이브러리로 호출할 때는 보통 Decoding 키를 사용합니다. Encoding 키를 사용하면 URL 인코딩이 중복되어 오류가 날 수 있습니다.

2단계: 준비물 설치

터미널(윈도우: CMD 또는 파워셸)을 열고 아래 명령어를 실행하세요:

pip install requests pandas openpyxl

requests는 공공데이터 API 서버에 요청을 보내는 라이브러리입니다. pandasopenpyxl은 수집한 데이터를 엑셀로 저장하는 데 사용합니다.


3단계: 완성 코드 — 행정구역별 인구 데이터 수집 예시

대표적인 예시로 행정안전부 주민등록 인구 통계 API를 활용한 코드입니다. 아래 코드를 public_data.py로 저장하세요.

import requests
import pandas as pd
from pathlib import Path

# ① 설정
API_KEY     = "여기에_Decoding_인증키_입력"   # ← 1단계에서 발급받은 인증키
OUTPUT_PATH = r"C:\Users\내이름\Desktop\공공데이터_수집결과.xlsx"  # ← 저장 경로

# 행정안전부 주민등록 인구통계 API 예시
BASE_URL = "https://apis.data.go.kr/1741000/admmSexdAgeStat/selectAdmmSexdAgeStat"

# ② API 요청 파라미터 (API 문서에 따라 항목이 다름)
params = {
    "serviceKey": API_KEY,
    "type":       "json",     # 응답 형식: json 또는 xml
    "numOfRows":  100,        # 한 번에 가져올 행 수
    "pageNo":     1,          # 페이지 번호
    "regDate":    "202605",   # 조회 기준월 (예: 2026년 5월)
}

# ③ API 호출
res = requests.get(BASE_URL, params=params, timeout=15)
print(f"  ✔ 응답 상태 코드: {res.status_code}")

if res.status_code != 200:
    print(f"  ✘ 요청 실패: {res.text[:300]}")
else:
    data = res.json()

    # ④ 응답 구조에 맞게 데이터 추출 (API마다 구조가 다르므로 확인 필요)
    items = data.get("StatisticsService", [{}])[1].get("row", [])
    print(f"  ✔ 수집된 항목: {len(items)}건")

    if items:
        # ⑤ 데이터프레임으로 변환 후 엑셀 저장
        df = pd.DataFrame(items)
        df.to_excel(OUTPUT_PATH, index=False)
        print(f"\n✅ 완료! 저장 → {OUTPUT_PATH}")
    else:
        print("  ⚠ 수집된 데이터가 없습니다. 파라미터를 확인하세요.")
💡 API마다 구조가 다릅니다: 공공데이터포털의 API는 제공기관마다 응답 구조(JSON 키 이름)가 다릅니다. 위 코드는 예시이며, 실제 사용할 API의 "활용가이드" 또는 "미리보기" 탭에서 정확한 요청/응답 구조를 반드시 확인한 후 코드를 맞춰야 합니다.

4단계: 실행 방법

  1. 공공데이터포털에서 원하는 데이터를 검색하고 활용신청 후 API 가이드 문서를 확인합니다.
  2. 코드 ① 설정의 API_KEY에 발급받은 인증키를 입력합니다.
  3. 코드 ②의 BASE_URLparams를 사용할 API의 가이드에 맞게 수정합니다.
  4. 코드 ④의 데이터 추출 부분을 실제 API 응답 구조에 맞게 수정합니다.
  5. 터미널에서 아래 명령어로 실행합니다:
python public_data.py

정상 실행 시 터미널에 이렇게 출력됩니다:

  ✔ 응답 상태 코드: 200
  ✔ 수집된 항목: 100건

✅ 완료! 저장 → C:\Users\내이름\Desktop\공공데이터_수집결과.xlsx

5단계: 자주 발생하는 오류와 해결법

오류 1: SERVICE_KEY_IS_NOT_REGISTERED_ERROR

인증키가 아직 승인되지 않았거나 잘못 입력된 경우입니다. 활용신청 승인까지 최대 1일 소요될 수 있습니다. 마이페이지에서 승인 상태를 확인하세요.

오류 2: 응답이 JSON이 아닌 XML 형식으로 와서 오류 발생

일부 API는 type 파라미터가 없거나 기본값이 XML인 경우가 있습니다. 파라미터 이름이 API마다 다를 수 있으니(type, resultType 등) 가이드 문서를 확인하세요. XML 응답을 처리해야 한다면 아래 코드를 사용하세요:

import xml.etree.ElementTree as ET
root = ET.fromstring(res.text)

오류 3: 페이지당 데이터 수가 적어서 전체를 못 받음

대부분의 공공데이터 API는 한 번에 최대 100~1000건만 반환합니다. pageNo를 늘려가며 반복 호출해서 전체 데이터를 모아야 합니다:

all_items = []
for page in range(1, 11):   # 최대 10페이지까지
    params["pageNo"] = page
    res = requests.get(BASE_URL, params=params)
    items = res.json().get("StatisticsService", [{}])[1].get("row", [])
    if not items:
        break
    all_items.extend(items)

응용: 자주 쓰이는 공공데이터 카테고리

블로그나 업무에 활용하기 좋은 공공데이터 분야를 소개합니다. 각 분야는 data.go.kr에서 검색해 활용신청하면 됩니다.

인구통계    →  행정안전부 주민등록 인구 통계
상권분석    →  소상공인시장진흥공단 상가업소정보
부동산      →  국토교통부 아파트 매매 실거래가
기상정보    →  기상청 단기예보 조회 서비스
교통정보    →  한국교통안전공단 교통사고 통계
대중교통    →  서울특별시 버스도착정보
의료기관    →  건강보험심사평가원 병원정보서비스
💡 이전 게시글과 결합하면: 차트 자동 저장 편과 결합하면 공공데이터를 시각화한 보고서를 자동으로 만들 수 있고, 스케줄러 편과 결합하면 매달 갱신되는 통계를 자동으로 수집해 누적할 수 있습니다.

핵심 요약

  • 준비물: 공공데이터포털 회원가입 및 API 활용신청(최초 1회) + pip install requests pandas openpyxl
  • 설정: API_KEY, BASE_URL, params를 사용할 API 가이드에 맞게 수정
  • 실행: 터미널에서 python public_data.py 입력
  • 결과: 정부 공공데이터를 자동 수집해 엑셀로 정리, 페이지네이션으로 전체 데이터 수집 가능

이 코드를 응용하면 여러 공공데이터 API를 조합해 지역별 종합 분석 리포트를 만들거나, 매달 자동 수집해 변화 추이를 추적하는 것도 가능합니다.

이 블로그의 인기 게시물

느려진 구글 크롬 속도 2배 빨라지는 3가지 설정 방법 (2026년 최신 가이드)

카카오톡 용량 줄이기! 대화방 파일 삭제로 스마트폰 용량 확보법 (1분 해결)

업무 속도 3배 빨라지는 윈도우 기본 캡처 도구 단축키 및 200% 활용 꿀팁