読者です 読者をやめる 読者になる 読者になる

写しPDF作成マクロ~(4)

クラスを組み合わせる

使用したクラス

それぞれのクラスの詳細については、リンク先をどうぞ。

標準モジュールのコード

Option Explicit

Public Type myFolder
  fdPath As String
  fdName As String
  fdIsExist As Boolean
  fdIsCreated As Boolean
End Type

Public Const SAVE_FOLDER As String = "写しPDF"

Public fng As FileNameGetter
Public scm As StampedCopyMaker
Public fc As FolderCreator
Public dpc As DocPdfConverter
Public ec As ErrorCatcher

Public Sub voidMain()
  Set scm = New StampedCopyMaker
  With scm
    'Wordドキュメントをセットする
    .setDocument (Range("DocumentPath").Value)    '……(1)
    If .isFailed = True Then    '……(2)
      Call showFailure(.objWord, .objDoc, .causeOfFail)    '……(3)
      Exit Sub
    End If
    '写しハンコを捺す
    .createCopyWithStamp (Range("ImageFilePath").Value)    '……(4)
    If .isFailed = True Then    '……(5)
      Call showFailure(.objWord, .objDoc, .causeOfFail)
      Exit Sub
    End If
    'PDF保存用のフォルダの有無をチェックし、なければ作る
    Set fc = New FolderCreator
    fc.createFolder scm.objDoc.path, SAVE_FOLDER    '……(5)
    If fc.objFolder.fdIsCreated = True Then    '……(6)
      .objWord.Visible = False
      MsgBox "このフォルダ内に「" & SAVE_FOLDER & "」フォルダを作成しました。", _
             vbInformation
    End If
    If fc.hasError = True Then    '……(7)
      Set ec = New ErrorCatcher
      ec.showError "FolderCreatorクラスのcreateFolderメソッド", True    '……(8)
      Set ec = Nothing
    End If
    Set fc = Nothing
    'WordドキュメントをPDF化して保存する
    Set dpc = New DocPdfConverter
    dpc.convertDocToPDF .objDoc, SAVE_FOLDER, "【写】"    '……(9)
    Set dpc = Nothing
    '元のWordドキュメントを閉じてWordを終了
    .objWord.Visible = False
    .objDoc.Close False
    If .objWord.Documents.Count = 0 Then
      .objWord.Application.Quit
    End If
    MsgBox "写しPDFを作成し、「写しPDF」フォルダに保存しました。"
  End With
  Set scm = Nothing
End Sub

Public Sub showFailure(ByRef wd As Word.Application, _
                       ByRef doc As Word.Document, _
                       ByVal message As String)
  wd.Visible = False
  If message <> "" Then
    MsgBox message, vbCritical
  End If
    MsgBox "     _________" & vbCrLf & _
           "  /                 \ " & vbCrLf & _
           "/ /・\  /・\        \" & vbCrLf & _
           "|   ̄ ̄    ̄             | ち~んw" & vbCrLf & _
           "|    (_人_)             |" & vbCrLf & _
           "|     \     |             |" & vbCrLf & _
           "\      \_|            /"
  If Not doc Is Nothing Then
    doc.Close False
  End If
  If Not wd Is Nothing Then
    If wd.Documents.Count = 0 Then
      wd.Quit
    End If
  End If
End Sub

コードの説明

  • (1)。まずはStampedCopyMakerクラスのsetDocumentメソッドで元になるWordドキュメントをセット。
  • (2)。(1)が失敗していたら、StampedCopyMakerクラスのisFailedプロパティがTrueになるので、その場合は(3)でshowFailureメソッドを実行。
  • (4)。createCopyWithStampメソッドで、まずはWordドキュメントにハンコ画像を追加。
  • (5)で、FolderCreatorクラスのcreateFolderを用いて保存用フォルダの有無を調べ、なかったら新たに作る。
  • (6)。新たにフォルダを作った場合は、FolderCreatorクラスのobjFolder.fdIsCreatedプロパティがTrueになるので、新たにフォルダを作成した旨、メッセージを表示する。
  • フォルダ作成の過程でエラーが発生していたらhasErrorプロパティがTrueになっているので、(8)でErrorCatcherクラスのshowErrorメソッドを用いてエラー発生についてユーザに知らせる。
  • (9)では、DocPdfConverterクラスのconvertDocToPDFメソッドを用いてWordドキュメントをPDF化して保存。
  • 以下、Wordドキュメントを保存せずに閉じて、Word.Applicationを終了している。

ざっとこんな感じ。

おわりに

他にも、リボンの表示/非表示を切り替えるコードとか、FileNameGetteクラスを使って、Wordドキュメントのフルパスとか、ハンコ用画像ファイルのフルパスを取得するコードなんかもあるけど、割愛。

あまり便利とかそういうのはないけど、こんなこともできますよ、ということで……。

@akashi_keirin on Twitter