Давным-давно я использовал PDFPrinter с открытым исходным кодом в сочетании с Excel. Вот часть кода, который я написал, который, кажется, делает то, что вы хотите. Может быть, вы можете использовать это как начало для собственного решения?
'Print the saved file as a pdf in the same directory
KTCurrentFilePath = ActiveWorkbook.Path 'Store current FilePath
'Define Variables for PDF printjob
Dim pdfjob As Object
Dim KTPDFName As String
Dim KTPDFPath As String
Dim KTPCurrentPrinter As String
'Установить переменные значения
KTPDFName = Range("MyPDFName").Value & ".pdf"
KTPDFPath = ActiveWorkbook.Path & Application.PathSeparator
KTPCurrentPrinter = Application.ActivePrinter
'Проверьте, не заполнен ли рабочий лист, и выйдите, если так
If IsEmpty(ActiveSheet.UsedRange) Then Exit Sub
'Запустить PDF Engine
Set pdfjob = CreateObject("PDFCreator.clsPDFCreator")
On Error GoTo 0
With pdfjob
If .cStart("/NoProcessingAtStartup") = False Then
MsgBox "Can't initialize PDFCreator.", vbCritical + _
vbOKOnly, "PrtPDFCreator"
Application.ActivePrinter = KTPCurrentPrinter
Exit Sub
End If
.cOption("UseAutosave") = 1
.cOption("UseAutosaveDirectory") = 1
.cOption("AutosaveDirectory") = KTPDFPath
.cOption("AutosaveFilename") = KTPDFName
.cOption("AutosaveFormat") = 0 ' 0 = PDF
.cClearCache
End With
'Распечатать документ в формате PDF
ActiveSheet.PrintOut copies:=1, ActivePrinter:="PDFCreator"
'Подождите, пока задание на печать не войдет в очередь печати
Do Until pdfjob.cCountOfPrintjobs = 1
DoEvents
Loop
pdfjob.cPrinterStop = False
'Дождитесь окончания создания PDF, затем отпустите объекты
Do Until pdfjob.cCountOfPrintjobs = 0
DoEvents
Loop
pdfjob.cClose
Set pdfjob = Nothing
'Сбросить настройки принтера по умолчанию
Application.ActivePrinter = KTPCurrentPrinter
End Sub
С уважением,
Роберт Ильбринк