Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Ist Blatt geschützt per VBA?

Forumthread: Ist Blatt geschützt per VBA?

Ist Blatt geschützt per VBA?
08.09.2004 19:36:58
Alex
Hallo zusammen,
gibt es eine möglichkeit per vba herauszufinden, ob ein tabellenblatt mit passwort geschützt ist?
danke
alex
Anzeige
AW: Ist Blatt geschützt per VBA?
andreas
Hallo alex

Sub schutz()
MsgBox ActiveSheet.Protect
End Sub

liefert wahr oder falsch
gruß
andreas e
Ausprobiert :-)
Ramses
Hallo Andreas
so geht es :-)
Option Explicit

Sub test()
Msgbox check_protect("Tabelle1")
End Sub


Function Check_Protect(wks As String) As Boolean
If Worksheets(wks).ProtectContents = True Then Check_Protect = True
End Function

Gruss Rainer
Anzeige
AW: Ausprobiert :-) flinke hirnlose finger!
andreas
- wie gut das da einer mit verstand drüberschaut !
Danke Rainer
AW: Ausprobiert :-) flinke hirnlose finger!
Alex
danke euch beiden!
Nun machst du mich aber verlegen :-)) o.T.
Ramses
...
Anzeige
funkt doch nicht
alex
hallo,
ich hab'S gerade versucht, das ergebnis ist aber nicht das was ich wollte:
ich möchte ermitteln, ob' ein passwort gibt
danke
alex
Geht meines Wissens auch nicht ...
Ramses
Hallo
ich kann nicht prüfen ob ein Passwort hinterlegt ist.
Was willst du denn dann machen, wenn du weisst dass ein Passwort hinterlegt ist ?
Gruss Rainer
Anzeige
AW: Geht meines Wissens auch nicht ...
alex
ich schreibe ein makro, welches den blattschutz für alle tabellenblätter aufhebt.
wenn ein blatt mit passwort geschützt ist, soll über eine inputbox das pw vorher abgefragt werden
lg
alex
AW: Geht meines Wissens auch nicht ...
Ramses
Hallo
dann schreib doch einfach
ActiveSheet.Unprotect
Wenn ein Passwort benötigt wird, geht die Dialogbox zur Eingabe des Passwortes automatisch auf.
Gruss Rainer
Anzeige
AW: Geht meines Wissens auch nicht ...
alex
so hab ich's auch gelöst,
allerdings wollte ich es mit einer inputbox steuern, um den namen der tabelle bei der passwortabfrage dem user mitzuteilen
alex
Geht doch....
Ramses
Hallo
Den Ansatz für diese Variante habe ich gerade von Peter erhalten.
Witzig, aber funktioniert
Du kannst das verwenden für eine Standardüberprüfung
Select Case Check_PW("Tabelle1", "")
oder du kannst auch gleich ein Passwort mit übergeben
Select Case Check_PW("Tabelle1", "Passwort")
die Prüfung läuft dann, und du kannst den Rückgabewert dann auswerten
Option Explicit

Sub unPro_WKS()
Dim getPw As String
Select Case Check_PW("Tabelle1", "")
Case 1
getPw = InputBox("Bitte Passwort eingeben", "Passwort")
ActiveSheet.Unprotect getPw
Case 2
MsgBox ("Falsches Passwort")
Exit Sub
Case 3
MsgBox "Kein Passwort vorhanden gewesen"
Case 4
MsgBox "Unbekannter Passwortfehler"
End Select
End Sub


Function Check_PW(wks As String, strPw As String) As Variant
On Error GoTo myerrorhandler
Dim myErr As Integer
'Prüfung ob Passwort vorhanden
If strPw = "" Then
myErr = 1
ActiveSheet.Unprotect ""
'Wenn es funktioniert hat ohne Passwort
myErr = 3
ElseIf strPw <> "" Then
'Prüfung mit übergebenem Passwort
myErr = 2
ActiveSheet.Unprotect strPw
End If
Exit Function
myerrorhandler:
Select Case myErr
Case 1
'Passwort auf Tabelle vorhanden
Check_PW = 1
Case 2
'Falsches Passwort
Check_PW = 2
Case 3
'Unbekannter Passwort Fehler
Check_PW = 4
End Select
End Function

Gruss Rainer
Anzeige
AW: Geht doch....
Alex
D A N K E !!!
AW: Ausprobiert :-)
Jörg
Hallo Rainer,
warum denn nicht gleich

Sub test()
MsgBox Sheets("Tabelle1").ProtectContents
End Sub

?
Bin VBA Anfänger, die Frage ist eine Frage, keine Feststellung, dass es so besser sein soll, hat deine Umleitung über die Funktion einen Vorteil?
Gruss Jörg
Anzeige
AW: Ausprobiert :-)
Ramses
Hallo
Prinzipiell ist/wäre es egal, Programmethisch nicht :-)
Wenn du den Code in eine Funktion auslagerst, hast du ihn an einer einzigen Stelle, und kannst ihn von überall aus aufrufen. Wenn etwas nicht stimmt,... musst du auch nur an einer einzigen Stelle ändern :-)
Ausserdem spart es Codezeilen :-). Wenn du innerhalb deines Codes z.B. mehrfach prüfen musst ob eine Tabelle nun geschützt ist oder nicht, musst du das halt nur einmal schreiben.
Das ist der Sinn von einzelnen Funktionen. Soviel wie nur möglich in kleine wartungsfreundliche Teile zu zerlegen. Alles andere ergibt den berühmt berüchtigten Spaghetti-Code der kaum noch zu warten/pflegen ist, wenn man mal was ändern will.
Wenn ich in einem Code-Review EINMAL diese Funktion sehe, weiss ich dass sie existiert.
Wenn ich in einem Code-Review die Anweisung wie von dir geschrieben sehe, weiss ich auch, dass es sie gibt,... aber nicht wie oft ;-))
Gruss Rainer
Anzeige
Danke für deine Ausführungen
Jörg
Hallo Rainer,
ich denke, dass ich es begriffen habe.
Gruss Jörg
AW: Ausprobiert - zusätzliche Frage
08.09.2004 22:35:22
Matze
Hallo Ramses,
ich verwende folgende Bildschirmmeldung öfters:
Dim myDocument As Object, L As Double, T As Double, W As Double, H As Double
W = 600
H = 50
L = Round((Application.Width - W) / "1,5", 0)
T = Round(Application.Height / 2, 0)
Set BVI = Worksheets ("BVI") ' festlegen des Gueltigkeitsbereiches
Set myDocument = ActiveSheet.Shapes.AddShape(msoShapeRectangle, L, T, W, H)
With myDocument
.Name = "Nachricht"
.Fill.ForeColor.SchemeColor = 22
.TextFrame.Characters.Text = "Bitte warten, übernehme die Daten aus dem Internet"
.TextFrame.VerticalAlignment = xlVAlignCenter
.TextFrame.HorizontalAlignment = xlHAlignCenter
.DrawingObject.RoundedCorners = msoTrue
.DrawingObject.Font.Bold = -1
.DrawingObject.Font.ColorIndex = 1
.DrawingObject.Font.Size = 22
.DrawingObject.Font.FontStyle = "Fett"
End With
Diese Meldung bleibt solange auf dem Bildschirm, bis die nachfolgenden Code-Zeilen abgearbeitet sind (was teilweise einige Minuten dauert).
1) Kann ich diesen Teil auch in eine eigene Prozedure/Funktion auslagern?
2) Dazu noch als Verständnisfrage: Muss ich das Modul aufrufen im "Hauptprogramm" - in meinem Fall Auto_Open() oder in dem von mir im Auto_Open-Modul über Call aufgerufenen "Unterprogramm"?
3) wie rufe ich dann den Löschung der Bildschirmmeldung auf. Bisher alles im gleichen Modul [mehrfach untergebracht im Code dank Kopierfunktion :-( ]
ActiveSheet.Shapes("Nachricht").Select
Selection.Delete
Danke für die Infos
Matze
Anzeige
AW: Ausprobiert - zusätzliche Frage
Ramses
Hallo
Prinzipiell würde ich die Variable "myDocument" nicht so verwenden, ist nicht lesefreundlich und impliziert etwas anderes, nämlich dass es sich um ein Document handelt und nicht um eine Nachrichtenbox
kopier mal den Code
Option Explicit
'Modul Übergreifende Variablen
Public myMsgBox As Object

Sub test()
'Message am Bildschirm zeigen
Draw_msg
'anhalten zum kucken :-)
MsgBox "stop"
'sonstiger Code
'Nachricht löschen
myMsgBox.Delete
End Sub


Function Draw_msg()
Dim L As Double, T As Double, W As Double, H As Double
W = 600
H = 50
L = Round((Application.Width - W) / 1.5, 0)
T = Round(Application.Height / 2, 0)
Set myMsgBox = ActiveSheet.Shapes.AddShape(msoShapeRectangle, L, T, W, H)
With myMsgBox
.Name = "Nachricht"
.Fill.ForeColor.SchemeColor = 22
.TextFrame.Characters.Text = "Bitte warten, übernehme die Daten aus dem Internet"
.TextFrame.VerticalAlignment = xlVAlignCenter
.TextFrame.HorizontalAlignment = xlHAlignCenter
.DrawingObject.RoundedCorners = msoTrue
.DrawingObject.Font.Bold = -1
.DrawingObject.Font.ColorIndex = 1
.DrawingObject.Font.Size = 22
.DrawingObject.Font.FontStyle = "Fett"
End With
End Function

Was du mit "Set BVI = ..." willst weiss ich nicht, das kommt ja in dem Code-Segment nicht mehr vor, deshalb habe ich es weggelassen. Die Variable "myMsgBox" bezieht sich ja sowieso schon auf das aktuelle Tabellenblatt.
Die Funktion selbst und die Variablendeklaration gehören in ein eigenes Modul.
Gruss Rainer
Anzeige
AW: Ausprobiert - zusätzliche Frage
09.09.2004 06:53:51
Matze
Hallo Rainer,
ich werde es heute abend mal ausprobieren. Sieht super aus. Danke
mfg
Matze
;
Anzeige

Infobox / Tutorial

Überprüfung des Blattschutzes in Excel mit VBA


Schritt-für-Schritt-Anleitung

In diesem Abschnitt zeige ich dir, wie du per VBA herausfinden kannst, ob ein Tabellenblatt in Excel geschützt ist. Die folgenden Schritte helfen dir, dies zu überprüfen:

  1. Öffne den VBA-Editor: Drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Neues Modul einfügen: Klicke mit der rechten Maustaste auf dein Projekt im Projekt-Explorer, gehe zu Einfügen und wähle Modul.

  3. Code einfügen: Füge den folgenden VBA-Code in das Modul ein:

    Sub schutz()
       MsgBox ActiveSheet.Protect
    End Sub
  4. Makro ausführen: Schließe den VBA-Editor und führe das Makro aus, um zu sehen, ob das aktive Blatt geschützt ist (es zeigt "True" oder "False" an).

  5. Erweiterte Funktion: Wenn du den Schutz für ein spezifisches Blatt überprüfen möchtest, kannst du den folgenden Code verwenden:

    Function Check_Protect(wks As String) As Boolean
       Check_Protect = Worksheets(wks).ProtectContents
    End Function

    Und rufe diese Funktion in einem anderen Sub auf:

    Sub test()
       MsgBox Check_Protect("Tabelle1")
    End Sub

Häufige Fehler und Lösungen

  • Fehler: "Objekt nicht gefunden"
    Lösung: Überprüfe, ob der Blattname korrekt eingegeben wurde.

  • Fehler: "Typen unverträglich"
    Lösung: Stelle sicher, dass du den korrekten Datentyp verwendest (z.B. String für Blattnamen).

  • Fehler: VBA gibt "False" zurück, obwohl das Blatt geschützt ist.
    Lösung: Vergewissere dich, dass du die ProtectContents-Eigenschaft verwendest, um den Schutzstatus korrekt zu überprüfen.


Alternative Methoden

Zusätzlich zu den oben beschriebenen Methoden gibt es verschiedene Ansätze, um den Blattschutz zu überprüfen:

  1. Direkt über die Sheet-Eigenschaften:

    Sub test()
       MsgBox Sheets("Tabelle1").ProtectContents
    End Sub
  2. Verwendung von InputBox für Passwortabfragen: Wenn du ein Makro schreibst, das den Blattschutz aufhebt, kannst du eine InputBox verwenden, um das Passwort abzufragen.

    Sub unPro_WKS()
       Dim getPw As String
       getPw = InputBox("Bitte Passwort eingeben", "Passwort")
       ActiveSheet.Unprotect getPw
    End Sub

Praktische Beispiele

Hier sind einige praktische Beispiele, die dir helfen, das Konzept besser zu verstehen.

Beispiel 1: Einfacher Schutz-Check

Sub checkSheetProtection()
   If ActiveSheet.ProtectContents Then
       MsgBox "Das Blatt ist geschützt."
   Else
       MsgBox "Das Blatt ist nicht geschützt."
   End If
End Sub

Beispiel 2: Passwortabfrage

Sub unlockSheet()
   Dim password As String
   password = InputBox("Gib das Passwort ein:")
   On Error Resume Next
   ActiveSheet.Unprotect password
   If Err.Number <> 0 Then
       MsgBox "Falsches Passwort!"
   Else
       MsgBox "Blatt erfolgreich entsperrt."
   End If
   On Error GoTo 0
End Sub

Tipps für Profis

  • Modularer Code: Halte deinen Code modular, indem du Funktionen für häufig genutzte Aufgaben erstellst. So bleibt dein Code übersichtlich und wartungsfreundlich.

  • Fehlerbehandlung: Implementiere Fehlerbehandlung, um unerwartete Ergebnisse besser zu handhaben.

  • Dokumentation: Kommentiere deinen Code ausgiebig, um anderen (oder dir selbst in der Zukunft) zu helfen, den Zweck jeder Funktion zu verstehen.


FAQ: Häufige Fragen

1. Kann ich auch prüfen, ob ein Passwort für den Blattschutz existiert?
Leider ist dies mit VBA nicht direkt möglich. Du kannst jedoch versuchen, das Blatt ohne Passwort zu entsperren und dann den Status zu überprüfen.

2. Was passiert, wenn ich das falsche Passwort eingebe?
Wenn du ein falsches Passwort eingibst, wird ein Fehler generiert. Du solltest Fehlerbehandlung implementieren, um den Benutzer zu informieren.

3. Welche Excel-Version benötige ich für diese Codes?
Die meisten der genannten Codes funtkionieren in Excel 2010 und späteren Versionen, da die VBA-Funktionalitäten dort weitgehend gleich sind.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige