8.4k Aufrufe
Gefragt in Tabellenkalkulation von fedjo Experte (2.2k Punkte)
Hallo Excelfreunde,
bräuchte mal wieder euere Hilfe zum füllen einer ComboBox.
Die ComboBox ist in einer UserForm und solle mit Werten aus Spalte C ab Zeile vier ohne doppelte Werte gefüllt werden.

Private Sub UserForm_Initialize()

Ich hoffe ihr könnt mir weiterhelfen.

Gruß
fedjo

19 Antworten

0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
Hi Fedjo,
Private Sub UserForm_Initialize()
Dim objDictionary As Object
Dim varBereich As Variant
Dim arrDaten As Variant
Dim loZaehler As Long
Set objDictionary = CreateObject("Scripting.Dictionary")
varBereich = Range("C4", Range("C4").End(xlDown))
For loZaehler = LBound(varBereich) To UBound(varBereich)
' Eintrag wird nur übernommen wenn er im DictionaryObject noch nicht enthalten ist
objDictionary(varBereich(loZaehler, 1)) = 0
Next
ComboBox1.List = objDictionary.keys
Set objDictionary = Nothing
End Sub

Bis später,
Karin
0 Punkte
Beantwortet von fedjo Experte (2.2k Punkte)
Hallo Karin,
funktioniert super, kann man den Code auch für zwei ComboBoxen verwenden (ComboBox1, ComboBox2) mit den gleichen Werten?

Danke für deine schnelle Hilfe

Gruß
fedjo
0 Punkte
Beantwortet von hajo_zi Experte (9.1k Punkte)
Hallo Fedjo,

da brauchst Du doch nur eine Zeile ergänzen
ComboBox1.List = objDictionary.keys
ComboBox2.List = objDictionary.keys

Gruß Hajo
0 Punkte
Beantwortet von fedjo Experte (2.2k Punkte)
Hallo Hajo,
das war auch mein erster Gedanke, da kammen aber die Fehlermeldungen:
Laufzeitfehler 424
Private Sub Worksheet_Activate()
UserForm1.StartupPosition = 0 ' Startposition der UserForm
UserForm1.Left = ActiveWindow.Width - UserForm1.Width - 130 ' Verschieben nach links / rechts
UserForm1.Top = ActiveWindow.Height - UserForm1.Height + 1 ' Verschieben nach oben / unten
UserForm1.Show
End Sub

Private Sub Worksheet_Deactivate()
Unload UserForm1
End Sub

Gruß
fedjo
0 Punkte
Beantwortet von hajo_zi Experte (9.1k Punkte)
Hallo Fedjo,

was hat der Code mit dem Code von Karin zu tun.
Dein Code wird bei jedem Starten in der Sitzung ausgeführt, Karin ihr Code nur beim ersten starten.

Gruß Hajo
0 Punkte
Beantwortet von fedjo Experte (2.2k Punkte)
Hallo Hajo,
wenn ich ein anderes Tabellblatt auswähle, wird die UserForm deaktiviert und dann wieder aktiviert (UserForm_Initialize) wird erneut ausgeführt. Wenn die Werte in der Spalte C sich ändern wird der Code auch ausgeführt.

Gruß
fedjo
0 Punkte
Beantwortet von fedjo Experte (2.2k Punkte)
Hallo Karin,
hab da noch eine Frage zu deinem Code.
Können die Werte in der ComboBox auch sortiert angezeigt werden?




Private Sub UserForm_Initialize()
Dim objDictionary As Object
Dim varBereich As Variant
Dim arrDaten As Variant
Dim loZaehler As Long
Set objDictionary = CreateObject("Scripting.Dictionary")
varBereich = Range("C4", Range("C4").End(xlDown))
For loZaehler = LBound(varBereich) To UBound(varBereich)
' Eintrag wird nur übernommen wenn er im DictionaryObject noch nicht enthalten ist
objDictionary(varBereich(loZaehler, 1)) = 0
Next
ComboBox1.List = objDictionary.keys
Set objDictionary = Nothing
End Sub
0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
Hi Fedjo,
Private Sub UserForm_Activate()
Dim objDictionary As Object
Dim varBereich As Variant
Dim arrDaten As Variant
Dim loZaehler As Long
Set objDictionary = CreateObject("Scripting.Dictionary")
varBereich = Range("C4", Range("C4").End(xlDown))
For loZaehler = LBound(varBereich) To UBound(varBereich)
' Eintrag wird nur übernommen wenn er im DictionaryObject noch nicht enthalten ist
objDictionary(varBereich(loZaehler, 1)) = 0
Next loZaehler
arrDaten = objDictionary.keys
QuickSort arrDaten
ComboBox1.List = arrDaten
Set objDictionary = Nothing
End Sub

Sub QuickSort(ByRef VA_Array, Optional V_Low1, Optional V_High1)
' http://www.herber.de/forum/archiv/108to112/t109556.htm
On Error Resume Next
Dim V_Low2 As Long, V_High2 As Long
Dim V_Val1, V_Val2 As Variant
If IsMissing(V_Low1) Then
V_Low1 = LBound(VA_Array, 1)
End If
If IsMissing(V_High1) Then
V_High1 = UBound(VA_Array, 1)
End If
V_Low2 = V_Low1
V_High2 = V_High1
V_Val1 = VA_Array((V_Low1 + V_High1) / 2)
While (V_Low2 <= V_High2)
While (VA_Array(V_Low2) < V_Val1 And _
V_Low2 < V_High1)
V_Low2 = V_Low2 + 1
Wend
While (VA_Array(V_High2) > V_Val1 And _
V_High2 > V_Low1)
V_High2 = V_High2 - 1
Wend
If (V_Low2 <= V_High2) Then
V_Val2 = VA_Array(V_Low2)
VA_Array(V_Low2) = VA_Array(V_High2)
VA_Array(V_High2) = V_Val2
V_Low2 = V_Low2 + 1
V_High2 = V_High2 - 1
End If
Wend
If (V_High2 > V_Low1) Then Call _
QuickSort(VA_Array, V_Low1, V_High2)
If (V_Low2 < V_High1) Then Call _
QuickSort(VA_Array, V_Low2, V_High1)
End Sub

Bis später,
Karin
0 Punkte
Beantwortet von fedjo Experte (2.2k Punkte)
Hi Karin,
es wird bei ( ComboBox1.List = arrDaten) ein Laufzeitfehler 424 Objekt erfoderlich angezeigt.
Wo muß eigentlich der Code: Sub QuickSort(ByRef VA_Array, Optional V_Low1, Optional V_High1) eingefügt werden?

Danke für deine Unterstützung.

Gruß
fedjo
0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
Hi Fedjo,

den Fehler kann ich in meiner Beispieldatei nicht nachvollziehen. Vielleicht gibt es bei dir keine ComboBox1.

Den Quick-Sort-Code kannst du ins Codemodul des UserForms schreiben oder in ein allgemeines Modul.

Bis später,
Karin
...