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

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

매번 반복되는 워드 문서 작성, 파이썬으로 자동 생성하기

매번 반복되는 워드 문서 작성, 파이썬으로 자동 생성하기 (완성 코드 공개)

파이썬으로 워드 문서를 자동으로 생성하는 모습


"A사 견적서, B사 견적서, C사 견적서…"

거래처마다 이름과 금액만 다를 뿐 양식은 똑같은 문서를 매번 복사해서 수정하고 있지는 않으신가요? 회사명을 잘못 복사하거나, 금액 수정을 빠뜨리는 실수가 반드시 생깁니다. 파이썬을 한 번만 세팅해두면 엑셀에 거래처 정보를 입력하는 것만으로 워드 문서가 자동으로 생성됩니다.


1단계: 준비물 설치

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

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

pip install python-docx pandas openpyxl

python-docx는 워드(.docx) 파일을 생성하고 편집하는 라이브러리입니다. 제목, 본문, 표, 서식까지 모두 코드로 제어할 수 있습니다. pandasopenpyxl은 엑셀에서 데이터를 읽어오는 데 사용합니다.

💡 이 코드로 할 수 있는 것: 엑셀 파일에 거래처별 정보(회사명, 담당자, 금액 등)를 입력해두면, 거래처마다 자동으로 개별 워드 파일을 생성합니다. 10개든 100개든 실행 한 번으로 처리됩니다.

2단계: 엑셀 파일 준비

코드를 실행하기 전에 엑셀 파일을 아래 형식으로 준비합니다. 1행은 반드시 헤더(열 이름)로, 2행부터 실제 데이터를 입력합니다.

A열(회사명)    B열(담당자)    C열(품목)       D열(금액)
----------------------------------------------------------
A주식회사      홍길동         노트북 5대      3,500,000
B기술연구소    김철수         마우스 20개     400,000
C물산          이영희         모니터 3대      1,800,000

열 이름은 자유롭게 바꿀 수 있습니다. 코드에서 열 이름을 지정하기 때문에 원하는 항목을 추가해도 됩니다.


3단계: 완성 코드

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

import pandas as pd
from docx import Document
from docx.shared import Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from pathlib import Path
from datetime import datetime

# ① 설정: 파일 경로
EXCEL_PATH  = r"C:\Users\내이름\Desktop\거래처목록.xlsx"   # ← 본인 엑셀 경로
OUTPUT_DIR  = r"C:\Users\내이름\Desktop\견적서모음"        # ← 저장할 폴더 경로

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

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

# ④ 거래처별 워드 파일 생성
created = 0
for _, row in df.iterrows():
    doc = Document()

    # 제목
    title = doc.add_heading("견 적 서", level=1)
    title.alignment = WD_ALIGN_PARAGRAPH.CENTER

    # 발행일
    date_para = doc.add_paragraph(f"발행일: {datetime.now().strftime('%Y년 %m월 %d일')}")
    date_para.alignment = WD_ALIGN_PARAGRAPH.RIGHT

    doc.add_paragraph()   # 빈 줄

    # 수신 정보
    doc.add_paragraph(f"수  신: {row['회사명']}  {row['담당자']} 님")
    doc.add_paragraph("발  신: IT꿀팁 연구소")

    doc.add_paragraph()   # 빈 줄

    # 품목 표
    table = doc.add_table(rows=1, cols=3)
    table.style = "Table Grid"
    header_cells = table.rows[0].cells
    header_cells[0].text = "품목"
    header_cells[1].text = "금액"
    header_cells[2].text = "비고"

    # 헤더 굵게 처리
    for cell in header_cells:
        for para in cell.paragraphs:
            for run in para.runs:
                run.bold = True

    # 데이터 행 추가
    data_cells = table.add_row().cells
    data_cells[0].text = str(row["품목"])
    data_cells[1].text = f"{int(row['금액']):,}원"
    data_cells[2].text = "부가세 별도"

    # 합계 행
    total_cells = table.add_row().cells
    total_cells[0].text = "합  계"
    total_cells[1].text = f"{int(row['금액']):,}원"
    total_cells[2].text = ""

    doc.add_paragraph()   # 빈 줄
    doc.add_paragraph("위와 같이 견적서를 제출합니다. 검토 후 연락 부탁드립니다.")

    # ⑤ 파일 저장 (회사명으로 파일명 지정)
    filename = f"견적서_{row['회사명']}.docx"
    doc.save(output_dir / filename)
    print(f"  ✔ 생성 완료: {filename}")
    created += 1

print(f"\n✅ 완료! 총 {created}개 워드 파일 생성 → {OUTPUT_DIR}")

4단계: 실행 방법

  1. 엑셀 파일을 준비하고 코드 ① 설정의 EXCEL_PATH에 파일 경로를 입력합니다.
  2. OUTPUT_DIR에 워드 파일을 저장할 폴더 경로를 입력합니다. 폴더가 없으면 자동으로 생성됩니다.
  3. 엑셀의 열 이름이 코드와 다르다면 row['회사명'], row['담당자'] 등을 본인 엑셀의 열 이름으로 수정합니다.
  4. 터미널에서 아래 명령어로 실행합니다:
python make_word.py

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

  ✔ 데이터 로드 완료: 3건
  ✔ 생성 완료: 견적서_A주식회사.docx
  ✔ 생성 완료: 견적서_B기술연구소.docx
  ✔ 생성 완료: 견적서_C물산.docx

✅ 완료! 총 3개 워드 파일 생성 → C:\Users\내이름\Desktop\견적서모음

지정한 폴더 안에 거래처별 워드 파일이 자동으로 생성됩니다. 각 파일에는 회사명, 담당자, 품목, 금액이 자동으로 채워져 있고 표 서식까지 적용되어 있습니다.


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

오류 1: ModuleNotFoundError: No module named 'docx'

설치 시 docx가 아닌 반드시 python-docx로 입력해야 합니다. 아래 명령어로 다시 설치하세요.

python -m pip install python-docx

오류 2: KeyError: '회사명'

코드의 row['회사명']에 입력한 열 이름이 엑셀 헤더와 정확히 일치하지 않을 때 발생합니다. 엑셀 1행의 열 이름을 다시 확인하고, 공백이나 오타가 없는지 점검하세요.

오류 3: 생성된 워드 파일의 한글이 깨짐

python-docx는 한글을 기본으로 지원합니다. 깨짐이 발생한다면 파일 저장 시 인코딩이 UTF-8로 설정되어 있는지 확인하세요. 메모장에서 저장할 때 인코딩을 UTF-8로 선택했는지 다시 확인합니다.


응용: 문서에 로고 이미지를 넣고 싶다면

회사 로고나 도장 이미지를 워드 문서에 자동으로 삽입할 수 있습니다. 제목 아래에 아래 코드를 추가하세요.

from docx.shared import Inches

LOGO_PATH = r"C:\Users\내이름\Desktop\회사로고.png"   # ← 로고 이미지 경로

logo_para = doc.add_paragraph()
logo_para.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = logo_para.add_run()
run.add_picture(LOGO_PATH, width=Inches(1.5))   # 너비 1.5인치로 삽입
💡 이전 게시글과 결합하면: 이메일 자동 발송 편의 코드와 결합하면, 거래처별 워드 파일을 생성한 직후 해당 담당자 이메일로 자동 발송하는 것도 가능합니다.

핵심 요약

  • 준비물: Python + python-docx + pandas + openpyxl 설치
  • 설정: 엑셀 파일 경로, 저장 폴더 경로, 열 이름만 수정
  • 실행: 터미널에서 python make_word.py 입력
  • 결과: 거래처별 워드 파일이 표 서식 포함 자동 생성, 파일명도 회사명으로 자동 지정

이 코드를 응용하면 보고서, 계약서, 안내문 등 어떤 양식의 문서도 자동으로 만들 수 있습니다.

이 블로그의 인기 게시물

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

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

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