Excel VBAで実用ツール(PDFファイル編)

2024-01-07

■PDFファイルの概要

PDF(Portable Document Format)は、AdobeがPostScriptをベースに開発した電子文書ファイルの形式で、ファイルの拡張子は「.pdf」です。

OSやハードウェアに依存することなく、文書や画像を表示することができるため、幅広く利用されているファイル形式で、ISO 32000という国際規格が定められていますが、Adobeのサイトでは規格書が無料で公開されています。
⇒詳細はAdobeのサイト(Portable document format — Part 1: PDF 1.7)を参照して下さい。

PDFファイルの構成

PDFファイルの構成は下図のようになっており、「ヘッダ」「ボディ」「クロスリファレンステーブル」「トレーラ」の順に配置されています(※)。

(※)PDFファイルに変更を加えた場合は、元のトレーラの後ろに変更後の「クロスリファレンステーブル」「トレーラ」が追加されます。

ボディは複数のオブジェクトの集合体になっており、各オブジェクトの位置をクロスリファレンステーブルが示し、クロスリファレンステーブルの位置をトレーラが示していますので、実際にはトレーラ→クロスリファレンステーブル→ボディの順にアクセスすることになります。

ヘッダ ボディ クロスリファレンステーブル トレーラ

PDFファイルの中にはバイナリ・データも含まれますが、構文を表すキーワードは全て文字列で、改行コード(CrLf)で行が区切られているため、メモ帳のようなテキスト・エディタで開けば、大体のファイル構造がわかります。

ヘッダのフォーマット

ヘッダのフォーマットは下図のようになっており、PDFのバージョンを示します。

  • (ヘッダの例)
  • %PDF-1.5

トレーラのフォーマット

トレーラのフォーマットは下図のようになっており、「トレーラ辞書」「クロスリファレンステーブルの開始位置(ファイルの先頭からのオフセット)」「%%EOF」の順で配置されています。

    • (トレーラのフォーマット)
    • trailer
    • << key1 value1
    •       key2 value2
    •       …
    •       keyn valuen>>
    • startxref
  • Byte_offset_of_last_cross-reference_section
  • %%EOF

トレーラ辞書に記述可能な項目は、下表の通りです。

key type value
Size integer クロスリファレンステーブルのエントリ数
Prev integer 前のクロスリファレンステーブルの開始位置
Root dictionary カタログディクショナリ
Encrypt dictionary 暗号化ディクショナリ
Info dictionary 文書情報ディクショナリ
ID array ファイル識別子
XRefStm integer クロスリファレンスストリームの開始位置

クロスリファレンステーブルのフォーマット

クロスリファレンステーブルのフォーマットは下図のようになっており、「xref」「エントリ数」「各エントリ」の順で配置されています。
各エントリは「オブジェクトの開始位置(10桁)」「オブジェクトの世代番号(5桁)」「f(未使用)またはn(使用中)」の3項目で構成されています。

  • (クロスリファレンステーブルの例)
  • xref
  • 0 7
  • 0000000000 65535 f
  • 0000000009 00000 n
  • 0000000074 00000 n
  • 0000000120 00000 n
  • 0000000179 00000 n
  • 0000000300 00000 n
  • 0000000384 00000 n

ボディのフォーマット

ボディのフォーマットは下図のようになっており、「オブジェクト番号」「世代番号」「obj~endobj」の順で配置されています。
(オブジェクトとして指定できる内容は多岐に亘るため、説明は割愛します)

  • (ボディの例)
  • 1 0 obj
  • <</Type /Catalog /Pages…>>
  • endobj
  • 2 0 obj
  • <</Type /Pages /Count…>>
  • endobj
  • 3 0 obj
  • <</Type /Page /Parent…>>
  • endobj
  • 4 0 obj
  • <</Filter /FlateDecode /Length…>>
  • stream
  • endstream
  • endobj
  • 5 0 obj
  • <</Type /Font /Subtype /TrueType /Name…>>
  • endobj
  • 6 0 obj
  • <</Type /FontDescriptor /FontName…>>
  • endobj

PDFの仕様を正確に理解すれば、自作のプログラムで加工することができるはずですが、非常に取扱い難いファイル形式なので、自力で加工することは断念しました。

次項ではOffice製品で提供されている機能やPDF結合ツール等を利用したExcelツールをご紹介します。

■Excel VBAを使用したPDFファイル作成(ExportAsFixedFormatメソッド)

Excel VBAでPDFファイル(またはXPSファイル)を作成する場合は、WorkbookオブジェクトWorksheetオブジェクト、DialogSheetオブジェクト、RangeオブジェクトChartオブジェクトで提供されている、ExportAsFixedFormatメソッドを使用します。

ExportAsFixedFormatメソッドの使用法

ExportAsFixedFormatメソッドの使用法は、以下の通りです。

  • Sub ExportAsFixedFormat(Type As XlFixedFormatType,
  •                                      [Filename],
  •                                      [Quality],
  •                                      [IncludeDocProperties],
  •                                      [IgnorePrintAreas],
  •                                      [From],
  •                                      [To],
  •                                      [OpenAfterPublish],
  •                                      [FixedFormatExtClassPtr])

引数として指定できる項目は下表の通りで、指定必須の引数はTypeだけです。

引数 説明
Type(必須) エクスポート・ファイルの形式(※1)を指定
(※1)XlFixedFormatType列挙体で指定
0:xlTypePDF
1:xlTypeXPS
Filename 保存するファイルの名前を指定
Quality エクスポート・ファイルの品質(※2)を指定
(※2)XlFixedFormatQuality列挙体で指定
0:xlQualityStandard
1:xlQualityMinimum
IncludeDocProperties ドキュメントのプロパティを含むかどうかを指定
True:プロパティを含む
False:プロパティを含まない
IgnorePrintAreas 設定された印刷領域を無視するかどうかを指定
True:印刷領域を無視する
False:印刷領域を無視しない)
From 開始ページ番号を指定
(省略時は先頭ページを仮定)
To 終了ページ番号を指定
(省略時は最終ページを仮定)
OpenAfterPublish エクスポート後、ビューアでファイルを表示するかどうかを指定
True:ファイルを表示する
False:ファイルを表示しない
FixedFormatExtClassPtr FixedFormatExtクラスへのポインタを指定
(コードの代替実装を呼び出せるアドインへのポインタを指定)

(参考)Excelを手動で操作してPDFを作成する場合は、メニューから「名前を付けて保存」を選択し、「ファイルの種類」で『PDF』を指定しますが、Excel VBAでプログラミングする場合、SaveAsメソッドでPDFファイルを作成することはできません。
(SaveAsメソッドのFileFormat引数はXlFileFormat列挙体で指定しますが、XlFileFormat列挙体にはPDFを表す定数が定義されていません)

■Word VBAを使用したPDFファイル作成(ExportAsFixedFormatメソッド、SaveAsメソッド、SaveAs2メソッド)

Word VBAでPDFファイル(またはXPSファイル)を作成する場合は、Documentオブジェクト、Selectionオブジェクト、Rangeオブジェクトで提供されている、ExportAsFixedFormatメソッドを使用します。
⇒Word VBAの概要については、Excel VBAでオブジェクト指向プログラミング(Word VBA編)を参照して下さい。

ExportAsFixedFormatメソッドの使用法

ExportAsFixedFormatメソッドの使用法は、以下の通りです。

  • Sub ExportAsFixedFormat(OutputFileName As String,
  •                                       ExportFormat As WdExportFormat,
  •                                      [OpenAfterExport As Boolean = False],
  •                                      [OptimizeFor As WdExportOptimizeFor =
  •                                       wdExportOptimizeForPrint],
  •                                      [ExportCurrentRange As WdExportRange =
  •                                       wdExportAllDocument],
  •                                      [From As Long = 1],
  •                                      [To As Long = 1],
  •                                      [Item As WdExportItem =
  •                                       wdExportDocumentContent],
  •                                      [IncludeDocProps As Boolean = False],
  •                                      [KeepIRM As Boolean = True],
  •                                      [CreateBookmarks As
  •                                       WdExportCreateBookmarks =
  •                                       wdExportCreateNoBookmarks],
  •                                     [DocStructureTags As Boolean = True],
  •                                     [BitmapMissingFonts As Boolean = True],
  •                                     [UseISO19005_1 As Boolean = False],
  •                                     [FixedFormatExtClassPtr])

引数として指定できる項目は下表の通りで、指定必須の引数はOutputFileNameとExportFormatだけです。

引数 説明
OutputFileName(必須) 出力ファイルの名前を指定
ExportFormat(必須) エクスポート・ファイルの形式(※1)を指定
(※1)WdExportFormat列挙体で指定
17:wdExportFormatPDF
18:wdExportFormatXPS
OpenAfterExport エクスポート後、新しいファイルを開くかどうかを指定
True:新しいファイルを開く
False:新しいファイルを開かない(既定)
OptimizeFor 画面または印刷用に最適化するかどうか(※2)を指定
(※2)WdExportOptimizeFor列挙体で指定
0:wdExportOptimizeForPrint(既定)
1:wdExportOptimizeForOnScreen
ExportCurrentRange 現在のページをエクスポートするかどうか(※3)を指定
(※3)WdExportRange列挙体で指定
0:wdExportAllDocument(既定)
1:wdExportSelection
2:wdExportCurrentPage
3:wdExportFromTo
From 開始ページ番号を指定
(省略時は1を仮定)
To 終了ページ番号を指定
(省略時は1を仮定)
Item エクスポート・ファイルにテキストのみを含めるか、テキストとマークアップコードを含めるか(※4)を指定
(※4)WdExportItem列挙体で指定
0:wdExportDocumentContent(既定)
1:wdExportDocumentWithMarkup
IncludeDocProps ドキュメントのプロパティを含むかどうかを指定
True:プロパティを含む
False:プロパティを含まない(既定)
KeepIRM IRM権限をXPSドキュメントにコピーするかどうかを指定
True:IRM権限をコピーする(既定)
False:IRM権限をコピーしない
CreateBookmarks ブックマークをエクスポートするかどうか(※5)を指定
(※5)WdExportCreateBookmarks列挙体で指定
0:wdExportCreateNoBookmarks(既定)
1:wdExportCreateHeadingBookmarks
2:wdExportCreateWordBookmarks
DocStructureTags スクリーンリーダーのためのデータを含めるかどうかを指定
True:データを含める(既定)
False:データを含めない
BitmapMissingFonts テキストのビットマップ(フォント)を含めるかどうかを指定
True:フォントを含める(既定)
False:フォントを含めない
UseISO19005_1 ISO 19005-1(PDF/A)に準拠するかどうかを指定
True:ISO 19005-1に準拠する
False:ISO 19005-1に準拠しない(既定)
FixedFormatExtClassPtr FixedFormatExtクラスへのポインタを指定
(コードの代替実装を呼び出せるアドインへのポインタを指定)

SaveAsメソッド(またはSaveAs2メソッド)の使用法

Excelとは異なり、Wordの場合はDocumentオブジェクトのSaveAsメソッド(またはSaveAs2メソッド)でも、PDFファイルを作成することができます。
SaveAsメソッド(またはSaveAs2メソッド)の使用法は、以下の通りです。

  • Sub SaveAs([FileName],
  •                   [FileFormat],
  •                   [LockComments],
  •                   [Password],
  •                   [AddToRecentFiles],
  •                   [WritePassword],
  •                   [ReadOnlyRecommended],
  •                   [EmbedTrueTypeFonts],
  •                   [SaveNativePictureFormat],
  •                   [SaveFormsData],
  •                   [SaveAsAOCELetter],
  •                   [Encoding],
  •                   [InsertLineBreaks],
  •                   [AllowSubstitutions],
  •                   [LineEnding],
  •                   [AddBiDiMarks])

引数として指定できる項目は下表の通りで、指定必須の引数はありませんが、PDFを作成する場合は、FileFormat引数にwdFormatPDF(=17)を指定する必要があります。

引数 説明
FileName 文書の名前を指定
(省略時は現在の文書名を仮定)
FileFormat 文書の保存形式(※1)を指定
(※1)WdSaveFormat列挙体で指定
17:wdFormatPDF
LockComments コメント用の文書をロックするかどうかを指定
True:コメントをロックする
False:コメントをロックしない(既定)
Password 読み取りパスワードを指定
AddToRecentFiles 「最近使った文書」に追加するかどうかを指定
True:「最近使った文書」に追加する(既定)
False:「最近使った文書」に追加しない
WritePassword 書き込みパスワードを指定
ReadOnlyRecommended 読み取り専用を推奨するかどうかを指定
True:読み取り専用を推奨する
False:読み取り専用を推奨しない(既定)
EmbedTrueTypeFonts TrueTypeフォントを保存するかどうかを指定
True:TrueTypeフォントを保存する
False:TrueTypeフォントを保存しない
(規定値はEmbedTrueTypeFontsプロパティの値)
SaveNativePictureFormat 画像のWindowsバージョンのみを保存するかどうかを指定
True:Windowsバージョンのみを保存する
False:元の画像フォーマットを保存する
SaveFormsData フォームにレコードとして保存するかどうかを指定
True:レコードとして保存する
False:レコードとして保存しない
SaveAsAOCELetter 文書をAOCEレターとして保存するかどうかを指定
True:AOCEレターとして保存する
False:AOCEレターとして保存しない
Encoding コードページまたは文字セットを指定
(既定値はシステム・コード・ページ)
InsertLineBreaks テキストの各行の最後に改行を挿入するかどうかを指定
True:改行を挿入する
False:改行を挿入しない
AllowSubstitutions 特定の記号を類似したテキストに置換するかどうかを指定
True:類似したテキストに置換する
False:類似したテキストに置換しない(既定)
LineEnding 改行および段落区切りを示す方法(※2)を指定
(※2)WdLineEndingType列挙体のうち、以下の値を指定可能
0:wdCRLF
1:wdCROnly
AddBiDiMarks 出力ファイルに制御文字を追加するかどうかを指定
True:制御文字を追加する
False:制御文字を追加しない
CompatibilityMode
(SaveAs2メソッドのみ)
文書を開くときにWordが使用する互換モード(※3)を指定
(※3)WdCompatibilityMode列挙体で指定
11:Word2003
12:Word2007
14:Word2010
15:Word2013
65535:Wordの最新バージョン
(省略時は、0(現在の文書の互換性モードを保持)を仮定)

■PowerPoint VBAを使用したPDFファイル作成(ExportAsFixedFormatメソッド、ExportAsFixedFormat2メソッド、SaveAsメソッド)

PowerPoint VBAでPDFファイル(またはXPSファイル)を作成する場合は、PresentationオブジェクトのExportAsFixedFormatメソッド(またはExportAsFixedFormat2メソッド)を使用します。
⇒PowerPoint VBAの概要については、Excel VBAでオブジェクト指向プログラミング(PowerPoint VBA編)を参照して下さい。

ExportAsFixedFormatメソッド(またはExportAsFixedFormat2メソッド)の使用法

ExportAsFixedFormatメソッド(またはExportAsFixedFormat2メソッド)の使用法は、以下の通りです。

  • Sub ExportAsFixedFormat(Path As String,
  •                                       FixedFormatType As PpFixedFormatType,
  •                                      [Intent As PpFixedFormatIntent =
  •                                       ppFixedFormatIntentScreen],
  •                                      [FrameSlides As MsoTriState],
  •                                      [HandoutOrder As PpPrintHandoutOrder =
  •                                       ppPrintHandoutVerticalFirst],
  •                                      [OutputType As PpPrintOutputType =
  •                                       ppPrintOutputSlides],
  •                                      [PrintHiddenSlides As MsoTriState],
  •                                      [PrintRange As PrintRange],
  •                                      [RangeType As PpPrintRangeType =
  •                                       ppPrintAll],
  •                                      [SlideShowName As String],
  •                                      [IncludeDocProperties As Boolean = False],
  •                                      [KeepIRMSettings As Boolean = True],
  •                                      [DocStructureTags As Boolean = True],
  •                                      [BitmapMissingFonts As Boolean = True],
  •                                      [UseISO19005_1 As Boolean = False],
  •                                      [ExternalExporter])

引数として指定できる項目は下表の通りで、指定必須の引数はPathとFixedFormatTypeだけです。

引数 説明
Path(必須) エクスポート先のパスを指定
FixedFormatType(必須) スライドをエクスポートする形式(※1)を指定
(※1)PpFixedFormatType列挙体で指定
1:ppFixedFormatTypeXPS
2:ppFixedFormatTypePDF
Intent エクスポートの目的(※2)を指定
(※2)PpFixedFormatIntent列挙体で指定
1:ppFixedFormatIntentScreen(既定)
2:ppFixedFormatIntentPrint
FrameSlides スライドをフレームで縁取るかどうか(※3)を指定
(※3)MsoTriState列挙体で指定
0:msoFalse(既定)
-1:msoTrue
HandoutOrder 配布資料を印刷する順序(※4)を指定
(※4)PpPrintHandoutOrder列挙体で指定
1:ppPrintHandoutVerticalFirst(既定)
2:ppPrintHandoutHorizontalFirst
OutputType 出力の種類(※5)を指定
(※5)PpPrintOutputType列挙体で指定
1:ppPrintOutputSlides(既定)
2:ppPrintOutputTwoSlideHandouts
3:ppPrintOutputThreeSlideHandouts
4:ppPrintOutputSixSlideHandouts
5:ppPrintOutputNotesPages
6:ppPrintOutputOutline
7:ppPrintOutputBuildSlides
8:ppPrintOutputFourSlideHandouts
9:ppPrintOutputNineSlideHandouts
10:ppPrintOutputOneSlideHandouts
PrintHiddenSlides 非表示のスライドを印刷するかどうか(※6)を指定
(※6)MsoTriState列挙体で指定
0:msoFalse(既定)
-1:msoTrue
PrintRange スライド範囲を指定
(PrintRangeオブジェクトを指定)
RangeType スライド範囲の種類(※7)を指定
(※7)PpPrintRangeType列挙体で指定
1:ppPrintAll(既定)
2:ppPrintSelection
3:ppPrintCurrent
4:ppPrintSlideRange
5:ppPrintNamedSlideShow
6:ppPrintSection
SlideShowName スライド ショーの名前を指定
IncludeDocProperties ドキュメントのプロパティもエクスポートするかどうかを指定
True:プロパティをコピーする(既定)
False:プロパティをコピーしない
KeepIRMSettings IRM設定もエクスポートするかどうかを指定
True:IRM設定を含める(既定)
False:IRM設定を含めない
DocStructureTags 文書構造タグを含めるかどうかを指定
True:文書構造タグを含める(既定)
False:文書構造タグを含めない
BitmapMissingFonts テキストのビットマップ(フォント)を含めるかどうかを指定
True:フォントを含める(既定)
False:フォントを含めない
UseISO19005_1 ISO 19005-1(PDF/A)に準拠するかどうかを指定
True:ISO 19005-1に準拠する
False:ISO 19005-1に準拠しない(既定)
IncludeMarkup
(ExportAsFixedFormat2メソッドのみ)
ペンマークを含めるかどうかを指定
True:ペンマークを含める
False:ペンマークを含めない(既定)
ExternalExporter IMsoDocExporterインターフェイスへのポインタを指定
(コードの代替実装を呼び出せるアドインへのポインタを指定)

SaveAsメソッドの使用法

Excelとは異なり、PowerPointの場合はPresentationオブジェクトのSaveAsメソッドでも、PDFファイルを作成することができます。
SaveAsメソッドの使用法は、以下の通りです。

  • Sub SaveAs(FileName,
  •                  [FileFormat As PpSaveAsFileType =
  •                   ppSaveAsDefault],
  •                  [EmbedTrueTypeFonts As MsoTriState =
  •                   msoTriStateMixed])

引数として指定できる項目は下表の通りで、指定必須の引数はFileNameだけです。

引数 説明
FileName(必須) 保存するファイルの名前を指定
FileFormat 保存するファイルの形式(※1)を指定
(※1)PpSaveAsFileType列挙体で指定
32:ppSaveAsPDF
(省略時は、11(ppSaveAsDefault)を仮定)
EmbedTrueTypeFonts TrueTypeフォントを埋め込むかどうか(※2)を指定
(※2)MsoTriState列挙体で指定
0:msoFalse(既定)
-1:msoTrue

■PDFファイルを結合するツール(ConcatPDF)

PDFファイルを結合するツールは色々ありますが、コマンド・プロンプトからも使用できるConcatPDFが便利です。

ConcatPDFの使用法

ConcatPDFをインストールすると、インストール先のフォルダにGUI版のConcatPDFW.exeとCUI版のConcatPDF.exeが格納されますので、コマンド・プロンプトから「ConcatPDF」と打てばCUI版を実行できます。

コマンド・プロンプトから「ConcatPDF /help」と入力すると、以下のように使用法が表示されます。

  • ConcatPDF [switches] {input-file}…
  • Switches:
  •   /outfile {file-name} Specify concatenated PDF file name.
  •   /add-outlines Add file names as outline.
  •   /fitting ( XYZ | Fit | FitB ) Set how to fit on a destination page.
  •   /copy-outlines Copy bookmarks from the original file.
  •   /security {128|40} {user-password|"} {master-password|"} {permission}…
  •     permission := ( printing | modify-contents | copy | modify-annotations | fill-in |
  •     screen-readers | assembly | degraded-printing
  •   /viewer {preference}… Set viewer preferences.
  •     preference := ( page-layout-single-page | page-layout-continuous |
  •     page-layout-continuous-facing-left | page-layout-continuous-facing-right |
  •     page-mode-use-none | page-mode-use-outlines | page-mode-use-thumbs |
  •     page-mode-full-screen | hide-toolbar hide-menubar | hide-window-UI |
  •     fit-window | center-window )

単にPDFを結合するだけであれば、以下のように指定するだけで大丈夫です。

  • ConcatPDF /outfile 出力ファイル 入力ファイル1 入力ファイル2 入力ファイル3…

■Excel VBAでコマンドを実行する方法(WshShellオブジェクト)

Excel VBAでコマンド・プロンプトを起動し、コマンドを実行する方法は色々ありますが、本稿ではWshShellオブジェクトをご紹介します。

WshShellオブジェクトはMicrosoftから提供されている、Windows上でスクリプトを実行するためのオブジェクトで、最上位のオブジェクトがWshShellオブジェクトです。
⇒詳細はMicrosoftのサイト(WSH(Windows Script Host)オブジェクト)を参照して下さい。

WshShellオブジェクトの詳細

WshShellオブジェクトで提供されているメソッドとプロパティは下表の通りです。

(WshShellオブジェクトのメソッドとプロパティ)

AppActivateメソッド
説明 アプリケーション・ウィンドウをアクティブにする
定義 Function AppActivate(App As Variant, Wait As Variant) As Boolean
CreateShortcutメソッド
説明 ショートカットを作成する
定義 Function CreateShortcut(PathLink As String) As Object
CurrentDirectoryプロパティ
説明 カレント・ディレクトリを設定/取得
定義 Property CurrentDirectory() As String
Environmentプロパティ(読み取り専用)
説明 WshEnvironment オブジェクト(環境変数のコレクション)を取得
定義 Property Environment(Type As Variant) As IWshEnvironment
Execメソッド
説明 コマンドシェルでアプリケーションを実行する
定義 Function Exec(Command As String) As IWshExec
ExpandEnvironmentStringsメソッド
説明 環境変数を展開した値を返す
定義 Function ExpandEnvironmentStrings(Src As String) As String
LogEventメソッド
説明 イベント・エントリをログ・ファイルに追加する
定義 Function LogEvent(Type As Variant, Message As String, [Target As String]) As Boolean
Popupメソッド
説明 ポップアップ・メッセージ・ボックスにテキストを表示する
定義 Function Popup(Text As String, SecondsToWait As Variant, Title As Variant, Type As Variant) As Integer
RegDeleteメソッド
説明 レジストリから指定されたキーまたは値を削除する
定義 Sub RegDelete(Name As String)
RegReadメソッド
説明 レジストリ内のキー名または値名の値を取得する
定義 Function RegRead(Name As String) As Variant
RegWriteメソッド
説明 レジストリ内のキー名または値名の値を設定する
定義 Sub RegWrite(Name As String, Value As Variant, Type As Variant)
Runメソッド
説明 新しいプロセス内でプログラムを実行する
定義 Function Run(Command As String, [WindowStyle As Variant], [WaitOnReturn As Variant]) As Integer
SendKeysメソッド
説明 キー・ストロークをアクティブなウィンドウに送る
定義 Sub SendKeys(Keys As String, Wait As Variant)
SpecialFoldersプロパティ(読み取り専用)
説明 SpecialFoldersオブジェクト(特定フォルダのコレクション)を返す
定義 Property SpecialFolders() As IWshCollection

WshShellオブジェクトを使用するための事前準備

WshShellオブジェクトを使用するための事前準備は、以下の3ステップです。
⇒オブジェクトを使用するための事前準備とオブジェクトブラウザによる調査方法については、Excel VBAでオブジェクト指向プログラミング(事前準備編)を参照して下さい。

①ライブラリの参照設定
Visual Basic Editor(VBE)のファイルメニューから[ツール]-[参照設定]を選択し、参照設定ダイアログでWindows Script Host Object Modelのチェックボックスにチェックを入れ、[OK]ボタンを押下。

②オブジェクト変数の定義
プログラムの宣言部でオブジェクト変数を定義。

  1. Dim wsh As IWshRuntimeLibrary.WshShell

③インスタンスの生成
プログラムの処理部でインスタンスを生成。

  1. Set wsh = New IWshRuntimeLibrary.WshShell
  2. 'ここにオブジェクトを使用した処理を記述
  3. Set wsh = Nothing

(参考)「Set wsh = New IWshRuntimeLibrary.WshShell」の部分を「Set wsh = CreateObject(“Wscript.Shell")」と記述すれば、ステップ①(ライブラリの参照設定)は不要です。

■複数のファイルをそれぞれPDFファイルに出力し、1つのPDFファイルに結合するツール

指定した入力ファイルをPDFファイルに変換し、結合して1つのPDFファイルを出力するツールですが、予め各ファイルの更新日時を取得し、入力ファイル(Excel,Word,PowerPoint)>出力ファイル(PDF)の場合だけ処理を行う仕様です。

Excelシートのフォーマット

サンプル・プログラムで使用するExcelシートには、3つの入力ファイルと出力ファイルのパスを入力してあり、プログラムを実行すると各ファイルの更新日時をセットした後、入力ファイルの更新日時>出力ファイルの更新日時であれば、PDFファイルを作成します。

なお、サンプル・プログラムで入力するファイルは、1つ目がExcel、2つ目がWord、3つ目がPowerPointです。

(Excelシートのイメージ)

入力ファイル1 C:\work\xxx.xlsx yyyy/mm/dd hh:mm:ss
入力ファイル2 C:\work\xxx.docx yyyy/mm/dd hh:mm:ss
入力ファイル3 C:\work\xxx.pptx yyyy/mm/dd hh:mm:ss
出力ファイル C:\work\xxx.pdf yyyy/mm/dd hh:mm:ss

サンプル・プログラム

行番号23~32で入力ファイル1、行番号34~43で入力ファイル2、行番号45~54で入力ファイル3、行番号56~60で出力ファイルのパスと更新日時を取得しています。
行番号63~65で入力ファイル1(Excelファイル)、行番号68~75で入力ファイル2(Wordファイル)、行番号78~85で入力ファイル3(PowerPointファイル)で各ファイルをPDFファイルに出力し、行番号88~91で1つのPDFファイルに結合しています。
⇒サンプル・プログラムの中で使用しているFileSystemObject(FSO)については、Excel VBAでオブジェクト指向プログラミング(FSO編)を参照して下さい。

  1. Dim sht As Worksheet
  2. Dim wd As Word.Application
  3. Dim doc As Word.Document
  4. Dim pp As PowerPoint.Application
  5. Dim prs As PowerPoint.Presentation
  6. Dim fso As FileSystemObject
  7. Dim wsh As IWshRuntimeLibrary.WshShell
  8. Dim InFilePath1 As String
  9. Dim InFileName1 As String
  10. Dim OutFilePath1 As String
  11. Dim InFilePath2 As String
  12. Dim OutFilePath2 As String
  13. Dim InFilePath3 As String
  14. Dim OutFilePath3 As String
  15. Dim OutPdfPath As String
  16. Dim cmd As String
  17. Dim pos As Integer
  18. Private Sub Sample1()
  19.     Set sht = ActiveSheet
  20.     Set fso = New FileSystemObject
  21.     InFilePath1 = sht.Range(“B1")
  22.     InFileName1 = Dir(InFilePath1)
  23.     pos = InStrRev(InFilePath1, “.")
  24.     If pos > 0 Then
  25.         OutFilePath1 = Left(InFilePath1, pos) & “pdf"
  26.     End If
  27.     If fso.FileExists(InFilePath1) = True Then
  28.         sht.Range(“C1") = fso.GetFile(InFilePath1).DateLastModified
  29.         sht.Range(“C1").NumberFormatLocal = “yyyy/mm/dd hh:mm:ss"
  30.     End If
  31.     InFilePath2 = sht.Range(“B2")
  32.     InFileName2 = Dir(InFilePath2)
  33.     pos = InStrRev(InFilePath2, “.")
  34.     If pos > 0 Then
  35.         OutFilePath2 = Left(InFilePath2, pos) & “pdf"
  36.     End If
  37.     If fso.FileExists(InFilePath2) = True Then
  38.         sht.Range(“C2") = fso.GetFile(InFilePath2).DateLastModified
  39.         sht.Range(“C2").NumberFormatLocal = “yyyy/mm/dd hh:mm:ss"
  40.     End If
  41.     InFilePath3 = sht.Range(“B3")
  42.     InFileName3 = Dir(InFilePath3)
  43.     pos = InStrRev(InFilePath3, “.")
  44.     If pos > 0 Then
  45.         OutFilePath3 = Left(InFilePath3, pos) & “pdf"
  46.     End If
  47.     If fso.FileExists(InFilePath3) = True Then
  48.         sht.Range(“C3") = fso.GetFile(InFilePath3).DateLastModified
  49.         sht.Range(“C3").NumberFormatLocal = “yyyy/mm/dd hh:mm:ss"
  50.     End If
  51.     OutPdfPath = sht.Range(“B4")
  52.     If fso.FileExists(OutPdfPath) = True Then
  53.         sht.Range(“C4") = fso.GetFile(OutPdfPath).DateLastModified
  54.         sht.Range(“C4").NumberFormatLocal = “yyyy/mm/dd hh:mm:ss"
  55.     End If
  56.     If sht.Range(“C1") > sht.Range(“C4") Then
  57.         Workbooks.Open Filename:=InFilePath1
  58.         ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=OutFilePath1
  59.         Workbooks(InFileName1).Close SaveChanges:=False
  60.     End If
  61.     If sht.Range(“C2") > sht.Range(“C4") Then
  62.         Set wd = New Word.Application
  63.         wd.Visible = True
  64.         Set doc = wd.Documents.Open(InFilePath2)
  65.         doc.ExportAsFixedFormat OutputFileName:=OutFilePath2, ExportFormat:=wdExportFormatPDF
  66.         doc.Close
  67.         wd.Quit
  68.         Set doc = Nothing
  69.         Set wd = Nothing
  70.     End If
  71.     If sht.Range(“C3") > sht.Range(“C4") Then
  72.         Set pp = New PowerPoint.Application
  73.         pp.Visible = True
  74.         Set prs = pp.Presentations.Open(InFilePath3)
  75.         prs.ExportAsFixedFormat OutFilePath3, fixedFormattype:=ppExportFormatPDF
  76.         prs.Close
  77.         Set prs = Nothing
  78.         pp.Quit
  79.         Set pp = Nothing
  80.     End If
  81.     If (sht.Range(“C1") > sht.Range(“C4")) Or (sht.Range(“C2") > sht.Range(“C4")) Or (sht.Range(“C3") > sht.Range(“C4")) Then
  82.         Set wsh = New IWshRuntimeLibrary.WshShell
  83.         cmd = “C:\work\ConcatPDF.exe /outfile " & OutPdfPath & " " & OutFilePath1 & " " & OutFilePath2 & " " & OutFilePath3
  84.         wsh.Run cmd
  85.         Set wsh = Nothing
  86.     End If
  87.     Set fso = Nothing
  88. End Sub

 

国本温子(著),緑川吉行(著),できるシリーズ編集部(著)
出版社:インプレス
発売日:2022/3/23
単行本(ソフトカバー):A5判/912ページ

大村あつし(著),古川順平(著)
出版社:技術評論社
発売日:2021/1/9
単行本(ソフトカバー):A5判/800ページ

高橋宣成(著)
出版社:技術評論社
発売日:2019/11/25
単行本(ソフトカバー):B5変形判/576ページ

実用ツール

Posted by hides