Also grundlegend gibt es zwei Möglichkeiten Einträge in ein Kombinationsfeld (ComboBox) einzutragen.
-
mittels der RowSource-Eigenschaft
-
ODER mittels der List-Eigenschaft (bzw. per AddItem-Methode)
Beides zusammen funktioniert nicht.
Nun weiß ich nicht in wie weit es Sinn macht, Listen mit Straßennamen auf mehreren Tabellen zu führen, das wirkt auf mich redundant.
Wenn sich die UserForm zuvor getätigte Einträge merken soll, dann musst du diese irgendwo zwischenspeichern. Das geht entweder auf einem (versteckten) Tabellenblatt, oder innerhalb/außerhalb der Userform. Letzteres bleibt solange erhalten, wie die Mappe geöffnet bleibt und keine Laufzeitfehler auftreten.
-> Auf dem aktuell sichtbaren Tabellenblatt "merken":
Option Explicit
'Standardbereich
Private Const C_BEREICH_COMBOBOX1 As String = "P11"
Private Sub CommandButton1_Click()
Dim strValue As String
Dim i As Long
strValue = Trim$(ComboBox1.Value)
If strValue <> "" Then
For i = 0 To ComboBox1.ListCount - 1
If 0 = StrComp(ComboBox1.List(i), strValue, vbTextCompare) Then
'-> Eintrag existiert bereits
Exit Sub
End If
Next
End If
'neuer Eintrag im Tabellenblatt (dies erweitert den festgelegten Standardbereich)
With Range(Range(C_BEREICH_COMBOBOX1).Cells(1), Cells(Rows.Count, Range(C_BEREICH_COMBOBOX1).Cells(1).Column).End(xlUp))
.Resize(1).Offset(.Rows.Count).Value = strValue
End With
'neuen Eintrag auch in der UserForm hinzufügen
ComboBox1.AddItem strValue
End Sub
Private Sub UserForm_Initialize()
Dim rngCell As Excel.Range
'Standardbereich, inkl. hinzugefügte Einträge
With Range(Range(C_BEREICH_COMBOBOX1).Cells(1), Cells(Rows.Count, Range(C_BEREICH_COMBOBOX1).Cells(1).Column).End(xlUp))
For Each rngCell In .Cells
ComboBox1.AddItem Trim$(rngCell.Value)
Next
End With
End Sub
-> Oder, neue Einträge in der UserForm merken:
!! Die UserForm darf in diesem Fall nicht entladen werden !!
Das heißt man darf sie nur verstecken, mit:
Me.Hide()
Sobald sie entladen wird, gehen die "gemerkten" Einträge verloren (das passiert auch, wenn Laufzeitfehler auftreten).
Option Explicit
Private m_colEintrage As VBA.Collection
'Standardbereich
Private Const C_BEREICH_COMBOBOX1 As String = "P11"
Private Sub CommandButton1_Click()
Dim strValue As String
Dim i As Long
strValue = Trim$(ComboBox1.Value)
If strValue <> "" Then
For i = 0 To ComboBox1.ListCount - 1
If 0 = StrComp(ComboBox1.List(i), strValue, vbTextCompare) Then
'-> Eintrag existiert bereits
Exit Sub
End If
Next
End If
'neuen Eintrag in der UserForm merken
m_colEintrage.Add strValue
'neuen Eintrag auch in der UserForm hinzufügen
ComboBox1.AddItem strValue
End Sub
Private Sub UserForm_Initialize()
Set m_colEintrage = New VBA.Collection
Dim rngCell As Excel.Range
'Standardbereich
For Each rngCell In Range(C_BEREICH_COMBOBOX1).Cells
ComboBox1.AddItem Trim$(rngCell.Value)
Next
End Sub
Die dritte Möglichkeit, wäre sich die Einträge auf einem extra erstellten Tabellenblatt zu merken, welches man versteckt. Das wäre dann ähnlich der ersten Variante, nur mit einem anderen Tabellenblatt als Ziel.
Viele Grüße
|