Private Sub UserForm_Initialize()
'Hier ein paar Beispielwerte für die ComboBox :
' Me.ComboBox1.AddItem "Wert 1"
' Me.ComboBox1.AddItem "Wert 2"
' Me.ComboBox1.AddItem "Wert 3"
' Me.ComboBox1.AddItem "Wert 4"
'Alternative : Werte aus A2 bis letzten eintrag der Spalte A festlegen :
Me.ComboBox1.RowSource = "$A$2:$A$" & Cells(Rows.Count, 1).End(xlUp).Row
End Sub
Allerdings werden hier auch doppelte Einträge aufgelistet, wenn diese Werte in Spalte A mehrfach enthalten sind.
Um alle Werte nur EINMALIG aufzulisten und Leerzellen aus der ComboBox zu eliminieren, dient folgender Code :
VBA-Code: | Private Sub UserForm_Initialize()
'26.01.2010, NoNet - www.excelei.de (z.Zt. Offline !)
'ComboBox mit allen Werten der Spalte A ohne Leerzellen und ohne doppelte Einträge füllen :
Dim lngZ As Long
Dim objColl As New Collection 'Collection zur EINMALIGEN Auflistung aller Werte
On Error Resume Next
For lngZ = 2 To Cells(Rows.Count, 1).End(xlUp).Row 'Alle Werte der Spalte A ab Zeile 2
If Cells(lngZ, 1) <> "" Then objColl.Add Cells(lngZ, 1), "X" & Cells(lngZ, 1)
Next
For lngZ = 0 To objColl.Count
Me.ComboBox1.AddItem objColl(lngZ) 'ComboBox mit einmaligen Werten der Collection befüllen
Next
End Sub
Gruß, NoNet
PS: Danke für das Lob ;-)
ComboBox bleibt leider leer
Dirk
Hallo NoNet,
Wahnsinn!
Nur leider bleibt die ComboBox mit der Variante Me.ComboBox1.RowSource = "$A$2:$A$" & Cells(Rows.Count, 1).End(xlUp).Row leer!?
Da ich in Spalte D filtere, habe ich die Zeile wie folgt angepasst:
Me.ComboBox1.RowSource = "$D$2:$D$" & Cells(Rows.Count, 4).End(xlUp).Row
Doch da tut sich nichts.
Auch bei der letzten Variante (ohne Doppelte) bleibt die CB leer
Was habe ich da falsch gemacht?
Gruß Dirk
AW: Wert über ComboBox in UserForm auswählen
Volker
Hallo Dirk Hallo NoNet.
Dirk ich habe eine ähnliches Problem wie du. Kannst du deine Lösung mal hochladen?..
Oder NoNet, kann du deine Lösung mal Hochladen. Habe nähmlich es nicht so hinbekommen wie du beschrieben hast.
Gruss Volker
Daten aus Blatt 'Master' einlesen
NoNet
Hallo Dirk, hallo Volker,
vielen Dank für die DEMO-Mappe ! Deine Umsetzung entspricht genau meinen Vorgaben.
Anhand der DEMO-Mappe konnte ich nun auch den gewünschten Aufbau erkennen :
Ich ging bisher davon aus, dass der Button im gleichen Tabellenblatt wie die Daten platziert ist.
Da die Daten jedoch im Blatt "Master" stehen, der Button im Blatt "Start", muss man im UserForm noch mit angeben, dass die Daten für die ComboBox nicht aus dem aktuellen Blatt "Start", sondern aus dem Blatt "Master" stammen, dann klappt das Befüllen der ComboBox einwandfrei :
Private Sub UserForm_Initialize()
'26.01.2010, NoNet - www.excelei.de (z.Zt. Offline !)
'ComboBox mit allen Werten der Spalte D ohne Leerzellen und ohne doppelte Einträge füllen
'Daten aus Blatt "Master"
Dim lngZ As Long
Dim objColl As New Collection 'Collection zur EINMALIGEN Auflistung aller Werte
On Error Resume Next
With Sheets("Master")
For lngZ = 2 To .Cells(Rows.Count, 4).End(xlUp).Row 'Alle Werte der Spalte D ab Zeile 2
If .Cells(lngZ, 4) "" Then objColl.Add .Cells(lngZ, 4), "X" & .Cells(lngZ, 4)
Next
End With
For lngZ = 0 To objColl.Count
Me.ComboBox1.AddItem objColl(lngZ) 'ComboBox mit einmaligen Werten der Collection befü _
llen
Next
End Sub
Gruß, NoNet
eine DEMO-Mappe sagt mehr als 1.000 Worte
Dirk
Hallo NoNet,
auf die Idee mit der DEMO-Mappe hätte ich ja auch gleich kommen können ;-)
Nun ja, jetzt funktioniert es tadellos! Vielen Dank!
Ein letzte Nachfrage :-)
Würde es sehr viele Umstände machen, den CODE so/zu anzupassen/erweitern, das die Bereiche sortiert in der Liste stehen?
Das würde dem Ganzen die Krone aufsetzten!!!!
Danke
und Gruß
Dirk
Hallo Dirk,
ich stehe zwar nicht so sehr auf Monarchien, hier aber dennoch die gewünschte Krönungszeremonie :
Private Sub UserForm_Initialize()
'26.01.2010, NoNet - www.excelei.de (z.Zt. Offline !)
'ComboBox mit allen Werten der Spalte D ohne Leerzellen und ohne doppelte Einträge füllen :
Dim lngZ As Long, lngC As Long, strTemp As String
Dim objColl As New Collection 'Collection zur EINMALIGEN Auflistung aller Werte
On Error Resume Next
With Sheets("Master")
For lngZ = 2 To .Cells(Rows.Count, 4).End(xlUp).Row 'Alle Werte der Spalte D ab Zeile 2
If .Cells(lngZ, 4) "" Then objColl.Add .Cells(lngZ, 4), "X" & .Cells(lngZ, 4)
Next
End With
'Collection-Objekt sortieren :
For lngZ = 0 To objColl.Count
For lngC = 0 To lngZ
If objColl(lngC) > objColl(lngZ) Then
strTemp = objColl(lngZ)
objColl(lngZ) = objColl(lngC)
objColl(lngC) = strTemp
End If
Next
Next
For lngZ = 0 To objColl.Count
Me.ComboBox1.AddItem objColl(lngZ) 'ComboBox mit einmaligen Werten der Collection befü _
llen
Next
End Sub
Gruß, NoNet
PS: Sämtliche potentiellen "Jobangebote" in Deinem Königreich - inkl. Hofnarr lehne ich aber schon im Vorfeld ab ;-))
mein Königreich wird DIR ...
Dirk
Hallo NoNet,
... einen Orden verleihen, für die wirklich perfekte Lösung incl. anschaulicher Beschreibung!
Solche Hilfestellungen kriegt man nicht alle Tage!
Die Krone sei DEIN! :-)
Vielen Dank
und einen schönen Abend
Gruß Dirk
AW: InputBox in eine ListBox ändern
Beverly
Hi Dirk,
eine Möglichkeit:
Option Explicit
Private Sub CommandButton1_Click()
Worksheets("Master").Range("D1").AutoFilter Field:=4, Criteria1:=ListBox1.List(ListBox1. _
ListIndex, 0), Operator:=xlAnd
End Sub
Private Sub ListBox1_GotFocus()
Dim objDictionary As Object
Dim varBereich As Variant
Dim loZaehler As Long
Dim arrDaten As Variant
Set objDictionary = CreateObject("Scripting.Dictionary")
With Worksheets("Master")
varBereich = .Range("D2", .Range("D2").End(xlDown))
End With
For loZaehler = LBound(varBereich) To UBound(varBereich)
objDictionary(varBereich(loZaehler, 1)) = 0
Next
arrDaten = objDictionary.keys
ListBox1.List = arrDaten
End Sub
https://www.herber.de/bbs/user/67512.xls
ListBox nicht immer im Vordergrund!
Dirk
Hallo Karin,
im Prinzip ist es das, was ich suche. Vielen Dank!
Würde gerne noch zwei Änderungswünsche anbringen, wenn erlaubt.
Die ListBox darf/soll nicht immer im Vordergrund stehen und
könnte man die Bereiche auch sortiert einlesen?!
Dann wäre es perfekt!
Danke
und Gruß
Dirk
AW: ListBox nicht immer im Vordergrund!
Beverly
Hi Dirk,
zu Frage 1: die ListBox kann man z.B. ein- und aussblenden
zu Frage 2: die Daten können auch sortiert eingelesen werden
Option Explicit
Private Sub CommandButton1_Click()
Worksheets("Master").Range("D1").AutoFilter Field:=4, Criteria1:=ListBox1.List(ListBox1. _
ListIndex, 0), Operator:=xlAnd
ListBox1.Visible = False
End Sub
Private Sub CommandButton2_Click()
Dim objDictionary As Object
Dim varBereich As Variant
Dim loZaehler As Long
Dim arrDaten As Variant
ListBox1.Visible = True
Set objDictionary = CreateObject("Scripting.Dictionary")
With Worksheets("Master")
varBereich = .Range("D2", .Range("D2").End(xlDown))
End With
For loZaehler = LBound(varBereich) To UBound(varBereich)
objDictionary(varBereich(loZaehler, 1)) = 0
Next
arrDaten = objDictionary.keys
QuickSort arrDaten
ListBox1.List = arrDaten
End Sub
Sub QuickSort(ByRef VA_Array, Optional V_Low1, Optional V_High1)
' https://www.herber.de/forum/ _
messages/1009306.html
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_Val1 And _
V_High2 > V_Low1)
V_High2 = V_High2 - 1
Wend
If (V_Low2 V_Low1) Then Call _
QuickSort(VA_Array, V_Low1, V_High2)
If (V_Low2
Hallo Karin,
... die CODE-Erweiterung für die Sortierung ist ja gigantisch!
Eine Nachfrage hab ich aber noch :-)
Kann man deine ListBox auch über/von/in einer UserForm starten?
Irgendwie will die Platzierung in der Tabelle nicht so wie ich will!
Danke
und einen schönen Abend!
Gruß Dirk
AW: vielen Dank ...
Beverly
Hi Dirk,
der Code für das UserForm ist der gleiche, nur dass er nicht in die Prozedur Private Sub CommandButton2_Click() kommt sondern in das UserForm_Activate Ereignis.
|
|