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.
Achtung: Es gibt bereits eine Version 2 des Tutorials, wo noch etwas mehr auf einen alternativen Quelltext eingegangen wird!
Ich habe für alle das unten folgende Beispiel als fertige Datei zum Download
bereitgestellt. Sie finden den Download-Link am Ende dieses Tutorials.
Unser Ziel ist eine Adressliste, die wir mit einer Eingabemaske versehen möchten. Die Eingabemaske soll
folgende Funktionen besitzen:
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 | H | I | |
---|---|---|---|---|---|---|---|---|---|
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 |
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.
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.
Option Explicit
Option Compare Text
' ************************************************************************************************
' Autor/en: http://www.online-vba.de - Marc Wershoven
' Verwendung der Quelltexte auf eigene Gefahr!
' Es gelten die Nutzungsbedingungen von www.online-vba.de!
' Original-Quelltext: www.online-vba.de/vba_tutorialuserform.php
' ************************************************************************************************
'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 überschriftrn
'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
Das war es schon! Wie die Programmierung funktioniert, habe ich
Ihnen in grüner Schrift in den Quelltext geschrieben.
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.
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.
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!
Zu guter Letzt habe ich Ihnen die in diesem Tutorial als Beispiel verwendete Datei als Download bereitgestellt.
Achtung: Es gibt bereits eine Version 2 des Tutorials, wo noch etwas mehr auf einen alternativen Quelltext eingegangen wird!
Den Link dazu finden Sie hier: Beispieldatei-Download
(Dateiformat: *.xlsm - Erstellt mit Microsoft® Excel® Version 2013 -
Diese Datei ist kompatibel mit Microsoft® Excel® Version 2007 oder neuer - Dateigröße: ca. 31 KiloBytes)
Wichtiger Hinweis: Als kostenlosen Service stellen die Autoren von
www.Online-VBA.de Dateien zum Download bereit. Dieser Download erfolgt stets auf eigene Gefahr.
Bitte beachten Sie die Nutzungsbedingungen und das Impressum von www.Online-VBA.de, bevor Sie die Datei herunterladen.
Ein kostenloser Support oder Service für die unter www.Online-VBA.de veröffentlichen Werke kann leider nicht angeboten werden!
Autor: Marc Wershoven (Oktober 2013)
VBA Programmierer gesucht?
http://www.WershovenOnline.de
Sie haben beispielsweise eine Frage zu einer Ihrer eigenen Makroprogrammierungen in VBA? Oder Sie suchen Unterstützung und Informationen über eine bestimmte Microsoft® Excel® Formel? Bei nahezu allen Fragen und Problemen rund um Microsoft® Office und VBA Makros steht Ihnen unser individueller Quick E-Mail Support zur Verfügung. Einfach, schnell und unkompliziert Ihre Frage in einer E-Mail formulieren, mit oder ohne Screenshots oder einer Beispieldatei absenden und kurze Zeit später haben Sie eine vollständige Lösung inkl. ausführlicher Erklärung vom Profi in Ihrem Postfach!
Zusätzlich besteht die Option, dass wir uns mittels Fernwartung (selbstverständlich nach Ihrem Einvertändnis) direkt "live" mit Ihnen zusammen an Ihrem Bildschirm gemeinsam Fragen und Problemstellungen anschauen und lösen können!
Weitere Informationen zu diesem kostenpflichtigen Angebot finden Sie auf der Anbieterseite von WershovenOnline® auf www.wershovenonline.de.
Zum Anbieter des Quick-E-Mail-Support...