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も再開しようかな。まだ面白い本が何冊か残ってるんだよなー。



