Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

ComboBox ohne Duplikate füllen

Forumthread: ComboBox ohne Duplikate füllen

ComboBox ohne Duplikate füllen
21.01.2009 18:53:00
Kasimir
Hallo Leute,
ich steh vor einem Problem und mir ist noch nicht so ganz klar, wie ich dies lösen soll. Ich bin dabei mir eine Termindatei für Wartungsarbeiten zu erstellen. Nun möchte ich über eine UserForm nach bestimmten Dingen in diesem Terminblatt suchen. Die Auswahl erfolgt in einer ComboBox. Soweit ist das auch noch nicht das Problem. Allerdings möchte ich auch nach einem Datum suchen und da fängt mein Problem an. Im Tabellenblatt steht das Datum in Spalte C. Dort steht z.B. 21.01.2009 oder auch 21.01.2010. Nun möchte ich alle Datumswert aus Spalte C in eine ComboBox einlesen. Allerdings nur 6 Stellen von dem Datum. Also für das Datum 21.01.2009 nur 21.01. . Da ich aber mehrere Datumswerte habe, die am 21. Januar sind, sich aber zum Teil nur vom Jahr unterscheiden, möchte ich natürlich nur 1x das Datum 21.01. in der ComboBox haben, Sprich es sollen keine Duplikate vom 21.01. eingelesen werden. Bisher habe ich immer Werte ohne Duplikate mit der Zeile
If WorksheetFunction.CountIf(Sheets("Termine ").Range("C2:C" & iRow), _
Sheets("Termine").Cells(iRow, 3)) = 1 Then _
ComboBox3.AddItem Mid(Sheets("Termine ").Cells(iRow, 3), 1, 6)

eingelesen. Allerdings wird hier die gesamte Zelle abgefragt und da funktioniert das. Ich muss aber nur 6 Stellen der Zelle prüfen und es darf dann das Datum 21.01.nur einmal in der ComboBox erscheinen.
Ich hoffe, jemand hat verstanden, was ich realisieren möchte und hat einen Tipp für mich.
Danke Euch schon mal im Voraus,
Kasimir
Anzeige

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: ComboBox ohne Duplikate füllen
21.01.2009 19:13:00
Kasimir
Hallo Hajo,
danke Dir für Deine Antwort. Auf die Idee, das Blatt vorher zu sortieren und dann nur die Zelle mit der Zelle aus der Zeile vorher zu vergleichen bin ich nicht gekommen. Aber es funktioniert bestens.
Gruß,
Kaismir
Anzeige
AW: ComboBox ohne Duplikate füllen
21.01.2009 19:37:00
ransi
HAllo KAsimir
VErsuch mal sowas:
Public Sub füllen()
Dim Dic
Dim L As Long
Dim arr
Dim lng_Row As Long
lng_Row = 1000 'Beispiel
Set Dic = CreateObject("Scripting.Dictionary")
arr = Range("C1:C" & lng_Row)
For L = 1 To lng_Row
    Dic(Day(arr(L, 1)) & "." & Month(arr(L, 1)) & ".") = 0
Next
ComboBox1.List = Dic.keys
End Sub

ransi
Anzeige
AW:@ransi- ComboBox ohne Duplikate füllen
21.01.2009 20:35:50
robert
hi,
ich finde den code genial,
aber was passiert in dieser zeile eigentlich?
Dic(Day(arr(L, 1)) & "." & Month(arr(L, 1)) & ".") = 0
wenn möglich, bitte erklärung
gruß
robert
AW: AW:@ransi- ComboBox ohne Duplikate füllen
21.01.2009 20:48:27
Ramses
Hallo
vereinfacht gesagt, "=0" kommt der Eintrag noch nicht vor, wird er zum Wörterbuch (Dictionary) hinzugefügt.
Weitere Infos
http://msdn.microsoft.com/en-us/library/x4k5wbx4(VS.85).aspx
Gruss Rainer
Anzeige
AW: AW:@ransi- Danke-owT
21.01.2009 20:51:00
robert
AW: ComboBox ohne Duplikate füllen
22.01.2009 05:30:00
Kasimir
Hallo ransi,
danke auch Dir für Deinen Vorschlag. Er funktioniert bestens. Allerdings würde mich interessieren, wie der Code aussehen müsste, damit die Werte auch noch sortiert in die ComboBox eingelesen werden. Ich habe die Werte mal in ein Tabellenblatt ausgeben lassen und dann versucht die Werte zu sortieren. Leider wird nicht so sortiert, wie ich es mir vorstelle.
Mal als Beispiel: Ich habe folgende Werte:
12.02.
18.04.
25.05.
30.05.
02.02.
21.01.
22.01.
23.01.
24.01.
25.01.
26.01.
27.01.
28.01.
29.01.
06.01.
Dann sieht das Ergebnis nach einer Sortierung folgendermaßen aus:
02.02.
06.01.
12.02.
18.04.
21.01.
22.01.
23.01.
24.01.
25.01.
25.05.
26.01.
27.01.
28.01.
29.01.
30.05.
Es wird nach der Tageszahl sortiert. Es sollte aber nach dem Tag und dem Monat sortiert werden:
06.01.
21.01.
22.01.
23.01.
24.01.
25.01.
26.01.
27.01.
28.01.
29.01.
02.02.
12.02.
18.04.
25.05.
30.05.
Wie kann ich das mit Deinem Code und einer Erweiterung erreichen?
Danke Dir,
Kasimir
Anzeige
AW: ComboBox ohne Duplikate füllen
22.01.2009 08:49:00
Tino
Hallo,
ich kenne mich mit Dictionary nicht besonders aus, hier aber mal eine Lösung.
Das Datum wird in eine Area geschrieben und diese Area wird zuerst Sortiert und danach ins richtige Format gebracht und am Ende an die Combo übergeben.
Option Explicit
Dim sArray
Sub QuickSort(ByVal MinElem As Long, MaxElem As Long)

Dim Mitte As Long
Dim vDummy As Variant
Dim i As Long, j As Long

    If MinElem > MaxElem Then
        Exit Sub
    End If
 
    Mitte = (MinElem + MaxElem) \ 2
    i = MinElem
    j = MaxElem
    Do

        Do While sArray(i) < sArray(Mitte)
            i = i + 1
        Loop

        Do While sArray(j) > sArray(Mitte)
            j = j - 1
        Loop
 
        If i <= j Then
 
            vDummy = sArray(j)
            sArray(j) = sArray(i)
            sArray(i) = vDummy ' Format(Day(vDummy), "00") & "." & Format(Month(vDummy), "00") 
 
            i = i + 1
            j = j - 1
        End If
 
    Loop Until i > j
 
    QuickSort MinElem, j
    QuickSort i, MaxElem
End Sub

Public Sub füllen()
Dim Dic
Dim L As Long
Dim lng_Row As Long

lng_Row = Cells(Rows.Count, 3).End(xlUp).Row 'Beispiel 
Set Dic = CreateObject("Scripting.Dictionary")
sArray = Range("C1:C" & lng_Row)

For L = 1 To lng_Row
   If sArray(L, 1) <> "" Then
      Dic(CDate(sArray(L, 1))) = 0
   End If
Next
sArray = Dic.keys

QuickSort Lbound(sArray), Ubound(sArray)

For A = Lbound(sArray) To Ubound(sArray)
 sArray(A) = Format(sArray(A), "dd.") & Format(sArray(A), "mm.")
Next A

ComboBox1.Clear
ComboBox1.List = sArray

Erase sArray
End Sub


Gruß Tino

Anzeige
AW: ComboBox ohne Duplikate füllen
23.01.2009 13:39:41
ransi
HAllo Kasimir
Den Code zu erweitern ist dann etwas schwierig.
Versuch alternativ zu Tinos Code mal sowas:
System.Collections.ArrayList ist zwar etwas "exotisch", sollte aber ab XP laufen:
Option Explicit

Public Sub füllen()
Dim AL As Object
Dim L As Long
Dim arr As Variant
Dim TMP As Date
Dim lng_Row As Long
lng_Row = 1000 'Beispiel
Set AL = CreateObject("System.Collections.ArrayList")
arr = Range("C1:C" & lng_Row)
With AL
    For L = 1 To lng_Row
        TMP = DateSerial(0, Month(arr(L, 1)), Day(arr(L, 1)))
        If Not .contains(TMP) Then .Add TMP
    Next
    .Sort
    arr = .toArray
    For L = LBound(arr) To UBound(arr)
        arr(L) = Format(arr(L), "DD.MM.")
    Next
End With
ComboBox1.List = arr
End Sub


ransi
Anzeige
AW: ComboBox ohne Duplikate füllen
22.01.2009 09:20:59
robert
hi,
frage -warum stört dich das ganze datum in der combobox?
z.B.hast du 21.1.2009
und 21.1.2010
dann hast du in der combobox 21.1. stehen, aber weisst nichr , welches jahr
ist das so gewollt ?
gruß
robert
;
Anzeige

Infobox / Tutorial

ComboBox in Excel ohne Duplikate füllen


Schritt-für-Schritt-Anleitung

  1. Öffne deine Excel-Datei und erstelle eine UserForm.

  2. Füge eine ComboBox zu deiner UserForm hinzu. Nenne sie z.B. ComboBox1.

  3. Füge den folgenden VBA-Code in das Modul der UserForm ein:

    Public Sub füllen()
       Dim Dic As Object
       Dim L As Long
       Dim lng_Row As Long
    
       lng_Row = Cells(Rows.Count, 3).End(xlUp).Row ' Letzte Zeile in Spalte C
       Set Dic = CreateObject("Scripting.Dictionary")
    
       For L = 1 To lng_Row
           If Cells(L, 3).Value <> "" Then
               Dic(Format(Cells(L, 3).Value, "dd.mm.")) = 0
           End If
       Next L
    
       ComboBox1.List = Dic.keys
    End Sub
  4. Starte die UserForm, um die ComboBox mit den Datumswerten zu füllen. Es werden nur die ersten 6 Stellen des Datums angezeigt, ohne Duplikate.


Häufige Fehler und Lösungen

  • Fehler: ComboBox bleibt leer

    • Stelle sicher, dass der Code in der UserForm richtig eingebunden ist und die ComboBox korrekt benannt wurde.
  • Fehler: Duplikate erscheinen in der ComboBox

    • Überprüfe, ob der Dictionary-Objekt korrekt verwendet wird. Der Code sollte sicherstellen, dass nur einzigartige Werte hinzugefügt werden.

Alternative Methoden

Eine alternative Methode zur Befüllung der ComboBox kann die Verwendung von ArrayList sein. Hier ein Beispiel:

Public Sub füllenMitArrayList()
    Dim AL As Object
    Dim L As Long
    Dim arr As Variant
    Dim lng_Row As Long

    lng_Row = Cells(Rows.Count, 3).End(xlUp).Row
    Set AL = CreateObject("System.Collections.ArrayList")

    arr = Range("C1:C" & lng_Row)

    For L = 1 To lng_Row
        Dim TMP As Date
        TMP = DateSerial(0, Month(arr(L, 1)), Day(arr(L, 1)))

        If Not AL.contains(TMP) Then AL.Add TMP
    Next L

    AL.Sort
    ComboBox1.List = AL.toArray
End Sub

Diese Methode bietet eine effiziente Möglichkeit, die Werte zu sammeln und zu sortieren.


Praktische Beispiele

Angenommen, du hast folgende Datumswerte in Spalte C:

12.02.2009
18.04.2010
21.01.2009
21.01.2010

Nach Ausführung des Codes wird die ComboBox wie folgt gefüllt:

12.02.
18.04.
21.01.

Nur die ersten 6 Stellen jedes Datums werden angezeigt, und Duplikate sind entfernt.


Tipps für Profis

  • Sortierung der Werte: Um die Werte in der ComboBox nach Datum zu sortieren, kannst du die QuickSort-Methode verwenden, bevor du sie der ComboBox zuweist.
  • Verbessere die Benutzeroberfläche: Füge Labels oder Textfelder hinzu, um die Benutzererfahrung zu verbessern und die Auswahl zu erläutern.
  • Nutze Ereignisse: Reagiere auf Änderungen in der ComboBox, um zusätzliche Aktionen auszulösen, wie z.B. das Anzeigen weiterer Informationen zu dem ausgewählten Datum.

FAQ: Häufige Fragen

1. Warum kann ich nur den Tag und Monat in der ComboBox sehen? Es werden nur die ersten 6 Stellen des Datums angezeigt, um Duplikate zu vermeiden.

2. Wie kann ich die Werte in der ComboBox sortiert anzeigen? Du kannst die Werte in ein Array sammeln, sortieren und dann der ComboBox zuweisen. Eine Sortiermethode wie QuickSort kann dabei hilfreich sein.

3. Funktioniert dieser Code in allen Excel-Versionen? Ja, der Code funktioniert in den meisten modernen Excel-Versionen, die VBA unterstützen, ab Excel 2003 und höher. Achte jedoch darauf, dass die entsprechenden Bibliotheken verfügbar sind.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige