ホーム > カテゴリ > Excel・VBA >

VBAでPDFファイルを結合する[ExcelのTIPS]

VBAでPDFファイルを結合する方法です。変換処理には個人・法人問わず利用、再配布可能な「PDFDesigner Tools」(無料)を使用します。

エクセル以外にもワード、パワーポイントなどでも使用可能です。

PDFDesigner Toolsのダウンロード

最初に「PDFDesigner Tools」をダウンロードします。

PDFDesigner Tools
http://papy.world.coocan.jp/pdftool/

左上にある「pdftool.zip」をダウンロードして展開すると「pdftool.dll」が作成されます。

PDFファイルを結合する

エクセルを起動して「マクロ有効ファイル」をデスクトップなどに作成します。そのマクロ有効ファイルと同じフォルダに「pdftool.dll」を移動します。

標準モジュール

次にVBAで「標準モジュール」を追加して「pdftool.dll」のAPIを宣言します。

' PDFDesigner Tools API
Public Declare Function LoadPDF Lib "pdftool.dll" (ByVal OpenFileName As String) As Long
Public Declare Sub FreePDF Lib "pdftool.dll" (ByVal PDF As Long)

Public Declare Function CombinePDF Lib "pdftool.dll" (ByVal PDF1 As Long, ByVal PDF2 As Long, ByVal SaveFileName As String) As Long

PDFのバージョンを1.4形式に変更するChangePDFVersion()関数とPDFファイルを結合するvba_CombinePDF()関数を「標準モジュール」に追記します。

' PDFのバージョンを1.4形式にする(コピーしたファイルを編集)
Public Sub ChangePDFVersion(ByVal OpenFileName As String, ByVal SaveFileName As String)
  Dim Stream() As Byte  ' ストリーム
  Dim FileNo As Integer ' ファイルNO

  ' ファイルを読み込む
  FileNo = FreeFile
  ReDim Stream(FileLen(OpenFileName) - 1)

  Open OpenFileName For Binary As #FileNo
    Get #FileNo, , Stream
  Close #FileNo

  ' PDFの形式を1.4にする
  Stream(5) = "&H31":   Stream(7) = "&H34"

  ' ファイルの出力
  FileNo = FreeFile
  Open SaveFileName For Binary Access Write As #FileNo
    Put #FileNo, , Stream
  Close #FileNo
End Sub

' PDFファイルを結合する
'  戻り値: 1:成功 -1:失敗
Public Function vba_CombinePDF(ByVal PDF1 As String, ByVal PDF2 As String, ByVal SaveFileName As String) As Long
  Dim p1, p2 As Long
  Dim tmp1, tmp2 As String
  Dim Result As Long
  
  ' 拡張子をtmpに変換する
  tmp1 = Replace(PDF1, ".pdf", ".tmp", compare:=vbTextCompare)
  tmp2 = Replace(PDF2, ".pdf", ".tmp", compare:=vbTextCompare)
  
  ' 元のPDFファイルをコピーしてバージョンを1.4形式に変更する
  Call ChangePDFVersion(PDF1, tmp1)
  Call ChangePDFVersion(PDF2, tmp2)
  
  ' PDFファイルを読み込んでハンドルを取得する
  p1 = LoadPDF(tmp1)
  p2 = LoadPDF(tmp2)
 
  ' PDFファイルを結合する
  Result = CombinePDF(p1, p2, SaveFileName)
 
  ' PDFファイルのハンドルを解放する
  FreePDF (p1)
  FreePDF (p2)
  
  ' テンポラリファイルを削除する
  Kill (tmp1)
  Kill (tmp2)
  
  vba_CombinePDF = Result
End Function

イベント

ボタンを押すとPDFファイルが結合されます。

Private Sub CommandButton1_Click()
  ' カレントディレクトリをExcelファイルとpdftool.dllがある場所に変更
  ChDir ThisWorkbook.Path
  ' PDFファイルを結合する
  call vba_CombinePDF("C:\結合元1.pdf","C:\結合元2.pdf","C:\結果.pdf")
End Sub

注意事項

WindowsやエクセルのバージョンによってはCドライブ直下(c:¥test.pdfなど)のファイルはセキュリティ制限で操作できない場合があります。その場合はC:¥Users¥ユーザー名¥Desktop¥など他のフォルダのファイルを指定してください。

また、pdftool.dllは32bitで作成されていますので、32bitのエクセルを使用してください。64bitのエクセルだとpdftool.dllが読み込めずに「実行時エラー 48 ファイルが見つかりません」とエラーが発生します。

Q & A

Q1: 何故、PDFのバージョンを変更するのですか?

「pdftool.dll」は2003年に作成したDelphiのクラスライブラリを元に作成されています。当時は存在しないPDFのバージョンは読み込めないようにしています。

そのバージョンチェックの機能を回避する為にPDFのバージョンを1.4形式に変更しています。これによりMicrosoft Officeなどで作成されたPDFファイルが読み込めるようになります。

Q2: どのようなPDFファイルに対応していますか?

「Microsoft Office、OpenOffice、Chrome」などで作成されたPDFファイルです。形式で言いますとPDF1.4形式(ISO 19005-1など)に準拠しているファイルです。「PDFの純正ツール」で作成したPDF1.5形式以降のファイルは基本的に対応していません。但し、PDF1.5形式以降のファイルでも内部的にPDF1.4形式ならば読み込めます。

また、PDFファイルが暗号化されている場合は対応できませんのでご了承ください。

メモ

本格的に運用する場合はエラーチェックなどを入れてくださいね。

公式リンク

PDFDesigner Tools
http://papy.world.coocan.jp/pdftool/
PDFDesigner JavaScript version(オープンソース)
http://www.petitmonte.com/pdfdesigner/

両方とも私が作成しています^^;

エクセル講座のクイックリンク

ホーム 新機能 基本(初級) 基本(中級) 基本(上級) 関数 マクロ VBA TIPS





関連記事



公開日:2016年01月05日 最終更新日:2016年06月29日
記事NO:01683