geocast
Goto Top

Einzelne Seiten aus Word einzeln Abspeichern

Hallo zusammen

Ich habe hier ein Word Dokument das durch Crystal Reports erstellt wird. Es enthält mehrere Seiten.

Jetzt möchte ich die einzelnen Seiten einzeln Abspeichern.

Das Problem ist, manche Dokumente darin enthalten beliebig viele Seiten, also eines kann eine Seite sein, währen ein anderes 5 hat. Sehen kann man es in der Fußzeile, Seite 1 von x.

Gibt es ein Programm, das dies erkennen kann und mir dann dementsprechend abspeichert? Ein Script ist auch in Ordnung.

Vielen Dank

Content-Key: 221388

Url: https://administrator.de/contentid/221388

Printed on: April 16, 2024 at 23:04 o'clock

Member: colinardo
colinardo Nov 07, 2013 updated at 16:22:17 (UTC)
Goto Top
Hallo geocast,
das könntest du mit diesem VB-Script erreichen welches alle Word-Dokumente in einem Verzeichnis verarbeitet und die Seiten jeweils als separates Dokument in einem Ordner deiner Wahl speichert:
Bitte noch folgende Variablen an dein System anpassen:
  • Zeile 2: Pfad in dem die Dokumente liegen
  • Zeile 4: Ordner in dem die einzelnen Seiten als Dokumente abgelegt werden
  • Zeile 6: Pfad zu einer Log-Datei die erstellt wird (falls Fehler auftreten)
  • Zeile 8: (Optional) Hier werden die Erweiterungen der Dateien angegeben die im Quellordner verarbeitet werden sollen.
'Pfad zu den Dokumenten  
Const strPathDocs = "C:\temp\docs"  
'ZielOrdner für die gesplitteten Dateien  
Const strAusgabeOrdner = "c:\temp\docs\ausgabe"  
'Logfile für eventuell auftretende Fehler  
Const strPathLogfile = "c:\temp\docs\logfile.txt"  
'Erweiterungen der Dateien die bearbeitet werden sollen  
arrFileExtensions = Array("doc","docx")  

Set fso = Wscript.CreateObject("Scripting.Filesystemobject")  
Set objWord = WScript.CreateObject("Word.Application")  
Set objShell = CreateObject("Wscript.Shell")  
Dim intDocCount, intErrCount
'Applikation anzeigen und eventuelle Dialoge für Batchbetrieb unterdrücken  
objWord.Visible = True
objWord.DisplayAlerts = -1
objWord.ScreenUpdating = False
'Im Ordner alle Word-Dokumente verarbeiten  
parseFolders fso.GetFolder(strPathDocs), False
'Das Anzeigen von Benachrichtigungen wieder aktivieren und Word schließen  
objWord.DisplayAlerts = -1
objWord.ScreenUpdating = True
objWord.Quit True
Set fso = Nothing
Set objWord = Nothing
If intErrCount = 0 Then
	MsgBox "Es wurden insgesamt " & intDocCount & " Dokument(e) verarbeitet.", vbInformation, "Verarbeitung abgeschlossen"  
Else
	MsgBox "Es wurden insgesamt " & intDocCount & " Dokumente verarbeitet." & vbCrLf & "Davon ist bei " & intErrCount & " Dokument(en) ein Fehler aufgetreten!", vbInformation, "Verarbeitung abgeschlossen"  
	objShell.Run "Notepad.exe " & strPathLogfile  
End If

'Ende  

Function parseFolders(fldr, boolRecursion)
    For Each file In fldr.Files
    	For i = 0 To UBound(arrFileExtensions)
			If LCase(arrFileExtensions(i)) = LCase(fso.GetExtensionName(file.Path)) Then
				intDocCount = intDocCount + 1 
	            'Fehlerbehandlung für den Fall das ein Fehler beim Öffnen eines Dokumentes auftritt  
	            On Error Resume Next
	            Set objDoc = objWord.Documents.Open(file.Path)
	            If Err.Number <> 0 Then
	            	intErrCount = intErrCount + 1
	            	WriteLog "!!ERROR!! Fehler beim öffnen der Datei: -> '" & file.Path & "'"  
	            Else
	            	sBasename = fso.GetBaseName(file.Path)
				    sExtension = fso.GetExtensionName(file.Path)
				    sPath = fso.GetParentFolderName(file.Path)
				    If Not fso.FolderExists(strAusgabeOrdner) Then
				    	fso.CreateFolder(strAusgabeOrdner)
				    End If
	            	Set rngPage = objDoc.Range
	            	iCurrentPage = 1
	            	iPageCount = objDoc.Content.ComputeStatistics(2)
	            
	            	Do Until iCurrentPage > iPageCount
				        If iCurrentPage = iPageCount Then
				            rngPage.End = objDoc.Range.End
				        Else
				            objWord.Selection.GoTo 1, 1, (iCurrentPage + 1)
				            rngPage.End = objWord.Selection.Start
				        End If
				        rngPage.Copy
				        Set docSingle = objWord.Documents.Add
				        docSingle.Range.Paste
				        docSingle.Range.Find.Execute "^m",,,,,,,,,""  
				        strNewFileName = strAusgabeOrdner & "\" & sBasename & "_" & iCurrentPage & "." & sExtension  
				        docSingle.SaveAs strNewFileName
				        iCurrentPage = iCurrentPage + 1
				        docSingle.Close
        				rngPage.Collapse 0
    				Loop
	            	
	            	objDoc.Close False
	            	WriteLog "Dokument wurde verarbeitet: ->'" & file.Path & "'"  
	            End if
	            Exit For
	         End If
		Next
    Next
    
    'Funktion wird rekursiv aufrufen wenn das durchsuchen aller Unterordner gewünscht ist  
    If boolRecursion Then
		For Each subFolder in fldr.SubFolders
			parseFolders subFolder, True
		Next
	End If
End Function

Function WriteLog(strText)
	Set objLog = fso.OpenTextFile(strPathLogfile,8,True)
	logline = Now & " - " & strText  
	objLog.WriteLine(logline)
	objLog.Close
End Function
Grüße Uwe
Member: geocast
geocast Nov 08, 2013 at 07:39:22 (UTC)
Goto Top
Hallo Uwe

Danke für dein Script. Allerdings funktioniert das nicht ganz so. Es unterteilt jede Seite in ein einzelnes Dokument. Ich bräuchte allerdings eines, dass erkennt, welche Seiten zusammen gehören und die in ein Dokument abspeichert.

Danke trotzdem
Member: colinardo
colinardo Nov 08, 2013 at 08:04:07 (UTC)
Goto Top
D.h die Dokumente haben mehrere Abschnitte im Dokument ? z.B nummeriert 1-5 , 1-3, etc ?

Dazu müsstest du mir mal ein Demodokument via PM(personal message) zuschicken, es reicht wenn die Fusszeilen original bleiben den Rest kannst du ja rauslöschen. Dann kann ich das Script eventuell an deine Bedürfnisse Anpassen ...

Grüße Uwe
Member: colinardo
colinardo Nov 08, 2013 updated at 10:52:20 (UTC)
Goto Top
Nach der Analyse eines der Dokumente sind wir letztendlich zu folgendem Script gekommen, welches den Inhalt jeder Seite auf das vorkommen des Strings "Seite X von X" in allen Textframes hin untersucht und anhand dessen die Seiten-Sektionen unterteilt und jeweils ein Dokument daraus generiert.
Bitte beachten das das folgende Script doch sehr spezifisch angepasst ist, und nicht universell verwendet werden kann, da es sich nicht an die in Word vorhandenen Funktionen zum Aufteilen mit Abschnitten hält, weil eben die Quelldokumente nicht so formatiert waren.
'Pfad zu den Dokumenten  
Const strPathDocs = "C:\temp\docs"  
'ZielOrdner für die gesplitteten Dateien  
Const strAusgabeOrdner = "c:\temp\docs\ausgabe"  
'Logfile für eventuell auftretende Fehler  
Const strPathLogfile = "c:\temp\docs\logfile.txt"  
'Erweiterungen der Dateien die bearbeitet werden sollen  
arrFileExtensions = Array("doc","docx")  

Set fso = Wscript.CreateObject("Scripting.Filesystemobject")  
Set objWord = WScript.CreateObject("Word.Application")  
Set objShell = CreateObject("Wscript.Shell")  
Set regex = CreateObject("vbscript.regexp")  
regex.Pattern = "Seite (\d+) / (\d+)"  
Dim intDocCount, intErrCount
'Applikation anzeigen und eventuelle Dialoge für Batchbetrieb unterdrücken  
objWord.Visible = True
objWord.DisplayAlerts = -1
objWord.ScreenUpdating = False
'Im Ordner alle Word-Dokumente verarbeiten  
parseFolders fso.GetFolder(strPathDocs), False
'Das Anzeigen von Benachrichtigungen wieder aktivieren und Word schließen  
objWord.DisplayAlerts = -1
objWord.ScreenUpdating = True
objWord.Quit True
Set fso = Nothing
Set objWord = Nothing
Set regex = Nothing
If intErrCount = 0 Then
	MsgBox "Es wurden insgesamt " & intDocCount & " Dokumente verarbeitet.", vbInformation, "Verarbeitung abgeschlossen"  
Else
	MsgBox "Es wurden insgesamt " & intDocCount & " Dokumente verarbeitet." & vbCrLf & "Davon ist bei " & intErrCount & " Dokumenten ein Fehler aufgetreten!", vbInformation, "Verarbeitung abgeschlossen"  
	objShell.Run "Notepad.exe " & strPathLogfile  
End If

'Ende  

Function parseFolders(fldr, boolRecursion)
    For Each file In fldr.Files
    	For i = 0 To UBound(arrFileExtensions)
			If LCase(arrFileExtensions(i)) = LCase(fso.GetExtensionName(file.Path)) Then
				intDocCount = intDocCount + 1 
	            'Fehlerbehandlung für den Fall das ein Fehler beim Öffnen eines Dokumentes auftritt  
	            On Error Resume Next
	            Set objDoc = objWord.Documents.Open(file.Path)
	            If Err.Number <> 0 Then
	            	intErrCount = intErrCount + 1
	            	WriteLog "!!ERROR!! Fehler beim öffnen der Datei: -> '" & file.Path & "'"  
	            Else
	            	sBasename = fso.GetBaseName(file.Path)
				    sExtension = fso.GetExtensionName(file.Path)
				    sPath = fso.GetParentFolderName(file.Path)
				    If Not fso.FolderExists(strAusgabeOrdner) Then
				    	fso.CreateFolder(strAusgabeOrdner)
				    End If
	            	Set rngPage = objDoc.Range
	            	iCurrentPage = 1
	            	iSubDocCount = 1
	            	iPageCount = objDoc.Content.ComputeStatistics(2)
	            	
	            	Do Until iCurrentPage > iPageCount
				        For Each frame In rngPage.Frames
				            Set myMatches = regex.Execute(frame.Range.Text)
				            If myMatches.Count >= 1 Then
				                Set myMatch = myMatches(0)
				                If myMatch.SubMatches.Count >= 1 Then
				                    sectionpage = myMatch.SubMatches(0)
				                    sectioncount = myMatch.SubMatches(1)
				                    If sectionpage = sectioncount Then
				                        If iCurrentPage = iPageCount Then
				                            rngPage.End = objDoc.Range.End 
				                        Else
				                            objWord.Selection.GoTo wdGoToPage, wdGoToAbsolute, iCurrentPage + 1
				                            rngPage.End = objWord.Selection.Start
				                        End If
				                        rngPage.Copy
				                        Set docSingle = objWord.Documents.Add
				                        docSingle.Range.Paste
				                        If sectioncount = 1 Then
				                            docSingle.Range.Find.Execute "^m",,,,,,,,,""  
				                            docSingle.Range.Find.Execute "^b",,,,,,,,,""  
				                        End If
				                        strNewFileName = strAusgabeOrdner & "\" & sBasename & "_" & iSubDocCount & "." & sExtension  
				                        docSingle.SaveAs strNewFileName
				                        iCurrentPage = iCurrentPage + 1
				                        iSubDocCount = iSubDocCount + 1
				                        docSingle.Close
				                        rngPage.Collapse 0
				                    Else
				                        objWord.Selection.GoTo 1, 1, iCurrentPage + 1
				                        iCurrentPage = iCurrentPage + 1
				                        rngPage.Collapse 0
				                    End If
				                End If
				            End If
				        Next
				    Loop
	            	objDoc.Close False
	            	WriteLog "Dokument wurde verarbeitet: ->'" & file.Path & "'"  
	            End if
	            Exit For
	         End If
		Next
    Next
    
    'Funktion wird rekursiv aufrufen wenn das durchsuchen aller Unterordner gewünscht ist  
    If boolRecursion Then
		For Each subFolder in fldr.SubFolders
			parseFolders subFolder, True
		Next
	End If
End Function

Function WriteLog(strText)
	Set objLog = fso.OpenTextFile(strPathLogfile,8,True)
	logline = Now & " - " & strText  
	objLog.WriteLine(logline)
	objLog.Close
End Function

Grüße Uwe
Member: colinardo
colinardo Nov 09, 2013 at 09:28:58 (UTC)
Goto Top
Wenns das dann war, Beitrag bitte noch als gelöst markieren. Merci.
Grüße Uwe