Alle Word Dokumente eines Ordners drucken

  • VBScript

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von wurstsemmerl.

    Alle Word Dokumente eines Ordners drucken

    Hallo liebe Programmiergemeinde,

    ich stehe vor folgendem Problem und hoffe auf Eure Unterstützung:
    Ich muss regelmäßig mehrere Word 2010-Dokumente (ca. 150 Stück) ausdrucken, welche sich alle in einem Ordner befinden, dabei muss die Reihenfolge unbedingt stimmen. Theoretisch könnte man alle Dateien dieses Ordners markieren und mit der rechten Maustaste "Drucken" wählen, leider wurde diese Funktion per Policy deaktiviert.

    Als Mittel zum Zweck habe ich nun ein kleines VB-Script im Netz gefunden, welches meinen Ansprüchen fast gerecht wird. Man zieht den gewünschten Ordner auf das Script, worauf dann alle darin vorhandenen Word-Dateien der Reihe nach am Standard-Drucker ausgedruckt werden. Leider habe ich dabei das Problem, dass der Script-Ablauf nach dem Druck der 4. Datei mit folgender Meldung stehen bleibt:

    "Microsoft Word kann nicht geschlossen werden, weil noch ein Dialogfeld göffnet ist. Klicken Sie auf 'OK', wechseln Sie dann zu Word, und schlißen Sie das Dialogfeld"

    Weiters würde ich gerne im Vorfeld angeben können, wie oft der Druck wiederholt werden soll bzw. wie oft der Ordnerinhalt gedruckt werden soll, wäre das per Schleife umzusetzen? Dieser soll nach Druck des letzten Dokuments wieder mit dem ersten Dokument anfangen, das ist wichtig da ich ansonsten alle Dokumente händisch in die richtige Reihenfolge sortieren müsste. Könnt Ihr mir da bitte weiterhelfen? :?:

    Mein Script sieht momentan wie folgt aus:

    Quellcode

    1. 'print_docx.vbs
    2. sSourceFolder = false
    3. If WScript.Arguments.Count > 0 Then
    4. sSourceFolder = WScript.Arguments(0)
    5. End If
    6. Set fso = CreateObject("Scripting.FileSystemObject")
    7. If Not fso.FolderExists(sSourceFolder) Then
    8. WScript.Echo "Es wurde kein Ordner angegeben."
    9. WScript.Quit(2)
    10. Else
    11. bPrintet = False
    12. Set oShellApp = WScript.CreateObject("Shell.Application")
    13. For Each oFile In fso.GetFolder(sSourceFolder).Files
    14. If InstrRev(oFile.Name, ".") Then
    15. If LCase(Mid(oFile.Name, InstrRev(oFile.Name, "."))) = ".docx" Then
    16. oShellApp.ShellExecute oFile.Path, "", "", "print", 0
    17. bPrinted = True
    18. WScript.Sleep(5180)
    19. End If
    20. End If
    21. Next
    22. Set oShellApp = Nothing
    23. If Not bPrinted Then
    24. WScript.Echo "Es konnte kein Word-Dokument zum Drucken gefunden werden."
    25. WScript.Quit(1)
    26. End If
    27. End If

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „wurstsemmerl“ ()

    Visual Basic-Quellcode

    1. Sub PrintFolder (FolderName, Copies)
    2. Set FS = CreatObject("Scripting.FileSystemObject")
    3. Set Word = CreateObject("Word.Application")
    4. Set Folder = FS.GetFolder(FolderName)
    5. For i = 1 to Copies
    6. For Each File in Folder.Files
    7. If Right(File.Name,5) = ".docx" Then
    8. Set Doc = Word.Documents.Open(File.Path, False, True)
    9. Doc.Printout False 'da kannst du noch viele weitere Parameter angeben.
    10. Doc.Close
    11. End If
    12. Next
    13. Next
    14. Word.Quit
    15. End Sub
    Code ist ungetestet!
    Debuggen musst du selbst, aber der Ansatz müsste passen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hi, danke für deine Unterstützung, doch den vba-Code kann ich leider nicht verwenden, ich würde das ganze als VB-Script -sprich *.vbs benötigen. :( Hab den Code testweise als "print.vbs" gespeichert, funzt aber leider nicht.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „wurstsemmerl“ ()

    Ich möchte blind behaupten, dass der Code mit VBS funktioniert.
    Ich sehe nirgends Elemente, die in VBS nicht verfügbar wären.

    Hab den Code testweise als "print.vbs" gespeichert, funzt aber leider nicht.
    Die Sub alleine zu speichern ist für VBS ein NoOp.
    Du solltest schon auch einen Aufruf unterbringen ;)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    hmmm, ich hänge jetzt seit stunden daran und kriegs nicht zum Laufen. Hab deinen Code jetzt zum Testen bzw. Debuggen als VBA-Code in Word 2010 eingebaut, bekomme leider nur Fehler wie "Fehler beim kompilieren, Variable oder Prozedur anstelle eines Projects erwartet".
    Mein oben geposteter Code funktioniert doch eigentlich bis auf diese Meldung das Word nicht geschlossen werden kann, kann ich das nicht einfacher lösen?
    Sorry, aber ich bin im Programmieren nicht so fit :(

    wurstsemmerl schrieb:

    Fehler beim kompilieren, Variable oder Prozedur anstelle eines Projects erwartet
    Mit VBA, als innerhalb Word, kannst du das natürlich vergessen. Da ist "Word" ein reserviertes Objekt.

    wurstsemmerl schrieb:

    funktioniert doch eigentlich bis auf diese Meldung das Word nicht geschlossen werden kann
    Eben deshalb der obige Ansatz:
    Eine einzige Word-Instanz öffnen, die alles handelt, anstatt im freilaufenden Parallelbetrieb viele Word-Instanzen unkoordiniert von der Shell öffnen lassen.

    Nimm doch einfach den obigen VBS-Ansatz und schreib noch einen passenden Aufruf der Sub dahinter.
    PrintFolder "c:\MyWordFolder\", 2
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    wie meinst du "der Sub dahinter, so :?: :?:

    Quellcode

    1. Sub PrintFolder (FolderName, Copies)
    2. PrintFolder "c:\MyWordFolder\", 2
    3. Set FS = CreateObject("Scripting.FileSystemObject")
    4. Set Word = CreateObject("Word.Application")
    5. Set Folder = FS.GetFolder(FolderName)
    6. For i = 1 to Copies
    7. For Each File in Folder.Files
    8. If Right(File.Name,5) = ".docx" Then
    9. Set Doc = Word.Documents.Open(File.Path, False, True)
    10. Doc.Printout False 'da kannst du noch viele weitere Parameter angeben.
    11. Doc.Close
    12. End If
    13. Next
    14. Next
    15. Word.Quit
    16. End Sub


    ...ich könnt verzweifeln 8|
    Natürlich nicht in der Sub, sondern in der Main.
    Die Sub ist leerer Code, wenn sie nie aufgerufen wird.

    Visual Basic-Quellcode

    1. Sub PrintFolder (FolderName, Copies)
    2. Set FS = CreateObject("Scripting.FileSystemObject")
    3. Set Word = CreateObject("Word.Application")
    4. Set Folder = FS.GetFolder(FolderName)
    5. For i = 1 to Copies
    6. For Each File in Folder.Files
    7. If Right(File.Name,5) = ".docx" Then
    8. Set Doc = Word.Documents.Open(File.Path, False, True)
    9. Doc.Printout False 'da kannst du noch viele weitere Parameter angeben.
    10. Doc.Close
    11. End If
    12. Next
    13. Next
    14. Word.Quit
    15. End Sub
    16. PrintFolder "c:\MyWordFolder\", 2
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    aha, super so startet schon mal der Ausdruck. :thumbup:
    Sorry, ich hab schon ein schlechtes Gewissen weil ich dich so nerve, aber eine Frage habe ich noch zu PrintFolder "c:\MyWordFolder\", 2
    Kann man das Verzeichnis und die Anzahl auch über eine Abfragebox auswählen, -jetzt ist ja alles fix in dieser Zeile definiert.
    Hast mir aber schon MEGA geholfen, danke danke danke :rolleyes: ...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „wurstsemmerl“ ()

    Hi nochmal, ich habs irgendwie fast noch selbst hinbekommen, Problem ist jetzt, das die Ordnerauswahl nur funktioniert, solange das vbs-Scribt im darüberliegenden Verzeichnis liegt. Anderfalls erhalte ich nach Angabe der Anzahl die Meldung "Der Pfad wurde nicht gfunden" ?( .
    Haste noch einen Tip?

    Quellcode

    1. SET bffShell = CreateObject("Shell.Application")
    2. SET bff = bffShell.BrowseForFolder(0,"Wählen Sie den Ordner mit den Dokumenten (*.docx) aus...",1)
    3. a = InputBox("Wie viele Exemplare möchten Sie drucken?")
    4. PrintFolder(bff), a

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „wurstsemmerl“ ()

    hmm, hab dein Script jetzt in der Firma getestet, da kommt aber so eine Fehlermeldung wegen einem Schreibschutz, weißt Du wass da falsch ist? Der Fehler tritt in Zeile 10 Zeichen 6 deines Codes auf (Doc.Close), der Druck bricht dann ab.

    Fehler: Diese Datei ist schreibgeschützt, Fehlercode: 800A1423. Ich hab das sofort überprüft, die beklagte Datei und auch alle im Druckordner liegendenden Dateien sind definitiv NICHT schreibgeschützt. :cursing: Plz HELP ;(
    Dieses Problem konnte ich lösen, indem ich Zeile 10 wie folgt geändert habe:

    Quellcode

    1. Doc.Close(wdDoNotSaveChanges)
    Eine Speicherung wird ohnehin nicht benötigt, daher perfekt :thumbsup:

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „wurstsemmerl“ ()