Dokumenteigenschaften von mehreren Word-Dokumenten löschen

  • #1
K

kukris

Bekanntes Mitglied
Themenersteller
Dabei seit
21.05.2003
Beiträge
133
Reaktionspunkte
0
Hallo,

ich suche ein Programm / Makro, daß aus mehreren Word-Dokumenten die Dokumenteigenschaften löschen (Word-->Datei-->Eigenschaften) kann.

Kennt jemand so etwas? (Ab Word 2000)

Gruß

Kukris
 
  • #2
Hallo kurkis,

ich hab dir eine Beispiel-Function Word_DocPropertiesDelete geschrieben, die im übergebenen Document die Dokument-Eigenschaften löscht.

Die Sub Test_DOKEIGENCHAFTENLOESCHEN() zeigt, wie die Fuction für das aktuelle Dokument aufgerufen wird. Das kann man dann erweitern .

Um mehrere Datein auszuwählen, kann man den Windows-Datei-Dialog einbauen.

Siehe auch http://www.wintotal-forum.de/index.php/topic,96825.0.html

Gruß Matjes :)

Code:
Sub Test_DOKEIGENCHAFTENLOESCHEN()
  Dim doc As Document
  Set doc = ActiveDocument
  Call Word_DocPropertiesDelete(doc)
AUFRAEUMEN:
  Set doc = Nothing
End Sub
'*********************************************
Function Word_DocPropertiesDelete(doc As Document)

  Dim dp As DocumentProperty
  
 ->eingebaute DocProps Value löschen
  On Error Resume Next
  For Each dp In doc.BuiltInDocumentProperties
    If dp.Type = 1 Then->msoPropertyTypeNumber
      dp.Value = 0
    ElseIf dp.Type = 2 Then->msoPropertyTypeBoolean
      dp.Value = Nothing
    ElseIf dp.Type = 3 Then->msoPropertyTypeDate
      dp.Value = Nothing
    ElseIf dp.Type = 4 Then->msoPropertyTypeString
      dp.Value = 
    ElseIf dp.Type = 5 Then->msoPropertyTypeFloat
      dp.Value = 0
    End If
  Next
  On Error GoTo 0
  
 ->selbsterzeugte DocProps löschen
  For Each dp In doc.CustomDocumentProperties: dp.Delete: Next
  
AUFRAEUMEN:
  Set dp = Nothing
End Function
 
  • #3
Hallo Matjes,

vielen Dank für den Code. Sobald ich Zeit habe probiere ich das aus und melde mich wieder.
 
  • #4
Hallo,

ich habe jetzt wieder etwas Zeit gefunden und habe den Öffnen-Dialog von folgendem Beitrag verwendet(http://www.wintotal-forum.de/index.php/topic,114988.msg593446.html), aber nun bekomme ich beim Ausführen den Fehler Argumenttyp unverträglich. Kann mir hier jemand helfen?

Code:
Option Explicit
' Typdeklaration für API-Dialog->Verzeichnis auswählen'
Private Type BrowseInfo
  hOwner     As Long
  pidlRoot    As Long
  pszDisplayName As String
  lpszTitle    As String
  ulFlags     As Long
  lpfn      As Long
  lParam     As Long
  iImage     As Long
End Type

Private Declare Function SHGetPathFromIDList Lib shell32.dll (ByVal pidl As Long, ByVal pszPath As String) As Long
Private Declare Function SHBrowseForFolder Lib shell32.dll (lpBrowseInfo As BrowseInfo) As Long


Sub main_DelDocProps()

 Dim i As Long, ret As Integer, sDateiname As String
 Dim sPfad As String, sDateinameFull As String, bSubFolders As Boolean
 
->Wurzelverzeichnis abfragen
 sPfad = VerzeichnisWaehlen(Quellverzeichnis auswählen)
 If sPfad =  Then Exit Sub-> Abbruch ?
 
->Abfrage mit/ohne Sub-Directories
 ret = MsgBox( _
  Sollen die Unterverzeichnisse einbezogen werden?, _
  vbYesNoCancel + vbDefaultButton2 + vbQuestion, _
  Auswahl mit/ohne Unterverzeichnisse)
 If ret = vbYes Then
  bSubFolders = True
 ElseIf ret = vbNo Then
  bSubFolders = False
 Else
  Exit Sub->Abbruch
 End If

 Application.ScreenUpdating = False
 
->Dateien suchen
 With Application.FileSearch
  .NewSearch
  .LookIn = sPfad
  .SearchSubFolders = bSubFolders
  .FileType = msoFileTypeWordDocuments
  .Execute
 ->alle gefundenen Dateien
  For i = 1 To .FoundFiles.Count
   sDateinameFull = .FoundFiles(i)
   sDateiname = DateinameAusDateinameFull(sDateinameFull)
  ->Datei gleichen Namens wie die Makro-Datei von Konvertierung ausschliessen
  ->If LCase(ThisWorkbook.Name) <> LCase(sDateiname) Then
    Application.StatusBar = sDateinameFull
   ->Dateieigenschaften löschen
    If Not Word_DocPropertiesDelete(sDateinameFull) Then
     MsgBox Fehler bei der Ausführung. & vbLf & sDateinameFull
    End If
    Application.StatusBar = 
    DoEvents
   End If
  Next
 End With
 
 Application.ScreenUpdating = True
End Sub



'***********************************************************
Private Function VerzeichnisWaehlen(Optional DialogTitel) As String
'***********************************************************
' Ermittelt Verzeichnisnamen und zeigt Windows-Dialog an
  Dim StrukturVerzeichnisInfo As BrowseInfo, ListenNr As Long, Pfad As String
  Dim hWndAccessApp As Long
 
  With StrukturVerzeichnisInfo
    .hOwner = hWndAccessApp
    .lpszTitle = IIf(IsMissing(DialogTitel), Verzeichnispfad auswählen, CStr(DialogTitel))
    .ulFlags = &H1-> BIF_RETURNONLYFSDIRS
  End With
  
  ListenNr = SHBrowseForFolder(StrukturVerzeichnisInfo)
  Pfad = Space$(512)
  
  If SHGetPathFromIDList(ByVal ListenNr, ByVal Pfad) Then VerzeichnisWaehlen = Left(Pfad, InStr(Pfad, vbNullChar) - 1)
  
End Function



'***********************************************************
Private Function DateinameAusDateinameFull(sDateinameFull As String) As String
'***********************************************************
 Dim pos As Long, posx As Long
 pos = 0: posx = 0
 Do
  pos = InStr(pos + 1, sDateinameFull, Application.PathSeparator)
  If pos > 0 Then posx = pos
 Loop While pos <> 0
 If posx = 0 Then
  DateinameAusDateinameFull = sDateinameFull
 Else
  DateinameAusDateinameFull = Right(sDateinameFull, Len(sDateinameFull) - posx)
 End If
 
End Function



'*************************************************
Function Word_DocPropertiesDelete(doc As Document)

 Dim dp As DocumentProperty
 
->eingebaute DocProps Value löschen
 On Error Resume Next
 For Each dp In doc.BuiltInDocumentProperties
  If dp.Type = 1 Then->msoPropertyTypeNumber
   dp.Value = 0
  ElseIf dp.Type = 2 Then->msoPropertyTypeBoolean
   dp.Value = Nothing
  ElseIf dp.Type = 3 Then->msoPropertyTypeDate
   dp.Value = Nothing
  ElseIf dp.Type = 4 Then->msoPropertyTypeString
   dp.Value = 
  ElseIf dp.Type = 5 Then->msoPropertyTypeFloat
   dp.Value = 0
  End If
 Next
 On Error GoTo 0
 
->selbsterzeugte DocProps löschen
 For Each dp In doc.CustomDocumentProperties: dp.Delete: Next
 
AUFRAEUMEN:
 Set dp = Nothing
End Function
 
  • #5
Hallo kurkis,

probiers mal so: Datei öffnen, Datei bearbeiten, Datei schliessen ;)

Gruß Matjes :)
Option Explicit
' Typdeklaration für API-Dialog->Verzeichnis auswählen'
Private Type BrowseInfo
hOwner As Long
pidlRoot As Long
pszDisplayName As String
lpszTitle As String
ulFlags As Long
lpfn As Long
lParam As Long
iImage As Long
End Type

Private Declare Function SHGetPathFromIDList Lib shell32.dll (ByVal pidl As Long, ByVal pszPath As String) As Long
Private Declare Function SHBrowseForFolder Lib shell32.dll (lpBrowseInfo As BrowseInfo) As Long


Sub main_DelDocProps()

Dim Doc As Document
Dim i As Long, ret As Integer, sDateiname As String
Dim sPfad As String, sDateinameFull As String, bSubFolders As Boolean

->Wurzelverzeichnis abfragen
sPfad = VerzeichnisWaehlen(Quellverzeichnis auswählen)
If sPfad = Then Exit Sub-> Abbruch ?

->Abfrage mit/ohne Sub-Directories
ret = MsgBox( _
Sollen die Unterverzeichnisse einbezogen werden?, _
vbYesNoCancel + vbDefaultButton2 + vbQuestion, _
Auswahl mit/ohne Unterverzeichnisse)
If ret = vbYes Then
bSubFolders = True
ElseIf ret = vbNo Then
bSubFolders = False
Else
Exit Sub->Abbruch
End If

Application.ScreenUpdating = False

->Dateien suchen
With Application.FileSearch
.NewSearch
.LookIn = sPfad
.SearchSubFolders = bSubFolders
.FileType = msoFileTypeWordDocuments
.Execute
->alle gefundenen Dateien
For i = 1 To .FoundFiles.Count
sDateinameFull = .FoundFiles(i)
->Datei gleichen Namens wie die Makro-Datei von Konvertierung ausschliessen
If LCase(ThisDocument.FullName) <> LCase(sDateinameFull) Then
Application.StatusBar = sDateinameFull

->Datei öffnen
On Error Resume Next
Set Doc = Documents.Open(FileName:=sDateinameFull)
On Error GoTo 0
If Doc Is Nothing Then
MsgBox Datei: & sDateinameFull & konnte nicht geöffnet werden.
Else
->Dateieigenschaften löschen
Call Word_DocPropertiesDelete(Doc)
->speichern und schliessen
Doc.Close Savechanges:=True

End If

Application.StatusBar =
DoEvents
End If
Next
End With

Application.ScreenUpdating = True
AUFRAEUMEN:
Set Doc = Nothing
End Sub



'***********************************************************
Private Function VerzeichnisWaehlen(Optional DialogTitel) As String
'***********************************************************
' Ermittelt Verzeichnisnamen und zeigt Windows-Dialog an
Dim StrukturVerzeichnisInfo As BrowseInfo, ListenNr As Long, Pfad As String
Dim hWndAccessApp As Long

With StrukturVerzeichnisInfo
.hOwner = hWndAccessApp
.lpszTitle = IIf(IsMissing(DialogTitel), Verzeichnispfad auswählen, CStr(DialogTitel))
.ulFlags = &H1-> BIF_RETURNONLYFSDIRS
End With

ListenNr = SHBrowseForFolder(StrukturVerzeichnisInfo)
Pfad = Space$(512)

If SHGetPathFromIDList(ByVal ListenNr, ByVal Pfad) Then VerzeichnisWaehlen = Left(Pfad, InStr(Pfad, vbNullChar) - 1)

End Function



'***********************************************************
Private Function DateinameAusDateinameFull(sDateinameFull As String) As String
'***********************************************************
Dim pos As Long, posx As Long
pos = 0: posx = 0
Do
pos = InStr(pos + 1, sDateinameFull, Application.PathSeparator)
If pos > 0 Then posx = pos
Loop While pos <> 0
If posx = 0 Then
DateinameAusDateinameFull = sDateinameFull
Else
DateinameAusDateinameFull = Right(sDateinameFull, Len(sDateinameFull) - posx)
End If

End Function


'*************************************************
Private Function Word_DocPropertiesDelete(Doc As Document) As Boolean

Dim dp As DocumentProperty

->eingebaute DocProps Value löschen
On Error Resume Next
For Each dp In Doc.BuiltInDocumentProperties
If dp.Type = 1 Then->msoPropertyTypeNumber
dp.Value = 0
ElseIf dp.Type = 2 Then->msoPropertyTypeBoolean
dp.Value = Nothing
ElseIf dp.Type = 3 Then->msoPropertyTypeDate
dp.Value = Nothing
ElseIf dp.Type = 4 Then->msoPropertyTypeString
dp.Value =
ElseIf dp.Type = 5 Then->msoPropertyTypeFloat
dp.Value = 0
End If
Next
On Error GoTo 0

->selbsterzeugte DocProps löschen
For Each dp In Doc.CustomDocumentProperties: dp.Delete: Next

AUFRAEUMEN:
Set dp = Nothing
End Function
 
  • #6
Hallo Matjes,

vielen Dank für den richtigen Code. Funktioniert jetzt alles einwandfrei

Gruß

kukris
 
  • #7
Leider ist noch ein Problem aufgetaucht: Es werden leider nicht nur Word-Dateien, sondern seltsamerweise auch HTML-Dateien geöffnet, was jedoch zu einem Fehler führt. Das Makro bleibt dann stehen.

Ist es möglich den Dateityp explizit auf *.doc zu filtern?
 
  • #8
Hallo kukris,

dann mit Filter nur *.doc.

Gruß Matjes :)
Option Explicit
' Typdeklaration für API-Dialog->Verzeichnis auswählen'
Private Type BrowseInfo
hOwner As Long
pidlRoot As Long
pszDisplayName As String
lpszTitle As String
ulFlags As Long
lpfn As Long
lParam As Long
iImage As Long
End Type

Private Declare Function SHGetPathFromIDList Lib shell32.dll (ByVal pidl As Long, ByVal pszPath As String) As Long
Private Declare Function SHBrowseForFolder Lib shell32.dll (lpBrowseInfo As BrowseInfo) As Long


Sub main_DelDocProps()

Dim Doc As Document
Dim i As Long, ret As Integer, sDateiname As String
Dim sPfad As String, sDateinameFull As String, bSubFolders As Boolean

->Wurzelverzeichnis abfragen
sPfad = VerzeichnisWaehlen(Quellverzeichnis auswählen)
If sPfad = Then Exit Sub-> Abbruch ?

->Abfrage mit/ohne Sub-Directories
ret = MsgBox( _
Sollen die Unterverzeichnisse einbezogen werden?, _
vbYesNoCancel + vbDefaultButton2 + vbQuestion, _
Auswahl mit/ohne Unterverzeichnisse)
If ret = vbYes Then
bSubFolders = True
ElseIf ret = vbNo Then
bSubFolders = False
Else
Exit Sub->Abbruch
End If

Application.ScreenUpdating = False

->Dateien suchen
With Application.FileSearch
.NewSearch
.LookIn = sPfad
.SearchSubFolders = bSubFolders
.FileType = msoFileTypeWordDocuments
.Execute
->alle gefundenen Dateien
For i = 1 To .FoundFiles.Count
sDateinameFull = .FoundFiles(i)
->Datei gleichen Namens wie die Makro-Datei von Konvertierung ausschliessen
If LCase(ThisDocument.FullName) <> LCase(sDateinameFull) Then
If LCase(Right(sDateinameFull, 4)) = .doc Then
Application.StatusBar = sDateinameFull

->Datei öffnen
On Error Resume Next
Set Doc = Documents.Open(Filename:=sDateinameFull)
On Error GoTo 0
If Doc Is Nothing Then
MsgBox Datei: & sDateinameFull & konnte nicht geöffnet werden.
Else
->Dateieigenschaften löschen
Call Word_DocPropertiesDelete(Doc)
->speichern und schliessen
Doc.Close Savechanges:=True

End If

Application.StatusBar =
DoEvents
End If
End If
Next
End With

Application.ScreenUpdating = True
AUFRAEUMEN:
Set Doc = Nothing
End Sub



'***********************************************************
Private Function VerzeichnisWaehlen(Optional DialogTitel) As String
'***********************************************************
' Ermittelt Verzeichnisnamen und zeigt Windows-Dialog an
Dim StrukturVerzeichnisInfo As BrowseInfo, ListenNr As Long, Pfad As String
Dim hWndAccessApp As Long

With StrukturVerzeichnisInfo
.hOwner = hWndAccessApp
.lpszTitle = IIf(IsMissing(DialogTitel), Verzeichnispfad auswählen, CStr(DialogTitel))
.ulFlags = &H1-> BIF_RETURNONLYFSDIRS
End With

ListenNr = SHBrowseForFolder(StrukturVerzeichnisInfo)
Pfad = Space$(512)

If SHGetPathFromIDList(ByVal ListenNr, ByVal Pfad) Then VerzeichnisWaehlen = Left(Pfad, InStr(Pfad, vbNullChar) - 1)

End Function



'***********************************************************
Private Function DateinameAusDateinameFull(sDateinameFull As String) As String
'***********************************************************
Dim pos As Long, posx As Long
pos = 0: posx = 0
Do
pos = InStr(pos + 1, sDateinameFull, Application.PathSeparator)
If pos > 0 Then posx = pos
Loop While pos <> 0
If posx = 0 Then
DateinameAusDateinameFull = sDateinameFull
Else
DateinameAusDateinameFull = Right(sDateinameFull, Len(sDateinameFull) - posx)
End If

End Function


'*************************************************
Private Function Word_DocPropertiesDelete(Doc As Document) As Boolean

Dim dp As DocumentProperty

->eingebaute DocProps Value löschen
On Error Resume Next
For Each dp In Doc.BuiltinDocumentProperties
If dp.Type = 1 Then->msoPropertyTypeNumber
dp.Value = 0
ElseIf dp.Type = 2 Then->msoPropertyTypeBoolean
dp.Value = Nothing
ElseIf dp.Type = 3 Then->msoPropertyTypeDate
dp.Value = Nothing
ElseIf dp.Type = 4 Then->msoPropertyTypeString
dp.Value =
ElseIf dp.Type = 5 Then->msoPropertyTypeFloat
dp.Value = 0
End If
Next
On Error GoTo 0

->selbsterzeugte DocProps löschen
For Each dp In Doc.CustomDocumentProperties: dp.Delete: Next

AUFRAEUMEN:
Set dp = Nothing
End Function
 
  • #9
Hallo Matjes,

vielen Dank. Funktioniert jetzt einwandfrei und ist ohne Fehler durchgelaufen.

Gruß

Kukris
 
  • #10
Hallo,

ich habe jetzt versucht das ganze auch für Excel- und PowerPoint-Dokumente zu erstellen. Bei Excel hat es funktioniert, bei PowerPoint jedoch bekomme ich einen Fehler beim Kompilieren und weiß nicht warum. Kann mir jemand sagen warum?

Code:
'Delete properties of PowerPoint documents (only *.ppt) like author, comment, etc.

Option Explicit
' Typdeklaration für API-Dialog->Verzeichnis auswählen'
Private Type BrowseInfo
  hOwner     As Long
  pidlRoot    As Long
  pszDisplayName As String
  lpszTitle    As String
  ulFlags     As Long
  lpfn      As Long
  lParam     As Long
  iImage     As Long
End Type

Private Declare Function SHGetPathFromIDList Lib shell32.dll (ByVal pidl As Long, ByVal pszPath As String) As Long
Private Declare Function SHBrowseForFolder Lib shell32.dll (lpBrowseInfo As BrowseInfo) As Long


Sub main_DelPptProps()

 Dim Ppt As PowerPointPresentation
 Dim i As Long, ret As Integer, sDateiname As String
 Dim sPfad As String, sDateinameFull As String, bSubFolders As Boolean
 
->Wurzelverzeichnis abfragen
 sPfad = VerzeichnisWaehlen(Quellverzeichnis auswählen)
 If sPfad =  Then Exit Sub-> Abbruch ?
 
->Abfrage mit/ohne Sub-Directories
 ret = MsgBox( _
  Sollen die Unterverzeichnisse einbezogen werden?, _
  vbYesNoCancel + vbDefaultButton2 + vbQuestion, _
  Auswahl mit/ohne Unterverzeichnisse)
 If ret = vbYes Then
  bSubFolders = True
 ElseIf ret = vbNo Then
  bSubFolders = False
 Else
  Exit Sub->Abbruch
 End If

 Application.ScreenUpdating = False
 
->Dateien suchen
 With Application.FileSearch
  .NewSearch
  .LookIn = sPfad
  .SearchSubFolders = bSubFolders
  .FileType = msoFileTypePowerPointPresentations
  .Execute
 ->alle gefundenen Dateien
  For i = 1 To .FoundFiles.Count
   sDateinameFull = .FoundFiles(i)
  ->Datei gleichen Namens wie die Makro-Datei von Konvertierung ausschliessen
   If LCase(ThisPowerPointPresentation.FullName) <> LCase(sDateinameFull) Then
    If LCase(Right(sDateinameFull, 4)) = .ppt Then
     Application.StatusBar = sDateinameFull
      
    ->Datei öffnen
     On Error Resume Next
     Set Ppt = PowerPointPresentations.Open(FileName:=sDateinameFull)

     On Error GoTo 0
     If Ppt Is Nothing Then
      MsgBox Datei:  & sDateinameFull &  konnte nicht geöffnet werden.
     Else
     ->Dateieigenschaften löschen
      Call PowerPoint_PptPropertiesDelete(Ppt)
     ->speichern und schliessen
      Ppt.Close Savechanges:=True
     
     End If
    
     Application.StatusBar = 
     DoEvents
    End If
   End If
  Next
 End With
 
 Application.ScreenUpdating = True
AUFRAEUMEN:
 Set Ppt = Nothing
 MsgBox Programmende.
End Sub



'***********************************************************
Private Function VerzeichnisWaehlen(Optional DialogTitel) As String
'***********************************************************
' Ermittelt Verzeichnisnamen und zeigt Windows-Dialog an
  Dim StrukturVerzeichnisInfo As BrowseInfo, ListenNr As Long, Pfad As String
  Dim hWndAccessApp As Long
 
  With StrukturVerzeichnisInfo
    .hOwner = hWndAccessApp
    .lpszTitle = IIf(IsMissing(DialogTitel), Verzeichnispfad auswählen, CStr(DialogTitel))
    .ulFlags = &H1-> BIF_RETURNONLYFSDIRS
  End With
  
  ListenNr = SHBrowseForFolder(StrukturVerzeichnisInfo)
  Pfad = Space$(512)
  
  If SHGetPathFromIDList(ByVal ListenNr, ByVal Pfad) Then VerzeichnisWaehlen = Left(Pfad, InStr(Pfad, vbNullChar) - 1)
  
End Function



'***********************************************************
Private Function DateinameAusDateinameFull(sDateinameFull As String) As String
'***********************************************************
 Dim pos As Long, posx As Long
 pos = 0: posx = 0
 Do
  pos = InStr(pos + 1, sDateinameFull, Application.PathSeparator)
  If pos > 0 Then posx = pos
 Loop While pos <> 0
 If posx = 0 Then
  DateinameAusDateinameFull = sDateinameFull
 Else
  DateinameAusDateinameFull = Right(sDateinameFull, Len(sDateinameFull) - posx)
 End If
 
End Function


'*************************************************
Private Function PowerPoint_PptPropertiesDelete(Ppt As PowerPointPresentation) As Boolean

 Dim dp As DocumentProperty

->eingebaute PptProps Value löschen
 On Error Resume Next
 For Each dp In Ppt.BuiltInDocumentProperties
  If dp.Type = 1 Then->msoPropertyTypeNumber
   dp.Value = 0
  ElseIf dp.Type = 2 Then->msoPropertyTypeBoolean
   dp.Value = Nothing
  ElseIf dp.Type = 3 Then->msoPropertyTypeDate
   dp.Value = Nothing
  ElseIf dp.Type = 4 Then->msoPropertyTypeString
   dp.Value = 
  ElseIf dp.Type = 5 Then->msoPropertyTypeFloat
   dp.Value = 0
  End If
 Next
 On Error GoTo 0

->selbsterzeugte PptProps löschen
 For Each dp In Ppt.CustomDocumentProperties: dp.Delete: Next

AUFRAEUMEN:
 Set dp = Nothing
End Function
 
  • #11
Hallo kurkis,
bei Excel, Word, Powerpoint ist alles etwas gleich und verschieden ;D

So sollte es klappen.

Gruß Matjes :)
'Delete properties of PowerPoint documents (only *.ppt) like author, comment, etc.

Option Explicit
' Typdeklaration für API-Dialog->Verzeichnis auswählen'
Private Type BrowseInfo
hOwner As Long
pidlRoot As Long
pszDisplayName As String
lpszTitle As String
ulFlags As Long
lpfn As Long
lParam As Long
iImage As Long
End Type

Private Declare Function SHGetPathFromIDList Lib shell32.dll (ByVal pidl As Long, ByVal pszPath As String) As Long
Private Declare Function SHBrowseForFolder Lib shell32.dll (lpBrowseInfo As BrowseInfo) As Long


Sub main_DelPptProps()

Dim Ppt As Presentation, MePpt As Presentation
Dim i As Long, ret As Integer, sDateiname As String
Dim sPfad As String, sDateinameFull As String, bSubFolders As Boolean

->aktive Presentation meken (selbst)
Set MePpt = ActivePresentation

->Wurzelverzeichnis abfragen
sPfad = VerzeichnisWaehlen(Quellverzeichnis auswählen)
If sPfad = Then Exit Sub-> Abbruch ?

->Abfrage mit/ohne Sub-Directories
ret = MsgBox( _
Sollen die Unterverzeichnisse einbezogen werden?, _
vbYesNoCancel + vbDefaultButton2 + vbQuestion, _
Auswahl mit/ohne Unterverzeichnisse)
If ret = vbYes Then
bSubFolders = True
ElseIf ret = vbNo Then
bSubFolders = False
Else
Exit Sub->Abbruch
End If

->Dateien suchen
With Application.FileSearch
.NewSearch
.LookIn = sPfad
.SearchSubFolders = bSubFolders
.FileType = msoFileTypePowerPointPresentations
.Execute
->alle gefundenen Dateien
For i = 1 To .FoundFiles.Count
sDateinameFull = .FoundFiles(i)
->Datei gleichen Namens wie die Makro-Datei von Konvertierung ausschliessen
If LCase(MePpt.FullName) <> LCase(sDateinameFull) Then
If LCase(Right(sDateinameFull, 4)) = .ppt Then

->Datei öffnen
On Error Resume Next
Set Ppt = Presentations.Open(FileName:=sDateinameFull)
On Error GoTo 0
If Ppt Is Nothing Then
MsgBox Datei: & sDateinameFull & konnte nicht geöffnet werden.
Else
->Dateieigenschaften löschen
Call PptPropertiesDelete(Ppt)
->speichern und schliessen
Ppt.Save
Ppt.Close
End If
DoEvents
End If
End If
Next
End With

AUFRAEUMEN:
Set Ppt = Nothing
MsgBox Programmende.
End Sub

'***********************************************************
Private Function VerzeichnisWaehlen(Optional DialogTitel) As String
'***********************************************************
' Ermittelt Verzeichnisnamen und zeigt Windows-Dialog an
Dim StrukturVerzeichnisInfo As BrowseInfo, ListenNr As Long, Pfad As String
Dim hWndAccessApp As Long

With StrukturVerzeichnisInfo
.hOwner = hWndAccessApp
.lpszTitle = IIf(IsMissing(DialogTitel), Verzeichnispfad auswählen, CStr(DialogTitel))
.ulFlags = &H1-> BIF_RETURNONLYFSDIRS
End With

ListenNr = SHBrowseForFolder(StrukturVerzeichnisInfo)
Pfad = Space$(512)

If SHGetPathFromIDList(ByVal ListenNr, ByVal Pfad) Then VerzeichnisWaehlen = Left(Pfad, InStr(Pfad, vbNullChar) - 1)

End Function


'*************************************************
Private Function PptPropertiesDelete(Ppt As Presentation) As Boolean

Dim dp As DocumentProperty

->eingebaute PptProps Value löschen
On Error Resume Next
For Each dp In Ppt.BuiltInDocumentProperties
If dp.Type = 1 Then->msoPropertyTypeNumber
dp.Value = 0
ElseIf dp.Type = 2 Then->msoPropertyTypeBoolean
dp.Value = Nothing
ElseIf dp.Type = 3 Then->msoPropertyTypeDate
dp.Value = Nothing
ElseIf dp.Type = 4 Then->msoPropertyTypeString
dp.Value =
ElseIf dp.Type = 5 Then->msoPropertyTypeFloat
dp.Value = 0
End If
Next
On Error GoTo 0

->selbsterzeugte PptProps löschen
For Each dp In Ppt.CustomDocumentProperties: dp.Delete: Next

AUFRAEUMEN:
Set dp = Nothing
End Function
 
  • #12
Hallo Matjes,

ich danke dir nochmals. Auch dieses Skript funktioniert einwandfrei.
 
  • #13
Hallo Matjes,

es wird in den PowerPoint-Dokumenten komischerweise nur der Titel nicht gelöscht, aber alle andere Eigenschaften. Läuft das in PP auch anders als in Word?

Gruß

Hans Jörg
 
  • #14
Hallo kukris,

du müßtest nochmal genau schildern, unter welchen Umständen was nicht gelöscht wird.

Ich habe eine Test-Datei Test.ppt erzeugt.
Unter Datei->Eigenschaften->
Reiter Zusammenfassung habe ich alle Textfelder ausgefüllt.
Reiter Anpassen habe ich allen vorhandenen Marken einen Wert zugeordnet.
Reiter Anpassen habe ich eigene Marken hinzugefügt und ihnen einen Wert zugeordnet.

Nachdem das Makro über die Datei gelaufen ist, sind alle Eigenschaften gelöscht.

Gruß Matjes :)
 
  • #15
Hallo Matjes,

bei neu erstellten PP-Dokumente kann ich auch die Eigenschaften löschen, nur bei meinen anderen funktioniert das nicht. Die Dokumente scheinen irgendeinen Schutz zu haben. Ich kann dort zwar manuell die Dateieigenschaften wie Titel löschen und dann abspeichern, aber nach einem erneuten Öffnen ist der Titel wieder vorhanden.

Gruß

Kukris
 
  • #16
Hallo kukris,

kannst du mir ein Beispiel an mein mail-addy senden ?
Vielleicht kann ich dann rausfinden woran es liegt.

Gruß Matjes :)
 
  • #17
Ok, die Email ist unterwegs.
 
  • #18
Hallo kurkis,

erstmal zur Beruhigung: die Titel werden vom Makro gelöscht !

Wenn die Dokumenteneigenschaft title leer ist, versucht PP einen neuen Titel aus dem vorhandenen Text abzuleiten, wie z.B. Folie 1. Dies ist aber nur ein Vorschlag von PP.

Wenn man das unterdrücken will, schreibt man einfach ein Leerzeichen in die Dokumenteneigenschaft title.

Hab das Makro soweit angepaßt.

Gruß Matjes :)
Code:
'Delete properties of PowerPoint documents (only *.ppt) like author, comment, etc.

Option Explicit
' Typdeklaration für API-Dialog->Verzeichnis auswählen'
Private Type BrowseInfo
  hOwner     As Long
  pidlRoot    As Long
  pszDisplayName As String
  lpszTitle    As String
  ulFlags     As Long
  lpfn      As Long
  lParam     As Long
  iImage     As Long
End Type

Private Declare Function SHGetPathFromIDList Lib shell32.dll (ByVal pidl As Long, ByVal pszPath As String) As Long
Private Declare Function SHBrowseForFolder Lib shell32.dll (lpBrowseInfo As BrowseInfo) As Long


Sub main_DelPptProps()

 Dim Ppt As Presentation, MePpt As Presentation
 Dim i As Long, ret As Integer, sDateiname As String, lAnz As Long
 Dim sPfad As String, sDateinameFull As String, bSubFolders As Boolean
 
->aktive Presentation meken (selbst)
 Set MePpt = ActivePresentation
 
->Wurzelverzeichnis abfragen
 sPfad = VerzeichnisWaehlen(Quellverzeichnis auswählen)
 If sPfad =  Then Exit Sub-> Abbruch ?
 
->Abfrage mit/ohne Sub-Directories
 ret = MsgBox( _
  Sollen die Unterverzeichnisse einbezogen werden?, _
  vbYesNoCancel + vbDefaultButton2 + vbQuestion, _
  Auswahl mit/ohne Unterverzeichnisse)
 If ret = vbYes Then
  bSubFolders = True
 ElseIf ret = vbNo Then
  bSubFolders = False
 Else
  Exit Sub->Abbruch
 End If

->Dateien suchen
 With Application.FileSearch
  .NewSearch
  .LookIn = sPfad
  .SearchSubFolders = bSubFolders
  .FileType = msoFileTypePowerPointPresentations
  .Execute
 ->alle gefundenen Dateien
  For i = 1 To .FoundFiles.Count
   sDateinameFull = .FoundFiles(i)
  ->Datei gleichen Namens wie die Makro-Datei von Konvertierung ausschliessen
   If LCase(MePpt.FullName) <> LCase(sDateinameFull) Then
    If LCase(Right(sDateinameFull, 4)) = .ppt Then
      
    ->Datei öffnen
     On Error Resume Next
     Set Ppt = Presentations.Open(FileName:=sDateinameFull)
     On Error GoTo 0
     If Ppt Is Nothing Then
      MsgBox Datei:  & sDateinameFull &  konnte nicht geöffnet werden.
     Else
     ->Dateieigenschaften löschen
      Call PptPropertiesDelete(Ppt)
     ->speichern und schliessen
      Ppt.Save
      Ppt.Close
      lAnz = lAnz + 1
     End If
     DoEvents
    End If
   End If
  Next
 End With
 
AUFRAEUMEN:
 Set Ppt = Nothing
 MsgBox Programmende. & vbLf & lAnz &  Dateien bearbeitet.
End Sub

'***********************************************************
Private Function VerzeichnisWaehlen(Optional DialogTitel) As String
'***********************************************************
' Ermittelt Verzeichnisnamen und zeigt Windows-Dialog an
  Dim StrukturVerzeichnisInfo As BrowseInfo, ListenNr As Long, Pfad As String
  Dim hWndAccessApp As Long
 
  With StrukturVerzeichnisInfo
    .hOwner = hWndAccessApp
    .lpszTitle = IIf(IsMissing(DialogTitel), Verzeichnispfad auswählen, CStr(DialogTitel))
    .ulFlags = &H1-> BIF_RETURNONLYFSDIRS
  End With
  
  ListenNr = SHBrowseForFolder(StrukturVerzeichnisInfo)
  Pfad = Space$(512)
  
  If SHGetPathFromIDList(ByVal ListenNr, ByVal Pfad) Then VerzeichnisWaehlen = Left(Pfad, InStr(Pfad, vbNullChar) - 1)
  
End Function


'*************************************************
Private Function PptPropertiesDelete(Ppt As Presentation) As Boolean

 Dim dp As DocumentProperty

->eingebaute PptProps Value löschen
 On Error Resume Next
 For Each dp In Ppt.BuiltInDocumentProperties
  If dp.Type = 1 Then->msoPropertyTypeNumber
   dp.Value = 0
  ElseIf dp.Type = 2 Then->msoPropertyTypeBoolean
   dp.Value = Nothing
  ElseIf dp.Type = 3 Then->msoPropertyTypeDate
   dp.Value = Nothing
  ElseIf dp.Type = 4 Then->msoPropertyTypeString
   dp.Value = 
  ElseIf dp.Type = 5 Then->msoPropertyTypeFloat
   dp.Value = 0
  End If
 Next
 On Error GoTo 0
->selbsterzeugte PptProps löschen
 For Each dp In Ppt.CustomDocumentProperties: dp.Delete: Next

->Titel wird mit einem Leerzeichen gefüllt,
->damit die automatische Titel-Vergabe von PP nicht erfolgt
 Ppt.BuiltInDocumentProperties.Item(title).Value =  

AUFRAEUMEN:
 Set dp = Nothing
End Function
 
  • #19
Danke Matjes,

das hatte ich mir mittlerweile auch gedacht. Ich hatte auf einen Eintrag hier im Forum gewartet und nicht meine Emails gecheckt, deshalb antworte ich erst jetzt.

Das Makro habe ich getestet und jetzt hat alles geklappt. Danke dir nochmals.

Gruß

Kukris
 
Thema:

Dokumenteigenschaften von mehreren Word-Dokumenten löschen

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.838
Beiträge
707.961
Mitglieder
51.491
Neuestes Mitglied
haraldmuc
Oben