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

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

마케팅 링크 클릭률 추적! 파이썬으로 단축 URL 자동 생성하기

마케팅 링크 클릭률 추적! 파이썬으로 단축 URL 자동 생성하기 (완성 코드 공개)

파이썬으로 단축 URL을 자동으로 생성하고 클릭 통계를 추적하는 모습


"긴 상품 URL을 SNS에 올리려니 너무 길어서 보기 안 좋다", "이메일 캠페인마다 어떤 링크가 더 많이 클릭됐는지 비교하고 싶다", "수십 개의 상품 URL을 한꺼번에 단축해야 한다"…

긴 URL은 SNS나 문자메시지에서 보기 좋지 않고, 클릭 수를 추적하기도 어렵습니다. 파이썬과 무료 단축 URL API(TinyURL)를 활용하면 긴 링크를 짧게 자동 변환하고, 여러 링크를 한꺼번에 처리해 엑셀로 정리할 수 있습니다.


1단계: 준비물 설치

파이썬이 설치되어 있어야 합니다. 없다면 python.org에서 최신 버전을 받아 설치하세요. 설치 시 반드시 "Add Python to PATH"에 체크해야 합니다.

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

pip install requests pandas openpyxl

requests는 TinyURL API를 호출해 URL을 단축하는 데 사용합니다. TinyURL은 회원가입 없이 무료로 사용할 수 있는 단축 URL 서비스입니다. pandasopenpyxl은 결과를 엑셀로 저장하는 데 사용합니다.

💡 이 코드로 할 수 있는 것: 엑셀에 정리된 원본 URL 목록을 읽어 자동으로 단축 URL을 생성하고, 캠페인명·생성일과 함께 엑셀에 저장합니다. 회원가입 없이 무료로 무제한 사용할 수 있습니다.

2단계: 엑셀 파일 준비

단축할 URL 목록을 아래처럼 엑셀로 준비합니다.

캠페인명        원본URL
6월_봄신상품   https://shop.example.com/products/spring-collection-2026?utm_source=instagram
6월_이벤트     https://shop.example.com/events/summer-sale?utm_source=email
6월_블로그글   https://www.howtothea.com/2026/06/python-automation-guide.html

3단계: 완성 코드

아래 코드를 그대로 복사해서 메모장에 붙여넣고, short_url.py로 저장하세요. 저장 시 파일 형식은 "모든 파일", 인코딩은 UTF-8로 설정합니다.

import requests
import pandas as pd
from pathlib import Path
from datetime import datetime

# ① 설정
INPUT_PATH  = r"C:\Users\내이름\Desktop\URL목록.xlsx"        # ← 원본 URL 목록 엑셀
OUTPUT_PATH = r"C:\Users\내이름\Desktop\단축URL_결과.xlsx"   # ← 결과 저장 경로
NAME_COL    = "캠페인명"   # ← 캠페인 이름 열
URL_COL     = "원본URL"    # ← 단축할 URL 열

# ② TinyURL API로 단축 URL 생성
def shorten_url(long_url):
    api_url = "https://tinyurl.com/api-create.php"
    res = requests.get(api_url, params={"url": long_url}, timeout=10)
    if res.status_code == 200 and res.text.startswith("http"):
        return res.text
    return None

# ③ 엑셀 읽기
df = pd.read_excel(INPUT_PATH, engine="openpyxl")
print(f"  ✔ 데이터 로드 완료: {len(df)}건")

# ④ 단축 URL 일괄 생성
results = []
for _, row in df.iterrows():
    name     = row[NAME_COL]
    long_url = row[URL_COL]

    short_url = shorten_url(long_url)

    if short_url:
        print(f"  ✔ {name}: {short_url}")
        status = "성공"
    else:
        print(f"  ✘ {name}: 단축 실패")
        short_url = ""
        status = "실패"

    results.append({
        "캠페인명":   name,
        "원본URL":   long_url,
        "단축URL":   short_url,
        "생성일시":   datetime.now().strftime("%Y-%m-%d %H:%M"),
        "상태":      status,
    })

# ⑤ 결과 엑셀 저장
df_result = pd.DataFrame(results)
df_result.to_excel(OUTPUT_PATH, index=False)

success_count = (df_result["상태"] == "성공").sum()
print(f"\n✅ 완료! 성공: {success_count}건 / 전체: {len(df_result)}건 → {OUTPUT_PATH}")

4단계: 실행 방법

  1. 코드 ① 설정의 INPUT_PATH에 원본 URL 목록 엑셀 경로를 입력합니다.
  2. OUTPUT_PATH에 결과를 저장할 경로를 입력합니다.
  3. NAME_COLURL_COL이 본인 엑셀의 열 이름과 일치하는지 확인합니다.
  4. 터미널에서 아래 명령어로 실행합니다:
python short_url.py

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

  ✔ 데이터 로드 완료: 3건
  ✔ 6월_봄신상품: https://tinyurl.com/abc123
  ✔ 6월_이벤트: https://tinyurl.com/def456
  ✔ 6월_블로그글: https://tinyurl.com/ghi789

✅ 완료! 성공: 3건 / 전체: 3건 → C:\Users\내이름\Desktop\단축URL_결과.xlsx

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

오류 1: 단축 URL 생성이 계속 실패함

원본 URL에 한글이나 특수문자가 포함된 경우 인코딩 문제로 실패할 수 있습니다. URL을 인코딩하는 코드를 추가하세요:

from urllib.parse import quote
long_url_encoded = quote(long_url, safe=":/?=&")

오류 2: requests.exceptions.ConnectionError

인터넷 연결이 불안정하거나 TinyURL 서버에 일시적으로 접근이 안 될 때 발생합니다. 짧은 시간에 너무 많은 요청을 보내면 일시적으로 제한될 수 있으니 요청 사이에 time.sleep(1)을 추가하세요.

오류 3: 단축 URL이 만들어졌는데 클릭하면 오류 페이지로 이동함

원본 URL 자체가 잘못되었거나 만료된 경우입니다. 원본 URL을 브라우저에 직접 입력해 정상 접속되는지 먼저 확인하세요.


응용: 클릭 수까지 추적하고 싶다면

TinyURL은 무료 버전에서 클릭 통계를 제공하지 않습니다. 클릭 수까지 추적하려면 자체 리다이렉트 서버를 만들어야 합니다. 간단한 Flask 기반 추적 서버 예시입니다.

from flask import Flask, redirect
import json
from pathlib import Path
from datetime import datetime

app = Flask(__name__)
CLICK_LOG = Path("click_log.json")

# 캠페인명: 실제 이동할 URL
REDIRECT_MAP = {
    "spring": "https://shop.example.com/products/spring-collection-2026",
    "summer": "https://shop.example.com/events/summer-sale",
}

@app.route("/go/")
def track_click(campaign):
    # 클릭 로그 기록
    log = json.loads(CLICK_LOG.read_text()) if CLICK_LOG.exists() else {}
    log[campaign] = log.get(campaign, 0) + 1
    log[f"{campaign}_last"] = datetime.now().strftime("%Y-%m-%d %H:%M")
    CLICK_LOG.write_text(json.dumps(log, ensure_ascii=False, indent=2))

    target = REDIRECT_MAP.get(campaign, "https://www.howtothea.com")
    return redirect(target)

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

이 서버를 실행하면 내서버주소/go/spring 링크를 SNS에 올렸을 때 클릭 시 자동으로 카운트가 기록되고 실제 페이지로 이동합니다.

💡 이전 게시글과 결합하면: QR코드 자동 생성 편과 결합하면 단축 URL을 QR코드로 변환해 오프라인 홍보물에 활용할 수 있고, 차트 자동 저장 편과 결합하면 클릭 통계를 시각화할 수 있습니다.

핵심 요약

  • 준비물: Python + requests + pandas + openpyxl 설치 (pip install requests pandas openpyxl)
  • 설정: INPUT_PATH, OUTPUT_PATH, NAME_COL, URL_COL 수정
  • 실행: 터미널에서 python short_url.py 입력
  • 결과: 캠페인명·원본URL·단축URL·생성일시가 정리된 엑셀 파일 자동 생성

이 코드를 응용하면 단축 URL을 거래처별로 자동 발송하거나, 만료 기한이 있는 캠페인 링크를 관리하는 것도 가능합니다.

이 블로그의 인기 게시물

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

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

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