Excel VBA PDFといったキーワードでググればすぐに行き着くこのblog
EXCEL VBAからシートのPDF変換を行う - BullZip PDF Printer - Developer☆STYLE
でサンプルコードが手に入り、さらにBullzipの配布元のサンプルコードも読むことができる。
COM Automation from VB Script
ただ、児童の氏名からファイル名を作って、どんどんActiveSheet.PrintOutとやると動作がおかしくなる。具体的には
Set objPrinterSettings = CreateObject("Bullzip.PDFPrinterSettings") For i=1 to 40 WorkSheets("学級入力シート").Range("AD12")=i if WorkSheet("学級入力シート").Range("B16")<>"" Then '児童名のセルが空白でないなら savePath=ActiveWorkbook.Path & "¥" & WorkSheet("学級入力シート").Range("B16") & "_様式1.pdf" With objPrinterSettings .SetValue "output", savePath .SetValue "showsettings", "never" .SetValue "ShowPDF", "no" .SetValue "ShowProgress", "no" .SetValue "ShowProgressFinished", "no" .WriteSettings True End With WorkSheets("学級入力シート").PrintOut from:=1,to:=1 End if Next iま、こんな感じでファイル名を指定して、PDF変換中や変換後にあれこれ問い合わせをしない状態で、40人分いっぺんにPDFに変換できる、はずなのだが、なぜかうまくいかないで悩んだ。
症状としては、「アンパンマン.pdf」なのに、中身はカレーパンマン、というふうにファイル名と変換されるシートが一致しない。ところが、ブレークポイント作ってステップ実行すると思った通りの動作をする、という。これには頭を抱えた。
結論からいうと、Next iの前に
Application.Wait("0:00:02")
と2秒ほどのWaitを入れるといいことがわかった。
objPrinterSettings.WriteSettings TrueでPDFプリンタドライバの.iniファイルに設定を書き込んでいるので、少しだけ待ってやらないとPDF変換のほうがiniファイル書き込みを追い越してしまうらしい。
いやー、わかったときはガッツポーズでありました。
やはり、VBAといえどもプログラミングはおもしろい。そろそろCocoaも再開しようかな。まだ面白い本が何冊か残ってるんだよなー。