三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。
Ken3三流君の連絡先:
[google formsで連絡する]
上記の問い合わせフォームに質問・感想など気軽に書き込んでください

よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

PowerPoint ExportAsFixedFormatでPDF配布資料の作成 ppPrintOutputSixSlideHandoutsを指定してページあたり6枚のスライドでPDFを作成

概要:A列にある複数のパワーポイントファイルをPDF配布資料に一括変換する方法を紹介します
ページあたり6枚のスライドでPDFをマクロで作成してみた
VBAコードのテスト

解説動画: https://youtu.be/DwbEUtamCI8

キーワード:
#PowerPointVBA #パワーポイント #ExcelVBA #MSエクセル
#PDF変換 #一括変換 #フレーム付き #配布資料 #自動化

質問内容: 01:40

vbaでのパワーポイントの操作について質問です。
同じフォルダにある複数のパワーポイントをPDFファイルに変換したいです。
ExcelのA列に対象のパワーポイントのパスを列挙することはできます。
配布資料1ページあたり6枚のスライド、スライドはフレームで縁取りたいです。

実行結果: 02:49 の実行結果から見てください
https://www.youtube.com/watch?v=DwbEUtamCI8&t=169s

配布資料PDF 6スライドで1つのPDFを作成する

ヘルプを探すと
https://learn.microsoft.com/ja-jp/office/vba/api/powerpoint.presentation.exportasfixedformat
↑ココかな。

ExportAsFixedFormat (Path, FixedFormatType, Intent, FrameSlides, HandoutOrder, OutputType, PrintHiddenSlides, PrintRange, RangeType, SlideShowName, IncludeDocProperties, KeepIRMSettings, DocStructureTags, BitmapMissingFonts, UseISO19005_1, ExternalExporter)

↑なんだか、すごい数のパラメーターだけど・・・
例題のコードをコピーして、探っていきます

Public Sub ExportAsFixedFormat_Example() 
       ActivePresentation.ExportAsFixedFormat "C:\Users\username \Documents\test.pdf", ppFixedFormatTypePDF, ppFixedFormatIntentScreen, msoCTrue, ppPrintHandoutHorizontalFirst, ppPrintOutputBuildSlides, msoFalse, , , , False, False, False, False, False 
 
End Sub

FixedFormatType 10:08

ppFixedFormatTypePDF 2 PDF 形式にエクスポートします。

Intent

定数 説明
ppFixedFormatIntentPrint オンラインで公開され、印刷されることを目的としています。
ppFixedFormatIntentScreen 既定値です。 オンラインでのみ公開することを目的としています。

FrameSlides 10:46

定数 説明
msoFalse 既定値です。 エクスポートするスライドをフレームで縁取りません。
msoTrue エクスポートするスライドをフレームで縁取ります。

HandoutOrder 11:10

定数 説明
ppPrintHandoutHorizontalFirst 連続するスライドがまず水平方向に (水平方向の行に) 表示されるように配布資料を印刷します。
ppPrintHandoutVerticalFirst 既定値です。 連続するスライドがまず垂直方向に (垂直方向の列に) 表示されるように配布資料を印刷します。

OutputType 13:37

定数 説明
ppPrintOutputBuildSlides
ppPrintOutputFourSlideHandouts 配布資料 1 ページあたり 4 枚のスライドを印刷します。
ppPrintOutputNineSlideHandouts 配布資料 1 ページあたり 9 枚のスライドを印刷します。
ppPrintOutputNotesPages ノートを印刷します。
ppPrintOutputOneSlideHandouts 配布資料 1 ページあたり 1 枚のスライドを印刷します。
ppPrintOutputOutline アウトライン ビューを印刷します。
ppPrintOutputSixSlideHandouts 配布資料 1 ページあたり 6 枚のスライドを印刷します。
ppPrintOutputSlides プレゼンテーションのすべてのスライドを印刷します。 既定値です。
ppPrintOutputThreeSlideHandouts 配布資料 1 ページあたり 3 枚のスライドを印刷します。
ppPrintOutputTwoSlideHandouts 配布資料 1 ページあたり 2 枚のスライドを印刷します。

05:58 ここから、私が作成したサンプルコードを説明する
https://www.youtube.com/watch?v=DwbEUtamCI8&t=358s
↑簡単な解説はここから。

ソースコード:ExcelからPowerPoint16.0を参照設定して使ってみてください。

'A列のフルパスPowerPointを開いて、配布資料PDF作成の処理を行う
Private Sub CommandButton1_Click()
    'PowerPointアプリの起動
    Dim ppApp As PowerPoint.Application
    Set ppApp = CreateObject("PowerPoint.Application")
    ppApp.Visible = True '可視にする
    DoEvents

    Dim y As Long  '行カウンタ
    y = 1    'A1から始めたいので
    
    Dim strPDFFileName As String   'PDFのファイル名
    
    'A列のファイル名が存在する間ループする
    While Len(Trim(Cells(y, "A"))) > 0
        '開く、コピー元を変数に入れる
        Dim ppプレゼン As PowerPoint.Presentation  'pp:プレゼンテーション
        Set ppプレゼン = Nothing '初期化、エラーチェックもかねて
        On Error Resume Next   '↓でSet 取得エラー時に次へ ファイルが開けなかった時
        Set ppプレゼン = ppApp.Presentations.Open(Trim(Cells(y, "A"))) 'A列のファイル名を開く
        DoEvents
        On Error GoTo 0  'エラーを元に戻す※これを忘れると、デバッグ時にハマるから注意
        '↑単純に、.Open "ファイル名" で開いただけです
        If ppプレゼン Is Nothing Then '↑上で開けたか?
            'openエラーの時、B列に開けなかったことを知らせる
            Cells(y, "B") = "オープンエラー"
            DoEvents  'なぜか?固まって、動かない時がある・・
        Else
            Cells(y, "B") = ""  '開けたときは空白
            
            'PDFの出力先を作る、今回はexcelと同じ位置 ThisWorkbook.Pathに作成しました
            'Split(ppプレゼン.Name, ".")(0) ←手抜きの拡張子抜きの名前取得
            strPDFFileName = ThisWorkbook.Path & "\" & Split(ppプレゼン.Name, ".")(0) & ".pdf"
            Debug.Print "PDF出力先", strPDFFileName
            
            '開いたプレゼンをPDFの配布資料として出力する
            '単純に ExportAsFixedFormat を使っただけ
            ' https://learn.microsoft.com/ja-jp/office/vba/api/powerpoint.presentation.exportasfixedformat ←を見てください
            
            ppプレゼン.ExportAsFixedFormat strPDFFileName, _
                                            ppFixedFormatTypePDF, _
                                            ppFixedFormatIntentScreen, _
                                            msoTrue, _
                                            ppPrintHandoutVerticalFirst, _
                                            ppPrintOutputSixSlideHandouts
            
            DoEvents
            
            'PDF出力したので、開いたプレゼンは閉じる
            DoEvents
            ppプレゼン.Close
            DoEvents
            Set ppプレゼン = Nothing
        End If
        
        y = y + 1  '次の行へ※忘れて無限ループはシャレにならないよ・・・
    Wend
    
    ppApp.Quit
    Set ppApp = Nothing

    MsgBox "処理終了、PDFを確認してください"

End Sub

おまけ:ListViewでファイルを受け取る
ken3memo.hatenablog.com

'A列をクリア後、受け取ったファイル名を書き込む
'リストビューにファイルをドロップして、A列へ
' https://www.youtube.com/watch?v=Z9b5dXKVKzE
'紹介、宣伝兼ねて設置してみた、おいおい

Private Sub ListView1_OLEDragDrop(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single)
    
    Dim sFileName
    
    Columns("A:A").ClearContents  'A列のデータをクリアする
    
    Debug.Print "Data.GetFormat(1) =", Data.GetFormat(1)
    
    'テキストフォーマットで取得可能か聞く GetFormat(1) = Trueで判断
    If Data.GetFormat(1) = True Then
        '単純に書き出してみた
        Debug.Print "Data.GetData(1) =", Data.GetData(1)
        Range("a1") = "テキストデータを受け取りました。"
        Range("a2") = Data.GetData(1)
    Else
        'テキストで取得不可なら、ファイルでしょと考えるのは、安易だが、
        '(※他の、形式で、ドロップされたデータもあるので)

        'いつもの、.Countで数がわかるので、何かのチェックで使うか。
        Debug.Print "Data.Files.Count=", Data.Files.Count
        
        Dim nROW As Long  '行カウンタ
        nROW = 1   'A1から書き込むので初期値1を代入
        For Each sFileName In Data.Files  'ファイル名を取得
            Debug.Print "Data.Files = ", sFileName
            Cells(nROW, 1) = sFileName   'A列にファイル名をセットする
            nROW = nROW + 1  '次の行へ
        Next
        
    End If
    
End Sub

Private Sub Worksheet_Activate()
    Debug.Print "Worksheet_Activate", ActiveSheet.Name
    ListView1.OLEDropMode = ccOLEDropManual  'ドロップを受け入れる
End Sub


配布資料作りのヒントとなれば幸いです。

ランダムな占い

再生リスト:[占い 今日のラッキーカラー]をショート動画

Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。

  1. [VBA・マクロ プログラミング]の解説
    当店の人気はVBA系のCreateObject("XXXXXX.application")で他のアプリケーションを操作するサンプルが人気です
  2. [プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
    三流君を踏み台にする
  3. [古いクラシック ASP(Active Server Pages)]の解説。
  4. [元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



[連絡先はココのフォームから]←連絡先の入力フォームです、気軽に書いてください
本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)