Da haben wir ein tolles Formular in Excel konstruiert, haben jede
Menge Checkboxen und Dropdownfelder zur Auswahl eingebaut und
zudem noch eine riesige Menge normale Eingabezellen spendiert.
Der Anwender kann nun prima ausfüllen.Ganz großartig.
Was aber ist, wenn er das nächste Formular bearbeiten, oder
wenn er noch einmal von vorne beginnen möchte?
Schließt er dann das Formular und liest es erneut ein? Oder schlimmer
noch: Soll er von Hand alle Zellen löschen und die Felder wieder "frei"
klicken? Wie unpraktisch.
Wäre ein "Reset-Button" nicht die bessere Wahl?
Damit der Anwender unsere Mühe nicht zunichte macht, wollen wir
außerdem das Formular sperren und nur die Felder und Eingabezellen
zur Bearbeitung freigeben.
Die normalen Eingabezellen sind schnell markiert und über Format/Zellen
entsperrt. Die Formularfelder bzw. die Steuerelemente können aber zur
Formatierung nur einzeln selektiert werden. Das soll ein Makro übernehmen,
sonst klicken wir uns die Finger wund.
Soll das Formular später überarbeitet werden, so soll ein Makro alle
Blätter in einem Schritt sperren oder entsperren - also immer den
jeweils anderen Zustand, als den gerade vorhandenen, herstellen.
Der Blattschutz verfügt über kein Passwort, weil wir dem Anwender
ja vertrauen ^^. Der Blattschutz soll nur ein versehentliches Ändern
verhindern.
Modul1 Modul2 CommandButtons
In diesem "Modul2" wird der Blattschutz geändert und die Sperrung
der Steuerelemt-Toolbox-Felder gesetzt oder aufgehoben.
Da dieses aber sicher nur sehr selten geschehen
soll, ist diesen Funktionen kein Button zugewiesen. Sie müssen in
der Entwicklungsumgebung von Hand gestartet werden. Sie sind auch
nicht als SUB gespeichert, damit der Anwender diese Makros unter
Extras/Makro/Makros nicht finden kann.
Die Eigenschaft "LockedText" ist mit Vorsicht zu
gebrauchen. Denn sie funktioniert nur manchmal und produziert ansonsten
Fehler und es besteht der Verdacht, dass hierfür unterschiedliche
Excel-Versionen verantwortlich sein können, mit denen die Felder
erstellt wurden. Genau dies war nämlich bei der Entwicklung des
Formulars der Fall.In diesem Beispiel sind die 2 Zeilen deshalb auch
auskommentiert.
Option Explicit Private i As Integer
Function Blattschutz() If ActiveSheet.ProtectContents = True Then For i = 1 To Worksheets.Count With Worksheets(i) .Unprotect End With Next i ElseIf ActiveSheet.ProtectContents = False Then For i = 1 To Worksheets.Count With Worksheets(i) .Protect DrawingObjects:=False, Contents:=True End With Next i End If End Function
Function Steuerelemente_sperren() Dim sh As Shape For i = 1 To Worksheets.Count For Each sh In Worksheets(i).Shapes If sh.Type = msoFormControl Then If sh.FormControlType = xlCheckBox Then sh.Locked = True 'sh.LockedText = True End If If sh.FormControlType = xlDropDown Then sh.Locked = False End If End If Next sh Next i End Function
Function Steuerelemente_entsperren() Dim sh As Shape For i = 1 To Worksheets.Count For Each sh In Worksheets(i).Shapes sh.Select If sh.Type = msoFormControl Then If sh.FormControlType = xlCheckBox Then With Selection .Locked = False 'sh.LockedText = True End With End If If sh.FormControlType = xlDropDown Then sh.Locked = False End If End If Next sh Next i End Function