【ExcelVBA】PDFにパスワードを設定する

「VBAで出力したPDFにパスワードをかけたい」

たまにそのような話を聞くのですが、調べてみるとVBAだけでは実現できないようです。

そもそもExcelからPDF形式に保存はできるのですが、標準機能ではパスワード設定ができません。

VBAでパスワードを設定するにはAcrobatに付属しているアドインを利用するか各社が出しているPDF編集ソフトを入手する必要があります。

いろいろ調べたところ、コマンドラインで利用できるQPDFというソフトがVBAと相性が良さそうなので使ってみることにしました。

とりあえずサンプルを作ってみました。

マクロ入りのシートは以下のような感じで作ってます。

PDFファイルは、Excelファイルと同じディレクトリに拡張子をPDFに変えて出力する仕様にしています。

ソースコードは以下の通り。

Option Explicit

Private Const CMD_TEMPLATE As String = "%ComSpec% /c [QpdfPath] --encrypt [UserPassword] [OwnerPassword] 256 -- [PdfInputPath] [PdfOutputPath]"

Sub test()
    Dim wb As Workbook
    Dim pos As Long
    Dim cmd As String
    Dim wsh As Object
    Dim result As Object
    Dim QpdfPath As String
    Dim BookPath As String
    Dim SheetName As String
    Dim UserPassword As String
    Dim PdfInputPath As String
    Dim PdfOutputPath As String
    
    ' 確認メッセージ
    If MsgBox("PDFを出力します。よろしいですか?", vbYesNo + vbQuestion) = vbNo Then
        Exit Sub
    End If

    ' 画面更新停止
    Application.ScreenUpdating = False

    ' 設定値取得
    QpdfPath = ActiveSheet.Cells(2, 3).Value
    BookPath = ActiveSheet.Cells(3, 3).Value
    SheetName = ActiveSheet.Cells(4, 3).Value
    UserPassword = ActiveSheet.Cells(5, 3).Value

    ' PDFファイルパス生成
    pos = InStrRev(BookPath, ".")
    If pos > 0 Then
        PdfOutputPath = Replace(BookPath, LCase(Mid(BookPath, pos + 1)), "pdf")
    End If
    PdfInputPath = PdfOutputPath & "_tmp.pdf"
    
    ' EXCELをPDF形式で保存
    Set wb = Workbooks.Open(BookPath)
    wb.Worksheets(SheetName).ExportAsFixedFormat Type:=xlTypePDF, Filename:=PdfInputPath
    Call wb.Close(SaveChanges:=False)
    
    ' コマンド作成
    cmd = CMD_TEMPLATE
    cmd = Replace(cmd, "[QpdfPath]", QpdfPath)
    cmd = Replace(cmd, "[UserPassword]", UserPassword)
    cmd = Replace(cmd, "[OwnerPassword]", Chr(34) & Chr(34))
    cmd = Replace(cmd, "[PdfInputPath]", Chr(34) & PdfInputPath & Chr(34))
    cmd = Replace(cmd, "[PdfOutputPath]", Chr(34) & PdfOutputPath & Chr(34))
        
    ' コマンド実行(QPDF)
    Set wsh = CreateObject("WScript.Shell")
    Set result = wsh.exec(cmd)
    Do While result.Status = 0
        DoEvents
    Loop
    Set result = Nothing
    Set wsh = Nothing
    
    ' 入力用PDFファイル削除
    Kill PdfInputPath

    ' 画面更新開始
    Application.ScreenUpdating = True
    
    ' 完了メッセージ
    MsgBox ("完了しました。")
    
End Sub

CMD_TEMPLATE にコマンドの構文を定義しています。

256はパスワードの暗号化の鍵長です。40、126、256から選択できます。

処理はExcel標準機能でPDFを作った後、そのPDFを入力ファイルとしてQPDFでパスワード入りのPDFを出力するという流れです。

エラー処理とか考慮してないのでもっと洗練できそうですが、とりあえずパスワードを設定するという目的は達成できたので、備忘録として公開しておきます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です