预计阅读时间:24 分钟
哈喽,大家好,我是露。
最近,群里有小伙伴问到这样一个问题:
有啥快速页对页换备注的方法么?甲方的 PPT 有备注(后续简称 A),设计师做好的没备注(后续简称 B),想把甲方的备注逐一复制到做好的 PPT 里。
咱第一时间想到的:手速起飞~
逐一复制虽然可行,但是费手啊,页数太多的时候可咋整,鼠标键盘都得冒火星子了。
那不得想想,有没有可偷懒的方法?
以下内容,含“码”量有点高,请大家“谨慎”食用。
哈哈哈,开玩笑的,等看到最后,相信大家都会放下心来,并对我发起“嘲笑”攻击。
对于上面提到的问题,其实我尝试了多种不同的方法。
话不多,咱们直接上解决方案。
01. 改后缀(弃)
咱去网上搜了一下解决方案,有人提到:
可以把两份 PPT(.ppt文件先另存为.pptx文件)分别改后缀为 zip,再分别解压,把 A 的 notesSlides 文件夹整个复制并替换 B 的,接着把 B 重新压缩,再改后缀为 pptx 即可。
可惜经过实际测试:要么需要修复,要么备注没弄过来。
经过反复测试后发现,PPT的备注不止受这一个文件影响,可以影响备注的文件及文件夹分别为:
-
docProps/app.xml
-
[Content_Types].xml
-
ppt/notesSlides 文件夹
-
尤其是最后这个文件夹,PPT 有多少页,这里面就需要修改多少个文件。
那岂不是和手动复制没区别了?甚至还不如手动复制快呢。
于是,网上找的这个方案,弃用!
02. VBA(页数相同)
接着想到,常规方案搞不定,那能不能用 VBA 呢?
这方面问 ChatGPT 应该更在行一些,于是便开始了人机对话。
问:你知道如何把 PowerPoint 的备注,从一个文件中快速迁移到另一份文件中么?
ChatGPT 答:
迁移 PowerPoint 备注到另一个文件,通常有几种方法,取决于你的具体需求和使用的 PowerPoint 版本,以下是一些常用的方法:
1. 手动复制和粘贴:
-
-
在“视图”菜单中选择“备注页”视图,这样你可以看到幻灯片和相应的备注;
-
-
-
在对应的幻灯片中,切换到“备注页”视图,并在备注区域右键点击选择“粘贴”。
2. 使用 VBA 脚本:
Sub CopyNotes()
Dim sourcePresentation As Presentation
Dim targetPresentation As Presentation
Set sourcePresentation = Presentations.Open("C:\Path\To\Source\Presentation.pptx")
Set targetPresentation = Presentations.Open("C:\Path\To\Target\Presentation.pptx")
Dim i As Integer
For i = 1 To sourcePresentation.Slides.Count
If i <= targetPresentation.Slides.Count Then
targetPresentation.Slides(i).NotesPage.Shapes(2).TextFrame.TextRange.Text = sourcePresentation.Slides(i).NotesPage.Shapes(2).TextFrame.TextRange.Text
End If
Next i
sourcePresentation.Close
targetPresentation.Save
targetPresentation.Close
End Sub
这里得暂停一下,有些小伙伴可能之前没用过 VBA, 所以顺带插播一下 VBA 代码的使用方法:
第一步,打开 PPT 后,按 Alt+F11 打开代码编辑器。
也可以在功能区上右键,选择自定义功能区,在弹出的窗口右侧勾选开发工具,确定后即可在功能区看到开发工具选项卡。
接着,点击开发工具选项卡中的 Visual Basic 按钮,即可打开代码编辑器。
第二步,在代码编辑器中,点击上方菜单中的插入-模块功能,在弹出的模块窗口中,将需要使用的 VBA 代码粘贴进去即可:
第三步,回到普通视图,按 Alt+F8 或点击开发工具选项卡中的宏功能,即可查看该演示文稿中的所有宏。
选中所需的宏,点击运行即可:
如果不仅要使用 VBA 代码,还希望保存多个宏,或者把代码片段保存后发给他人,亦或者方便自己下次打开继续使用,则需要将演示文稿另存为启用宏的演示文稿,即 .pptm 格式的文件。
也可以在宏界面输入英文字母,新建宏,再把上述代码复制进去,运行宏即可替换备注。
需要注意:
代码中的 "C:\Path\To\Source\Presentation.pptx" 是有备注的 PPT 文件完整路径,后面的是待添加备注的 PPT 文件的完整路径。
这两个,需要替换成 A 和 B 的文件路径。
文件路径可以在资源管理器中选中文件,右键,复制文件地址。
备注:Win10 好像没有这功能,可以在文件夹地址栏复制路径+A/B 文件名,记得保留英文双引号。
只有替换文件路径后,运行代码才不会报错。
好啦,回归主题,经过测试验证,前面提到的 VBA 脚本方法是可行的。
但是,只适合两份 PPT 文件页数相同的情况,如果页数不一致,就会出错。
那要是复制前后的文件页数不同,该怎么办呢?
03. VBA(页数不同)
咱接着问 ChatGPT:
问:VBA 的这种方法很好,如果两个文件的页数不一样,该怎么办呢?
ChatGPT 答:
-
如果两个 PowerPoint 文件的页数不相同,并且你想使用 VBA 脚本迁移备注,你需要确保脚本在执行时,不会因为页数不匹配而出错。
-
例如,如果源文件的幻灯片数量多于目标文件,而你尝试迁移不存在的幻灯片的备注,这将导致错误。
-
你可以修改 VBA 脚本以适应页数不同的情况,只迁移目标文件中存在的幻灯片的备注。
-
Sub CopyNotesAdjusted()
' 定义和打开两个演示文稿
Dim sourcePresentation As Presentation
Dim targetPresentation As Presentation
Set sourcePresentation = Presentations.Open("C:\Path\To\Source\Presentation.pptx", WithWindow:=msoFalse)
Set targetPresentation = Presentations.Open("C:\Path\To\Target\Presentation.pptx", WithWindow:=msoFalse)
' 计算应复制的幻灯片的最小数量
Dim minSlideCount As Integer
minSlideCount = Min(sourcePresentation.Slides.Count, targetPresentation.Slides.Count)
' 复制备注
Dim i As Integer
For i = 1 To minSlideCount
targetPresentation.Slides(i).NotesPage.Shapes(2).TextFrame.TextRange.Text = sourcePresentation.Slides(i).NotesPage.Shapes(2).TextFrame.TextRange.Text
Next i
' 关闭源文件,保存并关闭目标文件
sourcePresentation.Close
targetPresentation.Save
targetPresentation.Close
End Sub
' 辅助函数,用来找出两个数中的最小值
Function Min(ByVal Num1 As Long, ByVal Num2 As Long) As Long
If Num1 < Num2 Then
Min = Num1
Else
Min = Num2
End If
End Function
-
-
WithWindow:=msoFalse 参数用于在后台打开演示文稿,这样用户界面不会显示这些文件,从而加快脚本的运行速度;
-
minSlideCount 变量确保只迁移目标文件中实际存在的幻灯片数量;
-
加入了 Min 函数来计算两个演示文稿中幻灯片数量的最小值,从而避免引用不存在的幻灯片而产生错误。
-
这样,无论两个文件的页数是否相同,脚本都可以安全地运行,只对存在的幻灯片进行备注复制。
AI 确实挺好使,这个方法测试后也没问题。
那,咱的思维就忍不住继续发散了:
甲方把备注添加到 PPT 各页里之前,说不定已经有额外编辑好的 txt 或 word 文件,能不能把里边的内容分页导入到 PPT 的备注页里呢?
04. VBA(拓展)
接着问 ChatGPT:
问:有什么办法可以把 txt 或 word 文件中的内容,快速分页放到 PPT 的备注中么?
ChatGPT 答:
这里我将提供两个示例:一个用于从文本文件导入备注到 PowerPoint,另一个从 Word 文档导入。
1. 从文本文件导入备注到 PowerPoint
你可以使用以下 VBA 代码,将文本文件的每一行,添加到对应幻灯片的备注中:
Sub ImportNotesFromTextFile()
Dim filePath As String
Dim txtFile As Integer
Dim fileContent As String
Dim lines() As String
Dim i As Integer
' 设置文本文件的路径
filePath = "C:\Path\To\Your\Notes.txt"
' 打开文本文件
txtFile = FreeFile
Open filePath For Input As txtFile
' 读取文件内容
fileContent = Input$(LOF(txtFile), txtFile)
Close txtFile
' 按行分割文本
lines = Split(fileContent, vbCrLf)
' 遍历幻灯片并添加备注
For i = 1 To UBound(lines) + 1
If i <= ActivePresentation.Slides.Count Then
ActivePresentation.Slides(i).NotesPage.Shapes(2).TextFrame.TextRange.Text = lines(i - 1)
End If
Next i
End Sub
2. 从 Word 文档导入备注到 PowerPoint
同样,你可以使用 VBA
从Word文档中,导入每个段落到对应的 PowerPoint 幻灯片备注中:
Sub ImportNotesFromWordDocument()
Dim wordApp As Object
Dim wordDoc As Object
Dim p As Object
Dim slideIndex As Integer
' 打开Word文档
Set wordApp = CreateObject("Word.Application")
Set wordDoc = wordApp.Documents.Open("C:\Path\To\Your\Document.docx")
' 初始化幻灯片索引
slideIndex = 1
' 遍历Word文档中的每个段落并添加到PowerPoint备注中
For Each p In wordDoc.Paragraphs
If slideIndex <= ActivePresentation.Slides.Count Then
ActivePresentation.Slides(slideIndex).NotesPage.Shapes(2).TextFrame.TextRange.Text = p.Range.Text
slideIndex = slideIndex + 1
Else
Exit For
End If
Next p
' 清理
wordDoc.Close False
wordApp.Quit
Set wordDoc = Nothing
Set wordApp = Nothing
End Sub
-
确保已启用宏和对应的信任设置,以允许 VBA 代码执行;
-
替换代码中的文件路径,为你的实际文件路径;
-
这些脚本假设文本文件的每行,和 Word 文档的每个段落,应该对应一个幻灯片的备注;
-
如果你的幻灯片数量少于文档中的段落数量,超出部分的文本将不会被导入;
-
这些脚本没有错误处理机制,例如打开文件失败,或者文件路径错误等情况,你可能需要根据实际情况添加适当的错误处理代码。
-
使用 VBA 导入备注,是一个非常强大的方式,可以显著提高工作效率,特别是在处理需要大量备注信息的演示文稿时。
问:很好,可是目前只能每行或每段对应一页幻灯片备注,假设我需要给每页幻灯片导入多段内容,用 VBA 该怎么办呢?
ChatGPT
答:
Sub ImportMultipleNotesFromTextFile()
Dim filePath As String
Dim txtFile As Integer
Dim fileContent As String
Dim lines() As String
Dim i As Integer
Dim notesText As String
Dim slidesPerNote As Integer
' 设置文本文件的路径
filePath = "C:\Path\To\Your\Notes.txt"
' 设置每个幻灯片包含多少行
slidesPerNote = 3
' 打开文本文件
txtFile = FreeFile
Open filePath For Input As txtFile
' 读取文件内容
fileContent = Input$(LOF(txtFile), txtFile)
Close txtFile
' 按行分割文本
lines = Split(fileContent, vbCrLf)
' 遍历幻灯片并添加备注
For i = 0 To UBound(lines) Step slidesPerNote
If (i / slidesPerNote) + 1 <= ActivePresentation.Slides.Count Then
notesText = ""
' 将多行合并为一段备注
For j = i To i + slidesPerNote - 1
If j <= UBound(lines) Then
notesText = notesText & lines(j) & vbCrLf
End If
Next j
ActivePresentation.Slides((i / slidesPerNote) + 1).NotesPage.Shapes(2).TextFrame.TextRange.Text = notesText
End If
Next i
End Sub
从 Word 文档导入多个段落到单个幻灯片的备注:
Sub ImportMultipleNotesFromWordDocument()
Dim wordApp As Object
Dim wordDoc As Object
Dim p As Object
Dim slideIndex As Integer
Dim notesText As String
Dim paragraphsPerSlide As Integer
' 打开Word文档
Set wordApp = CreateObject("Word.Application")
Set wordDoc = wordApp.Documents.Open("C:\Path\To\Your\Document.docx")
' 设置每个幻灯片包含多少段落
paragraphsPerSlide = 3
' 初始化幻灯片索引
slideIndex = 1
' 遍历Word文档中的每个段落并添加到PowerPoint备注中
For Each p In wordDoc.Paragraphs
If slideIndex <= ActivePresentation.Slides.Count Then
If (slideIndex - 1) Mod paragraphsPerSlide = 0 Then
notesText = ""
End If
notesText = notesText & p.Range.Text & vbCrLf
' 检查是否到达每页段落数
If slideIndex Mod paragraphsPerSlide = 0 Or p Is wordDoc.Paragraphs.Last Then
ActivePresentation.Slides((slideIndex - 1) \ paragraphsPerSlide + 1).NotesPage.Shapes(2).TextFrame.TextRange.Text = notesText
End If
slideIndex = slideIndex + 1
Else
Exit For
End If
Next p
' 清理
wordDoc.Close False
wordApp.Quit
Set wordDoc = Nothing
Set wordApp = Nothing
End Sub
问:很好,现在每页幻灯片的行数都一样,但实际上,不同幻灯片页面的备注行数并不相同,这又该怎么办呢?
ChatGPT
答:
解决方案 1: 使用配置文件
Slide 1,3
Slide 2,5
Slide 3,2
...