Excel VBAで実用ツール(PDFファイル編)
■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]ボタンを押下。
②オブジェクト変数の定義
プログラムの宣言部でオブジェクト変数を定義。
- Dim wsh As IWshRuntimeLibrary.WshShell
③インスタンスの生成
プログラムの処理部でインスタンスを生成。
- Set wsh = New IWshRuntimeLibrary.WshShell
- 'ここにオブジェクトを使用した処理を記述
- 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編)を参照して下さい。
- Dim sht As Worksheet
- Dim wd As Word.Application
- Dim doc As Word.Document
- Dim pp As PowerPoint.Application
- Dim prs As PowerPoint.Presentation
- Dim fso As FileSystemObject
- Dim wsh As IWshRuntimeLibrary.WshShell
- Dim InFilePath1 As String
- Dim InFileName1 As String
- Dim OutFilePath1 As String
- Dim InFilePath2 As String
- Dim OutFilePath2 As String
- Dim InFilePath3 As String
- Dim OutFilePath3 As String
- Dim OutPdfPath As String
- Dim cmd As String
- Dim pos As Integer
- Private Sub Sample1()
- Set sht = ActiveSheet
- Set fso = New FileSystemObject
- InFilePath1 = sht.Range(“B1")
- InFileName1 = Dir(InFilePath1)
- pos = InStrRev(InFilePath1, “.")
- If pos > 0 Then
- OutFilePath1 = Left(InFilePath1, pos) & “pdf"
- End If
- If fso.FileExists(InFilePath1) = True Then
- sht.Range(“C1") = fso.GetFile(InFilePath1).DateLastModified
- sht.Range(“C1").NumberFormatLocal = “yyyy/mm/dd hh:mm:ss"
- End If
- InFilePath2 = sht.Range(“B2")
- InFileName2 = Dir(InFilePath2)
- pos = InStrRev(InFilePath2, “.")
- If pos > 0 Then
- OutFilePath2 = Left(InFilePath2, pos) & “pdf"
- End If
- If fso.FileExists(InFilePath2) = True Then
- sht.Range(“C2") = fso.GetFile(InFilePath2).DateLastModified
- sht.Range(“C2").NumberFormatLocal = “yyyy/mm/dd hh:mm:ss"
- End If
- InFilePath3 = sht.Range(“B3")
- InFileName3 = Dir(InFilePath3)
- pos = InStrRev(InFilePath3, “.")
- If pos > 0 Then
- OutFilePath3 = Left(InFilePath3, pos) & “pdf"
- End If
- If fso.FileExists(InFilePath3) = True Then
- sht.Range(“C3") = fso.GetFile(InFilePath3).DateLastModified
- sht.Range(“C3").NumberFormatLocal = “yyyy/mm/dd hh:mm:ss"
- End If
- OutPdfPath = sht.Range(“B4")
- If fso.FileExists(OutPdfPath) = True Then
- sht.Range(“C4") = fso.GetFile(OutPdfPath).DateLastModified
- sht.Range(“C4").NumberFormatLocal = “yyyy/mm/dd hh:mm:ss"
- End If
- If sht.Range(“C1") > sht.Range(“C4") Then
- Workbooks.Open Filename:=InFilePath1
- ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=OutFilePath1
- Workbooks(InFileName1).Close SaveChanges:=False
- End If
- If sht.Range(“C2") > sht.Range(“C4") Then
- Set wd = New Word.Application
- wd.Visible = True
- Set doc = wd.Documents.Open(InFilePath2)
- doc.ExportAsFixedFormat OutputFileName:=OutFilePath2, ExportFormat:=wdExportFormatPDF
- doc.Close
- wd.Quit
- Set doc = Nothing
- Set wd = Nothing
- End If
- If sht.Range(“C3") > sht.Range(“C4") Then
- Set pp = New PowerPoint.Application
- pp.Visible = True
- Set prs = pp.Presentations.Open(InFilePath3)
- prs.ExportAsFixedFormat OutFilePath3, fixedFormattype:=ppExportFormatPDF
- prs.Close
- Set prs = Nothing
- pp.Quit
- Set pp = Nothing
- End If
- If (sht.Range(“C1") > sht.Range(“C4")) Or (sht.Range(“C2") > sht.Range(“C4")) Or (sht.Range(“C3") > sht.Range(“C4")) Then
- Set wsh = New IWshRuntimeLibrary.WshShell
- cmd = “C:\work\ConcatPDF.exe /outfile " & OutPdfPath & " " & OutFilePath1 & " " & OutFilePath2 & " " & OutFilePath3
- wsh.Run cmd
- Set wsh = Nothing
- End If
- Set fso = Nothing
- End Sub
出版社:インプレス
発売日:2022/3/23
単行本(ソフトカバー):A5判/912ページ
出版社:技術評論社
発売日:2021/1/9
単行本(ソフトカバー):A5判/800ページ
出版社:技術評論社
発売日:2019/11/25
単行本(ソフトカバー):B5変形判/576ページ
ディスカッション
コメント一覧
まだ、コメントがありません