【问题标题】:How to export two PowerPoint slides to PDF file?如何将两张 PowerPoint 幻灯片导出为 PDF 文件?
【发布时间】:2021-03-26 22:07:08
【问题描述】:

在这个网站上,我找到了将最后一张幻灯片打印为 PDF 的代码。

Sub PDFtesti()
    
timestamp = Now()
Dim PR As PrintRange
Dim lngLast As Long
Dim lngFirst As Long
Dim savePath As String
Dim PrintPDF As Integer
Dim name As String

name = ActivePresentation.Slides(2).Shapes("TextBox1").OLEFormat.object.Text

savePath = "C:\Powerpoint\" & Format(timestamp, "yyyymmdd-hhnn") & " - " & name & ".pdf"

lngLast = ActivePresentation.Slides.Count

With ActivePresentation.PrintOptions
    .Ranges.ClearAll
Set PR = .Ranges.Add(lngLong, lngLong)
End With

ActivePresentation.ExportAsFixedFormat _
Path:=savePath, _
FixedFormatType:=ppFixedFormatTypePDF, _
PrintRange:=PR, _
Intent:=ppFixedFormatIntentScreen, _
FrameSlides:=msoTrue, _
RangeType:=ppPrintSlideRange 

End Sub

我想打印两张幻灯片:第二张幻灯片和最后一页。

我试过了

Set PR = .Ranges.Add(lngLong, lngLong)
Set PR = .Ranges.Add(2, 2)

Set PR = .Ranges.Add(Array("lngLong, lngLong" & "2,2")

【问题讨论】:

    标签: vba pdf printing powerpoint export-to-pdf


    【解决方案1】:

    更新的解决方案。为了使打印特定幻灯片更加舒适,我决定将它们放入一个变量中(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
    

    【讨论】:

    • 谢谢,它就像一个魅力!以防万一我出于某种原因需要添加 3...x 幻灯片,是否仅通过添加 PR.Add lngLast - 1, lngLast - 2, lngLast.Slides(3).MoveTo lngLast - 2 之类的代码然后最终以相同的方式返回?还是 PR(1) 仅适用于最后 2 张幻灯片?
    • 不能说我理解每一行 100%,但按照你的逻辑,我只是​​想知道是否会这样。
    • @dibledurf - 我已经更新了解决方案。现在您可以指定要打印的所有幻灯片。
    猜你喜欢
    • 1970-01-01
    • 2016-11-20
    • 2017-07-18
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多