Tutorial: Eingabemaske für Excel-Tabelle (Anfänger)
Einleitung
                        Ich wurde schon sehr oft auf das Thema: "Ich würde gerne eine Eingabemaske für meine Tabelle haben" angesprochen.
                        Daher habe ich mir die Zeit genommen und Ihnen ein kleines Tutorial geschrieben, welches von A-Z die Erstellung
                        einer wirklich einfachen Eingabemaske beschreibt. Ich habe mich für eine kleine Adressliste entschieden.
                        Dieses Tutorial ist eine Schritt-für-Schritt Anleitung, die Sie selbst nachbauen können. 
                        Später können Sie dieses Beispiel immer weiter ausbauen und ergänzen. In diesem Tutorial wird lediglich
                        ein leichtes und stark vereinfachtes Beispiel verwendet und die ersten Schritte für Einsteiger und Anfänger erläutert. 
                        Daher ersetzt dieses Tutorial keine fundierte Schulung oder ein Seminar, sondern bietet lediglich den Service, 
                        um die ersten Schritte mit VBA und einer Eingabemaske auszuprobieren.
                        
                        Für Fortgeschrittene ist dieses Tutorial nicht geeignet!
                        
                    
                        Hinweis: Für dieses Tutorial wurde Microsoft Office Professional Version 2013 verwendet. 
                        Als Betriebssystem wurde Windows 7 verwendet. Wenn Sie eine andere Version verwenden, kann
                        es Unterschiede im Erscheinungsbild geben! Verwenden Sie Microsoft Office für Mac? Hier gibt es einige weitere Unterschiede, welche ich in diesem Tutorial aber nicht weiter ansprechen möchte.
                        
                        Ich habe für alle das unten folgende Beispiel als fertige Datei zum Download bereitgestellt. Sie finden den Download-Link am Ende dieses Tutorials.
                    
Neue Version des Tutorials
                            Bitte beachten Sie auch die bereits verfügbare 
                            Version 2 des Tutorials, wo noch etwas mehr auf einen alternativen Quelltext eingegangen wird! 
                        
Die Ausgangslage und Zielsetzung
                        Unser Ziel ist eine Adressliste, die wir mit einer Eingabemaske versehen möchten. Die Eingabemaske soll
                        folgende Funktionen besitzen:
                    
- Beim Öffnen der Eingabemaske sollen alle vorhandenen Namen in einer Liste auf der Eingabemaske angezeigt werden.
 - Beim Klick auf einen Namen in dieser Liste sollen die Informationen der Adressliste auf der Eingabemaske in sogenannten Textboxen angezeigt werden.
 - Änderungen sollen mit einem Speichern-Knopf in die Excel Tabelle eingetragen werden.
 - Neue Einträge sollen mit einer Schaltfläche "Adresse hinzufügen" angelegt werden können.
 - Existierende Einträge sollen mit einer "Löschen" Schaltfläche entfernt werden können.
 
                        In diesem Tutorial geht es lediglich um Grundlagenwissen. 
                        Komplizierte Eingabeprüfungen und Fehlerbehandlungsroutinen werde ich nicht ansprechen. 
                        Diese Themen sind jedoch weitere Ausbaumöglichkeiten, wären aber in einem ersten Schritt für Anfänger zu viel auf einmal.
                        
                        Schauen wir uns die Ausgangslage an. Ich habe eine kleine Beispieltabelle erzeugt. Es ist wirklich ein sehr simples Beispiel.
                        Wenn Sie dieses Beispiel nachbauen möchten, öffnen Sie nun Ihr Microsoft Excel und öffnen Sie eine neue und leere Arbeitsmappe.
                        
                    
| A | B | C | D | E | F | G | |
|---|---|---|---|---|---|---|---|
| 1 | Name (ID) | Telefon | Adresse | PLZ | Ort | ||
| 2 | Marc | 12345 | info@wershovenonline.de | Musterstrasse 16 | 12345 | Musterhausen | |
| 3 | Anika | 54321 | keine vorhanden | Beispielweg 2 | 54321 | Musterort | |
| 4 | Max Mustermann | 33445 | max@mustermann.de | Muster-Haupt-Str. 3 | 22334 | Mustermetropole | |
| 5 | |||||||
| 6 | 
                        
                        Wichtige Annahme für dieses Beispiel: Wir gehen davon aus, das es jeden Namen, den wir eingeben, nur EINMAL gibt!
                        Wenn in Ihrer zukünftigen Tabelle beispielsweise eine eindeutige Rechnungsnummer oder eine laufende Nummer existiert,
                        können Sie diese verwenden, um Ihre Datensätze in der späteren Programmierung auffinden zu können.
                        Deshalb steht in der Überschrift auch "Name (ID)", um zu kennzeichnen, 
                        dass diese Spalte das Erkennungszeichen eines Datensatzes beinhaltet.
    
                    
Die Eingabemaske erstellen
                        Nachdem wir unsere Datengrundlage eingegeben haben, erstellen wir uns nun eine Eingabemaske. Zuerst entwerfen wir das Layout unserer Oberfläche, 
                        die auch als UserForm bezeichnet wird. Dazu drücken Sie in Excel die Tastenkombination ALT und F11.
                        Jetzt wird die integrierte Entwicklungsumgebung geöffnet.
                        
                        Auf der linken Seite sehen Sie nun ein Fenster mit dem Titel "Projekt-Explorer". In diesem sehen Sie alle
                        geöffneten Arbeitsmappen und Add-Ins. Klappen Sie Ihre Datei mit Hilfe des + Zeichens in einem Kästchen auf, sofern diese nicht schon aufgeklappt ist.
                        Sollten Sie den Projekt-Explorer und das Eigenschaftenfenster nicht sehen, können Sie sich über das Menü "Ansicht" diese einblenden.
                    

                        Jetzt sehen Sie alle Tabellen, Formulare und Module Ihrer Datei.
                        Klicken Sie nun mit der rechten Maustaste auf Ihre Datei und wählen Sie
                        dort Einfügen -> UserForm.
                    

                        Es wird eine neue "UserForm1" erstellt und im Projekt-Explorer eingefügt. Doppel-Klicken Sie mit der Maus
                        auf die neu erstellte "UserForm1". Es wird das folgende Fenster geöffnet, sofern dies nicht schon automatisch durch die Entwicklungsumgebung getan wurde:
                    

                        Im Eigenschaftenfenster sehen Sie den Namen der Eingabemaske: "UserForm1". Bitte ändern Sie diesen für dieses Beispiel 
                        erstmal nicht. In Ihren zukünftigen Projekten können Sie selbstverständlich eigene Namen verwenden, dann müssen
                        Sie aber in der Programmierung an den entsprechenden Stellen den korrekten UserForm Namen verwenden. In unserem Beispiel
                        verwenden wir daher die Standardnamen, um es nicht weiter zu verkomplizieren. Die Größe der UserForm können Sie frei verändern.
                        Ziehen Sie die UserForm mit der Maus an einer der Randmarkierungen einfach größer oder kleiner. Ganz nach Ihrem Wunsch.
                        
                        Der nächste Schritt ist die eigentliche Erstellung unserer Benutzeroberfläche, 
                        welche ähnlich zu den Auto-Formen in den Microsoft
                        Office Produkten abläuft. Wir benötigen dazu die sogenannte Werkzeugsammlung (auch Toolsammlung genannt), welche Sie sich bitte,
                        wenn noch nicht automatisch geschehen, über das Menü "Ansicht" der Entwicklungsumgebung einblenden.
                        Klicken Sie in der Werkzeugsammlung auf das entsprechende Objekt-Icon, welches Sie auf die UserForm einfügen wollen, 
                        und fügen Sie dieses wie bei den Auto-Formen auf die graue Fläche unserer UserForm1 ein. Und zwar genau so, als wollten Sie einen
                        Rahmen zeichnen. Wenn Sie nicht wissen, welches Icon wofür ist, gehen Sie mit der Maus über das 
                        Icon und warten Sie, bis der ToolTippText angezeigt wird.
                        
                        Wir benötigen auf unserer UserForm1 folgendes:
                    
- 1x ListBox (Name: ListBox1)
 - 6x TextBox (Namen: TextBox1 bis TextBox6)
 - 1x CommandButton (Name: CommandButton_1 - Caption: Neuer Eintrag)
 - 1x CommandButton (Name: CommandButton_2 - Caption: Löschen)
 - 1x CommandButton (Name: CommandButton_3 - Caption: Speichern)
 - 1x CommandButton (Name: CommandButton_4 - Caption: Beenden)
 - 7x Label (Um die Oberfläche zu beschriften!)
 
                        
                        Das Ergebnis könnte ungefähr so aussehen:
                    

                        Hinweis zur Gestaltung: Wenn Sie ein Objekt, wie die TextBox oder den CommandButton, auf der UserForm1 anklicken, sehen Sie
                        im Eigenschaftenfenster (dieses können Sie sich im Menü "Ansicht" zur Not einblenden lassen) ganz viele Einstellungsmöglichkeiten.
                        Die Wichtigste für uns ist der "(Name)". Dieser muss wie oben in der Liste angegeben benannt sein 
                        (bspw. ListBox1, TextBox1, usw.), da sonst unsere Programmierung
                        nicht funktionieren würde. Um einen Label-Text zu ändern oder die Schrift der Command_Buttons, können Sie die Eigenschaft 
                        Caption verwenden (im Eigenschaftenfenster) oder mit der Maus das 
                        Label markieren und mit einem erneuten Klick in den Editiermodus wechseln, 
                        dann sehen Sie den Cursor im Text blinken und können diesen nun verändern.
                        
                        Damit haben wir unsere Oberfläche fertiggestellt. Es folgt die eigentliche Programmierung.
                    
Die Funktionalitäten der Eingabemaske erstellen
                        Um unserer Benutzeroberfläche "das Leben einzuhauchen" Doppel-Klicken Sie bitte auf 
                        die "Beenden"-Schaltfläche, unserem CommandButton_4 auf unserer UserForm1. Der Quellcode Editor wird geöffnet und 
                        Sie sehen schon etwas Quelltext. Löschen Sie diesen und fügen Sie den folgenden Quelltext
                        vollständig ein.
                        
                        Und das war es dann auch schon! Wie die Programmierung funktioniert, habe ich 
                        Ihnen in grüner Schrift in den Quelltext geschrieben.
                    
Ergebnisse statt Aufwand & Arbeit?
Wir liefern Ergebnisse - Schicken Sie uns kurz Ihre Datei und Ihre Wünsche; wir integrieren den notwendigen Code professionell, beheben ggf. vorhandene Fehler, machen optional ein Code-Review, liefern bei Bedarf Performance-Optimierungen & setzen gewünschte Erweiterungen effizient für Sie um (und das zum Festpreis nach kurzer Sichtung).
Express-Service beauftragen
Der Quelltext
				
                            Option Explicit
                    
                            Option Compare Text
                    
                            
                            ' Original-Quelltext unter: https://www.online-vba.de/vba-tutorial-eingabemaske-fuer-excel-tabelle
                            ' Express-Hilfe für VBA unter https://www.online-vba.de/vba-expresshilfe
                            ' Es gelten die Nutzungsbedingungen von Online-VBA.de
                            
                            'Neuer Eintrag Schaltfläche Ereignisroutine
                            Private Sub CommandButton1_Click()
                              Dim lZeile As Long
                                'Wenn der Benutzer einen neuen Eintrag erzeugen möchte,
                                'erstellen wir einen neuen Eintrag in der ListBox und markieren
                                'diesen, damit der Benutzer die Daten eintragen kann
                                
                                lZeile = 2 'Start in Zeile 2, Zeile 1 sind ja die überschriften
                                'Schleife, solange etwas in der ersten Spalte in Tabelle 1 drin steht
                                Do While Trim(CStr(Tabelle1.Cells(lZeile, 1).Value)) <> ""
                                    lZeile = lZeile + 1 'Nächste Zeile bearbeiten
                                Loop
                                
                                'Nach Durchlauf dieser Schleife steht lZeile in der ersten leeren Zeile von Tabelle1
                                'Neuen Eintrag in die Tabelle1 schreiben, Spalte ID muss gefüllt sein, damit
                                'unsere Routinen die Zeile wiederfinden!
                                Tabelle1.Cells(lZeile, 1) = CStr("Neuer Eintrag Zeile " & lZeile)
                                
                                'Und neuen Eintrag in die UserForm eintragen
                                ListBox1.AddItem CStr("Neuer Eintrag Zeile " & lZeile)
                                
                                'Den neuen Eintrag markieren mit Hilfe des ListIndexes
                                ListBox1.ListIndex = ListBox1.ListCount - 1
                                'Durch das Click Ereignis der ListBox werden die Daten automatisch geladen
                                
                            End Sub
                            
                            'Löschen Schaltfläche Ereignisroutine
                            Private Sub CommandButton2_Click()
                              Dim lZeile As Long
                              
                                'Wenn kein Datensatz in der ListBox markiert wurde, wird die Routine beendet
                                If ListBox1.ListIndex = -1 Then Exit Sub
                              
                                'Zum Löschen benötigen wir die Zeilennummer des ausgewählten Datensatzes
                                lZeile = 2 'Start in Zeile 2, Zeile 1 sind ja die Überschriften
                                'Schleife solange etwas in der ersten Spalte in Tabelle 1 drin steht
                                Do While Trim(CStr(Tabelle1.Cells(lZeile, 1).Value)) <> ""
                                
                                    'Datensatz ID Spalte mit selektiertem Eintrag der ListBox vergleichen
                                    If ListBox1.Text = Trim(CStr(Tabelle1.Cells(lZeile, 1).Value)) Then
                                        
                                        'Eintrag gefunden, die ganze Zeile wird nun gelöscht
                                        Tabelle1.Rows(CStr(lZeile & ":" & lZeile)).Delete
                                        
                                        'Die ListBox muss nun neu geladen werden!
                                        Call UserForm_Initialize
                                        If ListBox1.ListCount > 0 Then ListBox1.ListIndex = 0
                                        
                                        Exit Do 'Vorzeitiges Ende, da der Datensatz schon gefunden ist
                                        
                                    End If
                                
                                    lZeile = lZeile + 1 'Nächste Zeile bearbeiten
                                Loop
                                
                            End Sub
                            
                            'Speichern Schaltfläche Ereignisroutine
                            Private Sub CommandButton3_Click()
                              Dim lZeile As Long
                              
                                'Wenn kein Datensatz in der ListBox markiert wurde, wird die Routine beendet
                                If ListBox1.ListIndex = -1 Then Exit Sub
                                
                                'Wir müssen prüfen, ob die ID Spalte auch gefüllt ist!!
                                If Trim(CStr(TextBox1.Text)) = "" Then
                                    'Meldung ausgeben
                                    MsgBox "Sie müssen mindestens einen Namen eingeben!", vbCritical + vbOKOnly, "FEHLER!"
                                    'Abbrechen der Speicherroutine
                                    Exit Sub
                                End If
                                'Ausbauoption: Prüfen, ob die ID in Tabelle1 Spalte 1 schon vorhanden ist!
                                
                                'Zum Speichern benötigen wir die Zeilennummer des ausgewählten Datensatzes
                                lZeile = 2 'Start in Zeile 2, Zeile 1 sind ja die Überschriften
                                'Schleife, solange etwas in der ersten Spalte in Tabelle 1 drin steht
                                Do While Trim(CStr(Tabelle1.Cells(lZeile, 1).Value)) <> ""
                                
                                    'Datensatz ID Spalte mit selektiertem Eintrag der ListBox vergleichen
                                    If ListBox1.Text = Trim(CStr(Tabelle1.Cells(lZeile, 1).Value)) Then
                                        
                                        'Eintrag gefunden, TextBoxen in die Zellen schreiben
                                        Tabelle1.Cells(lZeile, 1).Value = Trim(CStr(TextBox1.Text))
                                        Tabelle1.Cells(lZeile, 2).Value = TextBox2.Text
                                        Tabelle1.Cells(lZeile, 3).Value = TextBox3.Text
                                        Tabelle1.Cells(lZeile, 4).Value = TextBox4.Text
                                        Tabelle1.Cells(lZeile, 5).Value = TextBox5.Text
                                        Tabelle1.Cells(lZeile, 6).Value = TextBox6.Text
                                        
                                        'Die ListBox muss nun neu geladen werden
                                        'allerdings nur, wenn sich der Name (ID) geändert hat
                                        If ListBox1.Text <> Trim(CStr(TextBox1.Text)) Then
                                            Call UserForm_Initialize
                                            If ListBox1.ListCount > 0 Then ListBox1.ListIndex = 0
                                        End If
                                        
                                        Exit Do 'Vorzeitiges Ende, da der Datensatz schon gefunden ist
                                        
                                    End If
                                
                                    lZeile = lZeile + 1 'Nächste Zeile bearbeiten
                                Loop
                                
                            End Sub
                            
                            'Beenden Schaltfläche Ereignisroutine
                            Private Sub CommandButton4_Click()
                                Unload Me
                            End Sub
                            
                            'Klick auf die ListBox Ereignisroutine
                            Private Sub ListBox1_Click()
                              Dim lZeile As Long
                                'Wenn der Benutzer einen Namen anklickt, suchen wir
                                'diesen in der Tabelle1 heraus und tragen die Daten
                                'in die TextBoxen ein.
                                
                                'Wir löschen standardmäßig alle bisherigen TextBoxen-Inhalte
                                TextBox1 = ""
                                TextBox2 = ""
                                TextBox3 = ""
                                TextBox4 = ""
                                TextBox5 = ""
                                TextBox6 = ""
                                
                                'Nur wenn ein Eintrag selektiert/markiert ist
                                If ListBox1.ListIndex >= 0 Then
                                
                                    lZeile = 2 'Start in Zeile 2, Zeile 1 sind ja die Überschriften
                                    'Schleife, solange etwas in der ersten Spalte in Tabelle 1 drin steht
                                    Do While Trim(CStr(Tabelle1.Cells(lZeile, 1).Value)) <> ""
                                    
                                        'Wenn wir den Namen aus der ListBox1 in der Tabelle1 Spalte 1
                                        'gefunden haben, übertragen wir die anderen Spalteninhalte
                                        'in die TextBoxen!
                                        If ListBox1.Text = Trim(CStr(Tabelle1.Cells(lZeile, 1).Value)) Then
                                        
                                            'TextBoxen füllen
                                            TextBox1 = Trim(CStr(Tabelle1.Cells(lZeile, 1).Value))
                                            TextBox2 = Tabelle1.Cells(lZeile, 2).Value
                                            TextBox3 = Tabelle1.Cells(lZeile, 3).Value
                                            TextBox4 = Tabelle1.Cells(lZeile, 4).Value
                                            TextBox5 = Tabelle1.Cells(lZeile, 5).Value
                                            TextBox6 = Tabelle1.Cells(lZeile, 6).Value
                                        
                                            Exit Do 'Vorzeitiges Ende, da der Datensatz schon gefunden ist
                                        
                                        End If
                                    
                                        lZeile = lZeile + 1 'Nächste Zeile bearbeiten
                                    
                                    Loop
                                    
                                End If
                                
                            End Sub
                            
                            Private Sub UserForm_Activate()
                                'Wenn die Eingabemaske angezeigt wird, markieren wir den ersten Namen
                                'jedoch nur, wenn auch Einträge in der Liste stehen
                                If ListBox1.ListCount > 0 Then ListBox1.ListIndex = 0
                            End Sub
                            
                            'Startroutine, wird ausgeführt bevor die Eingabemaske angezeigt wird
                            Private Sub UserForm_Initialize()
                              Dim lZeile As Long
                              
                                'Alle TextBoxen leer machen
                                TextBox1 = ""
                                TextBox2 = ""
                                TextBox3 = ""
                                TextBox4 = ""
                                TextBox5 = ""
                                TextBox6 = ""
                              
                                'In dieser Routine laden wir alle vorhandenen
                                'Einträge in die ListBox1
                                ListBox1.Clear 'Zuerst einmal die Liste leeren
                                
                                lZeile = 2 'Start in Zeile 2, Zeile 1 sind ja die Überschriften
                                'Schleife, solange etwas in der ersten Spalte in Tabelle 1 drin steht
                                Do While Trim(CStr(Tabelle1.Cells(lZeile, 1).Value)) <> ""
                                    
                                    'Aktuelle Zeile in die ListBox eintragen
                                    ListBox1.AddItem Trim(CStr(Tabelle1.Cells(lZeile, 1).Value))
                                    
                                    lZeile = lZeile + 1 'Nächste Zeile bearbeiten
                                    
                                Loop
                                
                            End Sub
                        
Eine Schaltfläche erstellen, welche die Eingabemaske öffnet
                        Jetzt müssen wir nur noch eine Schaltfläche in unsere Excel Tabelle einfügen, damit wir die 
                        Benutzeroberfläche auch jederzeit starten können! Sie können die Entwicklungsumgebung 
                        nun vollständig schließen und zurück zu unserer Excel Tabelle1 wechseln. 
                        (Entweder über das X am oberen rechten Fensterrand oder über das Menü der Entwicklungsumgebung.)
                        Jetzt benötigen wir den Excel Reiter "Entwicklertools". Sollte dieser bei Ihnen nicht eingeblendet sein,
                        gehen Sie bitte in Ihre Excel Optionen unter Menüband und aktivieren Sie die Anzeige der Entwicklertools.
                    

Klicken Sie nun wie im folgenden Screenshot gezeigt auf "Einfügen"... "Schaltfläche" und platzieren Sie eine neue Schaltfläche auf Ihrem Tabellenblatt Tabelle1.

Nachdem Sie die Schaltfläche eingefügt haben, öffnet sich automatisch ein weiteres Fenster. Klicken Sie dort auf "Neu". Die Entwicklungsumgebung öffnet sich und es steht etwas Quelltext im Code-Fenster. Schreiben Sie UserForm1.Show zwischen die beiden existierenden Zeilen, wie im folgenden Screenshot zu sehen.

                        Schließen Sie die Entwicklungsumgebung und kehren Sie zur Excel Tabelle1 zurück. Wir sind fertig!
                    
Jetzt testen wir!
                        Nun ist es soweit! Wir probieren das Ganze aus.
                        Klicken Sie auf unsere Schaltfläche, um die Eingabemaske zu öffnen, und probieren Sie alles in Ruhe aus.
                    


Schlusswort
                        Ich hoffe, ich konnte Ihnen an diesem einfachen Beispiel die ersten Schritte 
                        zur eigenen Eingabemaske etwas erleichtern. Selbstverständlich gibt es noch viele weitere Möglichkeiten,
                        Erweiterungen und Verschönerungen, die man einbauen kann. Wie sagt man so 
                        schön: "Man kann immer mehr dazu bauen und hübscher geht auch immer!". Diese Aufgabe
                        überlasse ich allerdings Ihnen selbst!
                        
                        Ich wünsche Ihnen Viel Erfolg und Spass bei Ihrer ersten eigenen Eingabemaske!
                        
                    
Das könnte Sie auch interessieren:
 
                    Wir übernehmen die Excel-Migration – Bestandsaufnahme, Portierung von Makros/Daten und saubere Übergabe in eine wartbare Struktur.
                    Regional unterstützen wir Sie mit einem VBA-Entwickler für Köln – Festpreise und direkter Ansprechpartner.
                    
Download der Beispieldatei
                        Zu guter Letzt habe ich Ihnen die in diesem Tutorial als Beispiel verwendete Datei als Download bereitgestellt.
                        
                        Den Link dazu finden Sie hier: 
                        
                        DOWNLOAD
                        
                    
Anmerkungen und Hinweise
Dieser Codeschnipsel wurde geschrieben von Marc Wershoven im Jahr 2013.
                Die Nutzung erfolgt auf eigene Gefahr.
Bitte denken Sie immer zuerst an eine ausreichende Datensicherung.
Wir können keinen kostenlosen Support anbieten.
Es gelten unsere Nutzungsbedingungen.
                
                Wichtiger Hinweis für Downloads: Als kostenlosen Service stellen die Autoren von Online-VBA.de Dateien zum Download bereit. Dieser Download erfolgt stets auf eigene Gefahr. Bitte beachten Sie die Nutzungsbedingungen, bevor Sie die Datei herunterladen. Einen kostenlosen Support oder Service für die hier veröffentlichen Werke kann leider nicht angeboten werden!
                
