Word-Dokumente in Ordnerstruktur in der richtigen Reihenfolge drucken

  • VBScript

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von peterfido.

    Word-Dokumente in Ordnerstruktur in der richtigen Reihenfolge drucken

    Hallo zusammen,

    ich bin ein VBS Neuling und habe folgendes Problem:
    Ich habe mir mühselig ein Script zusammengebastelt, das alle Word-Dokumente in einer Ordnerstruktur mit Unterordnern ausdruckt.

    Da die gedruckten Dokumente anschließend als Dokument gebunden werden sollen, ist es natürlich wichtig, dass die einzelnen Dokumente in der richtigen Reihenfolge gedruckt werden.

    Jedoch scheint die Druckreihenfolge innerhalb eines Unterordners wahllos zu sein oder von einer anderen Dateieigenschaft (z. B. Erstellungsdatum??) abzuhängen.
    Oder anders gesagt: die Zeile "For Each file In fldr.Files" macht nicht das was ich will.

    Ich bin für jede Hilfe und Erklärung dankbar.

    Viele Grüße,
    taxischeria

    Hier mein Code:

    Visual Basic-Quellcode

    1. 'Pfad zu den Dokumenten wählen
    2. AuswahlTitel = "Bitte Datei oder Verzeichnis auswählen"
    3. StartOrdner = "17" 'Arbeitsplatz
    4. Set Dateiauswahl = CreateObject("Shell.Application").BrowseForFolder(0,AuswahlTitel,16,StartOrdner)
    5. Set Ordner = Dateiauswahl.Self
    6. 'Erweiterungen der Dateien die bearbeitet werden sollen
    7. arrFileExtensions = Array("doc","docx","docm")
    8. ' -------------------------------------------------
    9. Set fso = CreateObject("Scripting.Filesystemobject")
    10. Set objWord = CreateObject("Word.Application")
    11. Set objShell = CreateObject("Wscript.Shell")
    12. Dim intDocCount, intErrCount
    13. 'Applikation anzeigen und eventuelle Dialoge für Batchbetrieb unterdrücken
    14. objWord.Visible = True
    15. objWord.DisplayAlerts = 0
    16. 'Im Ordner Rekursiv alle Word-Dokumente verarbeiten
    17. Druckeinstellung = True
    18. parseFolders fso.GetFolder(Ordner.Path), True
    19. 'Das Anzeigen von Benachrichtigungen wieder aktivieren und Word schließen
    20. objWord.DisplayAlerts = -1
    21. objWord.Quit True
    22. Set fso = Nothing
    23. Set objWord = Nothing
    24. If intErrCount = 0 Then
    25. MsgBox "Es wurden insgesamt " & intDocCount & " Dokumente verarbeitet.", vbInformation, "Verarbeitung abgeschlossen"
    26. Else
    27. MsgBox "Es wurden insgesamt " & intDocCount & " Dokumente verarbeitet." & vbCrLf & "Davon ist bei " & intErrCount & " Dokumenten ein Fehler aufgetreten!", vbInformation, "Verarbeitung abgeschlossen"
    28. objShell.Run "Notepad.exe " & Ordner.Path & "\logfile_Druck.txt"
    29. End If
    30. 'Ende
    31. Function parseFolders(fldr, boolRecursion)
    32. For Each file In fldr.Files
    33. For i = 0 To UBound(arrFileExtensions)
    34. If LCase(arrFileExtensions(i)) = LCase(fso.GetExtensionName(file.Path)) Then
    35. intDocCount = intDocCount + 1
    36. 'Fehlerbehandlung für den Fall das ein Fehler beim Öffnen eines Dokumentes auftritt
    37. On Error Resume Next
    38. Set objDoc = objWord.Documents.Open(file.Path)
    39. If Err.Number <> 0 Then
    40. intErrCount = intErrCount + 1
    41. WriteLog "!!ERROR!! Fehler beim öffnen der Datei: -> '" & file.Path & "'"
    42. Else
    43. '----- Dokument drucken -----------
    44. If Druckeinstellung = True Then
    45. objWord.Dialogs(88).Show
    46. Druckeinstellung = False
    47. End If
    48. objDoc.PrintOut
    49. objDoc.Close
    50. WriteLog "Dokument wurde gedruckt: ->'" & file.Path & "' --> '" & strPathPDF & "'"
    51. End if
    52. Exit For
    53. End If
    54. Next
    55. Next
    56. 'Funktion wird rekursiv aufrufen wenn das durchsuchen aller Unterordner gewünscht ist
    57. If boolRecursion Then
    58. For Each subFolder in fldr.SubFolders
    59. parseFolders subFolder, True
    60. Next
    61. End If
    62. End Function
    63. Function WriteLog(strText)
    64. Set objLog = fso.OpenTextFile(Ordner.Path & "\logfile_Druck.txt",8,True)
    65. logline = Now & " - " & strText
    66. objLog.WriteLine(logline)
    67. objLog.Close
    68. End Function


    VB-BBCode eingefügt, bitte demnächst selbst dran denken!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Hallo,

    das ist 'normales' Verhalten. Die Dateien / Ordner werden nach Inhaltsverzeichnis ausgegeben. Der Explorer z.B. sortiert diese dann standardmäßig nach Namen.

    Willst Du die Reihenfolge nach bestimmten Kriterien selbst bestimmen, dann hilft zwischenspeichern in einem Array, das Array sortieren und dann drucken.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Hallo peterfido,

    vielen Dank für Deine Hilfe. Ich habe mir mal ein paar Beispiele zum Füllen von Arrays und zum "Bubbelsort" angeschaut und versucht das in meinen Code einzubauen.
    Leider schaffe ich es nicht, dass das Array gefüllt wird (an manchen Stellen frage ich Zwischenergebnisse mit einer MsgBox ab).
    Ich fürchte ich bräuchte nochmal einen kleinen Denkanstoß, was ich hier falsch mache...

    Untenstehend meine abgeänderte Function "parseFolders".

    Vielen Dank nochmal und viele Grüße,
    taxischeria


    Visual Basic-Quellcode

    1. Function parseFolders(fldr, boolRecursion)
    2. 'Array initialisieren
    3. Dim arr
    4. Redim arr (0)
    5. Dim Zaehler
    6. Zaehler = 0
    7. For Each file In fldr.Files
    8. For i = 0 To UBound(arrFileExtensions)
    9. If LCase(arrFileExtensions(i)) = LCase(fso.GetExtensionName(file.Path)) Then
    10. intDocCount = intDocCount + 1
    11. 'Fehlerbehandlung für den Fall das ein Fehler beim Öffnen eines Dokumentes auftritt
    12. On Error Resume Next
    13. 'Array füllen
    14. arr(Zaehler) = file
    15. MsgBox(arr(Zaehler))
    16. 'Array vergrößern
    17. Zaehler = Zaehler + 1
    18. Redim arr(Zaehler)
    19. Exit For
    20. End If
    21. Next
    22. Next
    23. 'Bubblesort
    24. for s = 0 to ubound(arr)
    25. for t = s + 1 to ubound(arr)
    26. if arr(s) > arr(t) then
    27. arrTemp = arr(s)
    28. arr(s) = arr(t)
    29. arr(t) = arrTemp
    30. end if
    31. next
    32. next
    33. 'Schleife über Array
    34. For v = 0 to Zaehler
    35. NewFile = arr(v)
    36. MsgBox(NewFile)
    37. Set objDoc = objWord.Documents.Open(NewFile.Path)
    38. If Err.Number <> 0 Then
    39. intErrCount = intErrCount + 1
    40. WriteLog "!!ERROR!! Fehler beim öffnen der Datei: -> '" & NewFile.Path & "'"
    41. Else
    42. '----- Dokument drucken -----------
    43. If Druckeinstellung = True Then
    44. objWord.Dialogs(88).Show
    45. Druckeinstellung = False
    46. End If
    47. 'objDoc.PrintOut
    48. MsgBox(NewFile.path)
    49. objDoc.Close
    50. WriteLog "Dokument wurde gedruckt: ->'" & NewFile.Path & "' --> '" & strPathPDF & "'"
    51. End if
    52. next
    53. 'Funktion wird rekursiv aufrufen wenn das durchsuchen aller Unterordner gewünscht ist
    54. If boolRecursion Then
    55. For Each subFolder in fldr.SubFolders
    56. parseFolders subFolder, True
    57. Next
    58. End If
    59. End Function


    VB-BBCode eingefügt, bitte demnächst selbst dran denken!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Hallo,

    folgender Code, als VBS-Datei gespeichert, erstellt eine Textdatei mit dem Inhalt des Ordners, welcher auf die VBS draufgezogen wurde. Sortiert wird entweder nach Namen oder chronologisch.

    Visual Basic-Quellcode

    1. Option Explicit
    2. dim Dateiname,fSO, fSO1, WshShell, Treffer, Unterordner, DatumSort, objFile, Pfad, Arg, L, D, S
    3. dim Dateien()
    4. Const Maxalter = 63, ForReading = 1, ForWriting = 2, ForAppending = 8
    5. Unterordner=1
    6. DatumSort=1
    7. Treffer=0
    8. Set fSO = CreateObject("Scripting.FileSystemObject")
    9. if WScript.Arguments.count > 0 then
    10. For Each Arg in Wscript.Arguments
    11. Pfad = WScript.Arguments(0)
    12. if fso.FolderExists(Arg) then
    13. Pfad=Arg
    14. if right(Pfad,1)="\" then
    15. Dateiname = left(Pfad, len(Pfad)-1) & " Inhalt.txt"
    16. else
    17. Dateiname = Pfad & " Inhalt.txt"
    18. end if
    19. Los
    20. else
    21. msgbox "Ungültiger Ordner: " & Pfad, vbokonly+vbcritical, "Ordnerkontrolle"
    22. end if
    23. next
    24. else
    25. msgbox "Es wurde kein Ordner mit übergeben", vbokonly+vbcritical, "Ordnerkontrolle"
    26. end if
    27. Set fSO = Nothing
    28. private Sub Los()
    29. redim Dateien(0)
    30. Set fSO1 = CreateObject("Scripting.FileSystemObject")
    31. err.clear
    32. on error resume next
    33. if fSO1.FileExists(Dateiname) = true then
    34. fso1.DeleteFile Dateiname
    35. end if
    36. if err.number=0 then
    37. on error goto 0
    38. Dateienlesen Pfad
    39. else
    40. err.clear
    41. on error goto 0
    42. msgbox "Textdatei konnte nicht gelöscht werden." & vblf & "Bitte evtl. Notepad schließen" , vbcritical+vbokonly, "Fehler beim Dateizugriff"
    43. exit sub
    44. end if
    45. if Treffer>0 then
    46. QuickSort Dateien, 0, ubound(Dateien)
    47. Set objFile = fSO1.CreateTextFile(Dateiname, True)
    48. for l = 0 to Treffer -1
    49. objFile.WriteLine S & Dateien(l)
    50. next
    51. objFile.WriteLine(Treffer & " Dateien gefunden.")
    52. objFile.close
    53. Set fSO1 = Nothing
    54. msgbox Treffer & " Dateien gefunden", vbinformation+vbokonly,"Fertig: Dateien sortieren"
    55. Set WshShell = WScript.CreateObject("WScript.Shell")
    56. WshShell.Run("notepad.exe " & chr(34) & Dateiname & chr(34))
    57. Set WshShell = Nothing
    58. Treffer=0
    59. Else
    60. msgbox "Keine Datei gefunden", vbinformation+vbokonly,"Fertig: Dateien sortieren"
    61. end if
    62. End Sub
    63. Private Sub QuickSort(ByRef ArrayToSort, ByVal Low, ByVal High)
    64. Dim vPartition, vTemp
    65. Dim i, j
    66. If Low > High Then Exit Sub
    67. vPartition = ArrayToSort((Low + High) \ 2)
    68. i = Low: j = High
    69. Do
    70. Do While ArrayToSort(i) < vPartition
    71. i = i + 1
    72. Loop
    73. Do While ArrayToSort(j) > vPartition
    74. j = j - 1
    75. Loop
    76. If i <= j Then
    77. vTemp = ArrayToSort(j)
    78. ArrayToSort(j) = ArrayToSort(i)
    79. ArrayToSort(i) = vTemp
    80. i = i + 1
    81. j = j - 1
    82. End If
    83. Loop Until i > j
    84. If (j - Low) < (High - i) Then
    85. QuickSort ArrayToSort, Low, j
    86. QuickSort ArrayToSort, i, High
    87. Else
    88. QuickSort ArrayToSort, i, High
    89. QuickSort ArrayToSort, Low, j
    90. End If
    91. End Sub
    92. Private Sub Dateienlesen(ByVal sPfad)
    93. Dim fSO, fld, f, d
    94. Set fSO = CreateObject("Scripting.FileSystemObject")
    95. Set fld = fSO.GetFolder(sPfad)
    96. if Unterordner=1 then
    97. For Each f In fld.SubFolders
    98. if f.size>0 then
    99. Dateienlesen (f.Path)
    100. end if
    101. Next
    102. end if
    103. For Each d In fld.Files
    104. Treffer=Treffer+1
    105. redim preserve Dateien(Treffer -1)
    106. if DatumSort=1 then
    107. Dateien(ubound(Dateien))=Year(d.DateCreated) & "-" & Right("0" & Month(d.DateCreated), 2) & "-" & Right("0" & Day(d.DateCreated), 2) & " - " & d.Path
    108. else
    109. Dateien(ubound(Dateien))=d.Path
    110. end if
    111. Next
    112. End Sub


    Edit:
    Ein paar Variablen sind über (Ausschnitt aus einem größeren Projekt), stören aber nicht.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Hallo peterfido,

    vielen Dank! Mit Deiner Hilfe habe ich das Script so hingebogen, dass es funktioniert.
    Die Dokumente werden nun nach Dateinamen sortiert an den Drucker gesendet. Ein Log, in dem ich parallel mitschreiben lasse, welche Dokumente an den Drucker gesendet, werden bestätigt mir das.

    Jedoch sieht die Realität so aus, dass die Dokumente nicht in dieser Reihenfolge in der Druckwarteschlange landen. Die Ausdrucke kommen weiterhin chaotisch aus dem Drucker. Damit wäre mein schönes Script unbrauchbar.
    Vermutlich liegt es an der unterschiedlichen Verarbeitungszeit der verschiedengroßen Dokumente. Ich hab die Spoolereinstellungen auch schon geändert, aber leider ohne Erfolg.

    Hat hier noch jemand eine Idee? Ich probier schon seit Tagen erfolglos das Problem zu lösen.

    Meine aktuellen Druckereinstellungen, was den Spooler betrifft, sieht man im angehängten Screenshot.

    Vielen Dank im Voraus für jegliche Hilfe.

    Grüße,
    taxischeria
    Dateien
    Hallo,

    im einfachsten Fall eine Pause zwischen den Druckaufträgen einlegen sollte helfen. Dann gibt es noch die Möglichkeit, dass sich diesbezüglich was direkt am Drucker einstellen lässt. Das ist dann aber Druckerspezifisch und als weitere Möglichkeit kommt noch ein evtl. Druckserver als Übeltäter in Frage.
    Gruß
    Peterfido

    Keine Unterstützung per PN!