VBA из Excel не удается распечатать через PDFCreator после цикла - PullRequest
0 голосов
/ 31 января 2012

Я написал некоторый код для получения информации из 3 столбцов на первой вкладке (1000 строк данных) для заполнения данных на второй вкладке (для создания формы письма на основе адреса информации учетной записи и т. Д.).Код вводится в Do While, и проблема возникает после отправки PDF в очередь, когда код продолжает цикл.Ошибка возникает только при выполнении кода, при пошаговом выполнении кода проблем нет.

Я пробовал это как в 2003, так и в 2007 году с похожими результатами (2003 напечатает 3 файла, и я получил2007 для печати до 6 файлов)

Я также пытался добавить ручную задержку с

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

и после того, как задание входит в очередь печати

 Sleep 3000 

Я также добавил цикл «До», чтобы дождаться, пока задания на печать упадут до нуля, но безуспешно.

Полный код:

Sub PlaceData()

Dim accountNumber As String
Dim partyID As String
Dim ClientAddress As String
Dim bRestart As Boolean
Dim totalAccounts As Long
Dim pdfjob As PDFCreator.clsPDFCreator
Dim dataPage As Worksheet
Dim letterPage As Worksheet
Dim CB As Workbook 'CB = ClientBook

Set CB = ThisWorkbook
Set dataPage = CB.Sheets("Data")
Set letterPage = CB.Sheets("Letter")


'will iterate through the account numbers down

therow = 1
'where the loop starts
totalAccounts = dataPage.Cells(Rows.Count, 1).End(xlUp).Row

Do While therow < totalAccounts
therow = therow + 1

'for the form letter

letterPage.Range("F4").FormulaR1C1 = dataPage.Range("A" & therow)
letterPage.Range("F5").FormulaR1C1 = dataPage.Range("C" & therow)
letterPage.Range("B10").FormulaR1C1 = dataPage.Range("B" & therow)


'accountnumber minus one digit for the file name
accountNumber = letterPage.Range("F4").Text
accountNumberShort = Mid(accountNumber, 1, 8)

On Error GoTo EarlyExit
Application.ScreenUpdating = False
Set pdfjob = New PDFCreator.clsPDFCreator
sPDFPath = ActiveWorkbook.Path & Application.PathSeparator

'Check if PDFCreator is already running and attempt to kill the process if so

Do
    bRestart = False
    Set pdfjob = New PDFCreator.clsPDFCreator
    If pdfjob.cStart("/NoProcessingAtStartup") = False Then
        'PDF Creator is already running.  Kill the existing process
        Shell "taskkill /f /im PDFCreator.exe", vbHide
        DoEvents
        Set pdfjob = Nothing
        bRestart = True
    End If
Loop Until bRestart = False

With pdfjob
    .cOption("UseAutosave") = 1
    .cOption("UseAutosaveDirectory") = 1
    .cOption("AutosaveDirectory") = sPDFPath
    .cOption("AutosaveFilename") = accountNumberShort
    .cOption("AutosaveFormat") = 0    ' 0 = PDF
    .cClearCache
End With

        'Delete the PDF if it already exists
        If Dir(sPDFPath & accountNumberShort) = accountNumberShort Then Kill (sPDFPath & accountNumberShort)

'Print the document to PDF

        letterPage.PrintOut copies:=1, ActivePrinter:="PDFCreator"

        'Wait until the print job has entered the print queue
        Do Until pdfjob.cCountOfPrintjobs = 1
            DoEvents
        Loop
        pdfjob.cPrinterStop = False

 'Wait until PDF creator is finished then release the objects

        Do Until pdfjob.cCountOfPrintjobs = 0
            DoEvents
        Loop

Loop

'where the loop will end and where the issue is (I think)

'cleanups

Cleanup:
'Release objects and terminate PDFCreator
Set pdfjob = Nothing
Shell "taskkill /f /im PDFCreator.exe", vbHide
On Error GoTo 0
Application.ScreenUpdating = True
Exit Sub

EarlyExit:
'Inform user of error, and go to cleanup section
MsgBox "There was an error encountered.  PDFCreator has" & vbCrLf & _
       "has been terminated.  Please try again.", _
       vbCritical + vbOKOnly, "Error"
Resume Cleanup

Set CB = Nothing
Set dataPage = Nothing
Set letterPage = Nothing
Set pdfjob = Nothing

End Sub

Спасибо за любой ввод илипредложения,

1 Ответ

0 голосов
/ 27 марта 2014

Я хотел бы добавить правильное удаление PDFCreator (PDFC) после того, как выполнит свою работу, потому что неправильное удаление может вызвать проблемы при повторных запусках PDFC (оставшийся процесс, ресурсы и т. Д.).Все примеры кода, поставляемые с PDFC, реализуют утилизацию как минимум на минимальном уровне, т.е. они вызывают как минимум метод clsPDFCreator.cClose().

Например, проверьте файл примера C:\Program Files (x86)\PDFCreator\COM\VB6\Sample1\Form1.frm (укажите путь, если вы установили PDFC в другой каталог).Код, найденный в образце:

 If noStart = False Then
   PDFCreator1.cClose   ' sending cleanup&exit request to PDFCreator
   While PDFCreator1.cProgramIsRunning ' loop while PDFCreator is not found finished
     DoEvents
     Sleep 100 ' polling interval 100 ms
   Wend
 End If

 Set PDFCreator1 = Nothing
 Set pErr = Nothing
 Set opt = Nothing

Другие образцы, отправленные иногда, показывают некоторые дополнительные уловки, но ни один не пропускает часть утилизации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...