Office関連

Office文書をパスワード付きPDFに変換するVBAマクロ

4年ほど前に書いた、下記記事のマクロがWordでも使えるか?との質問を頂きました。

残念ながら、上記記事のコードをWordでそのまま使うことはできません。
そこで今回は、Excelに限定せず、WordやPowerPointファイルにも対応したマクロを書いてみました。

※下記コードはAcrobat PDFMakerを利用してPDFファイルへの変換を行います。Acrobatをインストールした上で、各Officeアプリケーション上でPDFMakerアドインを有効にする必要があります。

Option Explicit

Public Sub Sample()
'Wordファイルを読み取り・権限パスワード付のPDFに変換
  ConvertPdfUsingPDFMaker "C:\Test\Conv\Test.docx", "C:\Test\Conv\Test.pdf", "passr", "passw"
End Sub

Public Sub Sample2()
'Word,PowerPoint,Excelファイルを読み取り・権限パスワード付のPDFに一括変換
  Dim in_files, out_files
  Dim i As Long
  Const ReadPassWord As String = "1234"
  Const WritePassWord As String = "7777"
  
  in_files = Array("C:\Test\Conv\TestDOC.docx", _
                   "C:\Test\Conv\TestPPT.pptx", _
                   "C:\Test\Conv\TestXLS.xlsx")
  out_files = Array("C:\Test\Conv\TestDOC.pdf", _
                    "C:\Test\Conv\TestPPT.pdf", _
                    "C:\Test\Conv\TestXLS.pdf")
  For i = LBound(in_files) To UBound(in_files)
    ConvertPdfUsingPDFMaker in_files(i), out_files(i), ReadPassWord, WritePassWord
  Next
End Sub

Private Sub ConvertPdfUsingPDFMaker(ByVal InputFilePath As String, _
                                    ByVal OutputFilePath As String, _
                                    Optional ByVal ReadPassWord As String = "", _
                                    Optional ByVal WritePassWord As String = "")
  Dim pm As Object 'PDFMAKERAPILib.PDFMakerApp
  Dim cset As Object 'PDFMAKERAPILib.ConversionSettings
  Dim sset As Object 'PDFMAKERAPILib.securitySettings
  Dim appType As Long
  Dim settingsName As String
  Dim prms As Long
  Dim ret As Long
  
  'PDFMAKERAPILib.SupportedApps
  Const kAppUnknown = 0
  'PDFMAKERAPILib.PDFMakerRetVals
  Const kPDFMSuccess = 0
  Const kPDFMErrorPDFMakerUnavailable = -10
  Const kPDFMErrorFileOpenInAnotherApp = -24
  'PDFMAKERAPILib.tagPrintingModesAllowedEnum
  Const kPrintingAllowedNone = 0
  Const kPrintingAllowedLowRes = 1
  Const kPrintingAllowedHighRes = 2
  'PDFMAKERAPILib.tagAllowedChangesEnum
  Const kAllowChangesNone = 0
  Const kAllowChangesInsertDeleteRotatePages = 1
  Const kAllowChangesFormfillsSign = 2
  Const kAllowChangesCommentingFormfillsSign = 6
  Const kAllowChangesLayoutTouchupFormfillSign = 10
  Const kAllowChangesAnyExceptPageExtraction = 14
  Const kAllowChangesAll = 15
  
  On Error Resume Next
  Set pm = CreateObject("PDFMakerAPI.PDFMakerApp")
  On Error GoTo 0
  If pm Is Nothing Then
    MsgBox "PDFMakerを取得できませんでした。" & vbNewLine & _
           "処理を中止します。", vbCritical + vbSystemModal
    Exit Sub
  End If
  
  'ファイル判定
  appType = pm.GetSupportedAppType(InputFilePath)
  Select Case appType
    Case kAppUnknown
      MsgBox "サポートされていないファイルです。" & vbNewLine & _
             "処理を中止します。", vbCritical + vbSystemModal
      Exit Sub
  End Select
  
  '変換設定 ※アプリケーションの設定に依存
  '細かく設定する場合は下行のようにPDFMakerSettingsで指定
  'prms = kCreateDocInfo Or kCreateComments Or kCreateLinks
  Set cset = CreateObject("PDFMakerAPI.ConversionSettings")
  cset.GetAppConversionDefaults appType, prms, settingsName
  cset.SetConversionParameters prms
  
  'セキュリティ設定
  Set sset = cset.GetSecuritySettings
  With sset
    '文書を開くときのパスワード設定
    If Len(Trim(ReadPassWord)) > 0 Then
      .OpenDocPasswdNeeded = True
      .OpenDocPasswd = ReadPassWord
    End If
    
    '権限設定
    If Len(Trim(WritePassWord)) > 0 Then
      .PermsPasswdNeeded = True
      .PermsPasswd = WritePassWord
      
      '------------------------------------------------------------
      ' * 下記は必要に応じて設定
      '------------------------------------------------------------
      ' * 印刷を許可
      '------------------------------------------------------------
      '.PrintingModeAllowed = kPrintingAllowedHighRes '高解像度
      '.PrintingModeAllowed = kPrintingAllowedLowRes '低解像度 (150 dpi)
      .PrintingModeAllowed = kPrintingAllowedNone '許可しない
      '------------------------------------------------------------
      ' * 変更を許可
      '------------------------------------------------------------
      '.AllowedChanges = kAllowChangesAnyExceptPageExtraction 'ページの抽出を除くすべての操作
      '.AllowedChanges = kAllowChangesCommentingFormfillsSign '注釈の作成、フォームフィールドの入力と既存の署名フィールドに署名
      '.AllowedChanges = kAllowChangesFormfillsSign 'フォームフィールドの入力と既存の署名フィールドに署名
      '.AllowedChanges = kAllowChangesInsertDeleteRotatePages 'ページの挿入、削除、回転
      .AllowedChanges = kAllowChangesNone '許可しない
      '------------------------------------------------------------
      ' * テキスト、画像、およびその他の内容のコピーを有効にする
      '------------------------------------------------------------
      .EnableCopyingContent = False 'True:チェックON / False:チェックOFF
    End If
  End With
  cset.SetSecuritySettings sset
  
  'PDF作成
  ret = pm.CreatePDF(srcFilePath:=InputFilePath, _
                     pdfFilePath:=OutputFilePath, _
                     pSettings:=cset, _
                     bConvertSilent:=True, _
                     bShowProgress:=True, _
                     bConvertAsync:=False)
  Select Case ret
    Case kPDFMErrorFileOpenInAnotherApp
      MsgBox "対象ファイルが別のアプリケーションによって開かれています。" & vbNewLine & _
             "ファイルを閉じてから、再度実行してください。", vbCritical + vbSystemModal
    Case kPDFMErrorPDFMakerUnavailable
      MsgBox "PDFMakerアドインが有効になっていません。" & vbNewLine & _
             "アドインを有効にしてから、再度実行してください。", vbCritical + vbSystemModal
    Case kPDFMSuccess
      Debug.Print "正常終了:" & InputFilePath '確認用
    Case Else
      MsgBox "処理が失敗しました。" & vbNewLine & _
             "code:" & Hex(ret), vbCritical + vbSystemModal
  End Select
End Sub

「Sample」は1ファイルのみ変換を行い、「Sample2」は複数のファイルを一括して変換するサンプルです。

例えば、Excelのシートに元ファイルのパスや出力先、パスワードを記載しておけば、まとめてパスワード付のPDFを作成することができるので、出番は割と多いのではないかと思います。

なお、本マクロは、Excelだけでなく、WordやPowerPointでも実行することができます。

本マクロを作成するにあたり、下記サイトを参考にしました。

情報量が少ないPDFMakerを使った処理について詳細にまとめられており、大変助かりました。
この場を借りてお礼申し上げます。

関連記事

  1. Office関連

    PowerPointスライドショー終了後ファイルを閉じるVBAマクロ

    「Excel VBA PowerPoint スライドショー後閉じる」と…

  2. Office関連

    既存の機能の代わりにマクロを実行する方法をまとめてみました。

    「既存の機能の代わりにマクロを実行する」の関連になりますが、Offic…

  3. アイコン一覧

    Office 2013 アイコン一覧(O)

    ・Office 2013 アイコン一覧 NUM…

  4. Office関連

    Evernote Cloud SDKを使ったVBAマクロ

    3年ほど前にEvernote for Windowsを操作するVBAマ…

  5. Office関連

    VBAを学ぶときの参考資料

    知人から「Excelのマクロを勉強したいんだけど、どうやって勉強したら…

コメント

  • コメント (0)

  • トラックバックは利用できません。

  1. この記事へのコメントはありません。

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

RapidSSL_SEAL-90x50
PAGE TOP