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

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

민감한 엑셀 파일 보안 자동화! 파이썬으로 암호 설정·해제하기

민감한 엑셀 파일 보안 자동화! 파이썬으로 암호 설정·해제하기 (완성 코드 공개)

파이썬으로 엑셀 파일에 암호를 자동으로 설정하고 해제하는 모습


"거래처별 견적서 30개에 각각 다른 암호를 걸어서 발송해야 한다", "인사 자료가 담긴 엑셀을 외부에 보내기 전 반드시 암호를 걸어야 한다", "암호가 걸린 수십 개의 엑셀 파일을 한꺼번에 열어서 작업해야 한다"…

엑셀에서 파일 → 정보 → 통합 문서 보호 → 암호 설정 메뉴를 거래처 수만큼 반복하는 작업은 시간이 오래 걸리고 실수로 암호를 빠뜨리기도 합니다. 파이썬을 한 번만 세팅해두면 폴더 안의 모든 엑셀 파일에 암호를 자동으로 설정하거나, 암호가 걸린 파일들을 한꺼번에 해제할 수 있습니다.


1단계: 준비물 설치

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

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

pip install msoffcrypto-tool openpyxl

msoffcrypto-tool은 마이크로소프트 오피스 파일의 암호화·복호화를 처리하는 라이브러리입니다. 엑셀, 워드, 파워포인트 모두 지원합니다. openpyxl은 암호가 없는 일반 엑셀 파일을 읽고 쓰는 데 사용합니다.

⚠️ 중요: msoffcrypto-tool은 암호 해제(복호화)와 파일 읽기는 지원하지만, 새 암호 설정(암호화)은 직접 지원하지 않습니다. 암호 설정은 아래에서 소개하는 win32com(엑셀이 설치된 윈도우 환경 필요) 방식을 사용합니다.

2단계: 완성 코드 — 암호 일괄 설정 (윈도우 + 엑셀 설치 환경)

엑셀이 설치되어 있는 윈도우 환경에서 사용하는 방법입니다. 먼저 추가 라이브러리를 설치합니다.

pip install pywin32

아래 코드를 set_password.py로 저장하세요.

import win32com.client as win32
from pathlib import Path

# ① 설정
FOLDER_PATH = r"C:\Users\내이름\Desktop\견적서모음"   # ← 암호 설정할 폴더
PASSWORD    = "abc1234!"                              # ← 설정할 암호 (모든 파일 동일하게 적용 시)

# 거래처별로 다른 암호를 적용하려면 아래 딕셔너리 사용 (파일명 키워드: 암호)
CUSTOM_PASSWORDS = {
    "A주식회사": "Acompany2026!",
    "B기술연구소": "Btech2026!",
}

# ② 엑셀 애플리케이션 실행 (백그라운드)
excel = win32.gencache.EnsureDispatch("Excel.Application")
excel.Visible = False
excel.DisplayAlerts = False

folder = Path(FOLDER_PATH)
xlsx_files = sorted(folder.glob("*.xlsx"))
print(f"  📂 처리할 파일: {len(xlsx_files)}개")

success = 0
failed  = 0

for file in xlsx_files:
    try:
        # 파일명에 맞는 맞춤 암호가 있으면 사용, 없으면 기본 암호 사용
        pwd = PASSWORD
        for keyword, custom_pwd in CUSTOM_PASSWORDS.items():
            if keyword in file.name:
                pwd = custom_pwd
                break

        wb = excel.Workbooks.Open(str(file))
        wb.Password = pwd          # 열기 암호 설정
        wb.Save()
        wb.Close()
        print(f"  ✔ {file.name}  →  암호 설정 완료")
        success += 1

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

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

3단계: 완성 코드 — 암호 일괄 해제

암호가 걸린 엑셀 파일들을 한꺼번에 해제하는 코드입니다. msoffcrypto-tool을 사용하므로 엑셀 설치 없이도 동작합니다. 아래 코드를 remove_password.py로 저장하세요.

import msoffcrypto
from pathlib import Path
from io import BytesIO

# ① 설정
FOLDER_PATH = r"C:\Users\내이름\Desktop\암호걸린파일"     # ← 처리할 폴더
OUTPUT_DIR  = r"C:\Users\내이름\Desktop\암호해제결과"     # ← 결과 저장 폴더
PASSWORD    = "abc1234!"   # ← 모든 파일에 적용된 암호 (같은 암호인 경우)

output_dir = Path(OUTPUT_DIR)
output_dir.mkdir(exist_ok=True)

folder = Path(FOLDER_PATH)
xlsx_files = sorted(folder.glob("*.xlsx"))
print(f"  📂 처리할 파일: {len(xlsx_files)}개")

success = 0
failed  = 0

for file in xlsx_files:
    try:
        with open(file, "rb") as f:
            office_file = msoffcrypto.OfficeFile(f)
            office_file.load_key(password=PASSWORD)

            decrypted = BytesIO()
            office_file.decrypt(decrypted)

            out_path = output_dir / file.name
            with open(out_path, "wb") as out_f:
                out_f.write(decrypted.getvalue())

        print(f"  ✔ {file.name}  →  암호 해제 완료")
        success += 1

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

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

4단계: 실행 방법

암호 설정:

  1. 코드 ① 설정의 FOLDER_PATHPASSWORD를 입력합니다. 거래처별로 다른 암호가 필요하면 CUSTOM_PASSWORDS에 추가합니다.
  2. 터미널에서 실행합니다 (반드시 PC에 엑셀이 설치되어 있어야 합니다):
python set_password.py

암호 해제:

python remove_password.py

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

  📂 처리할 파일: 3개
  ✔ 견적서_A주식회사.xlsx  →  암호 설정 완료
  ✔ 견적서_B기술연구소.xlsx  →  암호 설정 완료
  ✔ 견적서_C물산.xlsx  →  암호 설정 완료

✅ 완료! 성공: 3개 / 실패: 0개

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

오류 1: pywin32.com_error — 엑셀이 설치되지 않음

암호 설정 코드는 PC에 마이크로소프트 엑셀이 실제로 설치되어 있어야 동작합니다. 엑셀이 없는 환경(서버 등)에서는 이 방법을 사용할 수 없으며, 별도의 클라우드 API 방식이 필요합니다.

오류 2: 암호 해제 시 Invalid password 오류

PASSWORD에 입력한 암호가 실제 파일 암호와 다른 경우입니다. 대소문자, 특수문자까지 정확히 일치해야 합니다. 파일마다 암호가 다르다면 CUSTOM_PASSWORDS 방식처럼 딕셔너리로 매핑하세요.

오류 3: 처리 중 엑셀이 응답 없음 상태로 멈춤

파일이 손상되었거나 매크로 보안 경고가 떠서 자동화가 멈추는 경우입니다. 작업 관리자에서 EXCEL.EXE 프로세스를 강제 종료하고, excel.DisplayAlerts = False 설정이 코드에 포함되어 있는지 확인하세요.


응용: 엑셀 파일 목록과 암호를 엑셀로 관리하기

거래처가 많을 때는 암호를 코드에 직접 입력하는 대신 엑셀 목록에서 읽어오면 관리가 편합니다.

import pandas as pd

# 거래처명, 암호가 정리된 엑셀 파일 읽기
pwd_df = pd.read_excel(r"C:\Users\내이름\Desktop\암호목록.xlsx", engine="openpyxl")
CUSTOM_PASSWORDS = dict(zip(pwd_df["거래처명"], pwd_df["암호"]))
💡 이전 게시글과 결합하면: 엑셀 데이터 분리 저장 편으로 거래처별 파일을 만든 뒤 이 코드로 각각 암호를 설정하고, 이메일 자동 발송 편으로 암호가 걸린 파일을 안전하게 발송하는 파이프라인을 구성할 수 있습니다.

핵심 요약

  • 준비물: 암호 설정은 pywin32(엑셀 설치 필요), 암호 해제는 msoffcrypto-tool(엑셀 불필요)
  • 암호 설정: FOLDER_PATH, PASSWORD 또는 CUSTOM_PASSWORDS 수정 후 set_password.py 실행
  • 암호 해제: FOLDER_PATH, PASSWORD 수정 후 remove_password.py 실행
  • 결과: 폴더 안의 모든 엑셀 파일에 일괄 암호 설정 또는 해제, 거래처별 다른 암호 적용 가능

이 코드를 응용하면 수정 암호(쓰기 보호)만 따로 설정하거나, 특정 시트만 잠그는 부분 보호도 구현할 수 있습니다. 보안이 중요한 작업이니 암호는 안전하게 관리하시길 권장합니다.

이 블로그의 인기 게시물

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

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

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