Blattschutz mit VBA aufheben
#1
Hallo Freunde,

helft mir bitte bei einem kleinen VBA-Problem. Ich habe in meiner Mappe die Blätter "Ausgabe" (dauerhaft sichtbar) und "Daten" (wird per VBA aus- bzw. eingeblendet).

Dazu habe ich folgenden Code (mit Tante Gugls Hilfe) zusammengeschustert:

Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'
   Dim raBereich As Range
       Set raBereich = Sheets("Ausgabe").Range("J1")
           Sheets("Ausgabe").Unprotect Password:="xxx"
               If Intersect(Target, raBereich) Is Nothing Then Exit Sub
                   If Sheets("Daten").Visible = xlVeryHidden Then
                           Sheets("Daten").Visible = True
                       Else: Sheets("Daten").Visible = xlVeryHidden
               End If
               Range("H2").Activate
           Sheets("Ausgabe").Protect Password:="xxx"
End Sub

Mit Doppelklick ("Ausgabe") in Zelle J1 (ist vom Blattschutz ausgenommen) hole ich das ausgeblendete Blatt hervor. Nun muss ich nach Eingaben im Blatt "Daten" noch in einem bestimmten Bereich im Blatt "Ausgabe" Einträge vornehmen . Allerdings wird mir durch das Makro der Blattschutz (noch) nicht aufgehoben.

An welcher Stelle gehört die Codezeile, die den Schutz aufhebt, hin? Und stimmt überhaupt meine Syntax?
Gruß Günter
Jeder Fehler erscheint unglaublich dumm, wenn andere ihn begehen.
angebl. von Georg Christoph Lichtenberg (1742-1799)
Top
#2
Hi Günter,

probiere es mal damit:

Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
 'Doppelklick im Sheet "Ausgabe"
 
 If Target.Address = "$J$1" Then
   If Sheets("Daten").Visible Then
     Sheets("Daten").Visible = xlVeryHidden
     Me.Protect Password:="xxx"
   Else
     Sheets("Daten").Visible = True
     Me.Unprotect Password:="xxx"
     Me.Range("H2").Activate
   End If
   Cancel = True
 End If
End Sub

Gruß Uwe
Top
#3
Hallo Günter,

das Makro schaltet den Blattschutz zuerst aus und sofort wieder ein. Es wäre eher sinnvoll, die beiden Vorgänge zu trennen.

eine Variante: zwei verschiedene Zellen zum Ein- bzw. Ausschalten:


Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

'
   
If Target.Address <> "$J$1" And Target.Address <> "$A$1" Then Exit Sub

    If Target.Address = "$J$1" Then
        Sheets("Ausgabe").Unprotect Password:="xxx"
        If Sheets("Daten").Visible = xlVeryHidden Then
            Sheets("Daten").Visible = True
        Else
            Sheets("Daten").Visible = xlVeryHidden
        End If
    Else
        Sheets("Ausgabe").Protect Password:="xxx"
    End If
End Sub
Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

'
   
If Target.Address <> "$J$1" And Target.Address <> "$A$1" Then Exit Sub

    
        If Sheets("Daten").Visible = xlVeryHidden Then
            Sheets("Daten").Visible = True
        Else
            Sheets("Daten").Visible = xlVeryHidden
        End If
    If Target.Address = "$J$1" Then
        Sheets("Ausgabe").Unprotect Password:="xxx"
    Else
        Sheets("Ausgabe").Protect Password:="xxx"
    End If
End Sub

oder mit zwei Makros, eins mit Doppelklick, eins beim Schließen der Datei, wenn es weitere Blätter gibt, auch beim Deaktivieren des Blattes.

Edit: Sehe gerade, Uwe hat schon was. Jetzt weiß ich was mir gefehlt hat!
Gruß

Edgar

Meine Antworten sind freiwillig und ohne Gewähr!
Über Rückmeldungen würde ich mich freuen.
Top
#4
Hallo Günter,

eine Lösung hast Du ja.
Aber hier noch ein paar Worte zum Verständnis und den Ablauf Deines Codes.

Bei Doppelklick wird, egal in welche Zelle, der Schutz aufgehoben.
Dann wird geschaut, ob die Zelle in der man den Doppelklick ausgeführt hat, im Schnittmengenbereich dieser Zelle mit der Zelle J1
liegt. Du merkst, dass das mit dem Schnittmengenbereich etwas Großspurig ist. In diesem Fall reicht einfach zu prüfen ob es Die Zelle J1 ist, so wie Uwe es macht. Aber das alles hat nichts mit Schutz zu tun.

Du erinnerst Dich noch, das der Schutz schon aufgehoben ist. Aber was nutzt es, Du bist ja noch in der Zelle drin und der Code möchte weitermachen. Der macht dann so weiter: Wenn Tabelle "Daten" ausgeblendet , dann wird sie eingeblendet sonst ausgeblendet.
Dann wird die Zelle H2 aktiviert.

Blattschutz ist immer noch raus.

Der Code ist fast am Ende.
Es wartet noch ungeduldig eine Codezeile, die noch ausgeführt werden will.
Und jetzt passiert es, Die Zeile wird ausgeführt.

Der Blattschutz wird gesetzt.

Also, Dein Problem ist nicht den Schutz aufzuheben, sondern das Du Ihn am Ende immer wieder setzt.
Diese Zeile mit Setzen muss an anderer Stelle abgearbeitet werden. Schutz soll gesetzt sein, wenn Tabelle Daten ausgeblendet, also auch da die Zeile hin.

Dein Code ginge dann so:

Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'
  Dim raBereich As Range
 Set raBereich = Sheets("Ausgabe").Range("J1")
     Sheets("Ausgabe").Unprotect Password:="xxx"
     If Intersect(Target, raBereich) Is Nothing Then Exit Sub
     If Sheets("Daten").Visible = xlVeryHidden Then
                 Sheets("Daten").Visible = True
     Else
       Sheets("Daten").Visible = xlVeryHidden
       Sheets("Ausgabe").Protect Password:="xxx"
     End If
     Range("H2").Activate

End Sub

Mit dem Doppelpunkt hinter Else ist leider vom Programmierer auch nicht schön gemacht.
Für einen Laien ist dann schwer zu erkennen, wie man dann noch andere Codezeilen im Else Teil unterbringen kann.



Hmm, währen ich meinen Roman schrieb hat auch Edgar schon geantwortet. Aber jetzt weißt Du bescheitd Günter. Wink
Gruß Atilla
Top
#5
Hallo Uwe, Edgar und Atilla,

schon mal lieben Dank für eure Hilfe. Ich habe noch ein paar Fehlermeldungen bekommen. Genaueres kann ich aber erst nach intensiverem Ausprobieren heute Abend nach der Arbeit sagen. Momentan habe ich nur mal die einzelnen Makros kopiert und einmal getestet.

Ich melde mich dann entweder heute Abend noch oder morgen Nachmittag und erstatte Bericht.
Gruß Günter
Jeder Fehler erscheint unglaublich dumm, wenn andere ihn begehen.
angebl. von Georg Christoph Lichtenberg (1742-1799)
Top
#6
(26.02.2015, 08:40)Kuwer schrieb: Hi Günter,

probiere es mal damit:



Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
 'Doppelklick im Sheet "Ausgabe" .... 

Gruß Uwe

Hi Uwe,

danke für deine Hilfe. Allerdings habe ich mit diesem Makro das Problem, dass es sich nur einmal ausführen lässt. Ich habe eine von Makros gänzlich befreite Kopie meiner Datei mit deinem Code bestückt und den DK ausgeführt. Das versteckte Tabellenblatt wurde eingeblendet und der Blattschutz aufgehoben. Mit einem weiteren DK wurde wieder Blatt2 ausgeblendet und der Blattschutz gesetzt.

Soweit ist alles in bester Ordnung.

Doch ein weiterer DK, um eine nochmalige Bearbeitung durchzuführen, führt ins Leere. Das Makro wird auch nach Schließen und erneutem Öffnen der Datei nicht mehr ausgeführt. Huh

Ich habe mich nun für mein eigenes Makro, das von Atilla umgebaut wurde, entschieden.
Gruß Günter
Jeder Fehler erscheint unglaublich dumm, wenn andere ihn begehen.
angebl. von Georg Christoph Lichtenberg (1742-1799)
Top
#7
Hi Edgar,

(26.02.2015, 08:58)BoskoBiati schrieb: Hallo Günter,

das Makro schaltet den Blattschutz zuerst aus und sofort wieder ein. Es wäre eher sinnvoll, die beiden Vorgänge zu trennen.

eine Variante: zwei verschiedene Zellen zum Ein- bzw. Ausschalten:





Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'
   
If Target.Address <> "$J$1" And Target.Address <> "$A$1" Then Exit Sub...
Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)....

oder mit zwei Makros, eins mit Doppelklick, eins beim Schließen der Datei, wenn es weitere Blätter gibt, auch beim Deaktivieren des Blattes.

Edit: Sehe gerade, Uwe hat schon was. Jetzt weiß ich was mir gefehlt hat!

auch dir vielen Dank für deine Hilfe. Mit deinem Vorschlag mit zwei getrennten Makros bin ich aber leider nicht klar gekommen. Entweder habe ich mich s...blöde angestellt oder eine Denkblockade verhindert, dass ich das Makro richtig anwende. Deshalb habe ich mich für mein eigenes, von Atilla korrigiertes, Makro entschieden.
Gruß Günter
Jeder Fehler erscheint unglaublich dumm, wenn andere ihn begehen.
angebl. von Georg Christoph Lichtenberg (1742-1799)
Top
#8
Hallo Günter,

Uwe hat Vereinfachungen in seinem Code. Diese funktionieren anscheinend nicht immer.

Ersetze
  If Sheets("Daten").Visible Then
durch
  If Sheets("Daten").Visible = True Then

und
    Me.Range("H2").Activate
durch
    Me.Activate
    Range("H2").Activate
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#9
Hi Atilla

(26.02.2015, 09:06)atilla schrieb: Hallo Günter,

eine Lösung hast Du ja.
Aber hier noch ein paar Worte zum Verständnis und den Ablauf Deines Codes.
[...]
Dein Code ginge dann so:


Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'
  Dim raBereich As Range
 Set raBereich = Sheets("Ausgabe").Range("J1")
     Sheets("Ausgabe").Unprotect Password:="xxx"
     If Intersect(Target, raBereich) Is Nothing Then Exit Sub
     If Sheets("Daten").Visible = xlVeryHidden Then
                 Sheets("Daten").Visible = True
     Else
       Sheets("Daten").Visible = xlVeryHidden
       Sheets("Ausgabe").Protect Password:="xxx"
     End If
     Range("H2").Activate

End Sub

[...]

Hmm, währen ich meinen Roman schrieb hat auch Edgar schon geantwortet. Aber jetzt weißt Du bescheitd Günter. Wink

vielen Dank für deinen "Roman". Deine Erklärungen haben mir für mein weiteres Makroverständnis sehr weitergeholfen. Ich habe mich deshalb für mein von dir korrigiertes Makro entschieden. Lediglich die Zeile "Sheets("Ausgabe").Unprotect Password:="xxx"" habe ich unter die Zeile "If intersect is..." gesetzt.
Vorher wurde der Blattschutz durch DK in irgendeine Zelle aufgehoben (Dank deiner Erklärung habe ich das ausprobiert; alleine wäre ich vllt. nur durch Zufall daraufgekommen) - mit dem Verschieben arbeitet das Makro nun so, wie ich es haben wollte.
Gruß Günter
Jeder Fehler erscheint unglaublich dumm, wenn andere ihn begehen.
angebl. von Georg Christoph Lichtenberg (1742-1799)
Top
#10
Hi André,

Zitat:Uwe hat Vereinfachungen in seinem Code. Diese funktionieren anscheinend nicht immer.

danke für den Hinweis. Einen Teil davon (...visible=true...) hatte ich schon selber ausprobiert, den "Range-Teil" teste ich heute Abend.
Gruß Günter
Jeder Fehler erscheint unglaublich dumm, wenn andere ihn begehen.
angebl. von Georg Christoph Lichtenberg (1742-1799)
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste