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

EXCEL VBAからシートのPDF変換を行う - BullZip PDF Printer - Developer☆STYLE
の補足です。

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

というエラーに対する対処です。残念ながら、私の環境ではエラーが出てないので、あくまでご参考ということになってしまいます。

環境

  • Windows 7
  • Excel2003 SP3
  • BullZip PDF Printer 7.1.1078

参考になったページ(コメント下さったirmrさんより)

さて、手順です。

DOSプロンプトから、Bullzipの環境変数を表示します。

"C:\Program Files\Bullzip\PDF Printer\gui.exe" info

※インストール先が違う場合は読み替えて下さい。


runonceというセクションを確認します。

C:\Users\[logonName]\AppData\Local\PDF Writer\Bullzip PDF Printer

とあるので、このディレクトリを控えておきます。

settings.iniの作成

runonceセクションのディレクトリに settings.ini というファイル名でテキストファイルを作成します。
※[logonName]の部分は読み替えて下さい。
※outputの部分が保存先になります。

settings.ini

output="C:\test.pdf"
showsettings=never

VBAを記述して、マクロからPrintSheetAsPDFを呼び出せば完了です

'*****************************************************
'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