Die Excel Wühlkiste

Formularfelder und Steuerelemente

zurücksetzen - sperren - entsperren

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
Die Excel Wühlkiste
Valid HTML 4.01 Strict
letzte Aktualisierung: 13.02.2009
Autor: Hubert Scheidgen / 04.02.2009
W3C CSS-Validierungsservice