파워포인트 자동화하기: VBA 매크로, Office 추가 기능, Python 활용법
어떤 파워포인트 반복 작업을 자동화할 가치가 있는지 판단하고, VBA 매크로, Office JavaScript 추가 기능, python-pptx 스크립트 중 알맞은 도구를 골라요.
- 난이도
- 전문가
- 시간
- 15분 분량
- 수정:
- 적용 대상:
- Microsoft 365용 PowerPoint, PowerPoint 2024, PowerPoint 2021, Mac용 PowerPoint, 웹용 PowerPoint(추가 기능만)

배울 내용
- 준비 시간, 절약되는 시간, 유지 관리를 기준으로 파워포인트 작업의 자동화 점수를 매겨요
- Application부터 TextRange까지 파워포인트 VBA 개체 모델을 읽어요
- 슬라이드 제목 목록을 만드는 매크로와 빠진 대체 텍스트를 찾는 매크로를 실행해요
- VBA보다 Office JavaScript 추가 기능이 더 알맞은 경우를 설명해요
- python-pptx로 파워포인트 밖에서 슬라이드 파일을 점검하거나 생성해요
- 입력, 출력, 위험, 담당자가 담긴 자동화 제안서를 써요
팀의 슬라이드 제작을 맡게 되면 매주 같은 잡일이 눈에 들어와요. 모든 슬라이드에 제목이 있는지 확인하고, 대체 텍스트 없는 이미지를 찾아다니고, 도형 이름을 바꾸고, 바닥글을 통일하고, 강좌 개요에 쓸 제목을 모으는 일이죠. 하나하나는 몇 분이면 끝나지만, 한 학기에 슬라이드 파일이 40개라면 며칠이 걸려요.
이 페이지는 무엇을 자동화할지, 어떤 도구를 쓸지 정하는 데 도움을 줘요. 작은 VBA 매크로 두 개를 실행해 보고, Office JavaScript 추가 기능이 어디에 맞는지 살펴보고, python-pptx로 파워포인트 밖에서 슬라이드 파일을 다뤄 볼 거예요. 예제는 템플릿 키트 페이지에 나왔던 튜터링 사이트의 강좌 팀이에요. 이제 관리해야 할 수업 슬라이드가 한가득 쌓여 있어요.
자동화할 가치가 있는 작업인지 판단하기
자동화는 거래예요. 반복 작업에 쓰는 시간을 그만 쓰기 위해, 무언가를 만들고 유지하는 데 시간을 들이는 거죠. 작업이 반복적이고, 규칙으로 정할 수 있고, 자주 일어날 때, 그리고 그 도구를 실행할 사람이 실제로 실행할 수 있을 때 이득이 돼요.
후보 작업마다 네 가지 질문에 1점(맞지 않음)부터 3점(잘 맞음)까지 점수를 매기세요.
- 반복. 모든 슬라이드 파일에서, 또는 파일 하나에서 여러 번 일어나나요?
- 규칙. 처음 보는 사람이 따라 해도 같은 결과가 나오도록 단계를 적을 수 있나요?
- 효과. 한 학기 동안 절약되는 시간이 제작 시간과 유지 관리 시간을 합친 것보다 분명히 큰가요?
- 사용자. 필요한 사람이 안전하게 실행할 수 있나요(권한, 플랫폼, 실력)?
다음은 강좌 팀이 작업 다섯 개에 매긴 점수예요.
| 작업 | 반복 | 규칙 | 효과 | 사용자 | 판단 |
|---|---|---|---|---|---|
| 강좌 개요용 슬라이드 제목 목록 만들기 | 3 | 3 | 3 | 3 | 자동화 |
| 대체 텍스트 없는 그림 찾기 | 3 | 3 | 3 | 3 | 자동화(대체 텍스트 작성은 사람이) |
| 슬라이드 파일 40개의 바닥글 텍스트 통일 | 2 | 3 | 3 | 2 | 일괄 처리 스크립트로 자동화 |
| 수업마다 표지 사진 고르기 | 2 | 1 | 1 | 3 | 자동화하지 않음 |
| 제목을 핵심 메시지로 다시 쓰기 | 3 | 1 | 2 | 3 | 자동화하지 않고 스타일 가이드에 추가 |
대체 텍스트 행을 보세요. 스크립트는 문제를 확실하게 찾을 수 있어요. 하지만 좋은 대체 텍스트를 쓰려면 그 이미지가 해당 슬라이드에서 무슨 의미인지 판단해야 하니, 그 부분은 여전히 사람이 해요.
파워포인트 개체 모델 익히기
VBA, 추가 기능, 파일 스크립트 등 어떤 자동화 방법이든 같은 기본 구조를 다뤄요. 한 번만 익혀 두면 코드가 읽히기 시작해요.
| 개체 | 의미 | VBA 예 |
|---|---|---|
| Application | 파워포인트 자체 | Application.Version |
| Presentation | 열려 있는 슬라이드 파일 하나 | ActivePresentation |
| Slides | 파일 안의 모든 슬라이드 | ActivePresentation.Slides.Count |
| Slide | 슬라이드 한 장 | ActivePresentation.Slides(3) |
| Shapes | 슬라이드 위의 모든 것: 개체 틀, 그림, 차트, 표, 그룹 | sld.Shapes |
| TextFrame / TextRange | 도형 안의 텍스트 | shp.TextFrame.TextRange.Text |
| Table, Chart | 일부 도형 안에 있는 특별한 내용 | shp.HasTable, shp.HasChart |
| Selection | 사용자가 지금 선택한 것 | ActiveWindow.Selection |
전형적인 매크로는 반복문이에요. 슬라이드마다, 도형마다 무언가를 확인하고, 보고하거나 바꾸죠. 이 작은 예제를 소리 내어 읽어 보면 계층 구조가 보일 거예요.
Sub MakeTitlesDarkBlue()
Dim sld As Slide
For Each sld In ActivePresentation.Slides
If sld.Shapes.HasTitle Then
sld.Shapes.Title.TextFrame.TextRange.Font.Color.RGB = RGB(31, 56, 100)
End If
Next sld
End Sub
잘 작동하지만, 잘 만든 템플릿에서는 자동화하지 말아야 할 일의 좋은 예이기도 해요. 제목 색을 바꿔야 한다면 테마나 마스터를 한 번만 바꾸면 돼요. 매크로는 템플릿이 통제할 수 없는 일에 쓰세요.
첫 매크로 실행하기: 제목 보고서와 대체 텍스트 점검
준비하기
- 개발 도구 탭을 표시하세요: 파일 다음 옵션 다음 리본 사용자 지정에서 개발 도구를 선택하고 확인을 클릭하세요.
- 개발 도구 다음 코드 다음 Visual Basic 또는 Alt+F11로 Visual Basic 편집기를 여세요.
- 편집기에서 삽입 › 모듈을 선택하고 아래 코드를 붙여 넣으세요.
- Ctrl+G로 직접 실행 창을 열어 출력을 볼 수 있게 하세요.
- 매크로 안을 클릭하고 F5를 눌러 실행하세요. 파워포인트의 보기 다음 매크로 다음 매크로에서도 매크로를 실행할 수 있어요.
매크로 1: 모든 슬라이드 제목 나열하기
팀이 예전에 손으로 베끼던 강좌 개요를 만들어 주고, 제목이 없거나 비어 있는 슬라이드(화면 읽기 프로그램의 탐색에도 방해가 돼요)를 표시해 줘요.
Sub ListSlideTitles()
Dim sld As Slide
Dim titleText As String
Dim report As String
For Each sld In ActivePresentation.Slides
titleText = ""
If sld.Shapes.HasTitle Then
titleText = Trim$(sld.Shapes.Title.TextFrame.TextRange.Text)
End If
If Len(titleText) = 0 Then titleText = "[MISSING TITLE]"
report = report & sld.SlideIndex & vbTab & titleText & vbCrLf
Next sld
Debug.Print report
End Sub
매크로 2: 대체 텍스트 없는 의미 있는 개체 찾기
그림, 차트, SmartArt, 그룹(개체 틀 안의 그림 포함)을 확인하고, 이미 장식용으로 표시된 것은 건너뛰어요.
Sub AuditAltText()
Dim sld As Slide
Dim shp As Shape
Dim issues As Long
For Each sld In ActivePresentation.Slides
For Each shp In sld.Shapes
If NeedsAltText(shp) Then
If Len(Trim$(shp.AlternativeText)) = 0 Then
Debug.Print "Slide " & sld.SlideIndex & ": " & shp.Name & " has no alt text"
issues = issues + 1
End If
End If
Next shp
Next sld
MsgBox issues & " object(s) need alt text. See the Immediate window.", vbInformation
End Sub
Private Function NeedsAltText(shp As Shape) As Boolean
If shp.Decorative = msoTrue Then Exit Function
Select Case shp.Type
Case msoPicture, msoLinkedPicture, msoChart, msoSmartArt, msoGroup
NeedsAltText = True
Case msoPlaceholder
Select Case shp.PlaceholderFormat.ContainedType
Case msoPicture, msoChart, msoSmartArt
NeedsAltText = True
End Select
End Select
End Function
Decorative 속성은 최신 Microsoft 365용 PowerPoint나 PowerPoint 2021 이상이 있어야 해요. 이전 버전이라면 그 줄을 지워도 매크로는 실행돼요.
매크로 저장하고 신뢰하기
- 매크로는 PowerPoint 매크로 사용 프레젠테이션(.pptm)에만 남아요. 코드가 든 파일을 .pptx로 저장하면 파워포인트가 코드를 지워요. 다시 쓸 도구라면, 많은 팀이 매크로를 .pptm "도구 상자" 파일 하나에 모아 두고 점검할 슬라이드 파일과 함께 열어요.
- 매크로 보안은 파일 다음 옵션 다음 보안 센터 다음 보안 센터 설정 다음 매크로 설정에 있어요. 도구를 돌리려고 모두의 보안 수준을 낮추지 마세요. 대신 신뢰할 수 있는 위치를 쓰거나 파일에 디지털 서명을 하세요.
- Microsoft 365는 인터넷에서 온 파일(많은 이메일 첨부 파일 포함)의 매크로를 기본적으로 차단해요. 이건 보안 기능이에요. 매크로 도구는 IT 팀이 승인한 내부 위치를 통해 공유하세요.
Office JavaScript 추가 기능이 더 알맞은 경우
Office 추가 기능은 파워포인트 안에서, 보통 작업 창 형태로 실행되는 작은 웹 앱(HTML, CSS, JavaScript)이에요. 같은 추가 기능이 Windows, Mac, 웹, iPad의 파워포인트에서 모두 작동할 수 있어요. 단, 각 플랫폼이 내가 쓰는 API를 지원해야 해요. 여러 플랫폼에서 쓸 수 있다는 점이 VBA 대신 추가 기능을 고르는 가장 큰 이유예요.
이럴 때 추가 기능을 고르세요.
- 팀이 웹용 PowerPoint나 Mac을 많이 써요.
- "승인된 수업 레이아웃 삽입" 단추가 있는 작업 창처럼 친숙한 인터페이스가 필요해요.
- IT 팀이 중앙에서 배포하고 관리하길 원해요. 관리자는 Microsoft 365 관리 센터에서 사용자에게 추가 기능을 배포할 수 있어요.
- 강좌 카탈로그나 이미지 라이브러리 같은 웹 서비스와 통신해야 해요.
도구가 데스크톱 고급 사용자 몇 명을 위한 것이고, 개체 모델 깊숙이 접근해야 하며, 웹 앱을 만들고 호스팅할 만큼은 아니라면 VBA를 고르세요.
추가 기능 코드는 이렇게 생겼어요. 이 코드 조각은 PowerPoint JavaScript API로 모든 슬라이드의 도형 이름을 나열해요. 애니메이션이나 읽기 순서 작업을 위해 도형 이름을 바꾸기 전에 쓰면 편해요.
await PowerPoint.run(async (context) => {
const slides = context.presentation.slides;
slides.load("items");
await context.sync();
slides.items.forEach((slide) => slide.shapes.load("items/name"));
await context.sync();
slides.items.forEach((slide, i) => {
const names = slide.shapes.items.map((shape) => shape.name);
console.log(`Slide ${i + 1}: ${names.join(", ")}`);
});
});
패턴은 늘 같아요. 읽고 싶은 것을 load로 대기열에 올리고, context.sync()를 호출해 가져온 다음, 값을 사용해요. 홈 다음 추가 기능 다음 추가 기능에서 Microsoft의 Script Lab 추가 기능을 설치하면 추가 기능을 다 만들지 않고도 이런 코드 조각을 시험해 볼 수 있어요.
슬라이드 파일 직접 다루기: Open XML과 python-pptx
.pptx 파일은 Open XML 형식의 XML 파일을 묶은 ZIP 패키지예요. 아무 슬라이드 파일이나 사본을 만들어 확장자를 .zip으로 바꾸고 열어 보세요. ppt/slides, ppt/slideLayouts, ppt/slideMasters, ppt/media 같은 폴더가 보일 거예요. 파일 수준 도구는 파워포인트를 열지 않고 이 부분들을 직접 읽고 써요.
그래서 일괄 작업에 잘 맞아요. 밤사이 슬라이드 파일 200개를 점검하거나, 스프레드시트 개요로 초안 슬라이드 30개를 만들거나, 모든 제목을 강좌 카탈로그로 뽑아내는 일이요. 흔히 쓰는 도구는 .NET용 Open XML SDK와 Python용 python-pptx예요.
다음은 슬라이드마다 번호, 레이아웃 이름, 제목을 보고하는 python-pptx 스크립트예요. 슬라이드 파일 폴더 전체에 돌리면 강좌 전체 개요와 제목이 빠진 슬라이드 목록이 생겨요.
from pptx import Presentation
prs = Presentation("lesson-07.pptx")
for number, slide in enumerate(prs.slides, start=1):
title = slide.shapes.title
text = title.text_frame.text.strip() if title is not None else ""
print(f"{number}\t{slide.slide_layout.name}\t{text or '[MISSING TITLE]'}")
그리고 이건 템플릿 키트의 이름 붙은 레이아웃을 써서 개요 파일로 초안 슬라이드를 만드는 스크립트예요. CSV의 각 행에는 layout, title, bullets(|로 구분)가 있어요.
import csv
from pptx import Presentation
prs = Presentation("course-template.pptx") # 템플릿의 .pptx 사본(샘플 슬라이드는 삭제)
layouts = {layout.name: layout for layout in prs.slide_layouts}
with open("lesson-07-outline.csv", newline="", encoding="utf-8") as f:
for row in csv.DictReader(f):
slide = prs.slides.add_slide(layouts[row["layout"]])
slide.shapes.title.text = row["title"]
bullets = [b.strip() for b in row["bullets"].split("|") if b.strip()]
if bullets:
body = next(p for p in slide.placeholders if p.placeholder_format.idx != 0)
body.text_frame.text = bullets[0]
for b in bullets[1:]:
body.text_frame.add_paragraph().text = b
prs.save("lesson-07-draft.pptx")
스크립트가 내 레이아웃과 개체 틀을 쓰기 때문에, 초안은 템플릿의 글꼴, 색, 읽기 순서를 그대로 물려받아요. 그다음 작성자가 사람의 몫을 해요: 시각 자료, 예시, 핵심 메시지 제목이요.
작업마다 알맞은 도구 고르기
누군가 "이거 자동화할 수 있어요?"라고 물으면 이 지도를 쓰세요.
| 작업 | 가장 좋은 방법 | 이유 |
|---|---|---|
| 슬라이드 파일 하나를 한 번만 고치기 | 파워포인트 UI(글꼴 바꾸기, 다시 설정, 선택 창) | 가장 빠르고, 유지 관리할 코드가 없음 |
| 열어 둔 파일에서 같은 점검 반복, 데스크톱 전용 | VBA 매크로 | 빨리 쓸 수 있고 개체 모델 전체를 다룸 |
| Windows, Mac, 웹을 아우르는 팀 전체용 도구 | Office 추가 기능 | 여러 플랫폼 지원, 중앙 배포 |
| 파일을 열지 않고 여러 파일을 일괄 처리 | python-pptx 또는 Open XML SDK | 무인 실행, 스크립트와 파이프라인에 잘 맞음 |
| 창의적이거나 판단이 필요한 일(스토리, 이미지 선택, 핵심 메시지 제목) | 템플릿과 스타일 가이드의 도움을 받는 사람 | 규칙으로 담을 수 없음 |
첫 번째 행을 건너뛰지 마세요. 홈 › 편집 › 바꾸기 › 글꼴 바꾸기는 파일 전체의 엉뚱한 글꼴을 몇 초 만에 고쳐 주고, 홈 › 슬라이드 › 다시 설정은 틀어진 개체 틀을 바로잡아 줘요. 기본 도구를 알면 필요 없는 코드를 쓰지 않게 돼요.
파워포인트 자동화에서 흔한 실수
- 템플릿이 맡아야 할 일을 자동화하기. 매크로가 모든 파일의 제목 서식을 다시 바꾸고 있다면, 차라리 마스터를 고치세요.
- 하나뿐인 원본에서 코드 실행하기. 도구가 검증될 때까지는 사본에서 작업하세요.
- 매크로가 든 파일을 .pptx로 저장하기. 코드가 지워져요. .pptm을 쓰세요(또는 도구를 별도의 도구 상자 파일에 보관하세요).
- 사람들에게 매크로 보안을 낮추라고 하기. 대신 신뢰할 수 있는 위치, 서명, IT 승인 배포를 쓰세요.
- 담당자 없음. 모든 스크립트에는 이름이 명시된 관리자, 짧은 설명서(하는 일, 입력, 출력), 마지막으로 테스트한 날짜가 필요해요.
- 판단이 필요한 부분까지 자동화에 맡기기. 스크립트는 빠진 대체 텍스트를 표시하고, 사람이 그것을 써요.
- 사용자 세 명을 위해 추가 기능 만들기. 공유 매크로나 스크립트로 충분한 경우가 많아요. 추가 기능은 사용 범위, 인터페이스, 배포가 중요할 때 의미가 있어요.
연습
연습
슬라이드 제목 보고서 자동화하기
따라 하기 연습:
- 슬라이드가 10장 이상인 실제 파일의 사본을 만드세요. 슬라이드 한 장의 제목 텍스트를 지우고, 대체 텍스트 없는 그림을 하나 추가하세요.
- 개발 도구 탭을 표시하고 Visual Basic 편집기(Alt+F11)를 여세요.
- 모듈을 삽입하고 이 페이지의
ListSlideTitles와AuditAltText를 붙여 넣으세요. - 둘 다 실행하세요. 빈 제목이
[MISSING TITLE]로 표시되고, 그림이 대체 텍스트 보고서에 나타나는지 확인하세요. - 파워포인트에서 두 문제를 고치고 매크로를 다시 실행해 깨끗한 보고서가 나오는지 확인하세요.
- 매크로를
DeckTools.pptm이라는 파일에 저장하고 저장한 위치를 적어 두세요.
혼자 해 보기 과제:
- 내 팀(또는 튜터링 웹사이트 콘텐츠 팀)이 슬라이드에서 반복하는 작업 다섯 가지를 적으세요.
- 이 페이지의 네 가지 질문으로 각 작업의 점수를 매기세요.
- 1위 작업에 대해 한 쪽짜리 자동화 제안서를 쓰세요: 입력, 출력, 고른 도구(VBA, 추가 기능, python-pptx)와 그 이유, 위험, 담당자, 테스트 방법.
- 돌아보기: 자동화하지 않기로 한 작업은 무엇이고, 대신 어떻게 할 건가요?
이해도 확인4문제 중 0문제 정답
답을 고르면 맞았는지와 그 이유를 바로 보여 줘요.
팀이 주로 웹용 PowerPoint와 Mac에서 슬라이드를 편집해요. 승인된 수업 레이아웃을 넣어 주는 단추를 원해요. 어떤 방법이 가장 알맞을까요?
추가 기능은 Windows, Mac, 웹에서 모두 실행되고 중앙에서 배포할 수 있어요. VBA는 웹용 PowerPoint에서 실행되지 않아요.
자동화 후보로 가장 약한 작업은 무엇일까요?
어울리는 사진을 고르는 일은 분명한 규칙이 없는 창의적 판단이에요. 나머지는 반복적이고 규칙으로 정할 수 있어요.
동료가 내 점검 매크로가 든 파일을 Lesson7.pptx로 저장했더니 매크로가 사라졌어요. 무슨 일이 일어난 걸까요?
.pptm 같은 매크로 사용 형식만 VBA를 유지해요. .pptx로 저장하면 코드가 지워져요.
보관된 슬라이드 파일 300개를 아무도 파워포인트를 열지 않고 밤사이 점검해서 빠진 제목을 찾아야 해요. 가장 좋은 방법은 무엇일까요?
파일 수준 도구는 많은 파일을 사람 없이 일괄 처리하도록 만들어졌어요. 매크로와 추가 기능은 열려 있는 파워포인트 안에서 실행돼요.
이렇게 할 수 있으면 다음으로 넘어가도 돼요
하나씩 확인하며 체크해 보세요. 체크 표시는 이 브라우저에만 저장돼요.
관련 자료
참고 자료
도움이 되었나요? 틀린 부분을 발견하셨나요? 피드백 보내기 · admin@arumsoft.com