2011年8月16日火曜日

Excel VBA bullzipでPDF変換ではまる

結局ExcelのシートをPDFに変換するのに、JustのPDFプリンタだとVBAから設定をいじれないらしいことがわかって、BullzipというPDFプリンタドライバを使うことにした。

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

0 件のコメント:

コメントを投稿