【Word】ページごとにPDF化するには【VBA】

Yahoo!知恵袋の質問に答えた中から、ページごとにPDF化する方法について紹介します。

質問

Yahoo!知恵袋にあった質問は、下記のようなものでした。

20ページのワードを、ページ毎に1ファイルとしてPDFで保存したいのです。
また、各ページの1行目をファイル名としたいのですが、そのようなマクロはできますでしょうか。

補足
20ページで1ファイルのワードが50以上、計1000ページ以上になります。

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12274061647

回答

私の回答はこんな感じです。

Option Explicit

Public Sub EachPage2PDF()

    Dim pg As Page
    Dim doc As Document
    Dim lNum As Long
    Dim stName As String
    
    Set doc = ActiveDocument
    For Each pg In doc.ActiveWindow.ActivePane.Pages
        '最初の1行目の文字列
        stName = pg.Rectangles(1).Lines(1).Range.Text
        
        'ページ番号を取得
        lNum = pg.Rectangles(1).Lines(1).Range.Information(wdActiveEndAdjustedPageNumber)
        
        '文末の改行コードはトル
        If Right(stName, 1) = vbCr Or Right(stName, 1) = vbLf Or Right(stName, 1) = vbCrLf Then stName = Left(stName, Len(stName) - 1)
                        
        'PDF保存用パス
        stName = doc.Path & "\" & stName & ".pdf"
        
        'ページを指定してPDF化
        doc.ExportAsFixedFormat OutputFileName:=stName, _
                Range:=wdExportFromTo, From:=lNum, To:=lNum, _
                ExportFormat:=wdExportFormatPDF
                        
    Next pg
    
    Set doc = Nothing

End Sub

解説

Word文書をPDFにするには、ExportAsFixedFormatというメソッドを使うことが多いです。このメソッドはExcelVBAでも使いますが、WordとExcelでは微妙に名前付引数の名称が異なるので注意です。

Document.ExportAsFixedFormat メソッド (Word)

ExportAsFixedFormatにはページを指定して出力するオプションも用意されていますので、今回はそれを使いました。

問題は、各ページの1行目を取得する方法です。

今回、PageオブジェクトのRectangleオブジェクトの中のLineオブジェクトを参照する形にしましたが、例えばページをまたぐようなRectangleが存在する場合、うまくいかないでしょう。

またファイル名となる1行目の文字列も、仕様が分からないのでそのままとってくる(Range.Text)形としましたが、例えばファイル名として不適切な文字列(/*などの記号)が含まれている場合もうまくいかないでしょう。

ページ番号はInformationを使って、wdActiveEndAdjustedPageNumberを指定してとってくるようにしてあります。

蛇足ですが、今回のようにPagesからアプローチする方法とは別に、BookMarks(“\Page”)からアプローチする方法もあります。

Pagesの場合はActiveWindowから参照していきます。BookMarks(“\Page”)の場合はActiveDocumentから参照していきます。

後記

WordのVBAは癖が強いですね。オブジェクトの参照も直感的に分かるようなものではないので(特にBookmark(“\Page”)は知らなければ分かりようがない)慣れが必要です。

1000ページ以上ということですので、これで少しでも作業が楽になるとよいのですが。

20230124追記 質問者様は無事コードを自分のものとされ、作業が楽になったようです。よかった!