如何使用 VBA 将 powerpoint 部分复制到新的演示文稿
How to copy powerpoint sections to a new presentation using VBA
我们通常使用 powerpoint 来促进我们的实验。我们在 powerpoint 中使用 "sections" 将每个实验任务的幻灯片组放在一起。移动部分以平衡实验的任务顺序需要大量工作!
我认为我们可以在 CSV 或数组中预定义平衡顺序(使用表示顺序的数字字符串)(尚未在 VBA 中构建)。然后使用 VBA 移动部分并为每个订单保存文件。我对使用 VBA 很生疏,但我认为我有一个很好的开始。问题出在第 24 行。我不知道如何将该部分复制到新的演示文稿中。有没有足够熟悉的人引导我走上正确的道路。
Sub Latin_Square()
Dim amountOfSubjects As Integer
'Declare the amount of subjects you have in your study
amountOfSubjects = 14
Dim filePath As String
filePath = "C:/1.pptx"
Dim amountofsections As Integer
Dim i As Integer
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Dim desktopPath As String
'find out where user's desktop is
desktopPath = Environ("UserProfile") & "\Desktop\"
Dim oldPresentation As Presentation
Dim newPresentation As Presentation
'open the target presentation
Set oldPresentation = Presentations.Open("C:.pptx")
For i = 1 To oldPresentation.Slides.Count
oldPresentation.Slides.Item(i).Copy
newPresentation.Item(1).Slides.Paste
Next i
oldPresentation.Close
With newPresentation
.SaveCopyAs _
FileName:=fso.BuildPath(desktopPath, "Test" & 1 & ".pptx"), _
FileFormat:=ppSaveAsOpenXMLPresentation
End With
End Sub
如果要复制幻灯片及其部分,则不能仅通过 newPresentation.Slides.Paste
粘贴幻灯片,因为这样会将最后一张幻灯片的部分移动到新粘贴的幻灯片中。
下面是一个如何复制 slide-by-slide、检查幻灯片是否是一个部分的开头以及如何添加新部分的示例:
Public Sub CopySlidesWithSections()
Dim oldPresentation As Presentation, newPresentation As Presentation
Dim oldSlide As Slide, newSlide As Slide
Dim oldSectionProperties As SectionProperties, newSectionProperties As SectionProperties
Dim i As Integer
Set oldPresentation = ActivePresentation
Set oldSectionProperties = oldPresentation.SectionProperties
Set newPresentation = Application.Presentations.Add
Set newSectionProperties = newPresentation.SectionProperties
For Each oldSlide In oldPresentation.Slides
oldSlide.Copy
' Would lead to wrong sectioning: Set newSlide = newPresentation.Slides.Paste.Item(1)
Set newSlide = newPresentation.Slides.Paste(newPresentation.Slides.Count + 1).Item(1)
For i = 1 To oldSectionProperties.Count
If oldSectionProperties.FirstSlide(i) = oldSlide.SlideIndex Then
newSectionProperties.AddBeforeSlide _
newSlide.SlideIndex, _
oldSectionProperties.Name(i)
Exit For
End If
Next i
Next oldSlide
End Sub
我们通常使用 powerpoint 来促进我们的实验。我们在 powerpoint 中使用 "sections" 将每个实验任务的幻灯片组放在一起。移动部分以平衡实验的任务顺序需要大量工作!
我认为我们可以在 CSV 或数组中预定义平衡顺序(使用表示顺序的数字字符串)(尚未在 VBA 中构建)。然后使用 VBA 移动部分并为每个订单保存文件。我对使用 VBA 很生疏,但我认为我有一个很好的开始。问题出在第 24 行。我不知道如何将该部分复制到新的演示文稿中。有没有足够熟悉的人引导我走上正确的道路。
Sub Latin_Square()
Dim amountOfSubjects As Integer
'Declare the amount of subjects you have in your study
amountOfSubjects = 14
Dim filePath As String
filePath = "C:/1.pptx"
Dim amountofsections As Integer
Dim i As Integer
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Dim desktopPath As String
'find out where user's desktop is
desktopPath = Environ("UserProfile") & "\Desktop\"
Dim oldPresentation As Presentation
Dim newPresentation As Presentation
'open the target presentation
Set oldPresentation = Presentations.Open("C:.pptx")
For i = 1 To oldPresentation.Slides.Count
oldPresentation.Slides.Item(i).Copy
newPresentation.Item(1).Slides.Paste
Next i
oldPresentation.Close
With newPresentation
.SaveCopyAs _
FileName:=fso.BuildPath(desktopPath, "Test" & 1 & ".pptx"), _
FileFormat:=ppSaveAsOpenXMLPresentation
End With
End Sub
如果要复制幻灯片及其部分,则不能仅通过 newPresentation.Slides.Paste
粘贴幻灯片,因为这样会将最后一张幻灯片的部分移动到新粘贴的幻灯片中。
下面是一个如何复制 slide-by-slide、检查幻灯片是否是一个部分的开头以及如何添加新部分的示例:
Public Sub CopySlidesWithSections()
Dim oldPresentation As Presentation, newPresentation As Presentation
Dim oldSlide As Slide, newSlide As Slide
Dim oldSectionProperties As SectionProperties, newSectionProperties As SectionProperties
Dim i As Integer
Set oldPresentation = ActivePresentation
Set oldSectionProperties = oldPresentation.SectionProperties
Set newPresentation = Application.Presentations.Add
Set newSectionProperties = newPresentation.SectionProperties
For Each oldSlide In oldPresentation.Slides
oldSlide.Copy
' Would lead to wrong sectioning: Set newSlide = newPresentation.Slides.Paste.Item(1)
Set newSlide = newPresentation.Slides.Paste(newPresentation.Slides.Count + 1).Item(1)
For i = 1 To oldSectionProperties.Count
If oldSectionProperties.FirstSlide(i) = oldSlide.SlideIndex Then
newSectionProperties.AddBeforeSlide _
newSlide.SlideIndex, _
oldSectionProperties.Name(i)
Exit For
End If
Next i
Next oldSlide
End Sub