更新的解决方案。为了使打印特定幻灯片更加舒适,我决定将它们放入一个变量中(slidesToPrint)。所有未放入此变量的幻灯片在打印之前都被隐藏(因此它们不会被打印)。打印后隐藏顺序恢复为原始状态。因此,必须打印的幻灯片应列在这一行:
slidesToPrint = Array(2, lngLast)
完整代码:
Sub PDFtesti()
Dim timestamp As Date
Dim PR As PrintRanges
Dim lngLast As Long
Dim lngFirst As Long
Dim savePath As String
Dim PrintPDF As Integer
Dim name As String
Dim originalHides() As Long
Dim slidesToPrint() As Variant
Dim i As Variant
timestamp = Now()
With ActivePresentation
name = .Slides(2).Shapes("TextBox1").OLEFormat.Object.Text
savePath = "C:\Powerpoint\" & Format(timestamp, "yyyymmdd-hhnn") & " - " & name & ".pdf"
lngLast = .Slides.Count
.PrintOptions.Ranges.ClearAll
' Slides to print are put here (inside parentheses)
slidesToPrint = Array(2, lngLast)
ReDim originalHides(1 To lngLast)
For i = 1 To lngLast
originalHides(i) = .Slides(i).SlideShowTransition.Hidden
.Slides(i).SlideShowTransition.Hidden = -1
Next
For Each i In slidesToPrint()
.Slides(i).SlideShowTransition.Hidden = 0
Next
.ExportAsFixedFormat _
Path:=savePath, _
FixedFormatType:=ppFixedFormatTypePDF, _
Intent:=ppFixedFormatIntentScreen, _
FrameSlides:=msoTrue
For i = 1 To lngLast
.Slides(i).SlideShowTransition.Hidden = originalHides(i)
Next
End With
End Sub
在您的代码中,您使用PR As PrintRange。但是由于您需要两页,第二页和最后一页,您将需要两个范围,不是PrintRange 类型,而是PrintRanges。在这种情况下,你会这样做:
.Ranges.Add(2, 2)
.Ranges.Add(lngLast, lngLast)
但这行不通,因为函数ExportAsFixedFormat 只接受PrintRange,而不接受PrintRanges。一种选择是先使用PrintRanges(1) 即(2, 2) 打印两张幻灯片以分隔文件,然后使用PrintRanges(2) 即(lngLast, lngLast)。但这并不是你真正想要的。
解决方案。它使用PR(1)(PR 的类型为PrintRanges,而PR(1) 的类型为PrintRange)。 PR(1) 是与最后 两张 幻灯片对应的范围。诀窍是在打印之前将第二张幻灯片移动到位置lngLast - 1(最后一张),打印后将其返回到正确的位置。
这会将第二张幻灯片移动到最后一个位置的前一个位置:
.Slides(2).MoveTo lngLast - 1
这会将其返回到原始位置:
.Slides(lngLast - 1).MoveTo 2
完整代码:
Sub PDFtesti()
Dim timestamp As Date
Dim PR As PrintRanges
Dim lngLast As Long
Dim lngFirst As Long
Dim savePath As String
Dim PrintPDF As Integer
Dim name As String
timestamp = Now()
With ActivePresentation
name = .Slides(2).Shapes("TextBox1").OLEFormat.Object.Text
savePath = "C:\Powerpoint\" & Format(timestamp, "yyyymmdd-hhnn") & " - " & name & ".pdf"
lngLast = .Slides.Count
Set PR = .PrintOptions.Ranges
PR.ClearAll
PR.Add lngLast - 1, lngLast
.Slides(2).MoveTo lngLast - 1
.ExportAsFixedFormat _
Path:=savePath, _
FixedFormatType:=ppFixedFormatTypePDF, _
PrintRange:=PR(1), _
Intent:=ppFixedFormatIntentScreen, _
FrameSlides:=msoTrue, _
RangeType:=ppPrintSlideRange
.Slides(lngLast - 1).MoveTo 2
End With
End Sub