ActiveX-ComboBox; einmalige Einträge & sortieren

Bild

Betrifft: ActiveX-ComboBox; einmalige Einträge & sortieren
von: Scoopa
Geschrieben am: 06.08.2015 15:34:01

Hallo,
ich habe ein Modul gefunden, welches beim Öffnen meiner Excel-Datei eine ActiveX-ComboBox mit Werten aus einem definierten Bereich füllt (ohne die leeren Zellen mit aufzunehmen).
Bisheriger Code:

Sub Auto_open()
With Sheets("Kalender")
Dim Zelle As Range
.ComboBox1.Clear
With ActiveSheet
For Each Zelle In .Range(.Range("R7"), .Range("S738").End(xlDown))
If Zelle.Value <> "" Then .ComboBox1.AddItem Zelle.Value
Next
End With
End With
End Sub
Ich würde die Einträge dieser ComboBox jetzt gerne noch alphanumerisch sortieren lassen und redundante Einträge nicht mit aufnehmen. Leider fehlt mir die Zeit und Muße, um tiefer in die VBA-Programmierung einzusteigen. Daher hoffe ich auf einen Profi, für den diese Problemstellung ein leichtes ist! ;)
P.S.: Innerhalb des Bereichs (R7:S738) gibts es im Schnitt nur ~50 Einträge, von daher wäre die Performance der Sortierung nicht ausschlaggebend.
Grüße,
Scoopa

Bild

Betrifft: AW: ActiveX-ComboBox; einmalige Einträge & sortieren
von: Sepp
Geschrieben am: 06.08.2015 15:54:21
Hallo Scoopa,
Auto_open wird eigentl. nicht mehr verwendet! Statt dessen verwendet man das Ereignis Workbook_Open().

' **********************************************************************
' Modul: DieseArbeitsmappe Typ: Element der Mappe(Sheet, Workbook, ...)
' **********************************************************************

Option Explicit

Private Sub Workbook_Open()
Dim vntList As Variant

With ActiveSheet
  vntList = .Range("R7:S738")
  vntList = toArraySorted(vntList)
End With
With Sheets("Kalender").ComboBox1
  .Clear
  .List = vntList
End With
End Sub


Private Function toArraySorted(Field As Variant, Optional Uniqe As Boolean = True) As Variant
Dim objArrayList As Object
Dim lngR As Long, lngC As Long

On Error GoTo ErrExit

Set objArrayList = CreateObject("System.Collections.Arraylist")

With objArrayList
  For lngR = LBound(Field, 1) To UBound(Field, 1)
    For lngC = LBound(Field, 2) To UBound(Field, 2)
      If Not .Contains(Field(lngR, lngC)) Or Not Uniqe Then
        If Field(lngR, lngC) <> "" Then .Add Field(lngR, lngC)
      End If
    Next
  Next
  .Sort
  toArraySorted = .toArray
End With

Exit Function
ErrExit:
toArraySorted = -1
End Function


Gruß Sepp


Bild

Betrifft: AW: ActiveX-ComboBox; einmalige Einträge & sortieren
von: Scoopa
Geschrieben am: 07.08.2015 09:53:32
Hallo Sepp,
vielen Dank für die superschnelle Hilfe, läuft einwandrei! :)
Grüße,
Scoopa

Bild

Betrifft: AW: ActiveX-ComboBox; einmalige Einträge & sortieren
von: Scoopa
Geschrieben am: 11.08.2015 09:56:59
Leider läuft die Funktion doch nicht so einwandfrei wie anfangs gedacht.
Solange in dem zu sortierenden Bereich alle Einträge entweder mit Buchstaben ODER Zahlen beginnen, funktioniert die Sortierung tadellos. Sobald jedoch Einträge mit Buchstaben UND Zahlen beginnen, bekomme ich den "Laufzeitfehler 381: Eigenschaft List konnte nicht gesetzt werden. Index des Eigenschaftsfeldes ungültig."
Ich nehme an, dass die Sort-Methode Probleme mit der Sortierung verschiedenartiger Zeichenketten hat?!
Beispiel: Die Einträge "abc" und "123" im zu sortierenden Bereich produzieren bereits die Fehlermeldung.
Gibt es eine Möglichkeit, um jegliche Kombinationen von Zeichen zu sortieren?

Bild

Betrifft: AW: ActiveX-ComboBox; einmalige Einträge & sortieren
von: Scoopa
Geschrieben am: 11.08.2015 13:41:33
Nachtrag: Ursache des Problems war meine Unaufmerksamkeit, - die Zellen waren noch als "Standard" formatiert; als "Text" formatiert funktioniert es wie vorgesehen. :)
Grüße,
Scoopa

 Bild

Beiträge aus den Excel-Beispielen zum Thema "ActiveX-ComboBox; einmalige Einträge & sortieren"