엑셀 매크로(VBA) 보안 경고 끝! 파이썬으로 똑같은 작업 대체하기
"거래처별 견적서 30개에 각각 다른 암호를 걸어서 발송해야 한다", "인사 자료가 담긴 엑셀을 외부에 보내기 전 반드시 암호를 걸어야 한다", "암호가 걸린 수십 개의 엑셀 파일을 한꺼번에 열어서 작업해야 한다"…
엑셀에서 파일 → 정보 → 통합 문서 보호 → 암호 설정 메뉴를 거래처 수만큼 반복하는 작업은 시간이 오래 걸리고 실수로 암호를 빠뜨리기도 합니다. 파이썬을 한 번만 세팅해두면 폴더 안의 모든 엑셀 파일에 암호를 자동으로 설정하거나, 암호가 걸린 파일들을 한꺼번에 해제할 수 있습니다.
파이썬이 설치되어 있어야 합니다. 없다면 python.org에서 최신 버전을 받아 설치하세요. 설치 시 반드시 "Add Python to PATH"에 체크해야 합니다.
엑셀 암호 처리에 필요한 라이브러리를 설치합니다. 터미널(윈도우: CMD 또는 파워셸)을 열고 아래 명령어를 실행하세요:
pip install msoffcrypto-tool openpyxl
msoffcrypto-tool은 마이크로소프트 오피스 파일의 암호화·복호화를 처리하는 라이브러리입니다. 엑셀, 워드, 파워포인트 모두 지원합니다. openpyxl은 암호가 없는 일반 엑셀 파일을 읽고 쓰는 데 사용합니다.
⚠️ 중요:msoffcrypto-tool은 암호 해제(복호화)와 파일 읽기는 지원하지만, 새 암호 설정(암호화)은 직접 지원하지 않습니다. 암호 설정은 아래에서 소개하는win32com(엑셀이 설치된 윈도우 환경 필요) 방식을 사용합니다.
엑셀이 설치되어 있는 윈도우 환경에서 사용하는 방법입니다. 먼저 추가 라이브러리를 설치합니다.
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}개")
암호가 걸린 엑셀 파일들을 한꺼번에 해제하는 코드입니다. 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}")
암호 설정:
FOLDER_PATH와 PASSWORD를 입력합니다. 거래처별로 다른 암호가 필요하면 CUSTOM_PASSWORDS에 추가합니다.python set_password.py
암호 해제:
python remove_password.py
암호 설정 정상 실행 시 터미널에 이렇게 출력됩니다:
📂 처리할 파일: 3개 ✔ 견적서_A주식회사.xlsx → 암호 설정 완료 ✔ 견적서_B기술연구소.xlsx → 암호 설정 완료 ✔ 견적서_C물산.xlsx → 암호 설정 완료 ✅ 완료! 성공: 3개 / 실패: 0개
오류 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["암호"]))
💡 이전 게시글과 결합하면: 엑셀 데이터 분리 저장 편으로 거래처별 파일을 만든 뒤 이 코드로 각각 암호를 설정하고, 이메일 자동 발송 편으로 암호가 걸린 파일을 안전하게 발송하는 파이프라인을 구성할 수 있습니다.
이 코드를 응용하면 수정 암호(쓰기 보호)만 따로 설정하거나, 특정 시트만 잠그는 부분 보호도 구현할 수 있습니다. 보안이 중요한 작업이니 암호는 안전하게 관리하시길 권장합니다.