ワークシートを任意の名前の軽量PDFにする
軽量PDFに任意のファイル名を付ける
ワークシートの軽量PDF化
ExcelのワークシートをPDF化するとき、ExportAsFixedFormat
メソッドを用いると、非常に軽快に動作する反面、出来上がったPDFドキュメントのサイズが異様に大きくなってしまう。
JUST PDF等のPDF化ソフトを用いると、設定次第で極めて小さなPDFドキュメントを作成できる反面、基本的に手作業になってしまうので、数が多いと相当めんどくさい。
というわけで、
コイツを作成したのだった。
軽量PDF化ツールの弱点
しかし、そもそも上掲ツールは自動印刷のプリンタをJUST PDFに置き換えているだけなので、そもそも
任意のファイル名を指定することができない
という弱点があった。
たとえば、JUST PDF 3の場合、
このように、①「実行時に設定」するか、②「作成元ファイルと同じ」という設定しかない。
①の場合、任意のファイル名を指定することはできるが、保存するたびにダイアログにファイル名を入力しなければならない。目指すのが自動化である以上、この設定は論外。
②の場合、文字通り「作成元のファイル名」すなわち、「[PDF化したいExcelのブック名].pdf
」という名前にしかならない。差し込み印刷のような感じで、様式にデータを挿入しつつ、一つ一つPDF化したい、というようなときに、まるで使い物にならない。
任意のファイル名を付けて軽量PDFを作成する
そこで、ちょっとやり方を考えてみた。
手順
- 新規ブックを作成する
- 新規ブックに必要な内容を書き込む
- 新規ブックに任意の名前を付けて保存する
- 新規ブックをPDFプリンタで印刷する
- 新規ブックを閉じる
- 新規ブックを削除する
かなり乱暴なやり方だが、このようにしてみた。
任意の名前の軽量PDFを作成するマクロ
ワークシートにテキトーに文字列を書き込んで、そのワークシートに任意の名前を付けて軽量PDF化するコードを書いてみた。
リスト1 標準モジュール
Public Sub test() Dim ar(1 To 10, 1 To 10) As Variant '……(1)' Dim i As Long Dim j As Long For i = 1 To 10 For j = 1 To 10 ar(i, j) = "ち~んw" Next Next Dim newBook As Workbook '……(2)' Set newBook = Workbooks.Add Dim targetFileName As String '……(3)' targetFileName = ThisWorkbook.Path & "\ち~んw.xlsx" Call newBook.SaveAs(FileName:=targetFileName) Dim rng As Range '……(4)' Set rng = newBook.Worksheets(1).Range("A1").Resize(10, 10) rng.Value = ar Dim originPrinter As String '……(5)' originPrinter = Application.ActivePrinter Application.ActivePrinter = "JUST PDF 3 on Ne03:" '……(6)' Call newBook.Worksheets(1).PrintOut Call newBook.Close(SaveChanges:=False) Dim fsObj As New FileSystemObject '……(7)' With fsObj If .FileExists(targetFileName) Then _ Call .DeleteFile(targetFileName) End With Application.ActivePrinter = originPrinter Set newBook = Nothing Set fsObj = Nothing End Sub
内容がしょうもない割にタテ長のコードになってしまってすまない。
まずは、(1)からの8行、
Dim ar(1 To 10, 1 To 10) As Variant Dim i As Long Dim j As Long For i = 1 To 10 For j = 1 To 10 ar(i, j) = "ち~んw" Next Next
後で、新規ブックに書き込むために10×10の「ち~んw」が入った配列を準備。
(2)からの2行
Dim newBook As Workbook Set newBook = Workbooks.Add
で、新規ブックを作成。
(3)からの3行
Dim targetFileName As String targetFileName = ThisWorkbook.Path & "\ち~んw.xlsx" Call newBook.SaveAs(FileName:=targetFileName)
で、(2)で作成した新規ブックに、SaveAs
メソッドで「ち~んw.xlsx
」というファイル名を付けて保存。
この新規ブックのフルパスは、後で使うので変数targetFileName
に入れておく。
(4)からの3行
Dim rng As Range Set rng = newBook.Worksheets(1).Range("A1").Resize(10, 10) rng.Value = ar
で新規ブックの一つ目のワークシートのA1セルを起点とする10×10の範囲に、(1)で作成した配列を活用して「ち~んw」を書き込む。
(5)からの2行
Dim originPrinter As String originPrinter = Application.ActivePrinter
で、現在のActivePrinter
プロパティの値を取得しておく。後で使用中のプリンタを元に戻すために用いる。
(6)からの3行
Application.ActivePrinter = "JUST PDF 3 on Ne03:" Call newBook.Worksheets(1).PrintOut Call newBook.Close(SaveChanges:=False)
で、一旦PDFプリンタに切り替えて印刷(すなわちPDF化)し、新規ブックを保存せずに閉じている。
「JUST PDF 3 on Ne03:
」の部分は、うちの環境でこうなっている、というだけなので、異なる環境のもとでは適宜改める必要がある。
これで、(JUST PDF 3使用の場合、)設定で「ファイル名」を「作成元ファイルと同じ」にしておくと、「保存先」で指定したフォルダ内に任意の名前(今回の場合だと「ち~んw.pdf
」。)のPDFができる。
あとは、(7)からの5行
Dim fsObj As New FileSystemObject With fsObj If .FileExists(targetFileName) Then _ Call .DeleteFile(targetFileName) End With
で、FileSystemObject
のDelete
メソッドを用いてPDFの作成元ブック(新規ブック)を削除しておしまい。たった一つのファイルを消すためにわざわざFileSystemObject
のインスタンスを作成するというこの
割鷄焉用牛刀感
たるやwww
まあ、FileSystemObject
の練習中ということで勘弁してくだされ。
実行
リスト1を実行して、PDF保存用のフォルダを覗くと……、
ほれ。このように「ち~んw.pdf
」が燦然と輝いておる!
開いてみると、
バッチリ。
おわりに
かなり乱暴なやり方だという自覚はあります。