엑셀 매크로(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 python-pptx pandas openpyxl

python-pptx는 파워포인트(.pptx) 파일을 생성하고 편집하는 라이브러리입니다. 제목, 본문, 표, 이미지, 차트까지 모두 코드로 제어할 수 있습니다. pandasopenpyxl은 엑셀 데이터를 읽어와 슬라이드에 반영하는 데 사용합니다.

💡 이 코드로 할 수 있는 것: 표지 슬라이드, 텍스트 본문 슬라이드, 표가 포함된 데이터 슬라이드를 자동으로 생성합니다. 엑셀 파일을 읽어 거래처별로 슬라이드를 자동으로 반복 생성하는 것도 가능합니다.

2단계: 완성 코드

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

from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
import pandas as pd
from datetime import datetime

# ① 설정
EXCEL_PATH  = r"C:\Users\내이름\Desktop\주간실적.xlsx"   # ← 데이터 엑셀 경로
OUTPUT_PATH = r"C:\Users\내이름\Desktop\주간보고서.pptx"  # ← 저장 경로

# ② 프레젠테이션 생성
prs = Presentation()
prs.slide_width  = Inches(13.33)   # 16:9 와이드 화면
prs.slide_height = Inches(7.5)

BLANK = prs.slide_layouts[6]   # 빈 레이아웃 사용 (자유 배치)

# ③ 표지 슬라이드
slide1 = prs.slides.add_slide(BLANK)
title_box = slide1.shapes.add_textbox(Inches(1), Inches(2.8), Inches(11), Inches(1.5))
tf = title_box.text_frame
tf.text = "주간 업무 실적 보고"
tf.paragraphs[0].font.size = Pt(44)
tf.paragraphs[0].font.bold = True
tf.paragraphs[0].font.color.rgb = RGBColor(0x2E, 0x50, 0x90)
tf.paragraphs[0].alignment = PP_ALIGN.CENTER

date_box = slide1.shapes.add_textbox(Inches(1), Inches(4.3), Inches(11), Inches(0.8))
date_box.text_frame.text = datetime.now().strftime("%Y년 %m월 %d일")
date_box.text_frame.paragraphs[0].font.size = Pt(20)
date_box.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
print(f"  ✔ 표지 슬라이드 생성 완료")

# ④ 텍스트 본문 슬라이드 (요약)
slide2 = prs.slides.add_slide(BLANK)
header = slide2.shapes.add_textbox(Inches(0.5), Inches(0.3), Inches(12), Inches(0.8))
header.text_frame.text = "이번 주 핵심 요약"
header.text_frame.paragraphs[0].font.size = Pt(32)
header.text_frame.paragraphs[0].font.bold = True

content = slide2.shapes.add_textbox(Inches(0.8), Inches(1.5), Inches(11.5), Inches(5))
tf2 = content.text_frame
tf2.word_wrap = True

bullet_points = [
    "전체 매출 목표 105% 달성",
    "신규 거래처 3곳 계약 완료",
    "미납 거래처 2건 → 추가 관리 필요",
    "다음 주 목표: 신규 영업 5건 이상",
]
for i, point in enumerate(bullet_points):
    p = tf2.paragraphs[0] if i == 0 else tf2.add_paragraph()
    p.text = f"•  {point}"
    p.font.size = Pt(22)
    p.space_after = Pt(16)
print(f"  ✔ 요약 슬라이드 생성 완료")

# ⑤ 표 슬라이드 (엑셀 데이터를 표로 변환)
df = pd.read_excel(EXCEL_PATH, engine="openpyxl")
print(f"  ✔ 엑셀 데이터 로드: {len(df)}행")

slide3 = prs.slides.add_slide(BLANK)
header3 = slide3.shapes.add_textbox(Inches(0.5), Inches(0.3), Inches(12), Inches(0.8))
header3.text_frame.text = "거래처별 실적 현황"
header3.text_frame.paragraphs[0].font.size = Pt(32)
header3.text_frame.paragraphs[0].font.bold = True

rows, cols = len(df) + 1, len(df.columns)   # +1: 헤더 행
table_shape = slide3.shapes.add_table(
    rows, cols, Inches(0.8), Inches(1.5), Inches(11.5), Inches(0.5 * rows)
)
table = table_shape.table

# 헤더 입력
for col_idx, col_name in enumerate(df.columns):
    cell = table.cell(0, col_idx)
    cell.text = str(col_name)
    cell.text_frame.paragraphs[0].font.bold = True
    cell.text_frame.paragraphs[0].font.size = Pt(14)
    cell.fill.solid()
    cell.fill.fore_color.rgb = RGBColor(0x2E, 0x50, 0x90)
    cell.text_frame.paragraphs[0].font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF)

# 데이터 입력
for row_idx, row in df.iterrows():
    for col_idx, value in enumerate(row):
        cell = table.cell(row_idx + 1, col_idx)
        cell.text = str(value)
        cell.text_frame.paragraphs[0].font.size = Pt(13)
print(f"  ✔ 표 슬라이드 생성 완료")

# ⑥ 저장
prs.save(OUTPUT_PATH)
print(f"\n✅ 완료! 슬라이드 {len(prs.slides.__iter__.__self__._sldIdLst)}장 생성 → {OUTPUT_PATH}")

3단계: 실행 방법

  1. 코드 ① 설정의 EXCEL_PATH에 표로 변환할 데이터 엑셀 경로를 입력합니다.
  2. OUTPUT_PATH에 저장할 파워포인트 경로를 입력합니다.
  3. 코드 ④의 bullet_points 목록을 원하는 요약 내용으로 수정합니다.
  4. 터미널에서 아래 명령어로 실행합니다:
python make_ppt.py

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

  ✔ 표지 슬라이드 생성 완료
  ✔ 요약 슬라이드 생성 완료
  ✔ 엑셀 데이터 로드: 8행
  ✔ 표 슬라이드 생성 완료

✅ 완료! 슬라이드 3장 생성 → C:\Users\내이름\Desktop\주간보고서.pptx

생성된 파워포인트 파일에는 표지, 요약, 데이터 표가 포함된 슬라이드 3장이 들어 있습니다. 파워포인트에서 열어 글꼴, 색상, 레이아웃을 추가로 다듬을 수 있습니다.


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

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

설치 시 pptx가 아닌 반드시 python-pptx로 입력해야 합니다.

python -m pip install python-pptx

오류 2: 표 데이터가 너무 많아 슬라이드를 벗어남

엑셀 행이 많으면 표가 슬라이드 높이를 초과합니다. 행이 15개 이상이면 여러 슬라이드로 나누는 것을 권장합니다. 아래처럼 일정 개수씩 잘라서 여러 슬라이드에 분산하세요:

chunks = [df[i:i+10] for i in range(0, len(df), 10)]   # 10행씩 분할

오류 3: 마지막 줄에서 슬라이드 개수 출력 시 오류 발생

코드 ⑥의 슬라이드 개수 출력 부분이 복잡해서 오류가 날 수 있습니다. 간단하게 아래로 교체하세요:

print(f"\n✅ 완료! 슬라이드 {len(prs.slides)}장 생성 → {OUTPUT_PATH}")

응용: 거래처별로 슬라이드를 자동 반복 생성하기

엑셀에 거래처 목록이 있을 때, 거래처마다 별도의 슬라이드를 자동으로 반복 생성할 수 있습니다.

for _, row in df.iterrows():
    slide = prs.slides.add_slide(BLANK)

    title_box = slide.shapes.add_textbox(Inches(0.5), Inches(0.3), Inches(12), Inches(0.8))
    title_box.text_frame.text = f"{row['거래처명']} 실적 현황"
    title_box.text_frame.paragraphs[0].font.size = Pt(28)
    title_box.text_frame.paragraphs[0].font.bold = True

    content_box = slide.shapes.add_textbox(Inches(0.8), Inches(1.5), Inches(11), Inches(4))
    tf = content_box.text_frame
    tf.text = f"매출: {row['매출금액']:,}원\n담당자: {row['담당자']}\n상태: {row['납부상태']}"
    tf.paragraphs[0].font.size = Pt(20)
💡 이전 게시글과 결합하면: 피벗 테이블 자동 생성 편으로 데이터를 집계한 뒤 이 코드로 슬라이드 표를 만들거나, 이메일 자동 발송 편과 결합해 완성된 파워포인트를 자동으로 발송할 수 있습니다.

핵심 요약

  • 준비물: Python + python-pptx + pandas + openpyxl 설치 (pip install python-pptx pandas openpyxl)
  • 설정: EXCEL_PATH, OUTPUT_PATH, 요약 문구(bullet_points) 수정
  • 실행: 터미널에서 python make_ppt.py 입력
  • 결과: 표지·요약·표 슬라이드가 포함된 파워포인트 자동 생성, 엑셀 데이터가 표로 그대로 반영

이 코드를 응용하면 차트 이미지를 슬라이드에 자동 삽입하거나, 회사 템플릿 디자인을 그대로 활용해 내용만 채우는 것도 가능합니다.

이 블로그의 인기 게시물

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

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

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