Wordドキュメントの編集中のページをサクッとPDF化する

WordドキュメントのアクティブなページのみPDF化

以前、

akashi-keirin.hatenablog.com

コチラの記事で、クリック一発で編集中のドキュメントをPDF化するマクロを紹介した。

今回は、題名のとおり、

現在アクティブなページのみPDF化

するマクロを考える。

使い道があるかどうかは不明なれどw

DocumentオブジェクトのExportAsFixedFormatメソッド

「PDF化」といえば、DocumentオブジェクトのExportAsFixedFormatメソッドの出番。

このメソッド、

f:id:akashi_keirin:20170930184535j:plain

実は、ご覧のように異様にたくさんの引数を持っている。その数実に 15。まさに引数祭りw

たいていは必須の「OutPutFileName」と「ExportFormat」の2つしか指定しないので、

Document.ExportAsFixedFormat "hogehoge.pdf",wdExportFormatPDF

みたいに記述すると思う。

実は、このメソッドの引数の中には、

Range

という引数がある。

面白いのは、この引数、データ型が

WdExportRange型 という独自の型なんである。

ちょっと調べてみると、WdExportRangeというのは列挙体で、

名前 説明
wdExportAllDocument 0 文書全体
wdExportCurrentPage 1 現在のページ
wdExportFromTo 2 開始・終了ページを指定
wdExportSelection 3 現在の選択範囲

それぞれ実際の値と意味するところはこうなっている。

つまり、ExportAsFixedFormatメソッドの引数「Range」に「wdExportCurrentPage(正体は整数の"2")」を渡してやれば、現在のページのみPDF化できるということだ。

ちなみに、コーディングの際は、

f:id:akashi_keirin:20170930184607j:plain

こんなふうにインテリセンスが働くので、楽ちん。

ところで、列挙体だけど

WdExportRange.wdExportAllDocument

みたいに書かなくても良いのはなぜなんでしょうね?(←素人丸出しの疑問?)

ファイル名にページ番号を付加する

現在選択中のページのみをPDF化するのだから、できあがったPDFファイルのファイル名にページ番号を付加するぐらいの気は利かせたいところ。

となると、現在選択中のページのページ番号を取得しなければならない。

SelectionオブジェクトのInformationプロパティ

結論から言うと、SelectionオブジェクトのInformationプロパティを参照すれば良い。

このInformationプロパティには引数が何と

41種類

もあった。

そのうち、「wdActiveEndPageNumber」を渡すと、Informationプロパティは、現在カーソルのあるページのページ番号を返してくれる。

Selection.Information(wdActiveEndPageNumber)

こう書く。

ちなみに、「Selection.Information(」まで入力すると、

f:id:akashi_keirin:20170930184550j:plain

このようにインテリセンスが働くので、入力は簡単。

コーディング

以上のことを踏まえてコーディングしてみる。

リスト1 標準モジュール
Public Sub convertActivePageToPDF()
'///アクティブドキュメントをPDF化する。'
  Dim objDoc As Document
  Set objDoc = ActiveDocument
  Dim pathStr As String
  pathStr = objDoc.FullName
  Dim pageNum As Integer
  pageNum = Selection.Information(wdActiveEndPageNumber)    '……(1)'
  'フルパスから拡張子の「.」の位置を取得。'
  Dim n As Integer
  n = InStrRev(pathStr, ".")
  '「.」の位置を元に、PDFファイルのフルパスを作る。'
  'ページ番号3ケタゼロ埋め文字列をファイル名に付加する。'
  pathStr = Left(pathStr, n - 1) & _
            "_P." & Format(pageNum, "00#") & ".pdf"    '……(2)'
  With objDoc
    .ExportAsFixedFormat OutputFileName:=pathStr, _
                         ExportFormat:=wdExportFormatPDF, _
                         Range:=wdExportCurrentPage    '……(3)'
  End With
  Set objDoc = Nothing
End Sub

(1)の

pageNum = Selection.Information(wdActiveEndPageNumber)

では、SelectionオブジェクトのInformationプロパティに引数として「wdActiveEndPageNumber」を渡すことによって、現在カーソルのあるページの番号を取得し、変数pageNumに格納している。

(2)の

pathStr = Left(pathStr, n - 1) & _
          "_P." & Format(pageNum, "00#") & ".pdf"

について。

この行にたどり着いた段階で、変数 pathStr には編集中のドキュメントのフルパスが格納されており、変数 n には拡張子の「.」(ピリオド)の位置(前から何番目にあるか)が格納されている。

まず

Left(pathStr, n - 1) 

で、Left関数を用いて、フルパスのうち、拡張子の「.」(ピリオド)の左側の文字列を取得する。

次に

& "_P."

で文字列「_P.」を連結し、

さらに

Format(pageNum, "00#")

でFormat関数を用いてページ番号を3ケタ0埋めにした文字列を連結し、最後に「.pdf」を連結して、出力PDFファイルのファイルフルパスを作成している。1000ページを超すようなドキュメントを扱うことはまあないので3ケタにしているが、4ケタとか5ケタとか必要だったら、Format関数の第2引数を変えたら良いと思う。

(3)の

objDoc.ExportAsFixedFormat OutputFileName:=pathStr, _
                           ExportFormat:=wdExportFormatPDF, _
                           Range:=wdExportCurrentPage

で、ExportAsFixedFormatメソッドを実行する。引数「Range」に「wdExportCurrentPage」を指定しているので、現在カーソルのあるページだけがPDF化されることになる。

実行

実験用として、

f:id:akashi_keirin:20170930184713j:plain

f:id:akashi_keirin:20170930184619j:plain

f:id:akashi_keirin:20170930184739j:plain

こんなドキュメントを用意して、3ページ目にカーソルを置いて実行。

f:id:akashi_keirin:20170930184756j:plain

実に分かりにくいけど、3ページ目だけがPDF化された。

おわりに

現在のページのみPDF化する、という場面がそんなにあるかどうかは不明だけれど、そういう作業が頻繁に発生するようなら、アドインとして登録しておいたら便利だと思う。

アドイン登録の方法については、

akashi-keirin.hatenablog.com

コチラをどうぞ。

Word初心者なので、なかなかオブジェクト構造が飲み込みづらいけれど、分かってくると結構いじり甲斐がありそうな気もするなあ。

@akashi_keirin on Twitter