Document Inspector 2007 automatisieren per Macro

Hallo!

Ich möchte den Document Inspector dafür nutzen, um in Office 2007 mehrere Word-Dokumente auf einmal von persönlichen Daten zu bereinigen. Habe lange gesucht, aber im Internet gibt es kein Freeware-Programm o.ä. das dies könnte, nur teure Spezial-Programme ( http://www.digitalconfidence.com/BatchPurifier.html oder http://esqinc.com/section/products/2/iscrub.html ). Für Office 2003 gibt es immerhin das Add-in RHD (http://www.microsoft.com/download/en/details.aspx?id…), das man über die Kommandozeile betreiben kann (http://support.microsoft.com/kb/834427)
Nun meine Bitte als Macro-Nullchecker: Könnte jemand aus dem Forum hier mithilfe dieser Infos Auf http://msdn.microsoft.com/en-us/library/aa338203(v=o…
ein Add-in schreiben, das beliebig viele Word-Files bereinigt? Dasselbe für PDF-Dateien wäre auch klasse!
->Mit so einem tollen Projekt könnte man sich sicher verewigen in der Community!

Gruß,
Theophilix

Ich möchte den Document Inspector dafür nutzen, um in Office
2007 mehrere Word-Dokumente auf einmal von persönlichen
Daten zu bereinigen. Habe lange gesucht, aber im Internet gibt
es kein Freeware-Programm o.ä. das dies könnte, nur teure
Spezial-Programme (

Hallo Theophilix,

ich wußt gar nicht daß es sowas gibt, sogar für Excel, da bin ich interessiert zu schauen was das Feature so macht bzw. nicht.
In Word ist meine Interessenslage eine Andere.

Nimm mal eine Docx die du bereinigen willst.
Gehe mal auf „Entwicklertools“, dann auf „Makro aufzeichnen“.
Du wirst dann gefragt wo du das Makro abspeichern willst, wähl die Normal.dotm und merk dir den vorgeschlagenen Makronamen

Dann führe das durch mit dem Feature. Anschließend auf „Makro beenden“.
Wenn das Feature mit einer PDF auch klappt so führe das Gleiche mit einer PDF auch durch.

Dann Alt+F8, suche das makro bzw. dessen namen und klick auf „Berabeiten“.
Nun siehst du die Codes, kopier die raus und zeige sie hier in w-w-w.
Dann kannst du sie bedenkenlos löschen.

Gruß
Reinhard

Danke für die Antwort, Reinhard. Auf http://www.computing.net/answers/office/run-the-doc-… habe ich folgenden Code gefunden:

Option Explicit

Sub ClearDocs()
Dim wdd As Document
Dim intRetVal As Integer
Dim n As Integer

On Error GoTo ErrHnd

'turn off screen updating so we don't see
'all the documents opened and closed again
Application.ScreenUpdating = False

'set the file open dialog filters
Application.FileDialog(msoFileDialogOpen).Filters.Clear
Application.FileDialog(msoFileDialogOpen).Filters.Add \_
 Description:="Word documents (\*.doc; \*.docx)", \_
 Extensions:="\*.doc;\*.docx"

'setup and show the Open dialog box
With Application.FileDialog(msoFileDialogOpen)
 .Title = "Select Documents to Clean"
 'set start folder
 .InitialFileName = "C:\temp\"
 .AllowMultiSelect = True
 'show the dialog box and get the button that was clicked
 intRetVal = .Show
 'check that user selected Open (-1) rather than Cancel (0)
 If intRetVal = -1 Then
 'iterate through the selected documents
 For n = 1 To .SelectedItems.Count
 'open document
 Set wdd = Documents.Open(.SelectedItems(n))
 'clear personal data from document
 wdd.RemoveDocumentInformation (wdRDIAll)
 'save and close document
 wdd.Close SaveChanges:=True
 Next n
 End If
End With
'turn on screen updating
Application.ScreenUpdating = True
Exit Sub

'error handler
ErrHnd:
Err.Clear
'turn on screen updating
Application.ScreenUpdating = True
End Sub

Der Code funktioniert gut. Man kann aber nur eine Datei auswählen. Wie kriege ich es hin, dass ich Word-Dateien in Ordner und Unterordner bereinigen kann?

Ergänzung: auf http://www.webplain.de/foren/read.php?2,29672,29683 wird die Dateisuche so gelöst:

Dim fso As FileSystemObject 
 Dim fldOrdner As Folder, fldUnterordner As Folder, fleDatei As File 
 On Error GoTo FehlermerkeN 
 DoCmd.Hourglass True 
 Set fso = New FileSystemObject 

 If VerzeichniS = "" Then VerzeichniS = "C:\" 

 Set fldOrdner = fso.GetFolder(VerzeichniS) 'Ordner holen 

 If UVZ = True Then 'falls mit Unterverzeichnissen gesucht werden soll 
 For Each fldUnterordner In fldOrdner.SubFolders 'für jeden Unterordner... 
 DateiSuchE fldUnterordner.Path, Dateiname, DateiTyP, UVZ, Zeigen '...die Prozedur "Suche" erneut aufrufen 
 Next 
 End If 

 'MsgBox "Suche in " & fldOrdner.Path 'Anzeigen in welchem Ordner gerade gesucht wird 
 For Each fleDatei In fldOrdner.Files 'alle Dateien im aktuellen Ordner durchgehen 
 If Not Dateiname = "" Then 
 If fso.GetFileName(fleDatei.Name) = Dateiname Then 
 If Zeigen Then MsgBox fldOrdner.Path & "\" & fleDatei.Name 
 DateiSuchE = fldOrdner.Path & "\" & fleDatei.Name 
 End If 
 End If 

 If Not DateiTyP = "" Then 
 If fso.GetExtensionName(fleDatei.Name) = DateiTyP Then 
 If Zeigen Then MsgBox fldOrdner.Path & "\" & fleDatei.Name 
 If DateiSuchE = "" Then DateiSuchE = fldOrdner.Path & "\" & fleDatei.Name Else DateiSuchE = DateiSuchE & "," & fldOrdner.Path & "\" & fleDatei.Name 
 End If 
 End If 
 Next 
 DoEvents 'ermöglicht die Suche jederzeit durch Betätigen eines Commandbuttons per "stop" anzuhalten 
 DoCmd.Hourglass False 
 Exit Function 

 FehlermerkeN: 
 Select Case err.Number 
 Case 70 
 MsgBox "dieses Verzeichnis ist gesperrt: " & fldUnterordner 
 Resume Next 
 Case Else 
 MsgBox err.Number & ", " & err.Description 
 Resume Next 
 End Select 
 End Function

Vielleicht ist auch dieser Link : http://msdn.microsoft.com/en-us/library/cc974107(v=o… eine Hilfe, dort wird die " SearchFolders procedure" benutzt

Private Sub SearchInFolder(ByVal Folderspec As String) ' auslesen aufrufen mit Ordnername
 Dim StTyp As String 
 Dim FSO As Object 
 Dim FI As Object 
 Set FSO = CreateObject("Scripting.Filesystemobject") 
 If Not FSO.FolderExists(Folderspec) Then 
 MsgBox Folderspec & " ist nicht vorhanden."
 Set FSO = Nothing 
 Exit Sub 
 End If 
 StTyp = "xls" ' Dateityp
 'Dateien auslesen
 For Each FI In FSO.GetFolder(Folderspec).Files ' Schleife über alle Dateien
 'Dateityp feststellen
 If UCase(FSO.GetExtensionName(FI)) = UCase(StTyp) Then 
 Sheets(1).Cells(Rows.Count, 1).End(xlUp).Offset(1) = FI 'anpassen
 End If 
 Next 
 Set FSO = Nothing 
End Sub 

Gruß,
Theophilix

http://www.computing.net/answers/office/run-the-doc-…

Der Code funktioniert gut. Man kann aber nur eine Datei
auswählen. Wie kriege ich es hin, dass ich Word-Dateien in
Ordner und Unterordner bereinigen kann?

Hallo Theophilix,

ich habe den Code nur angeschaut, das geht schon mit mehr Dateien, du kannst da in der Dialogbox wohl mehrere auswählen.
Aber für sehr viele ist das mühsam.

wdd.RemoveDocumentInformation (wdRDIAll)

ist der Befehl den ich suchte weil ich ihn nicht kenne.

Den Rest kriege ich selbst hin bzw. warum das Rad neu erfinden, du hast ja noch Code zum Dateienextrahieren gepostet, dann nehme ich den, muß ihn mir aber erst anschauen, eher heute nachmittag.

Gruß
Reinhard

Hallo T,

sorry, hab dich ein bißchen vergessen.

Der nachfolgende Code ist noch nicht dein Lösungscode, aber ghet in die Richtung.

Nimm ein neues leeres Dokument.
Alt+F11, Einfügen—Modul, Code reinkopieren.
In der Codezeile
For Each Datei In GetFiles(„C:\test“, True, „*.doc“)
änderts du C:\test ab auf den Oberordner/Pfad der bei dir gilt.

Das True danach gibt an daß auch Unterordner durchsucht werden, wenn du das nicht willst mache aus dem True ein False.

Mit Extras—Verweise kannst du den im Code erwähnten Verweis setzen.

Beende dann den Editor. In Word dann Alt+F8 und lasse das Makro Dateilisten ausführen.

Jetzt müßte im aktuellen Dokument eine Auflistung aller .docs kommen. Klappts?

Gruß
Reinhard

Option Explicit

' Achtung!
' --\> Microsoft Scripting Runtime - Verweis notwendig!
Sub Dateilisten()
Dim Datei As File, Zei As Long
Application.ScreenUpdating = False
For Each Datei In GetFiles("C:\test", True, "\*.doc")
 Selection.TypeText Text:=Datei.Path
 Selection.TypeParagraph
Next
Application.ScreenUpdating = True
End Sub
'
Public Function GetFiles(FolderPath As String, scanSubDirectorys As Boolean, Optional \_
SearchPattern As String, Optional SortBy As String) As Collection
 ' Die MSR - Objekte
 Dim objFs As New FileSystemObject
 Dim objRootFolder As Folder
 Dim objSubFolder As Folder
 Dim objFile As File
 ' Zwischenspeicher für den Rückgabewert der Funktion
 Dim HColl As New Collection
 Set HColl = Nothing
 ' Wenn kein Suchmuster angegeben alle Dateien zurückliefern
 If SearchPattern = "" Then SearchPattern = "\*"
 ' Das Ordner-Objekt für den angegebenen Pfad laden
 On Error GoTo err01
 Set objRootFolder = objFs.GetFolder(FolderPath)
err01:
 If Err.Number 0 Then
 Set GetFiles = HColl
 Exit Function
 End If
 ' Alle Dateien in diesem Ordner durchlaufen
 For Each objFile In objRootFolder.Files
 ' Wenn das Suchmuster übereinstimmt Datei der Collection hinzufügen
 If objFile.Name Like SearchPattern Then
 HColl.Add objFile
 End If
 Next
 ' Wenn angegeben, die Unterordner des Startpfades durchlaufen
 If scanSubDirectorys Then
 For Each objSubFolder In objRootFolder.SubFolders
 ' Alle per Rekursion zurückgelieferten Dateien der Hilfscollection hinzufügen
 For Each objFile In GetFiles(objSubFolder.Path, scanSubDirectorys, SearchPattern)
 HColl.Add objFile
 Next
 Next
 End If
 ' Wenn angegeben, die Hilfs-Collection sortieren
 If SortBy "" Then
 Set HColl = SortItemCollection(HColl, SortBy)
 End If
 ' Rückgabewert
 Set GetFiles = HColl
End Function
'
Public Function SortItemCollection(col As Collection, strPropertyName) As Collection
 Dim colNew As Collection
 Dim objCurrent As Object
 Dim objCompare As Object
 Dim lngCompareIndex As Long
 Dim variantCurrent As Variant
 Dim variantCompare As Variant
 Dim blnGreaterValueFound As Boolean
 'make a copy of the collection, ripping through it one item
 'at a time, adding to new collection in right order...
 Set colNew = New Collection
 For Each objCurrent In col
 'get value of current item...
 variantCurrent = CallByName(objCurrent, strPropertyName, VbGet)
 'setup for compare loop
 blnGreaterValueFound = False
 lngCompareIndex = 0
 For Each objCompare In colNew
 lngCompareIndex = lngCompareIndex + 1
 variantCompare = CallByName(objCompare, strPropertyName, VbGet)
 'die Vergleichstypen auf Variant geändert, somit können beliebige Datentypen \_
miteinander verglichen werden
 If variantCurrent 

Vielen Dank für deinen Einsatz, Reinhard!

Leider kommt bei der Zeile „Dim Datei as file“ die Meldung "Fehler beim kompilieren: Benutzerdefinierter Typ nicht definiert.

Leider kommt bei der Zeile „Dim Datei as file“ die Meldung
"Fehler beim kompilieren: Benutzerdefinierter Typ nicht
definiert.

Hallo T,

bist du sicher daß du dies getan hast?

’ Achtung!
’ --> Microsoft Scripting Runtime - Verweis notwendig!

Verweise setzt man im Editor mit Extras—verweise…

Gruß
Reinhard

Hallo Reinhard,

Danke für deinen Hinweis. Jetzt hat es funktioniert, aber:
Das Macro spuckt zwar eine Liste mit den Orten der .doc-Dateien aus, aber nach meine Recherchen fehlen 9 Dateien, das Makro zeigt 120 Dateien an. (129 insgesamt laut Windows Suche)
An den .doc-Dateien hat sich nichts verändert (z.B. Autor steht immer noch drin) - ich glaube nur der Makro-Teil „Dateilisten“ ist gelaufen.

Gruß,
Theophilix