SKILLExcelスキルアップ大全

  1. ホーム
  2. Excelスキルアップ大全

Excelとパスワード付きPDF

2024.01.06 |

 

こんにちは、すごい改善のAitoです。

 

さてさて、本日の話題はPDFとパスワードについてです。それぞれ単体では仕事でもプライベートでもよく使うことでしょう。しかし組み合わせるとなると……特にWindowsデフォルト環境下においてはちょっとどころではなく困りものです。今回はPDFファイルにパスワードを付けたいという課題について考えていきましょう。デフォルト環境では対応しきれない部分も多いため、フリーソフトを使ったら便利ですね。特に暗号に関わる部分は非専門家が自分で書くのは逆に危険なので信頼のおけるソフトの利用を強くおすすめします。

 

1. パスワード付きZIP化

そもそもなぜパスワード付きPDFが必要なのでしょう。パスワードが重要で、アクセス権を持った人だけが見ることができれば形式は何でもよいという方は多い気がします。それならばパスワード付きZIPでもいいのでは……?ということでExcelからパスワード付きZIPを作成する方法を解説していきます。

 

使用するのはこちら。

・7-Zip

 

言わずと知れた老舗アーカイバです。様々な形式に対応していますし、速いです。7-ZipをVBAからコマンドラインで呼び出して使用する方法を検討しましょう。

例えばこんな場合を考えてみます。

 

 

A列にZIP化したいファイルの名前が入っており、B列にそのファイルをZIP化した際にかけるパスワードが入っています。すべてのファイルに対してパスワード付きZIPを作成したいケースを考えます。

7-Zipの呼び出しコマンドは次のように仕様が定められています。

[7-Zipのプログラム本体があるパス] a  -mem=AES256 -ssw -p[パスワード] [ZIP化後のファイル名] [ZIP化したいファイル名]

従来の方式では暗号化しても容易に解読ができてしまうため、より強固なAES-256形式での暗号化をおすすめします。

さて、コマンドをVBAから呼び出して使うことにしましょう。自動化とCLIは相性が良いですね。コーディングするとこのようになります。


Option Explicit

Sub ZIP化_7zip()
    Dim folderPath As String: folderPath = ThisWorkbook.Path + "\"
    
    Dim objWSH As Object, objwExec As Object, Result As String
    Set objWSH = CreateObject("WScript.Shell")
    
    Dim cmd As String
    Dim i As Long
    For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
        cmd = "%ComSpec% /c " + Chr(34) _
                + """C:\Program Files\7-Zip\7z.exe""" _
                + " a -mem=AES256 -ssw -p" + CStr(Cells(i, 2).Value) _
                + Space(1) _
                + Chr(34) + folderPath + GetFileNameWithoutExtention(CStr(Cells(i, 1).Value)) + ".zip" + Chr(34) _
                + Space(1) _
                + Chr(34) + folderPath + CStr(Cells(i, 1).Value) + Chr(34) _
                + Chr(34)
        
        Set objwExec = objWSH.Exec(cmd)
        
        Do While objwExec.Status = 0
            DoEvents
        Loop
        Result = objwExec.StdOut.ReadAll
        Debug.Print Result

    Next
    
    Set objwExec = Nothing
    Set objWSH = Nothing
    
End Sub

Function GetFileNameWithoutExtention(ByVal fileName As String) As String
    Dim rightPoint As Long
    Dim ret As String
    
    rightPoint = InStrRev(fileName, ".")
    ret = Left(fileName, rightPoint - 1)
    
    GetFileNameWithoutExtention = ret
End Function

 

ちょこっとだけ解説すると、WScriptというものを使ってコマンドプロンプトに実行するファイル(今回は7-Zip)に対するコマンドを投げることができるんです。CreateObject(“WScript.Shell”)がその機能の呼び出しですね。今回はパスワードを付けて圧縮するコマンドを使いました。コマンドの仕様などはこちらをご覧ください。

https://7-zip.opensource.jp/howto/dos-command-password.html

 

他にもLhaplusを使う方法もありますので、興味を持たれた方・環境がそちらの方は調べてみてください。

 

 

ここまで読んで、フリーソフト以外の解決手段はないのか!と思われた方もいらっしゃるでしょう。Windowsのデフォルト環境で作成出来たら良かったのですが、Windows Vista以降パスワード付きZIPを作る機能が廃止されたんです。デフォルトのままでとなると環境自体をアップデートした方がよいです。ExcelにこだわりがなければPythonなど別の言語を用いて作ることもできます。ここはお好みで。

 

2. どうしてもパスワード付きPDFを作らざるを得ない場合

2.1. Adobeの環境が使える場合

どうしてもパスワード付きPDFを作らなければならない場合が出てきた時を想定しましょう。Acrobat Proを契約している場合はアクションウィザードを使ってください。ただし、個別にパスワードを設定したいなど細かなカスタマイズをしたい場合は、javascriptを書くことになるため対応できない場合は別の手法を考える必要があります。今回はjavascriptがメインではないので解説は省略します。

もしくはAdobe Acrobat Services APIの利用を検討してください。こちらも別言語での実装となるため、わからない場合は後述する方法を検討ください。

 

2.2. Wordを使う方法

次はWordを使う方法です。Wordはデフォルトでパスワード付きPDFの出力に対応しています。ExcelからデータをWordに貼り付けて出力すればお目当てのパスワード付きPDFが出来上がるというわけです。こちらはVBAで操作することができないようなので、手動でやる必要があります。ルーティンワーク以外のスポット作業で使ってもよいかもしれません。詳細はこちらをご覧ください。

https://swri.jp/article/760

 

2.3. フリーソフトを使う方法

お次はExcelからPDFとして出力してその後そのPDFにパスワードを付加する方法について考えてみましょう。フリーソフトを使う方法です。

今回はPDF出力がメインではないのでそこまで丁寧に記載しないため、もしPDF出力についてもっと知りたいという方はこちらをご覧ください。

https://excel-ubara.com/excelvba1/EXCELVBA439.html

https://tech-paclab.com/exportpdf/

 

事前準備として、pdftkというソフトをダウンロードします。このソフトは昔から使われているものです。インストールするのが嫌だという方はPortable版を調べてみましょう。せっかくなので今回はPortable版で作ってみることにします。

https://portableapps.com/apps/office/pdftk_builder_portable

ここからPortable版をダウンロードして、ダウンロードされたexeファイルを実行して解凍します。インストール先とか出てきますが、気にせずそのまま解凍してください。

 

 

こんな感じになりますかね。

では、作っていきましょう。Excelファイルはこんなのを用意してみました。

 

 

PDFの出力範囲はこんな感じにしました。

 

 

PDF出力してパスワード付加するところまで作っていきましょうか。

VBAはこのように書けます。ここでもWScript.Shellが登場していますね。よく使います。


Option Explicit

Sub ExportAndAddPassword()
    Call ExportPDF
    Call AddPassword("1234")    'ここでは1234に設定
End Sub

Sub ExportPDF()

    Dim ws As Worksheet: Set ws = Worksheets(1)
    ws.ExportAsFixedFormat Type:=xlTypePDF
    
    Set ws = Nothing
End Sub


Sub AddPassword(ByVal password)
    Dim pdftkPath As String: pdftkPath = """C:\PDFTKBuilderPortable\App\pdftkbuilder\pdftk.exe"""
    Dim inputFile As String: inputFile = Chr(34) + ThisWorkbook.Path + "\PDF化してパスワード付与.pdf" + Chr(34)
    Dim outputFile As String: outputFile = Chr(34) + ThisWorkbook.Path + "\PDF化してパスワード付与_pw.pdf" + Chr(34)
    
    Dim objWSH As Object, objwExec As Object, Result As String
    Dim cmd As String
    
    Set objWSH = CreateObject("WScript.Shell")
    
    cmd = "%ComSpec% /c " + Chr(34) + pdftkPath + " " + inputFile + " output " + outputFile + " user_pw " + password + Chr(34)
    
    
    Set objwExec = objWSH.Exec(cmd)
        
    Do While objwExec.Status = 0
        DoEvents
    Loop
    
    Result = objwExec.StdOut.ReadAll
    Debug.Print Result
    
End Sub

 

出力されたファイルを開こうとするとパスワードを求められます。上手くパスワード付加できていますね!1234と入力すると開きます。

 

 

3. まとめ

以上、Excelをパスワード付きPDFにする手法についてざっくりと解説しました。PDFは専用のソフトウェアを使って処理することが望ましいです。一番のおすすめは2.3のフリーソフトを使う方法です。悩んでいる方がいらっしゃったら参考になれば幸いです。

 

ではまた別の記事でお会いしましょう!最後まで読んでいただきありがとうございました。

 

 

 

 

ページの先頭へ