EXCEL VBAからシートのPDF変換を行う - BullZip PDF Printer

[2009-12-17]頂いたコメントを元に追記しました。

PDFファイルを作成可能なフリーソフト「BullZip PDF Printer」 - GIGAZINEで紹介されていた、無償のPDF作成ツール。

既に常用している方も多いのではないでしょうか。

本家(FREE PDF Printer)を覗いてみると、

Features

  • COM/ActiveX interface for programmatic control.
FREE PDF Printer

の文字が。VBVBAからPDF変換の機能を利用できるのでは?と考え付きました。

ヒントはユーザガイドにあります。

COM Automation

All examples where COM Automation (ActiveX) is used to control the printer must use a different Program ID. Some examples may contain the code below:
CreateObject("bioPDF.PDFPrinterSettings")

This should be changed to:
CreateObject("Bullzip.PDFPrinterSettings")

PDF Printer - User Guide

詳細は、bioPDF*1のサイトに飛ばされつつ、

COM Automation from Visual Basic Scriptingにサンプルが落ちています。


[2009-12-17追記]
コメント下さったirmrさんからの提供情報です。
Create a PDF from Microsoft Excelにズバリなサンプルがありました。



EXCELの標準モジュールを利用して、早速PDF変換してみました。以下がそのコードです。

'*****************************************************
'Bullzip PDF Printerを使ったPDF作成
'アクティブなワークシートを、C:\text.pdfに保存します。

'Bullzip PDF Printerのインストール必須
'*****************************************************
Sub PrintSheetAsPDF()
    Dim objPrinterSettings As Object
    Dim printerName As String
    Dim savePath As String

    Set objPrinterSettings = CreateObject("Bullzip.PDFPrinterSettings")
    
    printerName = "Bullzip PDF Printer" 'プリンタ名
    Dim fullPrinterName As String
    fullPrinterName = GetFullNetworkPrinterName(printerName)

    '保存するためのプリンタ設定を行う
    savePath = "C:\test.pdf" '保存先
    With objPrinterSettings
        .SetValue "output", savePath
        .SetValue "showsettings", "never"
        .WriteSettings True
    End With
    
    'アクティブなプリンタを一時的にBullzipに変更
    printerBuf = Application.ActivePrinter
    ActivePrinter = fullPrinterName
    
    'PDFに変換
    ActiveSheet.PrintOut
    
    'アクティブなプリンタを戻す
    ActivePrinter = printerBuf
    
End Sub

'*****************************************************
'ネットワークプリンタ名を取得する
' @param printerName : プリンタ名
' @return [printerName] on Ne99: 形式のプリンタ名 
'*****************************************************
Function GetFullNetworkPrinterName(printerName As String) As String
    Dim currentPrinterName As String
    Dim temp_printer_name As String
    Dim i As Long
    
    currentPrinterName = Application.ActivePrinter
    i = 0
    Do While i < 100
        tempPrinterName = printerName & " on Ne" & Format(i, "00") & ":"
        On Error Resume Next
        Application.ActivePrinter = tempPrinterName
        On Error GoTo 0
        If Application.ActivePrinter = tempPrinterName Then
            GetFullNetworkPrinterName = tempPrinterName
            Exit Do
        End If
        i = i + 1
    Loop
    Application.ActivePrinter = currentPrinterName
End Function


[2009-12-17追記]
コメント下さった、tecnoさん、irmrさんからの情報です。

「Error creating object: BullzipPdfSettings. Error-2147024894:ファイルまたはアセンブリ名BullzipPdfWrter、またはその依存関係の1つが見つかりませんでした。」

というエラーに対する対処法を頂きました。対策はコメントを参考にしてみてください。
VBAを書けるスキルが要求されると思います。

*1:PDF Writerというのを作っているデンマークの会社だそうです。BullZipとの関係は良く分かりません...