Registriert seit: 10.04.2014
Version(en): Microsoft 365, mtl. Kanal
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)
Registriert seit: 17.04.2014
Version(en): MS Office 365(32)
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
Registriert seit: 13.04.2014
Version(en): 365
26.02.2015, 08:58
(Dieser Beitrag wurde zuletzt bearbeitet: 26.02.2015, 09:09 von BoskoBiati.)
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.
Registriert seit: 14.04.2014
Version(en): 2003, 2007
26.02.2015, 09:06
(Dieser Beitrag wurde zuletzt bearbeitet: 26.02.2015, 09:21 von atilla.)
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.
Gruß Atilla
Registriert seit: 10.04.2014
Version(en): Microsoft 365, mtl. Kanal
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)
Registriert seit: 10.04.2014
Version(en): Microsoft 365, mtl. Kanal
(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. 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)
Registriert seit: 10.04.2014
Version(en): Microsoft 365, mtl. Kanal
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)
Registriert seit: 10.04.2014
Version(en): 97-2019 (32) + 365 (64)
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)
Registriert seit: 10.04.2014
Version(en): Microsoft 365, mtl. Kanal
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. 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)
Registriert seit: 10.04.2014
Version(en): Microsoft 365, mtl. Kanal
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)
|