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

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

한글 파일 열면 깨질 때! 파이썬으로 인코딩 자동 감지·변환하기

한글 파일 열면 깨질 때! 파이썬으로 인코딩 자동 감지·변환하기 (완성 코드 공개)

파이썬으로 텍스트 파일의 인코딩을 자동으로 감지하고 변환하는 모습


"옛날 회계 시스템에서 받은 CSV 파일을 열면 한글이 ㅁㅁㅁ로 깨진다", "거래처에서 보내준 텍스트 파일이 메모장에서는 이상하게 보이는데 다른 프로그램에서는 정상이다", "수십 개의 파일을 일괄로 UTF-8로 통일해야 한다"…

한글 텍스트 파일이 깨지는 가장 흔한 원인은 인코딩 방식의 차이 때문입니다. 오래된 윈도우 프로그램은 EUC-KR(또는 CP949)을 사용하고, 최신 웹·프로그램은 UTF-8을 사용합니다. 서로 다른 인코딩으로 저장된 파일을 잘못된 방식으로 열면 한글이 깨집니다. 파이썬을 한 번만 세팅해두면 파일의 인코딩을 자동으로 감지하고 원하는 인코딩으로 일괄 변환할 수 있습니다.


1단계: 준비물 설치

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

인코딩 감지에 필요한 라이브러리를 설치합니다. 터미널(윈도우: CMD 또는 파워셸)을 열고 아래 명령어를 실행하세요:

pip install chardet

chardet은 파일의 바이트 패턴을 분석해서 어떤 인코딩으로 저장되었는지 자동으로 감지하는 라이브러리입니다. 파일을 직접 열어보지 않고도 인코딩을 알 수 있습니다.

💡 이 코드로 할 수 있는 것: 텍스트·CSV 파일의 인코딩을 자동으로 감지하고, 원하는 인코딩(UTF-8, EUC-KR, CP949 등)으로 변환해 저장합니다. 폴더 안의 여러 파일을 한꺼번에 처리할 수 있고, 변환 전후 인코딩을 로그로 기록합니다.

2단계: 완성 코드

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

import chardet
from pathlib import Path

# ① 설정
FOLDER_PATH    = r"C:\Users\내이름\Desktop\텍스트모음"      # ← 변환할 파일이 있는 폴더
OUTPUT_DIR     = r"C:\Users\내이름\Desktop\UTF8변환결과"   # ← 변환 결과 저장 폴더
TARGET_ENCODING = "utf-8"     # ← 변환할 목표 인코딩 (utf-8, cp949, euc-kr 등)
SUPPORTED_EXT  = {".txt", ".csv", ".log"}   # ← 처리할 확장자

# ② 인코딩 자동 감지 함수
def detect_encoding(filepath):
    with open(filepath, "rb") as f:
        raw_data = f.read(50000)   # 앞 50KB만 분석 (대용량 파일도 빠르게 처리)
    result = chardet.detect(raw_data)
    encoding = result.get("encoding")
    confidence = result.get("confidence", 0)

    # chardet이 EUC-KR을 ISO-8859-1로 잘못 인식하는 경우가 많아 보정
    if encoding and encoding.lower() in ("iso-8859-1", "euc-kr"):
        encoding = "cp949"

    return encoding or "utf-8", confidence

# ③ 출력 폴더 생성
output_dir = Path(OUTPUT_DIR)
output_dir.mkdir(parents=True, exist_ok=True)

folder = Path(FOLDER_PATH)
files = sorted([f for f in folder.iterdir()
                if f.is_file() and f.suffix.lower() in SUPPORTED_EXT])

print(f"  📂 처리할 파일: {len(files)}개\n")

success = 0
failed  = 0

for file in files:
    try:
        # ④ 원본 인코딩 감지
        detected_encoding, confidence = detect_encoding(file)

        # ⑤ 감지된 인코딩으로 읽고 목표 인코딩으로 다시 저장
        with open(file, "r", encoding=detected_encoding, errors="replace") as f:
            content = f.read()

        out_path = output_dir / file.name
        with open(out_path, "w", encoding=TARGET_ENCODING) as f:
            f.write(content)

        print(f"  ✔ {file.name}  ({detected_encoding}, 신뢰도 {confidence:.0%})  →  {TARGET_ENCODING}")
        success += 1

    except Exception as e:
        print(f"  ✘ {file.name} 변환 실패: {e}")
        failed += 1

print(f"\n✅ 완료! 성공: {success}개 / 실패: {failed}개 → {OUTPUT_DIR}")

3단계: 실행 방법

  1. 코드 ① 설정의 FOLDER_PATH에 변환할 파일이 있는 폴더 경로를 입력합니다.
  2. OUTPUT_DIR에 변환된 파일을 저장할 폴더 경로를 입력합니다.
  3. TARGET_ENCODING에 원하는 목표 인코딩을 입력합니다. 보통은 "utf-8"을 권장합니다.
  4. 터미널에서 아래 명령어로 실행합니다:
python encoding_convert.py

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

  📂 처리할 파일: 4개

  ✔ 거래내역_2025.csv  (cp949, 신뢰도 99%)  →  utf-8
  ✔ 시스템로그.txt     (cp949, 신뢰도 87%)  →  utf-8
  ✔ 회원목록.csv       (utf-8, 신뢰도 100%)  →  utf-8
  ✔ 메모.txt           (cp949, 신뢰도 95%)  →  utf-8

✅ 완료! 성공: 4개 / 실패: 0개 → C:\Users\내이름\Desktop\UTF8변환결과

변환된 파일들은 모두 지정한 인코딩(예: UTF-8)으로 통일되어 저장됩니다. 원본 파일은 그대로 유지됩니다.


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

오류 1: 변환 후에도 일부 글자가 깨짐(□ 또는 ?)

chardet의 감지 신뢰도가 낮은 경우 발생합니다. 터미널에 출력된 "신뢰도"가 70% 미만이라면 자동 감지가 부정확할 수 있습니다. 해당 파일은 detected_encoding"cp949" 또는 "utf-8"로 직접 지정해서 다시 시도하세요.

오류 2: UnicodeDecodeError

감지된 인코딩이 실제와 다른 경우입니다. 코드에 이미 errors="replace"가 포함되어 있어 깨지는 문자는 대체 문자로 바뀌고 멈추지 않습니다. 정확한 변환이 필요하면 해당 파일의 실제 인코딩을 다른 도구(예: 메모장++)로 직접 확인해보세요.

오류 3: ModuleNotFoundError: No module named 'chardet'

설치가 제대로 되지 않은 경우입니다. 아래 명령어로 다시 시도하세요.

python -m pip install chardet

응용: 반대로 UTF-8을 EUC-KR로 변환하기

오래된 시스템에 업로드해야 해서 EUC-KR로 변환이 필요한 경우도 있습니다. 코드 ① 설정의 TARGET_ENCODING만 바꾸면 됩니다.

TARGET_ENCODING = "cp949"   # ← UTF-8 → EUC-KR(CP949)로 변환
⚠️ 주의: UTF-8에는 있지만 EUC-KR에는 없는 특수문자나 이모지가 포함된 경우, 변환 시 해당 문자가 깨질 수 있습니다. errors="replace" 설정으로 오류는 나지 않지만 일부 문자가 손실될 수 있다는 점을 참고하세요.

응용: 변환 결과를 엑셀로 정리해서 보고하기

여러 파일을 변환한 결과를 엑셀로 정리해서 어떤 파일이 어떤 인코딩이었는지 기록할 수 있습니다.

import pandas as pd

results = []   # 반복문 안에서 각 파일의 결과를 results.append({...})로 누적

results.append({
    "파일명": file.name,
    "원본인코딩": detected_encoding,
    "신뢰도": f"{confidence:.0%}",
    "변환결과": "성공",
})

df = pd.DataFrame(results)
df.to_excel(output_dir / "변환_보고서.xlsx", index=False)
💡 이전 게시글과 결합하면: CSV 자동 병합 편의 인코딩 감지 기능과 같은 원리이며, 이 코드로 먼저 인코딩을 통일한 뒤 CSV 병합을 진행하면 더욱 안정적으로 작업할 수 있습니다.

핵심 요약

  • 준비물: Python + chardet 설치 (pip install chardet)
  • 설정: FOLDER_PATH, OUTPUT_DIR, TARGET_ENCODING 수정
  • 실행: 터미널에서 python encoding_convert.py 입력
  • 결과: 원본 인코딩 자동 감지 후 목표 인코딩으로 일괄 변환, 신뢰도 함께 출력

이 코드를 응용하면 변환 전후 파일 크기를 비교하거나, 특정 인코딩의 파일만 골라서 변환하는 것도 가능합니다.

이 블로그의 인기 게시물

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

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

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