WordドキュメントのPDF化ツール――だいぶ本格的になりました

自作ツール「かんたんPDF変換」

3種類のPDF変換をこなすツールを自作した

akashi-keirin.hatenablog.com

akashi-keirin.hatenablog.com

上記の記事で、Wordドキュメントを編集中にサクッとPDF化するマクロを作ったわけだが、

いっそちゃんとしたツールとして作ってしまおう

と思って、作ってみた。

f:id:akashi_keirin:20171001212117j:plain

実行するとこんなユーザーフォームが出てきて、

  • ドキュメント全体
  • 現在カーソルがあるページのみ
  • 指定したページ範囲

のどれかを選んで実行すると、指定の形でPDFファイルをサクッと吐き出すというもの。

作り方

まず、ユーザーフォームを挿入し、画像のように各コントロールを貼り付ける。

f:id:akashi_keirin:20171001212048j:plain

めんどくさいので、フォーム、各コントロールのサイズや位置に関するプロパティは目分量w

フォーム及び各コントロールのオブジェクト名は画像の通り。

いちおう一覧表にもしておこう。

フォーム・各コントロールのオブジェクト名
フォーム・コントロール オブジェクト名
ユーザーフォーム FrmMain
フレーム FrameMain
オプションボタン OptBtnWhole
オプションボタン OptBtnCurrent
オプションボタン OptBtnSelect
コマンドボタン BtnStart
コマンドボタン BtnCancel
テキストボックス TxtBoxFrom
スピンボタン SpinBtn1
ラベル Label1
テキストボックス TxtBoxTo
スピンボタン SpinBtn1

これだけ準備しておいて、お次はコーディング。

リスト1 フォームモジュール

だいぶ長くなるよ。

Option Explicit
Private currentPage As Integer
Private numOfPagesInDocument As Integer

Private Sub UserForm_Initialize()
  currentPage = Selection.Information(wdActiveEndPageNumber)
  numOfPagesInDocument = Selection.Information(wdNumberOfPagesInDocument)
  With Me
    .OptBtnWhole = True
    Call unablePageSelect
  End With
End Sub

Private Sub unablePageSelect()
  With Me
    .SpinBtn1.Enabled = False
    .SpinBtn2.Enabled = False
    .TxtBoxFrom.Enabled = False
    .TxtBoxTo.Enabled = False
  End With
End Sub

Private Sub BtnCancel_Click()
  Unload Me
End Sub

Private Sub BtnStart_Click()
  With Me
    If .OptBtnWhole.Value _
      Then Call convertDocumentToPDF
    If .OptBtnCurrent.Value _
      Then Call convertActivePageToPDF(currentPage)
    If .OptBtnSelect.Value _
      Then Call convertSelectedPagesToPDF(.TxtBoxFrom.Value, _
                                          .TxtBoxTo.Value)
  End With
  Unload Me
End Sub

Private Sub OptBtnWhole_Change()
  If OptBtnWhole.Value Then Call unablePageSelect
  If OptBtnCurrent.Value Then Call unablePageSelect
End Sub

Private Sub OptBtnCurrent_Change()
  If OptBtnWhole.Value Then Call unablePageSelect
  If OptBtnCurrent.Value Then Call unablePageSelect
End Sub

Private Sub OptBtnSelect_Change()
  If OptBtnWhole.Value Then Call unablePageSelect
  If OptBtnCurrent.Value Then Call unablePageSelect
  If OptBtnSelect.Value Then Call enablePageSelect
End Sub

Private Sub enablePageSelect()
  With Me
    .SpinBtn1.Enabled = True
    .SpinBtn2.Enabled = True
    .TxtBoxFrom.Enabled = True
    .TxtBoxFrom.Value = currentPage
    .TxtBoxTo.Enabled = True
    .TxtBoxTo.Value = numOfPagesInDocument
  End With
End Sub

Private Sub SpinBtn1_SpinDown()
  With Me.TxtBoxFrom
    If CInt(.Value) > 1 Then
      .Value = .Value - 1
    End If
  End With
End Sub

Private Sub SpinBtn1_SpinUp()
  With Me.TxtBoxFrom
    If CInt(.Value) < CInt(Me.TxtBoxTo.Value) Then
      .Value = .Value + 1
    End If
  End With
End Sub

Private Sub SpinBtn2_SpinDown()
  With Me.TxtBoxTo
    If CInt(.Value) > CInt(Me.TxtBoxFrom.Value) Then
      .Value = .Value - 1
    End If
  End With
End Sub

Private Sub SpinBtn2_SpinUp()
  With Me.TxtBoxTo
    If CInt(.Value) < CInt(Selection.Information(wdNumberOfPagesInDocument)) Then
      .Value = .Value + 1
    End If
  End With
End Sub

Private Sub convertDocumentToPDF()
  '///アクティブドキュメントをPDF化する。'
  Dim objDoc As Document
  Set objDoc = ActiveDocument
  Dim pathStr As String
  pathStr = objDoc.FullName
  'フルパスから拡張子の「.」の位置を取得。'
  Dim n As Integer
  n = InStrRev(pathStr, ".")
  '「.」の位置を元に、PDFファイルのフルパスを作る。'
  pathStr = Left(pathStr, n) & "pdf"
  With objDoc
    .ExportAsFixedFormat OutputFileName:=pathStr, _
                         ExportFormat:=wdExportFormatPDF
  End With
  Set objDoc = Nothing
End Sub

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

Private Sub convertSelectedPagesToPDF(ByVal pageFrom As Integer, _
                                      ByVal pageTo As Integer)
  '///指定されたページ範囲をPDF化する。'
  Dim objDoc As Document
  Set objDoc = ActiveDocument
  Dim pathStr As String
  pathStr = objDoc.FullName
  'フルパスから拡張子の「.」の位置を取得。'
  Dim n As Integer
  n = InStrRev(pathStr, ".")
  '「.」の位置を元に、PDFファイルのフルパスを作る。'
  'ページ番号3ケタゼロ埋め文字列をファイル名に付加する。'
  pathStr = Left(pathStr, n - 1) & _
            "_P." & Format(pageFrom, "00#") & _
            "-P." & Format(pageTo, "00#") & ".pdf"
  With objDoc
    .ExportAsFixedFormat OutputFileName:=pathStr, _
                         ExportFormat:=wdExportFormatPDF, _
                         Range:=wdExportFromTo, _
                         From:=pageFrom, _
                         To:=pageTo
  End With
  Set objDoc = Nothing
End Sub

実行

エントリーポイントとして、標準モジュールに次のコードを書く。

スト2 標準モジュール
Public Sub run()
  FrmMain.Show
End Sub

このマクロを書いたファイルを「.dotm」形式で

ユーザー\AppData\Roaming\Microsoft\Word\STARTUP フォルダ

に保存、クイック アクセス ツール バー に登録して実行するようにする。

一連の方法は

akashi-keirin.hatenablog.com

コチラをどうぞ。

f:id:akashi_keirin:20171001212213j:plain

こんなドキュメントがあったとして、

f:id:akashi_keirin:20171001212226j:plain

こんなふうに条件を指定して[PDF化]ボタンをクリックすると、

f:id:akashi_keirin:20171001212242j:plain

f:id:akashi_keirin:20171001212253j:plain

一瞬でPDF化できた。

おわりに

なかなか便利なツールに仕上がったんではないでしょうか。

え? 「飛び飛びのページを指定してPDF化したいときはどうするんだよ!?」ですか?

そんなもん、不要なページを削除してからPDF化して、ドキュメントを保存せずに閉じたらいいじゃねーかよ!!!!!!!!

はっ、取り乱しました。

まあ、とりあえず動くこと優先で書き飛ばしたコードなのでムダが多いコードだとは自分でも思いますよ。まあ、ヒマなときにリファクタリングするので、そのときはまたネタにしようかな。

ヒマな人はリファクタリングの練習用にどうぞ。

@akashi_keirin on Twitter