Ich baue mir eine Userform, was eigentlich auch sehr gut funktioniert.
Nun habe ich aber folgende Probleme:
Bei meinem Code werden in der Userform die Textboxen 1-4 und die Comboboxen 1-4 mit den gleichen Inhalten gefüllt.
Leider kann ich nicht ganz nachvollziehen warum.
Mein anderes Problem ist, dass ich nicht genau weis wie die Textboxen und Comboboxen auf die Tabelle Bezug nimmt.
Also Textbox1 wird gefüllt mit A1.
Vielleicht kann mir ja hier jemand einen Tipp geben.
Herzlichen Dank Alex
Private Const lCONST_STARTZEILENNUMMER_DER_TABELLE As Long = 5
Private Sub UserForm_Initialize()
'With UF
'.MaxButton = True
'.MinButton = True
'.BorderStyle = xlSolid
'.Create Me
'End With
'Set g_UserForm = Me
With Me.ComboBox1
ComboBox1.Clear
.AddItem ("Administration")
.AddItem ("Hauswirtschaft")
.AddItem ("Lingerie")
.AddItem ("Pflege")
.AddItem ("Restauration")
.AddItem ("Technik")
.AddItem ("Verwaltung")
.AddItem ("Küche")
.AddItem ("")
End With
With Me.ComboBox2
ComboBox2.Clear
.AddItem ("zwingend")
.AddItem ("zu erwarten")
.AddItem ("gewünscht")
.AddItem ("")
End With
Call LISTE_LADEN_UND_INITIALISIEREN 'Aufruf der entsprechenden Verarbeitungsroutine
End Sub
Private Sub LISTE_LADEN_UND_INITIALISIEREN()
Dim lZeile As Long
Dim lZeileMaximum As Long
Dim i As Integer
'Alle TextBoxen leer machen
For i = 1 To iCONST_ANZAHL_EINGABEFELDER
Me.Controls("TextBox" & i) = ""
Next i
For i = 1 To 4
Me.Controls("Combobox" & i) = ""
Next i
ListBox1.Clear 'Liste leeren
'4 Spalten einrichten
'Spalte 1: Zeilennummer des Datensatzes
'Spalte 2: Name (Spalte A)
'Spalte 3: Telefon (Spalte B)
'Spalte 4: E-Mail (Spalte C)
ListBox1.ColumnCount = 6
'Spaltenbreiten der Liste anpassen (0=ausblenden, nichts=automatisch)
'"
ListBox1.ColumnWidths = "0;;;;"
'Feste Breiten: ListBox1.ColumnWidths = "0;100;100;100"
'Um eine Schleife für alle Datensätze zu erhalten, benötigen wir die letzte verwendete _
Zeile
lZeileMaximum = Tabelle3.UsedRange.Rows.Count 'Benutzer Bereich auslesen
For lZeile = lCONST_STARTZEILENNUMMER_DER_TABELLE To lZeileMaximum
'Nur wenn die Zeile benutzt / nicht leer ist, zeigen wir etwas an:
If IST_ZEILE_LEER(lZeile) = False Then
'Spalte 1 der Liste mit der Zeilennummer füllen
ListBox1.AddItem lZeile
'Spalten 2 bis 4 der Liste füllen
ListBox1.List(ListBox1.ListCount - 1, 2) = CStr(Tabelle3.Cells(lZeile, 1).Text)
ListBox1.List(ListBox1.ListCount - 1, 1) = CStr(Tabelle3.Cells(lZeile, 2).Text)
ListBox1.List(ListBox1.ListCount - 1, 3) = CStr(Tabelle3.Cells(lZeile, 3).Text)
ListBox1.List(ListBox1.ListCount - 1, 4) = CStr(Tabelle3.Cells(lZeile, 4).Text)
ListBox1.List(ListBox1.ListCount - 1, 5) = CStr(Tabelle3.Cells(lZeile, 7).Text)
'ListBox1.List(ListBox1.ListCount - 1, 6) = CStr(Tabelle3.Cells(lZeile, 6).Text)
'ListBox1.List(ListBox1.ListCount - 1, 7) = CStr(Tabelle3.Cells(lZeile, 7).Text)
'ListBox1.List(ListBox1.ListCount - 1, 8) = CStr(Tabelle3.Cells(lZeile, 8).Text)
'ListBox1.List(ListBox1.ListCount - 1, 9) = CStr(Tabelle3.Cells(lZeile, 9).Text)
' ListBox1.List(ListBox1.ListCount - 1, 10) = CStr(Tabelle3.Cells(lZeile, 10).Text)
'ListBox1.List(ListBox1.ListCount - 1, 11) = CStr(Tabelle3.Cells(lZeile, 11).Text)
'ListBox1.List(ListBox1.ListCount - 1, 12) = CStr(Tabelle3.Cells(lZeile, 12).Text)
End If
Next lZeile
End Sub
Private Sub EINTRAG_LADEN_UND_ANZEIGEN()
Dim lZeile As Long
Dim i As Integer
'Eingabefelder resetten
For i = 1 To iCONST_ANZAHL_EINGABEFELDER
Me.Controls("TextBox" & i) = ""
Next i
For i = 1 To 4
Me.Controls("Combobox" & i) = ""
Next i
'Nur wenn ein Eintrag selektiert/markiert ist
If ListBox1.ListIndex >= 0 Then
'Die Zeilennummer des Datensatzes steht in der ersten ausgeblendeten Spalte der Liste,
'somit können wir direkt zugreifen.
lZeile = ListBox1.List(ListBox1.ListIndex, 0)
For i = 1 To iCONST_ANZAHL_EINGABEFELDER
Me.Controls("TextBox" & i) = CStr(Tabelle3.Cells(lZeile, i).Text)
Next i
For i = 1 To 4
Me.Controls("Combobox" & i) = CStr(Tabelle3.Cells(lZeile, i).Text)
Next i
End If
End Sub
Private Sub EINTRAG_SPEICHERN()
Dim lZeile As Long
Dim i As Integer
'Wenn kein Datensatz in der ListBox markiert wurde, wird die Routine beendet
If ListBox1.ListIndex = -1 Then Exit Sub
'Zum Speichern benötigen wir die Zeilennummer des ausgewählten Datensatzes
lZeile = ListBox1.List(ListBox1.ListIndex, 0)
For i = 1 To iCONST_ANZAHL_EINGABEFELDER
Tabelle3.Cells(lZeile, i) = Me.Controls("TextBox" & i)
Tabelle3.Cells(lZeile, 7) = CDbl(TextBox3.Value)
Next i
For i = 1 To 4
Tabelle3.Cells(lZeile, i) = Me.Controls("Combobox" & i)
Next i
'Der Benutzer könnte die angezeigten Werte in der Liste geändert haben,
'daher aktualisieren wir den ausgewählten Eintrag entsprechend.
ListBox1.List(ListBox1.ListIndex, 2) = ComboBox1
ListBox1.List(ListBox1.ListIndex, 1) = TextBox2
ListBox1.List(ListBox1.ListIndex, 3) = TextBox3
ListBox1.List(ListBox1.ListIndex, 4) = ComboBox2
ListBox1.List(ListBox1.ListIndex, 5) = TextBox7
'ListBox1.List(ListBox1.ListIndex, 6) = TextBox3
'ListBox1.List(ListBox1.ListIndex, 7) = TextBox4
'ListBox1.List(ListBox1.ListIndex, 8) = TextBox5
'ListBox1.List(ListBox1.ListIndex, 9) = TextBox6
'ListBox1.List(ListBox1.ListIndex, 10) = TextBox8
'ListBox1.List(ListBox1.ListIndex, 11) = TextBox9
'ListBox1.List(ListBox1.ListIndex, 12) = TextBox10
End Sub
Private Sub EINTRAG_LOESCHEN()
Dim lZeile As Long
'Wenn kein Datensatz in der ListBox markiert wurde, wird die Routine beendet
If ListBox1.ListIndex = -1 Then Exit Sub
'Beim Löschen fragen wir zuerst den Benutzer noch einmal sicherheitshalber:
If MsgBox("Sie möchten den markierten Datensatz wirklich löschen?", _
vbQuestion + vbYesNo, "Sicherheitsabfrage!") = vbYes Then
'Nur wenn er mit antwortet, löschen wir auch!
'Zum Löschen benötigen wir die Zeilennummer des ausgewählten Datensatzes
lZeile = ListBox1.List(ListBox1.ListIndex, 0)
'Die ganze Zeile wird nun gelöscht
Tabelle3.Rows(CStr(lZeile & ":" & lZeile)).Delete
'Und den Eintrag in der Liste müssen wir auch noch entfernen
ListBox1.RemoveItem ListBox1.ListIndex
End If
End Sub
Private Sub EINTRAG_ANLEGEN()
Dim lZeile As Long
lZeile = lCONST_STARTZEILENNUMMER_DER_TABELLE
'Schleife bis eine leere ungebrauchte Zeile gefunden wird
Do While IST_ZEILE_LEER(lZeile) = False
lZeile = lZeile + 1 'Nächste Zeile bearbeiten
Loop
'Nach Durchlauf dieser Schleife steht lZeile in der ersten leeren Zeile von Tabelle1
Tabelle3.Cells(lZeile, 2) = CStr("Neuer Eintrag Zeile " & lZeile)
'Und neuen Eintrag in die UserForm eintragen
ListBox1.AddItem lZeile
ListBox1.List(ListBox1.ListCount - 1, 1) = CStr("Neuer Eintrag Zeile " & lZeile)
ListBox1.List(ListBox1.ListCount - 1, 2) = ""
ListBox1.List(ListBox1.ListCount - 1, 3) = ""
ListBox1.List(ListBox1.ListCount - 1, 4) = ""
ListBox1.List(ListBox1.ListCount - 1, 5) = ""
'ListBox1.List(ListBox1.ListCount - 1, 6) = ""
'ListBox1.List(ListBox1.ListCount - 1, 7) = ""
'ListBox1.List(ListBox1.ListCount - 1, 8) = ""
'ListBox1.List(ListBox1.ListCount - 1, 9) = ""
'ListBox1.List(ListBox1.ListCount - 1, 10) = ""
'ListBox1.List(ListBox1.ListCount - 1, 11) = ""
'ListBox1.List(ListBox1.ListCount - 1, 12) = ""
'Den neuen Eintrag markieren mit Hilfe des ListIndex
ListBox1.ListIndex = ListBox1.ListCount - 1
'Durch das Click Ereignis der ListBox werden die Daten automatisch geladen
'Und dem Benutzer direkt noch den Cursor in das erste Eingabefeld stellen und alles _
vorselektieren,
'so kann der Benutzer direkt loslegen mit der Dateneingabe.
TextBox1.SetFocus
TextBox1.SelStart = 0
TextBox1.SelLength = Len(TextBox1)
End Sub
' ************************************************************************************************
' HILFSFUNKTIONEN
' ************************************************************************************************
'Ermittelt, ob eine Zeile in Benutzung ist...
Private Function IST_ZEILE_LEER(ByVal lZeile As Long) As Boolean
Dim i As Long
Dim sTemp As String
'Hilfsvariable initialisieren
sTemp = ""
'Um zu erkennen, ob eine Zeile komplett leer/ungebraucht ist
'verketten wir einfach alle Spalteninhalte der Zeile miteinander.
'Ist die zusammengesetzte Zeichenkette aller Spalten leer,
'ist die Zeile nicht genutzt...
For i = 1 To iCONST_ANZAHL_EINGABEFELDER
sTemp = sTemp & Trim(CStr(Tabelle3.Cells(lZeile, i).Text))
Next i
'Rückgabewert festlegen
If Trim(sTemp) = "" Then
'Die Zeile ist leer
IST_ZEILE_LEER = True
Else
'Die Zeile ist mindestens in einer Spalte gefüllt
IST_ZEILE_LEER = False
End If
End Function