Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema InputBox
BildScreenshot zu InputBox InputBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema Frame
BildScreenshot zu Frame Frame-Seite mit Beispielarbeitsmappe aufrufen

Ist Blatt geschützt per VBA?

Betrifft: Ist Blatt geschützt per VBA? von: Alex
Geschrieben am: 08.09.2004 19:36:58

Hallo zusammen,

gibt es eine möglichkeit per vba herauszufinden, ob ein tabellenblatt mit passwort geschützt ist?

danke

alex

  


Betrifft: AW: Ist Blatt geschützt per VBA? von: andreas e
Geschrieben am: 08.09.2004 19:39:32

Hallo alex

Sub schutz()
MsgBox ActiveSheet.Protect
End Sub


liefert wahr oder falsch
gruß
andreas e


  


Betrifft: Ausprobiert :-) von: Ramses
Geschrieben am: 08.09.2004 19:50:57

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


  


Betrifft: AW: Ausprobiert :-) flinke hirnlose finger! von: andreas e
Geschrieben am: 08.09.2004 19:53:08

- wie gut das da einer mit verstand drüberschaut !
Danke Rainer


  


Betrifft: AW: Ausprobiert :-) flinke hirnlose finger! von: Alex
Geschrieben am: 08.09.2004 19:54:33

danke euch beiden!


  


Betrifft: Nun machst du mich aber verlegen :-)) o.T. von: Ramses
Geschrieben am: 08.09.2004 19:59:01

...


  


Betrifft: funkt doch nicht von: alex
Geschrieben am: 08.09.2004 20:19:07

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


  


Betrifft: Geht meines Wissens auch nicht ... von: Ramses
Geschrieben am: 08.09.2004 20:28:55

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


  


Betrifft: AW: Geht meines Wissens auch nicht ... von: alex
Geschrieben am: 08.09.2004 21:38:07

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


  


Betrifft: AW: Geht meines Wissens auch nicht ... von: Ramses
Geschrieben am: 08.09.2004 22:29:44

Hallo

dann schreib doch einfach

ActiveSheet.Unprotect

Wenn ein Passwort benötigt wird, geht die Dialogbox zur Eingabe des Passwortes automatisch auf.

Gruss Rainer


  


Betrifft: AW: Geht meines Wissens auch nicht ... von: alex
Geschrieben am: 08.09.2004 23:34:21

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


  


Betrifft: Geht doch.... von: Ramses
Geschrieben am: 09.09.2004 00:14:39

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


  


Betrifft: AW: Geht doch.... von: Alex
Geschrieben am: 09.09.2004 07:59:45

D A N K E !!!


  


Betrifft: AW: Ausprobiert :-) von: Jörg Gradert
Geschrieben am: 08.09.2004 20:08:59

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


  


Betrifft: AW: Ausprobiert :-) von: Ramses
Geschrieben am: 08.09.2004 20:18:41

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


  


Betrifft: Danke für deine Ausführungen von: Jörg Gradert
Geschrieben am: 08.09.2004 20:28:54

Hallo Rainer,
ich denke, dass ich es begriffen habe.

Gruss Jörg


  


Betrifft: AW: Ausprobiert - zusätzliche Frage von: Matze
Geschrieben am: 08.09.2004 22:35:22

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


  


Betrifft: AW: Ausprobiert - zusätzliche Frage von: Ramses
Geschrieben am: 08.09.2004 22:56:24

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


  


Betrifft: AW: Ausprobiert - zusätzliche Frage von: Matze
Geschrieben am: 09.09.2004 06:53:51

Hallo Rainer,

ich werde es heute abend mal ausprobieren. Sieht super aus. Danke

mfg
Matze