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
Die ersten drei Funktionen auf dieser Seite sind je einem
CommandButton zugewiesen und lesen in die Variable
"Datenfeld1" sämtliche Adressen der normalen Eingabezellen eines
Blattes als einen einzigen String ein. Der Blattname wird in der
Variablen "WKS" gespeichert. Anschließend wird die Vierte Funktion
mit dem Namen "Loeschen" in diesem Modul aufgerufen und gleichzeitig
der Inhalt der beiden Variablen an sie übergeben.
Im ersten Schritt werden dort die Felder der
Steuerelement-Toolbox zurückgesetzt und im zweiten Schritt die Felder
der Formular-Toolbox.
Anschließend werden die normalen Eingabezellen
alle mit einem Leerstring ("") versehen.
Leider geht an dieser
Stelle "ClearContents" nicht, weil das Blatt ja noch gesperrt ist.
An dieser Stelle könnte man dann sicher noch das Entsperren-Makro
aufrufen. Wer's denn so lieber mag, der baue sich den VBA-Code eben
entsprechend um.
Überhaupt sei noch angemerkt, das man die Fünktionen, die keine Rückgabe
liefern auch als Sub ausführen kann. Es ist auch möglich, diesen Code
direkt beim CommandButton zu belassen. Dann ist er aber nicht so schön
übersichtlich in einem einzigen Modul untergebracht.
Neu hinzu am 14.03.2009:
Eine Abfrage, ob wirklich alles zurückgesetzt und gelöscht werden soll,
findet sich jetzt ganz unten in diesem Modul. Aufgerufen wird sie durch
die CommandButtons.
Danke an Andreas Killer für sein Feedback.
Option Explicit Private WKS As String 'Worksheet.Name Private Datenfeld1 As String 'normale zu löschende Zellen pro Blatt in einem einzigen String
Function Allgemein_loeschen() WKS = "Allgemein" 'Tabelle1 'alle "normalen" Eingabezellen der Seite: "Allgemein": Datenfeld1 = "" _ & "C8, G8, C10, G10, C12, G12, C14, G14," _ & "C20, C22, C24" Datenfeld2 = "" _ & "E24" Loeschen Datenfeld1, Datenfeld2, WKS End Function
Function Musteranforderung_loeschen() WKS = "Musteranforderung" 'Tabelle2 'alle "normalen" Eingabezellen der Musteranforderung: Datenfeld1 = "" _ & "R4, J20, J22, H24, N24, K26," _ & "O26, S26, U26, G32, K37, O37," _ & "S37, L39 ,N41, U41, J43, S43," _ & "G48, J48, M48, Q48, G50, J50," _ & "M50, Q50, G52, J52, M52, Q52," _ & "H54, H56, H58, I63, S63, E65," _ & "I67, B69, E71, Q71, T74, M76," _ & "E78" Datenfeld2 = "" _ & "O78" Loeschen Datenfeld1, Datenfeld2, WKS End Function
Function Erstauftrag_loeschen() WKS = "Erstauftrag" 'Tabelle5 'alle "normalen" Eingabezellen der Seite: "Erstauftrag": Datenfeld1 = "" _ & "Q4, G18, Q18, G20, G22, D28, J28, R28, G31," _ & "I31, L31, O31, I34, I36, I38, F41, F41, T41," _ & "F43, G45, I45, F50, I50, O50, S50, F52, I52," _ & "O52, S52, G57:P57, G58:P58, I61, T61, F63, R66, K68, T68, M70, T70," _ & "O77, T77, O79, T79, H82, B84, B86, E88, G59:P59, I59" Datenfeld2 = "" _ & "O88" Loeschen Datenfeld1, Datenfeld2, WKS End Function
Function Loeschen(Datenfeld1, Datenfeld2, WKS) Dim oleObj As OLEObject Dim mycntrl As OLEObject Dim sh As Shape 'zwei Möglichkeiten, die erste ist für Elemente der Steuerelement Toolbox, 'die zweite für Elemente Formular Toolbox: For Each sh In Worksheets(WKS).Shapes If sh.Type = msoFormControl Then If sh.FormControlType = xlCheckBox Then sh.ControlFormat.Value = 0 End If If sh.FormControlType = xlDropDown Then sh.ControlFormat.Value = 0 End If End If Next sh For Each oleObj In Worksheets(WKS).OLEObjects If oleObj.progID = "Forms.CheckBox.1" Then oleObj.Object.Value = 0 End If If oleObj.progID = "Forms.Dropdown.1" Then oleObj.Object.Value = 0 End If Next oleObj With Worksheets(WKS) If Datenfeld1 <> "" Then .Range(Datenfeld1).Value = "" End If If Datenfeld2 <> "" Then .Range(Datenfeld2).Value = "" End If End With End Function
Function Antwort(Meldung As String) As Integer Antwort = MsgBox("Wirklich " & Meldung & " löschen?", _ vbYesNo + vbDefaultButton2, "Bestätigung Löschen") End Function