Делать, пока не работает как исключение, цикл никогда не останавливается - PullRequest
0 голосов
/ 24 июня 2019

Я пытаюсь автоматически отправить на принтер все файлы .pdf из папки.

Вот код, который я пытаюсь


Option Explicit

Declare Function apiShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _
    ByVal hwnd As Long, _
    ByVal lpOperation As String, _
    ByVal lpFile As String, _
    ByVal lpParameters As String, _
    ByVal lpDirectory As String, _
    ByVal nShowCmd As Long) _
    As Long

Public Sub PrintFile(ByVal strPathAndFilename As String)

    Call apiShellExecute(Application.hwnd, "print", strPathAndFilename, vbNullString, vbNullString, 0)

End Sub

Sub Test()

Dim filepath As String
Dim currfile As String
Dim wrdApps As Object
Dim wrdDoc As Object

Set wrdApps = CreateObject("Word.Application")
filepath = ActiveWorkbook.Path & "\AIMPRIMER\"
currfile = Dir(filepath & "*.PDF")

Do While currfile <> ""

    PrintFile (filepath + currfile)

    currfile = Dir()
Loop

End Sub


Do While Используется для просмотра всех файлов PDF из папки

PrintFile (filepath + currfile) Необходимо отправить текущий файл на принтер.

Я за исключением этого, чтобы распечатать все .pdf один раз, но на самом деле цикл do while работает не так, как принято, цикл do while работает циклично и никогда не останавливается.

Я попытался: Debug.Print filepath + currfile здесь я получил один путь ко всем .PDF один раз, но этот путь не отправляется один раз на принтер.

Так что я не понимаю, почему Debug.Print filepath + currfile работает хорошо, и когда я использую PrintFile (filepath + currfile), принтер печатает и никогда не прекращает печать ...

1 Ответ

2 голосов
/ 24 июня 2019

Кажется, что вызов API сбрасывает Dir, хотя я не могу воспроизвести эту проблему (кажется, что моя первоначальная попытка действительно вызвала бесконечный цикл, но я не могу воспроизвести его секундувремя...).Лучше всего построить список файлов first .

Dim filepath$, currfile$, item
Dim files As New Collection

filepath = "C:\debug\"
currfile = Dir(filepath & "*.pdf")
' build a list of files to be printed later
Do While currfile <> ""
    files.Add filepath + currfile
    currfile = Dir()
Loop
' print each file in the list we created in previous loop
For Each item In files
    PrintFile currfile
Next
...