帯

VBA PowerPoint文書Nin1

PowerPointには「スライド一覧」の表示機能があり、ページ並びを編集したり、スライド全体の流れを把握したりする時に活用されると思います。

その「スライド一覧」イメージの文書ファイルを作成するツールを作りました。スライドイメージを縮小して、複数ページを1枚のスライドにN in 1形式で貼り付けたスライドを作成します。スライドを貼り付ける際のパラメータを、Excelシート上の表で指定できるよう、ExcelにVBAプログラムを組み込んだものとしています。

ツールファイル添付

VBAプログラムを組み込んだExcelのツールファイルを添付します。

ツールの使い方

Excelのツールファイルを開いて、「貼り付けるスライドの設定」や「貼り付け先スライドのページ設定」の表内容を設定して、「PPT文書 N in 1」ボタンを押します。

ファイルダイアログが開くので、対象のPowerPoint文書ファイルを選択して、「OK」ボタンを押します。Ctrlキーを押しながらファイル名をクリックすることで、複数ファイルを選択可能です。

スライドイメージをN in 1形式で貼り付けたPowerPoint文書が作成され、対象ファイルと同じフォルダ内に保存されます。

貼り付けるスライドの設定」表の項目説明です。
・横枚数:横方向に貼付けるスライドイメージの最大枚数
縦枚数:縦方向に貼付けるスライドイメージの最大枚数
貼付け方向:貼付ける順番を「横方向」か「縦方向」で指定

貼り付け先スライドのページ設定」表の項目説明です。
スライドサイズ:標準(4:3)、ワイド画面(16:9)、A4のいずれかで指定
スライド向き:「横向き」か「縦向き」で指定
上/下/左/右余白:スライド端と貼付け領域との余白をcm単位で指定
最小スライド間:スライド間の最小間隔を[cm単位]で指定

プログラムの解説

プログラムの主な内容を説明します。

PARAMETER_TYPEは、スライドイメージを貼り付ける際の様々なパラメータを保持するユーザー定義型です。

Private Type PARAMETER_TYPE
    HNum As Integer             '横枚数 (Horizontal Number)
    VNum As Integer             '縦枚数 (Vertical Number)
    Direction As String         '貼付け方向
    SlideSize As String         'スライドサイズ
    SlideOrientation As String  'スライド向き
    MarginTop As Single         '上余白
    MarginBottom As Single      '下余白
    MarginLeft As Single        '左余白
    MarginRight As Single       '右余白
    MinPad As Single            '最小スライド間 (Minimum Padding)
    
    MaxSlides As Integer        '1頁あたり最大スライド数
    CWidth As Single            '圧縮後のスライド幅 (Compress Width)
    CHeight As Single           '圧縮後のスライド高さ (Compress Height)
    HPad As Single              'スライド横間隔 (Horizontal Padding)
    VPad As Single              'スライド縦間隔 (Vertical Padding)
End Type
 
Private Pa As PARAMETER_TYPE

buttonPowerPointNin1_Clickは、「PPT文書 N in 1」ボタンのクリックで呼び出されるメイン処理です。PowerPointアプリケーションを起動して、対象の文書ファイルを開くとともに、貼付け先の文書を追加します。貼付け先の文書のページ設定、各種パラメータの準備を行った後、N in 1の貼付け文書を作成します。

Private Sub buttonPowerPointNin1_Click()
    Call StatusBar("準備中...")
    Call SetParameter
    
    Dim app As Object: Set app = CreateObject("PowerPoint.Application")
    
    Dim sFileName As Variant
    For Each sFileName In DialogFileName("PowerPoint", "*.ppt*")
        
        Dim src As Object: Set src = app.Presentations.Open(sFileName)
        Dim dst As Object: Set dst = app.Presentations.Add
        
        Call SetupPage(dst)
        
        Call CalcParameter(src, dst)
        
        Call CreatePPtNin1(src, dst)
        
        dst.SaveAs Filename:=dstPath(CStr(sFileName), "pptx")
        dst.Close
        src.Close
    Next sFileName
    
    app.Quit
    Call StatusBar("完了!")
End Sub

CalcParameterは、各種パラメータを算出する処理です。「1頁あたり最大スライド数」や「圧縮後のスライド幅・高さ」「スライド横・縦間隔」を求めます。

Private Sub CalcParameter(src As Object, dst As Object)
    Pa.MaxSlides = Pa.HNum * Pa.VNum
    
    Dim nWidth As Single    '貼付領域の幅
    Dim nHeight As Single   '貼付領域の高さ
    nWidth = dst.PageSetup.SlideWidth - Pa.MarginLeft - Pa.MarginRight
    nHeight = dst.PageSetup.SlideHeight - Pa.MarginTop - Pa.MarginBottom
    
    Pa.CWidth = (nWidth - Pa.MinPad * (Pa.HNum - 1)) / Pa.HNum
    Pa.CHeight = (nHeight - Pa.MinPad * (Pa.VNum - 1)) / Pa.VNum
    
    With src.PageSetup
        If (Pa.CHeight / Pa.CWidth) < (.SlideHeight / .SlideWidth) Then
            Pa.CWidth = Pa.CHeight * (.SlideWidth / .SlideHeight)
            Pa.VPad = Pa.MinPad
            
            If Pa.HNum = 1 Then
                Pa.HPad = 0
            Else
                Pa.HPad = (nWidth - Pa.CWidth * Pa.HNum) / (Pa.HNum - 1)
            End If
        Else
            Pa.CHeight = Pa.CWidth * (.SlideHeight / .SlideWidth)
            Pa.HPad = Pa.MinPad
            
            If Pa.VNum = 1 Then
                Pa.VPad = 0
            Else
                Pa.VPad = (nHeight - Pa.CHeight * Pa.VNum) / (Pa.VNum - 1)
            End If
        End If
    End With
End Sub

CreatePPtNin1は、N in 1のスライドを作成する処理です。ページ番号から貼付け位置を求めてスライドイメージを貼付けた後、貼付けたスライドイメージのサイズ、位置を調整します。

Private Sub CreatePPtNin1(src As Object, dst As Object)
    :
    Dim srcPage As Integer
    For srcPage = 1 To src.Slides.Count
        Call StatusBar(src.Name & " - p." & srcPage)
        
        Dim HPos As Integer     '左起点の横貼付位置(0,1,2...)
        Dim VPos As Integer     '上起点の縦貼付位置(0,1,2...)
        If Pa.Direction = "横方向" Then
            HPos = (srcPage - 1) Mod Pa.HNum
            VPos = Int((srcPage - 1) / Pa.HNum) Mod Pa.VNum
        Else
            HPos = Int((srcPage - 1) / Pa.VNum) Mod Pa.HNum
            VPos = (srcPage - 1) Mod Pa.VNum
        End If
        
        dstPage = Int((srcPage - 1) / Pa.MaxSlides) + 1
        
        Dim oSlideImage As Object
        Set oSlideImage = PasteSlide(src.Slides(srcPage), dst.Slides(dstPage))
        
        With oSlideImage
            .LockAspectRatio = True
            .Width = Pa.CWidth
            
            .Top = Pa.MarginTop + (VPos * (Pa.CHeight + Pa.VPad))
            .Left = Pa.MarginLeft + (HPos * (Pa.CWidth + Pa.HPad))
            
            :
        End With
    Next srcPage
End Sub

PasteSlideは、スライドイメージをクリップボードを経由して貼り付けます。クリップボードへの格納が間に合わず貼付けエラーが発生した場合は、3回までリトライします。

Private Function PasteSlide(srcSlide As Object, dstSlide As Object) As Object
    Const ppPastePNG = 6    'PNG形式貼付け
    
    Set PasteSlide = Nothing
    
    srcSlide.Copy
    
    On Error Resume Next
    Dim i As Integer
    For i = 0 To 3          '貼付けエラー時は3回までリトライ
        DoEvents
        Set PasteSlide = dstSlide.Shapes.PasteSpecial(ppPastePNG)
        If Not (PasteSlide Is Nothing) Then Exit Function
    Next i
End Function

さいごに

PowerPoint文書の概要資料などを作成したりする際に活用できるかと思います。
VBAプログラム全体を閲覧されたい方は以下にパスワードを示します。

ここから先は

62字 / 1画像

¥ 100

記事を気に入って頂き、お役に立てたら嬉しいです。