PPT如何使用VBA批量替换字体

前言

最近有个需求, 需要将PPT内的字体全部修改为华文中宋, 并修改字号, 字符间距.
原以为可以和notepad++录制宏, 但是office居然把录制宏这个功能干掉了, 要实现这个需求, 只能自己写VBA.
本文从零开始学习VBA使用.

什么是VBA

Visual Basic for Applications(VBA)是Visual Basic的一种宏语言,主要能用来扩展Windows的应用程序功能,特别是Microsoft Office软件。也可说是一种应用程序视觉化的Basic Script。 1994年发行的Excel 5.0版本中,即具备了VBA的宏功能。

以上来自维基百科, 在我看来就是可以应用在office全家桶的一个编程语言. 既然是编程语言, 那就肯定有数据结构, 变量, 流程控制语句等.

PPT内的VBA对象

ActivePresentation: 返回一个Presentation对象, 该对象表示当前打开的PPT.
ActivePresentation.Slides: 返回PPT内的幻灯片集合.
ActivePresentation.Slides.Shapes: 返回幻灯片内的所有元素集合, 包括图片、文字等.
ActivePresentation.Slides.Shapes.TextFrame: 修改元素内的文本属性
ActivePresentation.Slides.Shapes.TextFrame2: 修改元素内的文本属性

TextFrameTextFrame2都是可以修改文本属性. 不需要纠结它们有什么不同.

VBA语法

Dim a As object: 声明object类型的对象变量a
For Each a In Array ... Next: 循环遍历Array数组, 每个元素都赋值给变量a.
If...Then...Else: 流程判断语句.
Not a: 对表达式的值取反, 相当于!a.
With object ... End With: 为object对象设置属性.
'我被单引号注释了: 单引号表示注释

完整例子

整个逻辑很简单, 就是循环遍历, 判断有文字就修改文字的属性.
如果有不想修改的属性, 打上单引号注释掉, 或者直接删掉那一行代码就可以了.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Sub ChangeFont()
Dim oShape As Shape
Dim oSlide As Slide
Dim oTxtRange As TextRange
On Error Resume Next

For Each oSlide In ActivePresentation.Slides
For Each oShape In oSlide.Shapes
Set oTxtRange1 = oShape.TextFrame.TextRange
If Not IsNull(oTxtRange1) Then
With oTxtRange1.Font
.NameFarEast = "华文中宋" '中文字体名称
.Name = "华文中宋" '字体名称
.NameOther = "华文中宋" '其他字体名称
.Size = 20 '字体大小
.Color.RGB = RGB(Red:=0, Green:=0, Blue:=0) '字体颜色
.Bold = False '是否加粗
.Italic = False '是否倾斜
.Shadow = False '是否阴影
End With
End If

Set oTxtRange2 = oShape.TextFrame2.TextRange
If Not IsNull(oTxtRange2) Then
With oTxtRange2.Font
.Spacing = 0 '字体字符间距为普通
End With
End If
Next
Next
End Sub

总结

VBA的主要难点是对office体系内的对象不了解, 就拿TextFrameTextFrame2来说, 同样设置字体格式, 居然分为两个对象来设置.

目前的需求很简单, 已经能满足了, 如果后续有其他奇奇怪怪的需求, 再补充下这个代码.