【VBA】ブックの内容をPDFファイル(パスワードあり)として出力する【QPDF】

VBAから
 ・ブックの内容を
 ・PDFファイル(パスワードあり)として出力
できます!

VBAから
 ・無料ツール「QPDF」を呼び出す
ことで実現します!
※無料ツール「QPDF」の実行ファイルの取得(ダウンロード)が必要です。

残念ながら
 ・VBAだけでは実現できない様子
です…。
※もしかしたら実現できるかもです。
私では実現方法を見つけられないだけかもです。

PR

QPDFの取得(ダウンロード)

手順

以下のURLにアクセスする。



手順

最新バージョンをクリックする。
※2023/10/26時点の最新バージョンは「11.6.3」ため、今回は「11.6.3」をクリックします。

「11.6.3」をクリック
11.6.3」をクリック


手順

Windows用である「qpdf-XX.X.X-mingw64.zip」をクリックし、ダウンロードする。
※今回は「qpdf-11.6.3-mingw64.zip」をクリックします。
※クリックにより「qpdf-11.6.3-mingw64.zip」がダウンロードされます。

「qpdf-XX.X.X-mingw64.zip」をクリック
「qpdf-XX.X.X-mingw64.zip」をクリック
ダウンロードされた「qpdf-XX.X.X-mingw64.zip」
ダウンロードされた「qpdf-XX.X.X-mingw64.zip」


手順

ダウンロードされた「qpdf-XX.X.X-mingw64.zip」を任意の場所に展開する。
※今回はデスクトップ配下へ展開します。

展開により作成されたフォルダ
展開により作成されたフォルダ


手順

「bin」フォルダの中に、「QPDF」の実行ファイル「qpdf.exe」が存在することを確認する。
※後述するVBAコードに、「QPDF」の実行ファイル「qpdf.exe」のパスを記載します。

「QPDF」の実行ファイル「qpdf.exe」
「QPDF」の実行ファイル「qpdf.exe」
PR

VBAコード

ここでは例として
 ・本VBAを実行しているブックの内容を
 ・PDF(パスワードあり)として出力
します。

ブックには以下の3シートがあるとします。
・Sheet1
・Sheet2
・Sheet3

Sheet1の内容
Sheet1の内容
Sheet2の内容
Sheet2の内容
Sheet3の内容
Sheet3の内容
Option Explicit

Sub sample()
    
    Dim qpdfExePath As String
    Dim tempPdfFilePath As String
    Dim passwordPdfFilePath As String
    Dim pdfPassword As String
    Dim fso As Object
    Dim execCommand As String
    Dim wsh As Object
    Dim result As Integer
    
    'qpdfの実行ファイルのパス
    qpdfExePath = "C:\Users\user\Desktop\qpdf-11.6.3-mingw64\bin\qpdf.exe"
    'tempなPDFのパス
    tempPdfFilePath = "C:\Users\user\Desktop\temp.pdf"
    '出力するPDF(パスワードあり)のパス
    passwordPdfFilePath = "C:\Users\user\Desktop\パスワード付きファイル.pdf"
    'PDFに設定するパスワード
    pdfPassword = "password12345"
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    '既にtempなPDFが存在したら削除
    If fso.FileExists(tempPdfFilePath) Then
        fso.DeleteFile tempPdfFilePath, True
    End If
    
    '既にPDF(パスワードあり)が存在したら削除
    If fso.FileExists(passwordPdfFilePath) Then
        fso.DeleteFile passwordPdfFilePath, True
    End If
    
    '本VBAを実行しているブックの内容をtempなPDFとして出力
    ThisWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:=tempPdfFilePath
    
    'コマンドを組み立て【「tempなPDF」から「PDF(パスワードあり)」を作成するコマンド】
    execCommand = qpdfExePath & " --encrypt " & pdfPassword & " " & pdfPassword & " 256 -modify=none --print=full -- " & tempPdfFilePath & " " & passwordPdfFilePath
    
    'コマンドを同期実行
    Set wsh = CreateObject("WScript.Shell")
    result = wsh.Run(Command:="%ComSpec% /c " & execCommand, WindowStyle:=0, WaitOnReturn:=True)
    
    'コマンドの実行結果を確認
    If (result = 0) Then
        MsgBox ("正常終了しました。")
    Else
        MsgBox ("異常終了しました。")
    End If
    
    '後片付け
    fso.DeleteFile tempPdfFilePath, True
    Set wsh = Nothing
    Set fso = Nothing
                                     
End Sub

以下を指定します(15~21行目)。
※状況に応じて任意の値を指定してください。

・qpdfの実行ファイルのパス
・tempなPDFのパス
・出力するPDF(パスワードあり)のパス
・PDFに設定するパスワード

既に「tempなPDF」と「PDF(パスワードあり)」が存在する場合、削除します(26~33行目)。

本VBAを実行しているブックの内容をtempなPDFとして出力します(36行目)。

『「tempなPDF」から「PDF(パスワードあり)」を作成するコマンド』を組み立てます(39~40行目)。
※「ユーザーパスワード」と「権限パスワード」の両方に同じパスワードを設定しています。
※「modify(変更可否)」に「none(許可しない)」を設定していますが、効いていないかもです。
※「print(印刷可否)」に「full(完全な印刷が可能)」を設定していますが、効いていないかもです。

上記で実行されるコマンドは以下となります。

C:\Users\user\Desktop\qpdf-11.6.3-mingw64\bin\qpdf.exe --encrypt password12345 password12345 256 -modify=none --print=full -- C:\Users\user\Desktop\temp.pdf C:\Users\user\Desktop\パスワード付きファイル.pdf
PR

実行結果

ブックの内容をPDFファイル(パスワードあり)として出力できました。

実行結果①
実行結果①
実行結果②
実行結果②


出力されたPDFファイル(パスワードあり)を開くと、パスワードの入力を求められます。

実行結果③
実行結果③


パスワードを入力すると、ちゃんと開けました。
ブックの内容が出力されていることを確認できました。

実行結果④
実行結果④
PR

参考①

上記のVBAコードは以下の記事を参考にして作成しました。

●シートの内容をPDFファイルとして出力する


●コマンドプロンプトのコマンドを実行する

PR

参考②

バッチファイルでもPDFにパスワードを設定できます。
※VBAと同様に無料ツール「QPDF」を使用します。

詳細は以下の記事をご確認ください。

PR

参考③

無料ツール「QPDF」のマニュアルは、展開したフォルダ配下の「share」-「doc」-「qpdf」フォルダの中にあります。
マニュアル英語で記載されています。

無料ツール「QPDF」のマニュアル
無料ツール「QPDF」のマニュアル
PR

参考④

本記事の内容は
 ・いただいた問い合わせを参考にして作成
しました。

タイトルとURLをコピーしました