Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
920to924
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
920to924
920to924
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

ComboBox sortieren

ComboBox sortieren
05.11.2007 18:32:00
Sebastian
Hallo liebe Experten!
Ich habe eine Userform mit mehreren Comboboxen, deren Liste mit Werten aus einem Excel-Blatt gefüllt werden. Diese sollen nun alphabetisch sortiert werden. Ich habe auch schon einige Prozeduren im Forum dazu gefunden, habe es aber aufgrund meiner mangelnden VBA-Kenntnisse nicht geschafft, diese auf meinen Fall anzuwenden.
Grundsätzlich sollen die Datenquellen im Excel-Blatt selbst nicht umsortiert werden, damit keine Bezüge kaputt gehen. Am besten wäre es, wenn einfach die Daten, die sich bereits in der Combobox befinden, in ein Array eingelesen und dann umsortiert würden. Habe folgendes im Forum gefunden:

Sub Combo_sortiert()
If ComboBox1.ListCount = 0 Then Exit Sub
Dim ArrSort() As Variant, i As Long
ReDim ArrSort(ComboBox1.ListCount - 1)
''Daten erstmal in Array einlesen
For i = 0 To ComboBox1.ListCount - 1
ArrSort(i) = ComboBox1.List(i)
Next
''Combobox löschen
Me.ComboBox1.Clear
''Sortierung aufrufen
Call Sortierung(ArrSort) 'wenn aufsteigend
''Combobox mit sortierten Daten füllen
ComboBox1.List() = ArrSort
''Ersten Eintrag auswählen
ComboBox1.ListIndex = 0
End Sub



Sub Sortierung(ByRef arr() As Variant)
Dim UB As Long, i As Long, tmp As Variant
UB = UBound(arr)
Do
For i = 0 To UB - 1
If arr(i) > arr(i + 1) Then
tmp = arr(i)
arr(i) = arr(i + 1)
arr(i + 1) = tmp
End If
Next
UB = UB - 1
Loop While UB > 1
End 

Sub
Diese funktioniert bei mir aber leider nicht, an der Stelle ComboBox1.Clear gibt es eine  _
Fehlermeldung und wenn ich diesen Teil rausnehme, gibt er mir an der Stelle: ComboBox1.List() = ArrSort die Fehlermeldung "Permission denied"
Ich wäre wirklich überaus dankbar wenn mir jemand diesbezüglich aus der Patsche helfen könnte!
Vielen Dank

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: ComboBox sortieren
05.11.2007 18:58:28
Sebastian
Hallo nochmal!
Habe durch weiteres Lesen mittlerweile herausbekommen, dass das ganze wohl daran scheitert, dass meine Combobox mit RowSource befüllt wird. Womit kann ich denn meine Combobox füllen, so dass ich diese dann später sortieren kann?
Im moment sieht meine Prozedur zum befüllen der Combox folgendermaßen aus:

Sub CboArtderBewertungFuellenD()
Dim lngx As Long
CboArtderBewertung.Clear
Worksheets("SAB").Activate
For lngx = 18 To Range("B65536").End(xlUp).Row
If WorksheetFunction.CountIf(Range("B1:B" & lngx), Cells(lngx, 2)) = 1 Then
Me.CboArtderBewertung.AddItem Cells(lngx, 2)
End If
Next
Worksheets("Readme").Activate
End Sub


Wie ändere ich sie ab, so dass eine Sortierung möglich wird?
Vielen Dank für Anregungen/ Tipps und Hilfen!!!
Besten Gruß,
Sebastian

Anzeige
AW: ComboBox sortieren
05.11.2007 19:24:54
Daniel
Hi
vielleicht als Workaround:
Kopier die Daten für die Userforms doch per Makro in ein anderes Blatt, dort kannst du sie dann nach belieben mit den Excelfunktionen sortieren lassen.
die Comboboxen der Userforms beziehen sich dann auf diese Kopierten Daten.
ist sicherlich nicht besonders elegant (deswegen lass ich dir Frage auch mal offen), aber bevor du jetzt ne Sortiertroutine nachprogrammierst, kannst du auch Excel dafür verwenden.
Gruß, Daniel

AW: ComboBox sortieren
05.11.2007 19:42:19
Chris
Servus Sebastian,
wenn es sich nur um Text handelt, könntest du auch direkt mit diesen Makros sortieren und Einlesen (doppelte werden auch nicht eingetragen).
Sub ComboBox1_Einlesen ()
Dim wks As Worksheet
Set wks = Sheets("SAB")
Sheets("Suchblatt").ComboBox1.Clear
With wks
Dim StListe() As String
Dim Loletzte As Long
Dim LoI As Long
Loletzte = 65536
If .Range("B65536") = "" Then Loletzte = .Cells(Rows.Count, 2).End(xlUp).Row
'Array Dimensionieren
ReDim Preserve StListe(1 To Loletzte)
For LoI = 1 To Loletzte
StListe(LoI) = .Cells(LoI, 2)
Next LoI
' Liste sortieren
Sort_Z_A StListe, LBound(StListe), UBound(StListe) ' Hier das jeweilige Sortiermakro aufrufen
' Liste in Listbox übertragen ohne Doppelte
Sheets("Suchblatt").ComboBox1.AddItem StListe(1)
For LoI = 2 To Loletzte
If StListe(LoI) StListe(LoI - 1) Then Sheets("Suchblatt").ComboBox1.AddItem StListe(LoI)
Next LoI
End With
End Sub


Wenn es sich um eine UF handelt musst du das eben entsprechend anpassen. Dann das obere Makro in die UF.


Public Sub Sort_Z_A(SortArray, L, R)
'   sortieren von Z bis A
'   von GerdZ Herber.de
Dim I, J, x, y
I = L
J = R
x = SortArray((L + R) / 2)
While (I  L)
J = J - 1
Wend
If (I 



Public Sub Sort_A_Z(SortArray, L, R)
'   sortieren von A bis Z
'   von GerdZ Herber.de
Dim I, J, x, y
I = L
J = R
x = SortArray((L + R) / 2)
While (I  x And I  SortArray(J) And J > L)
J = J - 1
Wend
If (I 


Diese beiden Makros in ein Modul. Momentan wird oben aufsteigend sortiert. Wie gesagt bei Zahlen haut es leider nicht so hin.
Gruß
Chris

Anzeige
AW: ComboBox sortieren
05.11.2007 19:28:50
Hajo_Zi
Hallo Sebastian,
mit Additem kannst Du Sie füllen.
RowSource löschen.
Ist es eine einspaltige oder mehrspaltig Combobox ?

AW: ComboBox sortieren
05.11.2007 19:44:25
Ramses
Hallo
Lösche die Rowsource in deiner Combobox und füge diese beiden Anweisungen in ein Modul !!
Option Explicit

'In ein Modul
Public sendArr() As Variant
Public getArr() As Variant

und das in deine Userform.
Darauf achten dass ein Button Commandbutton1 vorhanden ist, ansonsten in den entsprechenden Button kopieren oder in das Userform_Initialize Ereignis
Option Explicit

Private Sub CommandButton1_Click()
    Dim i As Long, tarCol As Long, startRow As Long, lastRow As Long
    'Startzeile wo die Daten beginnen
    startRow = 1
    'Spalte wo die Daten stehen
    '1 = A, 2 = B usw.
    tarCol = 1
    '*****************
    'Nichts mehr anpassen oder ändern
    'ausser dem Namen der Combobox
    'Letzter Eintrag in dieser Spalte berechnen
    lastRow = Cells(Rows.Count, tarCol).End(xlUp).Row
    ReDim sendArr((lastRow - startRow) + 1)
    ''Daten erstmal in Array einlesen
    For i = startRow To lastRow
        sendArr(i - 1) = Cells(i, 1)
    Next
    ''Combobox löschen
    Me.ComboBox1.Clear
    ''Sortierung aufrufen
    Call Sortierung(sendArr)
    ''Combobox mit sortierten Daten füllen
    Me.ComboBox1.List() = getArr
    ''Ersten Eintrag auswählen
    Me.ComboBox1.ListIndex = 0
End Sub



Private Sub Sortierung(tmpArr() As Variant)
    Dim lastArr As Long, i As Long, tmp As Variant
    Dim arrList As Long
    lastArr = UBound(tmpArr)
    Do
        For i = 0 To lastArr - 1
            If tmpArr(i) > tmpArr(i + 1) Then
                tmp = tmpArr(i)
                tmpArr(i) = tmpArr(i + 1)
                tmpArr(i + 1) = tmp
            End If
        Next
        lastArr = lastArr - 1
    Loop While lastArr > 1
    lastArr = UBound(tmpArr)
    arrList = 0
    ReDim Preserve getArr(arrList)
    For i = 0 To lastArr
        If tmpArr(i) <> "" Then
            getArr(arrList) = tmpArr(i)
            arrList = arrList + 1
            ReDim Preserve getArr(arrList)
        End If
    Next i
End Sub

Gruss Rainer

Anzeige
AW: ComboBox sortieren
05.11.2007 22:52:00
Sebastian
Wow!
Erst einmal Danke für die zahlreichen Anregungen und Tipps.
@Rainer: Ich habe deine Prozedur mal ausprobiert und sie funktioniert auch. Bloß beim Anpassen der Zeilen und Spalten gibt es Probleme. Meine Daten zum Einlesen in die Combobox beginnen in Reihe 18, daher habe ich in deiner Prozedur startRow = 18 gesetzt. Dann meckert er aber und sagt an der Stelle:
sendArr(i - 1) = Cells(i, 1)
"Subscipt out of range"
Wäre schön wenn man das hinbekommen könnte. Da ich mehrere verschiedene Comboboxen (teilweise Text, teilweise Zahlen)auf diese Art und weise füllen möchte, wäre es super wenn ich die STartzeile - und Spalte so einfach anpassen könnte.
Dankbar für weitere Hilfe verbleibe ich bis dahin mit besten Grüßen,
Sebastian

Anzeige
AW: ComboBox sortieren
05.11.2007 23:00:00
Ramses
Hallo
Um es völlig flexibel zu handhaben, ändere folgendes
For i = startRow To lastRow
sendArr(i - 1) = Cells(i, 1)
Next
in
For i = startRow To lastRow
sendArr(i - startRow) = Cells(i, 1)
Next
Gruss Rainer

AW: ComboBox sortieren
05.11.2007 23:17:15
Sebastian
Hallo Rainer! Vielen Dank für die schnelle Antwort!!
Die StartRow ist jetzt tatsächlich total flexibel. Aber mit der Start Column klappt es noch nicht so ganz.
Habe meine Daten in Spalte 2 und daher tarCol = 2 gesetzt. Es kommt zwar keine Fehlermeldung, aber er zieht sich aber weiterhin die Daten aus Spalte 1. Leider stecke ich in der Prozedur zu wenig drin, um das selbst ändern zu können. Von daher bitte ich Dich um einen weiteren Tipp, wie man das ändern könnte!?
Vielen Dank schon mal,
Gruß Sebastian

Anzeige
AW: ComboBox sortieren
06.11.2007 07:44:00
Ramses
Hallo
Lapsus meinerseits.
Wenn man schon Variablen deklariert soll man sie auch verwenden :-)
For i = startRow To lastRow
sendArr(i - startRow) = Cells(i, tarCol)
Next
Gruss Rainer

AW: ComboBox sortieren
06.11.2007 09:50:00
Sebastian
Hallo Rainer!
Super vielen Dank! So klappt das Ganze einwandfrei und lässt sich auf die Comboboxen anwenden. Ich habe allerdings noch eine Combobox, deren Werte nicht ganz so einfach befüllt werden. Vielleicht kannst du mir helfen, deine Routine auf diese Combobox anzupassen? Das ist allerdings etwas schwieriger denke ich.
Hier die Beschreibung:
Meine Combobox "CboWertermittlungsstichtag" soll mit Daten aus meinem Excel-Tabellenblatt befüllt werden. Im Tabellenblatt ist die 1. Spalte eine Objektnummer und die 3. Spalte ist ein Stichtagsdatum zur Wertermittlung des entsprechenden Objekts aus Spalte 1. Es gibt also beispielsweise zum Objekt mit der Objektnummer "10" mehrere Stichtage, so dass der Wert "10" in Spalte 1 mehrmals vorkommt.
Des Weiteren habe ich in meiner Eingabemaske eine Combobox ("CboObjektListe"), die mit den Objektnummern aus Spalte 1 befüllt ist. Ich möchte nun, dass bei Auswahl eines Objektes in dieser Combobox "CboObjektListe" die Combobox "CboWertermittlungsstichtag" mit allen vorhandenen Stichtagen des entsprechenden Objekts gefüllt wird. Das habe ich auch schon hinbekommen, und zwar so:

Sub CboWertermittlungsstichtagFuellen()
Dim lngx As Long
CboWertermittlungsstichtag.Clear
HoleStichtag (Me.CboObjektListe.Value)
Me.CboWertermittlungsstichtag.ListIndex = 0
End Sub



Function HoleStichtag(strCode As String) As String
Dim rgZelle As Range
Dim rgBereich As Range
Dim dblZeit As String
Set rgBereich = Worksheets("VKW").Range("A18:A500")
For Each rgZelle In rgBereich
If rgZelle.Value = strCode Then
dblZeit = rgZelle.Offset(0, 2)
Me.CboWertermittlungsstichtag.AddItem dblZeit
End If
Next
End Function


Das Ganze funktioniert so weit auch, nur dass die Stichtage genau so in die Combobox geschrieben werden, wie sie gerade in der Tabelle auftauchen. An dieser Stelle würde ich nun also gerne noch deine Routine einbauen, so dass mir alle Stichtage chronologisch aufgelistet werden. Falls du mir dabei helfen könntest, wäre mir wirklich sehr geholfen.
P.S. Ich hoffe ich habe mich verständlich ausgedrückt und konnte mein Problem einigermaßen rüberbringen. Ansonsten bitte einfach noch mal nachfragen.
Vielen Dank für die nette Unterstützung und besten Gruß,
Sebastian

Anzeige
AW: ComboBox sortieren
06.11.2007 10:49:57
Ramses
Hallo
Prozedere wie schon gehabt.
Combobox Daten in ein Array einlesen und an die Sortierfunktion übergeben.
Gruss Rainer

AW: ComboBox sortieren
06.11.2007 11:35:16
Sebastian
Hallo Rainer!
An welcher Stelle und wie lese ich denn die Daten in das Array. Sorry dass ich nochmal nachfragen muss, aber ich bekomme das leider nicht alleine hin, diesen Teil deiner Prozedur selbst anzupassen.
Ich gehe mal davon aus dass man die Sortierungsprozedur übernehmen kann, dann müßte folglich noch folgender Teil angepasst werden:
startRow = 18
tarCol = 3
lastRow = Cells(Rows.Count, tarCol).End(xlUp).Row
ReDim sendArr((lastRow - startRow) + 1)
For i = startRow To lastRow
sendArr(i - startRow) = Cells(i, tarCol)
Next
Wenn du mir weiterhelfen könntest wäre ich dir überaus dankbar.
Gruß Sebastian

Anzeige
AW: ComboBox sortieren
06.11.2007 18:17:00
Ramses
Hallo
Combobox auslesen
Dim startCmb As Long
Dim endCmb As Long
startCmb = 0
endCmb = Me.ComboBox1.ListCount - 1
For i = startCmb To endCmb
sendArr(i) = Me.ComboBox1.List(i)
Next
Der Rest sollte dann gleich sein,... hoffe ich :-)
Gruss Rainer

AW: ComboBox sortieren
06.11.2007 22:26:54
Sebastian
Hallo Rainer!
Leider funktioniert das Ganze so nicht. In meiner Combobox befinden sich jetzt diverse Werte, teilweise Objektnummern, teilweise Stichtagsdaten. Habe das ganze angepasst, so wie du es vorgeschlagen hast, also folgendermaßen:
Sub CboWertermittlungsstichtagFuellen()
Dim lngx As Long
CboWertermittlungsstichtag.Clear
HoleStichtag (Me.CboObjektListe.Value)
'Bis hier ist die Combobox noch mit den richtigen Werten gefüllt
Comboinarray
End Sub


Function HoleStichtag(strCode As String) As String
Dim rgZelle As Range
Dim rgBereich As Range
Dim dblZeit As String
Set rgBereich = Worksheets("VKW").Range("A18:A500")
For Each rgZelle In rgBereich
If rgZelle.Value = strCode Then
dblZeit = rgZelle.Offset(0, 2)
Me.CboWertermittlungsstichtag.AddItem dblZeit
End If
Next
End Function


Sub Comboinarray()
Dim startCmb As Long
Dim endCmb As Long
startCmb = 0
endCmb = Me.CboWertermittlungsstichtag.ListCount - 1
For i = startCmb To endCmb
sendArr(i) = Me.CboWertermittlungsstichtag.List(i)
Next
''Combobox löschen
Me.CboWertermittlungsstichtag.Clear
''Sortierung aufrufen
Call CboSortierung(sendArr)
''Combobox mit sortierten Daten füllen
Me.CboWertermittlungsstichtag.List() = getArr
Me.CboWertermittlungsstichtag.ListIndex = 0
End Sub



Private Sub CboSortierung(tmpArr() As Variant)
Dim lastArr As Long, i As Long, tmp As Variant
Dim arrList As Long
lastArr = UBound(tmpArr)
Do
For i = 0 To lastArr - 1
If tmpArr(i) > tmpArr(i + 1) Then
tmp = tmpArr(i)
tmpArr(i) = tmpArr(i + 1)
tmpArr(i + 1) = tmp
End If
Next
lastArr = lastArr - 1
Loop While lastArr > 1
lastArr = UBound(tmpArr)
arrList = 0
ReDim Preserve getArr(arrList)
For i = 0 To lastArr
If tmpArr(i)  "" Then
getArr(arrList) = tmpArr(i)
arrList = arrList + 1
ReDim Preserve getArr(arrList)
End If
Next i
End Sub


Vorher stehen in der Combobox definitiv nur Stichtagsdaten drin, daher kann ich mir nicht so wirklich erklären, wie durch Auslesen in ein Array jetzt plötzlich noch Objektnummern und einige (falsche) Stichtage dazukommen.
Falls das Ganze an dieser Stelle zu kompliziert wird, ist das auch nicht tragisch. Dann lasse ich die Daten einfach unsortiert. Vielleicht fällt dir ja trotzdem etwas ein!?
Etwas anderes, was mir viel wichtiger ist, ist mir allerdings auch noch aufgefallen:
Die anderen Comboboxen, die ich mit Hilfe deiner Sortierfunktion befüllt habe, enthalten am Ende immer noch einen leeren Eintrag. Wie bekomme ich diesen raus? Da mit den Werten aus der Combobox weitergerechnet wird kommt bei Anklicken des leeren Eintrags eine Fehlermeldung, was doch sehr unschön ist. Daher wäre es mir sehr wichtig, diesen "Leereintrag" wegzubekommen.
Ich hoffe ich überfordere dich nicht zu sehr und bin gespannt auf deine Antwort.
Tausend Dank schon einmal im Vorhinein!
Gruß Sebastian

Anzeige
AW: ComboBox sortieren
06.11.2007 23:30:00
Ramses
Hallo
Warum da plötzlich andere Daten drin stehen sollen verstehe ich auch nicht.
"..Daher wäre es mir sehr wichtig, diesen "Leereintrag" wegzubekommen...."
Füge noch folgenden Eintrag hinzu
ReDim Preserve getArr(arrList)
End If
Next i
ReDim Preserve getArr(arrList-1)
End Sub
Sollte eigentlich tun.
Gruss Rainer

AW: ComboBox sortieren
07.11.2007 09:15:38
Sebastian
Das klappt so!
Super vielen Dank für deine Hilfe und dass du dir die Zeit genommen hast meine Flut an Fragen zu beantworten!
Besten Gruß,
Sebastian

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige