Office関連

パスワード付のPDFファイルを作成するExcelマクロ

2019/8/16 追記:
WordやPowerPointにも対応した、改良版のマクロにつて記事を書きました。


以前書いたマクロが出てきました。
Acrobat付属のOffice用COMアドイン「Acrobat PDFMaker Office COM Addin」を利用して、Excelファイルからパスワード(読み取り、書き込み)付のPDFファイルに変換するマクロです。

Option Explicit

Public Sub Sample()
  ConvertPdfUsingPDFMaker "C:\Test\テストファイル.xlsx", _
                          "C:\Test\変換後.pdf", _
                          "read", _
                          "write"
End Sub

Public Sub ConvertPdfUsingPDFMaker(ByVal InputFilePath As String, _
                                   ByVal OutputFilePath As String, _
                                   Optional ByVal ReadPassWord As String = "", _
                                   Optional ByVal WritePassWord As String = "")
'[Acrobat PDFMaker Office COM Addin]を使ってPDFファイルに変換(Excel)
'下記ライブラリ要参照
' - AdobePDFMakerForOffice(AcrobatPDFMakerForOffice.tlb)
' - PDFMakerAPI 1.0 Type Library(PDFMakerAPI.dll)
  Dim pm As AdobePDFMakerForOffice.PDFMaker
  Dim iset As AdobePDFMakerForOffice.ISettings
  Dim sset As PDFMAKERAPILib.SecuritySettings
  Dim wb As Excel.Workbook
  
  Set pm = GetPDFMaker()
  If pm Is Nothing Then
    MsgBox "[Acrobat PDFMaker Office COM Addin]を取得できませんでした。" & vbNewLine & _
           "処理を中止します。", vbExclamation + vbSystemModal
    Exit Sub
  End If
  
  Set wb = Application.Workbooks.Open(InputFilePath)
  wb.Activate '念のため開いたブックをアクティブにする
  
  '環境設定(必要に応じてオプション変更)
  pm.GetCurrentConversionSettings iset
  With iset
    .IsAutomation = True
    .IsConversionSilent = True
    .ShouldShowProgressDialog = True
    .ViewPDFFile = False '結果の Adobe PDF を表示(Falseで非表示)
    .PrintActivesheetOnly = False '変換範囲(Falseでブック全体)
    .PromptForPDFFilename = False
    .PromptForSheetSelection = False
    .OutputPDFFileName = OutputFilePath
  End With
  
  'セキュリティ設定
  If Len(Trim(ReadPassWord)) > 0 Or _
     Len(Trim(WritePassWord)) > 0 Then
    Set sset = New PDFMAKERAPILib.SecuritySettings
    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 = True 'True:チェックON / False:チェックOFF
      End If
    End With
    iset.SecuritySettings = sset
  End If
  
  pm.CreatePDFEx iset, 0 'PDF作成
  wb.Close SaveChanges:=False
End Sub

Private Function GetPDFMaker() As AdobePDFMakerForOffice.PDFMaker
'PDFMakerオブジェクト取得
  Dim ad As Office.COMAddIn
  Dim ret As AdobePDFMakerForOffice.PDFMaker
  
  Set ret = Nothing '初期化
  For Each ad In Application.COMAddIns
    If ad.Connect = True Then
      If LCase(ad.progID) = LCase("PDFMaker.OfficeAddin") Then
        Set ret = ad.Object
        Exit For
      End If
    End If
  Next
  Set GetPDFMaker = ret
End Function

コード中にも記載していますが、「AdobePDFMakerForOffice(AcrobatPDFMakerForOffice.tlb)」と「PDFMakerAPI 1.0 Type Library(PDFMakerAPI.dll)」の参照が必要です。

たしか、“kPrintingAllowedHighRes”とか“kAllowChangesCommentingFormfillsSign”といった値が何を指しているのかを調べるのが大変で放置したままになっていたのでした。

結局今になっても調べきれていません。
UIAでアドインのダイアログ操作した方がマシかも?、なんて思いもしますが、いつかどこかで使う機会があるかもしれませんので、一応残しておきます。

選択したセルに連続行番号を振るWordマクロ前のページ

Office 2016関連資料のリンク次のページ

関連記事

  1. Excel

    MDB(Accessデータベース)ファイルを作成してデータを格納するExcelマクロ

    2012/2/22追記:下記で作成したMDBファイルを利用したWo…

  2. Office関連

    Microsoft Translator APIで文字列を翻訳するVBAマクロ

    以前書いた記事で、Google翻訳を使って文字列を翻訳するマクロを紹介…

  3. Office関連

    Office 365 APIをVBAから呼び出す(1)

    2015年4月に公開されたOffice Teamのブログ記事「Toda…

  4. Office関連

    PowerShellからNetOfficeを使ってExcelを操作する方法

    先日、Excel MVPの伊藤さんがPowerShellからExcel…

コメント

  • コメント (0)

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

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

Time limit is exhausted. Please reload CAPTCHA.

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

Translate

最近の記事

アーカイブ

PAGE TOP