Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Schreibschutz per VBA funktioniert nicht

Begonnen von frisch, Februar 25, 2011, 11:30:41

⏪ vorheriges - nächstes ⏩

frisch

Hallo Forum
ich versuche gerade eine Word Datei per VBA zu schützen.
(Ich übergebe aus Access dem Word einige Daten)
Ich kann das Word öffnen
den Schreibschutz mit

.ActiveDocument.Unprotect Password:="xxx"  entfernen

Aber beim Schützen mit dem Code:

.ActiveDocument.Protect Password:="xxx", NoReset:=True, Type:=wdAllowOnlyReading, UseIRM:=False, EnforceStyleLock:=False -->funktioniert nicht
.ActiveDocument.CommandBars("Restrict Formatting and Editing").Visible = False    --> funktioniert
.ActiveDocument.Save --> funktioniert

wird der Schutz nicht übernommen :-(

Hat jemand eine Idee?
Danke für Eure Hilfe

LG Friedrich

database

Hallo,

und was pssiert, wenn du NUR 

.ActiveDocument.Protect Type:=wdAllowOnlyReading, Password:="xxx"

nimmst (in obiger Reihenfolge) und den restlichen Schweif an Parametern erstmal wegläßt?

frisch

Hallo Peter,
danke für deine Antwort
wenn ich den Befehl
.ActiveDocument.Protect Type:=wdAllowOnlyReading, Password:="xxx"
eingebe wird der Schutz auch nicht gesetzt. (ohne Fehlermeldung)

wenn ich nur
.ActiveDocument.Protect  Password:="xxx"
eingebe
kommt die Fehlermeldung "Argument ist nicht optional"

wenn ich im Word das Makro schreibe und ausführe  funktioniert der Schreibschutz (Word 2010)  ....

LG Friedrich

database

Hallo,

Zitatwenn ich im Word das Makro schreibe und ausführe  funktioniert der Schreibschutz
zeig doch mal den ganzen ACCESS-Code her, wie du das Word-Dok öffnest und die Daten einträgst.

Ist der Verweis auf die Word.xx Library fehlerfrei gesetzt?


frisch

Hallo,
anbei mein Code...

Private Sub iso_freigabe_Click()

Me.aktiv = True
Me.er_datum = Date
Me.rueckstufung = False
DoCmd.RefreshRecord

If Me.iso_freigabe = True Then

Dim wwobj As Object
Dim vorlage As String
Dim transnr As String
Dim transtitel As String
Dim transersteller As String
Dim transdatum As String
Dim transtyp As String
Dim transart As String
Dim transbereich As String
Dim docneu As String
Dim transrev As String
Dim transvorgabe As String
Dim transfreigabe As String
Dim FileInQuestion As String
Dim revision_a As String
Dim v_nr As String

v_nr = Forms!schulung_details_iso.Form!vorlagen_nr
revision_a = Forms!schulung_details_iso.Form!revision

transnr = Me!nr
transtitel = Me!titel
transersteller = Me!Text88
transdatum = Me!Text124
transtyp = Me!Text122
transart = Me!Text126
transbereich = Me!Text123
transfreigabe = "dfgdsfsdf"
transrev = Me!revision
transvorgabe = Me!vorlagen_nr


docneu = "G:\dokumente\" & v_nr & "_" & revision_a & ".doc"
'MsgBox docneu

Set objWord = CreateObject("Word.Application")
    With objWord
        'Make the application visible.
        objWord.Visible = True
        'Open the document.
        objWord.Documents.Open (docneu)
       
         .ActiveDocument.Unprotect Password:="xxx"
        'Move to each bookmark and insert text from the form.
       
        'Dim oRng As Word.Range
         'Set oRng = .ActiveDocument.Bookmarks("Nr").Range
          '  oRng.Text = ActiveDocument.Bookmarks("Nr").Range.Text
           ' ActiveDocument.Bookmarks.Add "Nr", oRng
        .ActiveDocument.Bookmarks("Nr").Select
        .Selection.Text = CStr(transnr)
        .ActiveDocument.Bookmarks.Add Name:="Nr", Range:=.Selection.Range
        '.ActiveDocument.B("Nr").Range.InsertAfter transnr
       
             
        .ActiveDocument.Bookmarks("Titel").Select
        .Selection.Text = CStr(transtitel)
        .ActiveDocument.Bookmarks.Add Name:="Titel", Range:=.Selection.Range
        '.ActiveDocument.Bookmarks("Titel").Range.InsertAfter transtitel
       
        .ActiveDocument.Bookmarks("Ersteller").Select
        .Selection.Text = CStr(transersteller)
        .ActiveDocument.Bookmarks.Add Name:="Ersteller", Range:=.Selection.Range
        '.ActiveDocument.Bookmarks("Ersteller").Range.InsertAfter transersteller
       
        .ActiveDocument.Bookmarks("Datum").Select
        .Selection.Text = CStr(transdatum)
        .ActiveDocument.Bookmarks.Add Name:="Datum", Range:=.Selection.Range
        '.ActiveDocument.Bookmarks("Datum").Range.InsertAfter transdatum
       
        .ActiveDocument.Bookmarks("Typ").Select
        .Selection.Text = CStr(transtyp)
        .ActiveDocument.Bookmarks.Add Name:="Typ", Range:=.Selection.Range
        '.ActiveDocument.Bookmarks("Typ").Range.InsertAfter transtyp
       
        .ActiveDocument.Bookmarks("Art").Select
        .Selection.Text = CStr(transart)
        .ActiveDocument.Bookmarks.Add Name:="Art", Range:=.Selection.Range
        '.ActiveDocument.Bookmarks("Art").Range.InsertAfter transart
       
        .ActiveDocument.Bookmarks("Bereich").Select
        .Selection.Text = CStr(transbereich)
        .ActiveDocument.Bookmarks.Add Name:="Bereich", Range:=.Selection.Range
        '.ActiveDocument.Bookmarks("Bereich").Range.InsertAfter transbereich
       
        .ActiveDocument.Bookmarks("Freigabe").Select
        .Selection.Text = CStr(transfreigabe)
        .ActiveDocument.Bookmarks.Add Name:="Freigabe", Range:=.Selection.Range
        '.ActiveDocument.Bookmarks("Freigabe").Range.InsertAfter transfreigabe
               
        .ActiveDocument.Bookmarks("Vorgabe").Select
        .Selection.Text = CStr(transvorgabe)
        .ActiveDocument.Bookmarks.Add Name:="Vorgabe", Range:=.Selection.Range
        '.ActiveDocument.Bookmarks("Vorgabe").Range.InsertAfter transvorgabe
       
        .ActiveDocument.Bookmarks("Revision").Select
        .Selection.Text = CStr(transrev)
        .ActiveDocument.Bookmarks.Add Name:="Revision", Range:=.Selection.Range
        '.ActiveDocument.Bookmarks("Revision").Range.InsertAfter transrev
               
        .ActiveDocument.Bookmarks("Dummy").Select
        .Selection.Text = CStr("")
        .ActiveDocument.Bookmarks.Add Name:="Dummy", Range:=.Selection.Range
         '.ActiveDocument.Bookmarks("Dummy").Range.InsertAfter ("")
         
   
    If .ActiveWindow.View.SplitSpecial <> wdPaneNone Then
        .ActiveWindow.Panes(2).Close
         .ActiveWindow.ActivePane.View.Type = 3
         
    End If
    If .ActiveWindow.ActivePane.View.Type = wdNormalView Or .ActiveWindow.ActivePane.View.Type = wdOutlineView Then
        .ActiveWindow.ActivePane.View.Type = 3
    End If
    .ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader
    If .ActiveWindow.View.SplitSpecial = wdPaneNone Then
        .ActiveWindow.ActivePane.View.Type = 3
    Else
        .ActiveWindow.View.Type = 3
    End If
    .ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument
    If .ActiveWindow.View.SplitSpecial = wdPaneNone Then
        .ActiveWindow.ActivePane.View.Type = 3
    Else
        .ActiveWindow.View.Type = wdPrintView
        .ActiveWindow.ActivePane.View.Type = 3
    End If
   
    .ActiveDocument.Protect Password:="xxx"
    'objWord.Protect Password:="iso", NoReset:=False, Type:=wdAllowOnlyReading, UseIRM:=False, EnforceStyleLock:=False
    .ActiveDocument.Save
'    .ActiveDocument.SacveAs FileName:="docneu", WritePassword:="xxx"
  End With
 
   '´Wordobjekt leeren
   Set wwobj = Nothing
   Set objWord = Nothing

End If

Gruss Friedrich

database

#5
Hallo,

ich habe den Code ausprobiert und nach folgender Änderung funktioniert die Passworteingabe bzw -speicherung

Verweis auf die Microsoft Word xx.0 Object Library gesetzt

Im VBA-Editor von Access unter Extra ---> Optionen solltest du unbedingt 'Variablendeklaration erforderlich' anhaken!

Schreib in den Modulkopf deines Moduls in die 2. Zeile Option Explicit ! (Bei neuen Modulen wird das nach dem Setzen der Variablendeklaration automatisch eingefügt)

Deklariere objWord - diese Objektvariable setzt du ein ohne sie deklariert zu haben!

Dim objWord As Object in den Deklarationsabschnitt deiner Routine!
Dort steht ---  Dim wwobj As Object --- nur das Objekt wird im Code nirgends eingesetzt!

Dann habe ich ein neues Word-Dokument OHNE Passwort angelegt und die Zeile ...
.ActiveDocument.Unprotect Password:="xxx"
...auskommentiert

Den Code testweise mit F8 abgearbeitet

und das Dokument mit einem neuen Passwort gespeichert:

.ActiveDocument.Protect Password:="123", Type:=wdAllowOnlyReading

Danach diese Zeile ...
.ActiveDocument.Unprotect Password:="xxx"
... geändert auf ...
.ActiveDocument.Unprotect Password:="abc"

... die Zeile wieder aktiviert und den Code nochmals gestartet und mit F8 schrittweise abgearbeitet.

Der Vollständigkeit halber habe ich dann die Codezeile zum Speichern mit allen Optionen aktiviert und so getestet:

.ActiveDocument.Unprotect Password:="abc"

Dokument geändert und ....

.ActiveDocument.Protect Password:="iso", NoReset:=False, Type:=wdAllowOnlyReading, UseIRM:=False, EnforceStyleLock:=False
... mit dieserm Befehl ein neues Kennwort gesetzt, wobei ich objWord  durch .ActiveDocument ersetzt habe!

Ergebnis:
Das Dokument wurde per Kennwort geöffnet es konnte ins Dokument geschrieben werden.
Das Dokument wurde mit einem neuen Kennwort gespeichert und war vor Schreibzugriff geschützt.  ;)


HTH

frisch

Hallo,
leider funkt es bei mir noch immer nicht

ich habe nun die die Option Explicit eingefügt nun hat Access ein Problem mit der option Type:=wdAllowOnlyReading (Fehler beim Kompilieren Variable nicht definiert) ???

habe zum Probieren den Code gekürzt...

Private Sub Befehl159_Click()

Dim wordobj As Object
Set wordobj = CreateObject("Word.Application")
         
With wordobj
 
  wordobj.Visible = True
  wordobj.Documents.Open "g:\dokumente\1_3.doc"

    .ActiveDocument.Unprotect Password:="iso"
   
    .ActiveDocument.Protect Password:="iso", NoReset:=False, Type:=wdAllowOnlyReading, UseIRM:=False, EnforceStyleLock:=False
   
    .ActiveDocument.Save

End With
Set wordobj = Nothing
End Sub

Danke für deine Hilfe
Gruss Friedrich

DF6GL

Hallo,

wenn die Konstante nicht erkannt wird, könnte:

a) der Word-Verweis nicht korrekt sein.
b) eine Wordversion in Verwendung sein, die diese Konstante nicht kennt.

Setz mal einen Haltepunkt an die Codezeile und überprüf den Wert (evtl. im Direktfenster mit    ?wdAllowOnlyReading    )


Ansonsten versuch:

.ActiveDocument.Protect wdAllowOnlyReading, False, "iso", False, False

bzw.:

.ActiveDocument.Protect 3, False, "iso", False, False


frisch

#8
HAllo,

juhhuuu es funkt
die Zeile

.ActiveDocument.Protect 3, False, "iso", False, False

....hat zum Ziel geführt  :)   (muss man das Verstehen??)

1000 Dank an Franz und Peter
Lg
Friedrich

DF6GL

Hallo,

Zitatmuss man das Verstehen??

ja, der Grund dafür wurde doch schon mehrmals genannt:  Der Verweis auf die Word-Library fehlt oder ist gebrochen..