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を使った処理について詳細にまとめられており、大変助かりました。
この場を借りてお礼申し上げます。

Office製品のフィードバックって本当に反映されるの?前のページ

[Google Apps Script]Google フォームとkintoneを連携させる方法次のページ

関連記事

  1. Office関連

    Office 2016のコントロールIDリストが公開されました。

    昨年の秋にリリースされたOffice 2016。そのコントロールI…

  2. Office関連

    VBAで○○を禁止したい!・・・と思う前に。

    Office系Q&Aサイトを見ているとたまに出てくるのがこの質問。…

  3. Office関連

    「DQNネーム辞書」を更新しました。

    前のブログで公開していたIME 2010用の「DQNネーム辞書」を更新…

  4. Office関連

    Outlookの連絡先をvcf形式で一括保存する方法

    Outlookの連絡先をvcf形式で保存する場合、通常は「連絡先を v…

  5. アイコン一覧

    Office 365アイコン(imageMso)一覧(A)

    Office 365のデスクトップ版Officeアプリケーション(Wo…

  6. Office関連

    各ページを画像に変換するWordマクロ

    Excel MVPの伊藤さんがブログで、WordのPageオブジェクト…

コメント

  • コメント (0)

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

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

Time limit is exhausted. Please reload CAPTCHA.

※本ページはプロモーションが含まれています。

Translate

最近の記事

アーカイブ

PAGE TOP