专栏名称: 自律的音律
我做PPT养你!讲干货,讲故事
目录
相关文章推荐
51好读  ›  专栏  ›  自律的音律

甲方:把那份PPT的备注复制到这份里,马上给我!

自律的音律  · 公众号  ·  · 2024-04-22 10:00

正文

本文总计:9358 字

预计阅读时间: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/slides/_rels 文件夹

尤其是最后这个文件夹,PPT 有多少页,这里面就需要修改多少个文件。

那岂不是和手动复制没区别了?甚至还不如手动复制快呢。

于是,网上找的这个方案,弃用!


02. VBA(页数相同)

接着想到,常规方案搞不定,那能不能用 VBA 呢?

这方面问 ChatGPT 应该更在行一些,于是便开始了人机对话。

问:你知道如何把 PowerPoint 的备注,从一个文件中快速迁移到另一份文件中么?

ChatGPT 答:

迁移 PowerPoint 备注到另一个文件,通常有几种方法,取决于你的具体需求和使用的 PowerPoint 版本,以下是一些常用的方法:

1. 手动复制和粘贴:

  • 打开源 PowerPoint 文件;
  • 在“视图”菜单中选择“备注页”视图,这样你可以看到幻灯片和相应的备注;
  • 选择需要的备注文本,右键点击并选择“复制”;
  • 打开目标 PowerPoint 文件;
  • 在对应的幻灯片中,切换到“备注页”视图,并在备注区域右键点击选择“粘贴”。

2. 使用 VBA 脚本:

  • 如果你熟悉 VBA(Visual Basic for Applications),可以编写一个脚本,来自动化从一个演示文稿到另一个演示文稿的备注迁移过程。

  • 这种方法可以节省大量时间,特别是当处理大量幻灯片时。
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.CloseEnd Sub
  • 这段 VBA 代码会打开两个演示文稿,复制第一个演示文稿中每个幻灯片的备注,到第二个演示文稿的对应幻灯片中。

  • 选择哪种方法,取决于你的具体需求和可用的工具。

  • 如果你需要频繁进行此类操作,使用 VBA 脚本,可能是最高效的解决方案。

这里得暂停一下,有些小伙伴可能之前没用过 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.CloseEnd Sub
' 辅助函数,用来找出两个数中的最小值Function Min(ByVal Num1 As Long, ByVal Num2 As Long) As Long If Num1 < Num2 Then Min = Num1 Else Min = Num2 End IfEnd 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 iEnd 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 = NothingEnd Sub
注意事项:
  • 确保已启用宏和对应的信任设置,以允许 VBA 代码执行;

  • 替换代码中的文件路径,为你的实际文件路径;

  • 这些脚本假设文本文件的每行,和 Word 文档的每个段落,应该对应一个幻灯片的备注;

  • 如果你的幻灯片数量少于文档中的段落数量,超出部分的文本将不会被导入;

  • 这些脚本没有错误处理机制,例如打开文件失败,或者文件路径错误等情况,你可能需要根据实际情况添加适当的错误处理代码。
  • 使用 VBA 导入备注,是一个非常强大的方式,可以显著提高工作效率,特别是在处理需要大量备注信息的演示文稿时。

问:很好,可是目前只能每行或每段对应一页幻灯片备注,假设我需要给每页幻灯片导入多段内容,用 VBA 该怎么办呢?

ChatGPT 答:

  • 如果你需要将多个段落,或多行文本导入到单个幻灯片的备注中,你可以通过稍微修改前面的VBA代码来实现。

  • 这里的关键,是定义每个幻灯片应该包含多少段落或行,并相应地调整代码。

  • 假设,我们将文本文件中的每三行导入到一个幻灯片的备注中,下面是一个示例代码:
从文本文件导入多行到单个幻灯片的备注:
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 iEnd 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 = NothingEnd Sub
  • 这些脚本会根据设置的每个幻灯片的段落数,或行数来进行合并,并将合并后的文本放入相应的备注中。

  • 你可以根据实际需要,调整 slidesPerNote 或 paragraphsPerSlide 的值,来定义每个幻灯片应包含的文本量。

问:很好,现在每页幻灯片的行数都一样,但实际上,不同幻灯片页面的备注行数并不相同,这又该怎么办呢?

ChatGPT 答:

  • 当不同幻灯片的备注行数不相同时,你需要一种方法,来指定每个幻灯片应该接收多少行文本或多少段落。

  • 这通常可以通过使用一个配置文件,或在文本自身中设置某种标记来实现。

  • 下面,我将提供两种不同的解决方案:

解决方案 1: 使用配置文件

  • 在这个方法中,你可以创建一个简单的配置文件,比如一个 CSV 文件,其中指定了每个幻灯片的行数。

  • 这个文件可以类似于下面这样:
Slide 1,3Slide 2,5Slide 3,2...
  • 然后,你的 VBA 代码会读取这个配置文件,并根据每个幻灯片配置的行数来导入相应的文本行。







请到「今天看啥」查看全文