cico77778
Goto Top

VBA Dokumentenschutz aufheben Suchen Ersetzen Dokument schützen

Hi,

das Problem gab es 99% noch nicht im deutschsprachigen Internet bzw. wurde gelöst. Habe alles durchsucht.

Also folgendes:

1.) Mehrere Dateien in Unterverzeichnissen
2.) Dokumentenschutz aufheben (EDIT: Es ist kein Passwort vergeben)
3.) Suchen / Ersetzen (z.B. yyyyyyy mit XXXXXXX ersetzen)
4.) Dokument schützen (aber nur die Dokumente, die auch einen Dokumentenschutz hatten)
5.) Speichern unter Word 97 bis 2003 .doc

Wie gesagt, bin schon seit ein paar Tagen am Suchen und konnte nichts finden. Mittlerweile bin ich der Meinung dass das gar nicht geht... Naja, vielleicht gibt es ja einen Profi der das hibekommt. Habe Office 2007 und 2003 zur Verfügung

Vielen Dank im Voraus
Gruß Mo

Content-ID: 155358

Url: https://administrator.de/forum/vba-dokumentenschutz-aufheben-suchen-ersetzen-dokument-schuetzen-155358.html

Ausgedruckt am: 24.12.2024 um 13:12 Uhr

Biber
Biber 18.11.2010 um 20:28:49 Uhr
Goto Top
Moin cico77778,

willkommen im Forum.

Eines versteh ich nicht ganz - wenn du tagelang "am Suchen" warst, dann musst du doch zumindest Teil-Lösungen gefunden haben.
Oder eine Idee, ob du es mit mit VBA/word-Makros angehen willst oder als VBS-Schnipsel.
Wenn du aus welchen Gründen auch immer deine bereits vorhandenen Ansätze nicht mit einbringen magst, dann benenne doch die Punkte, an denen es jetzt klemmt.

Hast du denn die Suchen-Ersetzen-Mimik für ein Dokument fertig und die Dokumentenschutz-Deaktivier/Wieder-Aktiviermimik für ein Einzeldokument auch und es fehlt noch das rekursive Abklappern der Unterverzeichnisse oder umgekehrt...?

Oder hast du noch nie im Leben einen Makro aus der Nähe gesehen, aber gerade heute mittag nach dem Essen spontan die Idee gehabt, dir einen zum Copy&Pasten zu bestellen?

Oder wie sind die Rahmenbedingungen?

Grüße
Biber
TheEternalPhenom
TheEternalPhenom 18.11.2010 um 20:38:31 Uhr
Goto Top
Hallo cico77778,
ein Willkommen auch von mir.

Mal abgesehen von erstens sollte alles machbar sein sofern du keine utopischen Vorstellungen hast. Bei erstens muss ich sagen hab ich im mom keinen Plan was du damit meinst.
Es wäre blos sehr gut, wenn du uns wie Biber schon sagte mehr Infos geben könntest.

Wird zum Beispiel das Dokument nach einem bestimmten Wort durchsucht oder nach variablen Wörtern. Und ähnliche Dinge wären sehr interessant zu wissen, es würde eine Menge Zeit ersparen.

Zum Thema Internet suche kann ich nur sagen, dass zwei nicht gerade unbekannte Suchmaschinen herliche Ergebnise für alle gennanten Bereiche ausspucken. Mit etwas geschick kann man dann ohne Probleme alles zu einem Makro zusammen basteln.

Gruß

duffman521
cico77778
cico77778 18.11.2010 um 21:00:12 Uhr
Goto Top
Hi,

ich habe so gut wie keine Ahnung von Makros. Im netz habe ich "nur" Schnipsel gefunden, aber zusammensetzen kann ich sie nicht.
Da gibt es ettliche Beispiele. Mal funktioniert eins mit einer Datei, aber nicht über ein Verzeichnis mit Unterverzeichnissen. Meine Punkte 4 und 5 habe ich nirgends gefunden wie ich sie brauche. Es ist halt nicht so ohne, wenn man keine Zeile im Code versteht.
Vielleicht bringt der folgende Code Abhilfe.

Gruß Mo

Z.B.
Sub FormularschutzDynamischAufheben()
     If ActiveDocument.ProtectionType >= 0 Then
       ActiveDocument.Unprotect
   Else
       ActiveDocument.Protect Type:=wdAllowOnlyFormFields, NoReset:=True
      End If
    End Sub
_________________________________________________________________

' **** Anpassbare Werte ****  
Private Const Verzeichnis = "C:Eigene Dateien"  
Private Const Filter = "*.doc"  
Private Const UnterverzeichnisseDurchsuchen = 0
Private Const Suche = "XXXXXXXXX"  
Private Const ErsetzeMit = "YYYYYYYYYYY"  
' **** Ende der Anpassung ****  

Private Teil As Range

Sub SuchenErsetzenGanzesVerzeichnis()
  Dim oDoc As Document
  tmp = UnterverzeichnisseDurchsuchen
  If tmp = 1 Then UVD = True Else UVD = False
  If Documents.Count > 0 Then Dokument = ActiveDocument.FullName
  With Application.FileSearch
    .LookIn = Verzeichnis
    .FileName = Filter
    .SearchSubFolders = UVD
    .Execute SortBy:=msoSortByFileName
    Anzahl = .FoundFiles.Count
    Application.ScreenUpdating = False
    For Each aDok In .FoundFiles
      If aDok <> Dokument Then
        On Error Resume Next
        Documents.Open aDok
        Fehler = Err.Number
        On Error GoTo 0
        If Fehler = 0 Then
          Set oDoc = ActiveDocument
          If oDoc.ProtectionType = wdNoProtection Then
            If oDoc.ReadOnly = False Then
              StatusBar = "Durchsuche Dokument " + aDok + "."  
              DoEvents
              SuchenErsetzenSchleife
              oDoc.Close SaveChanges:=wdSaveChanges
            Else
              oDoc.Close SaveChanges:=wdDoNotSaveChanges
            End If
            Else
            oDoc.Close SaveChanges:=wdDoNotSaveChanges
          End If
        End If
      End If
    Next
  End With
  StatusBar = CStr(Anzahl) + " Dokumente durchsucht."  
  DoEvents
  Application.ScreenUpdating = True
End Sub

Private Sub SuchenErsetzenSchleife()
  Application.ScreenUpdating = False
  For Each Teil In ActiveDocument.StoryRanges
    SuchenErsetzen
    While Not (Teil.NextStoryRange Is Nothing)
      Set Teil = Teil.NextStoryRange
      SuchenErsetzen
    Wend
  Next
End Sub

Private Sub SuchenErsetzen()
  Teil.Find.Execute FindText:=Suche, _
    ReplaceWith:=ErsetzeMit, _
    MatchCase:=GrossUndKleinSchreibung, _
    MatchWholeWord:=GanzesWort, _
    MatchWildcards:=Jocker, _
    Replace:=wdReplaceAll
End Sub

Sub SpeichernAufruf()

    With Dialogs(wdDialogFileSaveAs)

    End With

End Sub


[Edit Biber] Codeformatierung [/Edit]
cico77778
cico77778 18.11.2010 um 23:22:30 Uhr
Goto Top
Zitat von @TheEternalPhenom:
Hallo cico77778,
ein Willkommen auch von mir.

Mal abgesehen von erstens sollte alles machbar sein sofern du keine utopischen Vorstellungen hast. Bei erstens muss ich sagen hab
ich im mom keinen Plan was du damit meinst.
Es wäre blos sehr gut, wenn du uns wie Biber schon sagte mehr Infos geben könntest.

Wird zum Beispiel das Dokument nach einem bestimmten Wort durchsucht oder nach variablen Wörtern. Und ähnliche Dinge
wären sehr interessant zu wissen, es würde eine Menge Zeit ersparen.

Zum Thema Internet suche kann ich nur sagen, dass zwei nicht gerade unbekannte Suchmaschinen herliche Ergebnise für alle
gennanten Bereiche ausspucken. Mit etwas geschick kann man dann ohne Probleme alles zu einem Makro zusammen basteln.

Gruß

duffman521

Hi,
habe eben erst Deine Nachricht gelesen. Du fragst nach dem Punkt 1.). Damit meine ich, dass in mehreren Dateien mit Unterverzeichnissen gesucht werden soll.

In der Suche sollen Wörter mit Wörtern ersetzt werden. also z.b. xxxxxx, yyyyyyy mit aaaaaaa, bbbbbbb.

Ich kam jetzt auch auf eine andere Idee wie man die Problematik aus Punkt 4.) (Dokument schützen (aber nur die Dokumente, die auch einen Dokumentenschutz hatten). Es wäre vielleicht mit 4 Makros möglich. Habe ein paar Makros per aufzeichnen erstellt. Ich weis nicht ob sie brauchbar sind. Folgende Schritte wären dann nötig:

1.) Erstes Makro hebt den Dokumentenschutz auf.
Sub Dokumentenschutz_aufheben()
    Documents.Open FileName:="XXXXX.doc", ConfirmConversions:= _  
        False, ReadOnly:=False, AddToRecentFiles:=False, PasswordDocument:="", _  
        PasswordTemplate:="", Revert:=False, WritePasswordDocument:="", _  
        WritePasswordTemplate:="", Format:=wdOpenFormatAuto, XMLTransform:=""  
End Sub

2.) Danach versschiebe ich alle neueren/veränderten Dateien samt Verzeichnisbaum in einen anderes Verzeichnis (mit totalcommander und Plugin Treecopy). Dadurch könnten die doc´s ohne Schutz und mit Schutz getrennt behandelt werden.

3.) In beiden Verzeichnis das Makro Suchen/Ersetzen starten:
Sub suchen_ersetzen()
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "xxxxx"  
        .Replacement.Text = "yyyyy"  
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

4.) Nur in das Verzeichnis ein neues Makro starten wo die Dokumente sind, die Dokumentenschutz hatten, damit der Dokumentenschutz wieder eingebaut wird. (dieses Makro konnte ich bei mir nicht erstellen, weil die Aufzeichnung jedes mal bei klick auf Dokument schützen abgebrochen ist)

5.) Diese Dokumente dann wieder in das Anfangsverzeichnis kopieren

6.) Speichern unter... hier ist das Problem, dass die Datei überschrieben werden muss, aber als Word 97-2003. Es muss also kein Zielordner angegeben werden und Dateiname geändert werden:
Sub speichern_unter_97_2003()
    ChangeFileOpenDirectory "D:	est"  
    ActiveDocument.SaveAs FileName:="XXXXX.doc", FileFormat:=100, _  
        LockComments:=False, Password:="", AddToRecentFiles:=True, WritePassword _  
        :="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _  
        SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _
        False
End Sub

Das ist vielleicht gar keine Schlechte Idee oder?
Jetzt sind eigentlich nur noch Fragen offen, wie man ein komplettes Verzeichnis mit Unterordnung anspricht, und wie man wieder Dokumente schützt (aber ohne Passwort).

Hoffe das jetzt verständlicher ist was ich meine.

Gruß Mo
cico77778
cico77778 19.11.2010 um 10:12:17 Uhr
Goto Top
cico77778
cico77778 19.11.2010 um 10:35:36 Uhr
Goto Top
Hi,

also ich habe jetzt weiter ausprobiert im Word 2007. Gestern der Code war vom Word 2003. im W2007 hat das mit dem Dokumentenschutz geklappt. Am Ende ist noch ein Code, der mehrere Dateien gleichzeitig abarbeitet. Das klappt aber noch nicht richtig. Vielleicht hilft das ja weiter:

Sub Dokumentenschutz_aufheben_word2003()
    Documents.Open FileName:="XXXXX.doc", ConfirmConversions:= _  
        False, ReadOnly:=False, AddToRecentFiles:=False, PasswordDocument:="", _  
        PasswordTemplate:="", Revert:=False, WritePasswordDocument:="", _  
        WritePasswordTemplate:="", Format:=wdOpenFormatAuto, XMLTransform:=""  
End Sub
Sub Dokumentenschutz_aufheben_word2007()
    ActiveDocument.Unprotect
End Sub
Sub suchen_ersetzen_word2003_2007_identisch()
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "xxxxx"  
        .Replacement.Text = "yyyyy"  
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub
Sub Dokument_schützen_word2007()
    ActiveDocument.Protect Password:="", NoReset:=False, Type:= _  
        wdAllowOnlyReading, UseIRM:=False, EnforceStyleLock:=False
End Sub
Sub speichern_unter_97_2003_inW2003()
    ChangeFileOpenDirectory "D:	est"  
    ActiveDocument.SaveAs FileName:="XXXXX.doc", FileFormat:=100, _  
        LockComments:=False, Password:="", AddToRecentFiles:=True, WritePassword _  
        :="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _  
        SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _
        False
End Sub
Sub speichern_unter_97_2003_inW2007()
    ActiveDocument.SaveAs FileName:="Dok2.doc", FileFormat:=wdFormatDocument, _  
        LockComments:=False, Password:="", AddToRecentFiles:=True, WritePassword _  
        :="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _  
        SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _
        False
End Sub

Verzeichnisübergreifend formatieren (Das habe ich aus einem Excel-Makro)
Sub Alle_Dateien_formatieren()
Dim objFileSystemObject As Object
Dim objAnzDateien As Object
Dim objDatei As Object

Set objFileSystemObject = CreateObject("Scripting.FileSystemObject")  
Set objAnzDateien = objFileSystemObject.getfolder("C:Eigene Dateien")  

For Each objDatei In objAnzDateien.Files
   If Right(objDatei.Name, 4) = ".doc" Then  
        
        With 

Hier kommen jetzt die eigentlichen Befehle von oben.

        End With
   End If
Next

Set objFileSystemObject = Nothing
Set objAnzDateien = Nothing
End Sub
76109
76109 21.11.2010 um 19:39:24 Uhr
Goto Top
Hallo Mo!

Mit Word-VBA beschäftige ich mich eher weniger, aber die Punkte 1-5 sollten mit diesem Code funktionieren:
Option Explicit

Const StartFolder = "E:\Test\Docs\"  'Dialog-Startverzeichnis  

Const SaveFormat = 107  'DateiFormat W97-W2002 (W97-W2003 = ???)  

Const Inp1 = "Bitte Such- und Ersetzenbegriffe eingeben:"  

Const Mld1 = "Suchen und Ersetzen..."  

Const Msg1 = "Bei dieser Aktion dürfen keine Dokumente geöffnet sein!"  
Const Msg2 = "Der Vorgang wurde wegen fehlender Eingabe abgebrochen!"  
Const Msg3 = "Die Bearbeitung der Dokumente ist abgeschlossen."  
Const Msg4 = "Die Datei: %1" & vbCr & "ist schreibgeschützt und kann nicht bearbeitet werden!"  

Dim Fso As Object, ReplaceList As Variant

Sub SearchAndReplace()
    Dim Path As String
    
    If Documents.Count Then MsgBox Msg1, vbExclamation, "Fehler":  Exit Sub  
    
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "Verzeichnis auswählen..."  
        .InitialFileName = StartFolder
         If .Show = False Then Exit Sub
         Path = .SelectedItems(1)
    End With
    
    ReplaceList = Split(InputBox(Inp1, Mld1, "Suchen1,Ersetzen1;Suchen2,Ersetzen2"), ";")  
    
    If UBound(ReplaceList) < 0 Then MsgBox Msg2, vbInformation, Mld1:  Exit Sub
    
    Set Fso = CreateObject("Scripting.FileSystemObject")  
    
    Call SearchDocFiles(Fso.GetFolder(Path))
    
    MsgBox Msg3, vbInformation, Mld1
End Sub

Private Sub SearchDocFiles(ByRef Folder)
    Dim File As Object, SubFolder As Object
    
    For Each File In Folder.Files
        If LCase(Fso.GetExtensionName(File.Name)) = "doc" Then  
            Call EditAndSaveDocFile(File.Path)
        End If
    Next
    
    For Each SubFolder In Folder.SubFolders
        Call SearchDocFiles(SubFolder)
    Next
End Sub

Private Sub EditAndSaveDocFile(ByRef File)
    Dim ProtectType As Long, Text As Variant, i As Integer

    With Documents.Open(File)
        If .ReadOnly = True Then
            MsgBox Replace(Msg4, "%1", .FullName), vbExclamation, "Fehler":  .Close:  Exit Sub  
        End If
        
        ProtectType = .ProtectionType
        
        If ProtectType <> wdNoProtection Then .Unprotect
        
        For i = 0 To UBound(ReplaceList)
            Text = Split(ReplaceList(i), ",")  
            If UBound(Text) = 1 Then
                With .Range(Start:=0, End:=0).Find
                    .ClearFormatting
                    .Text = Text(0)
                    .Replacement.ClearFormatting
                    .Replacement.Text = Text(1)
                    .Execute Replace:=wdReplaceAll
                End With
            End If
        Next
        
        If ProtectType <> wdNoProtection Then .Protect Type:=ProtectType, NoReset:=True
        
        Application.DisplayAlerts = wdAlertsNone
       .SaveAs FileName:=File, FileFormat:=SaveFormat, AddToRecentFiles:=False:  .Close
        Application.DisplayAlerts = wdAlertsAll
    End With
End Sub

Schritt1: Alle Dokumente schließen und den Quellcode im VB-Editor in ein Modul kopieren (Normal)
Schritt2: Die Konstante StartFolder entsprechend anpassen
Schritt3: Die Konstante SaveFormat entsprechend anpassen

Ablauf:
1. Wird geprüft, ob Documente geöffnet sind. Wenn ja, wird eine Fehlermeldung ausgegeben und die Aktion abgebrochen.

2. Wird ein Dialog zum auswählen des Start-Ordners angezeigt. Bei Abbruch wird die Aktion abgebrochen.

3. Wird eine Eingabe der Such- und Ersetzenbegriffe gefordert, wobei der Such- und Ersetzenbegriff durch ein Komma getrennt und weitere Such- und Ersetzenbegriffe durch ein Semikolon getrennt werden z.B. "Suchen1,Ersetzen1;Suchen2,Ersetzen2;..." (Beispiel wird per Default angezeigt). Bei Leer oder Abbruch, wird die Aktion abgebrochen.

4. Wird die Word-SearchFile-Funktion durch eine andere Such-Funktion ersetzt, da diese in den neueren Word-Versionen nicht mehr zur Verfügung steht.

5. Sind Dokumente schreibgeschützt, wird eine Fehlermeldung mit Pfad-Angabe der jeweiligen Datei ausgegeben.

6. Ist unerheblich, ob sich Dateien mit/ohne Dokument-Schutz in einem Verzeichnis befinden. Gechützte Dateien werden mit dem gleichen Schutz gespeichert, der beim Öffnen vorhanden war.

Das ganze sollte natürlich erst in einem Test-Verzeichnis getetet werdenface-wink

Gruß Dieter
aseyfarth
aseyfarth 10.08.2016 um 18:08:55 Uhr
Goto Top
Hallo Dieter (@76109)
funktioniert das auch unter Word 2013?
Ich habe da nämlich auch ein paar Unterordner mit Dateien, die einen Dokumentenschutz haben,
ich bin aber nicht der große Makroheld und traue mir nicht zu, das ohne Unterstützung zu ändern.
Das Programm, mit dem ich arbeite, ist wie gesagt Word 2013, die vorliegenden Dateien sind aber Word 2003 (*.dot) und ganz wenige Word 2007 und neuer (*.dotx) um es genau zu sagen, weil die Branchensoftware stabil die *.dot aufrufen kann, während die *.dotx nicht getestet ist, bzw. nur zum Teil.
Die Dateien, die vorher *.dot waren, müssen hinterher auch wieder *.dot Dateien sein und die *.dotx-Dateien müssen hinterher wieder dotx-Dateien sein.
Grund für die Aktion: wir müssen in gefühlten 300 bis 500 Vorlagen Einträge suchen und z. Teil löschen (Hinweis auf Jobbörse.) und zum Teil ersetzen (Revisionsstand in Fußzeile und Änderung des Brandings (Ein Unternehmen der <Firmenname>. wird a brand of <Firmenname>).
Einen großen Teil können wir zwar in den Filial- und Mandantendaten unserer Branchensoftware anpassen, dann bleibt aber immer noch der Hinweis auf die Jobbörse und die Anpassung des Revisonsstandes in der Word-Fußzeile.

Ich würde gern dein Makro testen, weiß aber nicht, wie ich es anpasse, damit auch das herauskommt, was ich haben will.

Ich habe hier noch einen Code, der zwar ohne Fehler durchläuft, aber den Dokumentenschutz nicht aufhebt.

Sub SetPassword()
Const AktPasswd = "test" 'das Originalpasswort ist mir bekannt
Dim varVerzeichnis As String
Dim strDatei As String
Dim wdDoc As Word.Document

With Application.FileDialog(msoFileDialogFolderPicker)
.AllowMultiSelect = False 'evt. rausnehmen, oder kann ich das auf True setzen, damit ich die Ordner auswählen kann, die es betrifft? Eine Kopie der Dateien habe ich gemacht
If .Show = -1 Then
Application.ScreenUpdating = False
varVerzeichnis = .SelectedItems(1)
strDatei = Dir(varVerzeichnis & Application.PathSeparator & "*.doc") 'hier müsste ich dot oder dotx auswählen können
While strDatei <> ""
If LCase(strDatei) <> LCase(ThisDocument.Name) Then
Set wdDoc = Documents.Open(varVerzeichnis & "\" & strDatei)
With wdDoc
If .ProtectionType <> wdNoProtection Then
'wenn geschützt, dann Schutz aufheben
.Unprotect Password:=AktPasswd
End If
.ReadOnlyRecommended = False
.Password = "" 'Passwort zurücksetzen
.WritePassword = "" 'Passwort zurücksetzen. Reicht einmal zurücksetzen?
.RemovePersonalInformation = False
.RemoveDateAndTime = False
.Close savechanges:=wdSaveChanges 'Datei speichern und schließen
End With
End If
strDatei = Dir
Wend
Application.ScreenUpdating = True
End If
End With
MsgBox "Fertig"
Set wdDoc = Nothing
End Sub

Das würde mir bereits genügen, ich habe ein Tool für suchen und ersetzen.

Wenn die Version von dir allerdings auch unter Word 2013 funktionieren würde, wäre das auch nicht schlecht. Ich würde das Makro dann sowieso mehrfach durchlaufen lassen, damit ich alle Bereiche erfasse.

Kann man auch eine Ergebnisliste erstellen, was gefunden wurde, bevor man ersetzt? bzw. kann man wählen, zwischen suchen und ersetzen?

Für eine Hilfe wäre ich sehr dankbar.

MfG

Andrea