AW: Suchschleife ohne wiederholte Ergenisse
10.10.2008 23:09:00
Yal
Hallo Iro,
ohne die zweite Teil der Frage hätte ich folgend beantwortet:
Du erreichst das gewünschte Ergebnis, in dem Du die weitere Durchsuchung in der aktuelle Zeile abbrichst, wenn der erste Treffer gefunden wird. Und zwar mit Exit For:
Sub Zuordnung_User(Name_User As String)
With Worksheets("Tabelle1")
For Z = Erstezeile To LetzteZeile
For S = ErsteSpalte To LetzteSpalte
If .Cells(i, j) Like "*" & Name_User & "*" Then
.CB_Legal_Entity.AddItem .Cells(i, 1)
Exit For
End If
Next S
Next Z
End With
End Sub
Aber es gibt eben den zweiten Teil,
daher glaube ich, dass das Ergebnis am ehesten zu erreichen, in dem eine Collection verwendet wird: durch den "Key" einer Element (das zweite Parameter in dem Add-Funktion einer Collection) wird vemiedet, dass ein Element zweimal aufgelistet wird:
Sub Zuordnung_User(Name_User As String)
Dim C As New Collection
With Worksheets("Tabelle1")
'Schritte 1: wir befüllen die Collection, diese stosst doppelte Einträge selbst aus
For Z = Erstezeile To LetzteZeile
For S = ErsteSpalte To LetzteSpalte
If .Cells(i, j) Like "*" & Name_User & "*" Then Collection_füttern C, W1.Cells(Z, 1)
Next S
Next Z
'Schritte 2: wir befüllen die ComboBox mit Elementen aus der Collection
For Each Elt In C
.CB_Legal_Entity.AddItem Elt
Next Elt
End With
End Sub
Function Collection_füttern(ByRef C As Collection, ByVal Element As String) As Boolean 'Eine _
separate Prozedure, um den "On Error" gezielt zu verwenden
On Error GoTo Ende
C.Add Item:=Element, Key:=Element 'Wert und Schlüssel sind gleich, Nur Wert können gelesen _
werden, Key muss eindeutig sein, sonst Fehler, aber eben das wollen wir nutzen
Collection_füttern = True 'wird bei Fehler nicht gesetzt, Default-Value (False) bleibt
Ende:
End Function
Der Trick dazu ist, dass wenn ein Element -durch seine Schlüssel identifiziert- in der Collection bereit vorhanden ist, verursacht Add einen Fehler, und wird dadurch nicht doppelt angelegt.
Da wir Fehlertolerant durch eine getrennte
Function arbeiten, nehmen wir diese Sondereffekt sogar zweimal als Vorteil:
Ist ein Element bereit in der Collection (--> Fehler), springt es direkt zu "Ende", das _
Ergebnis von Collection_füttern bleibt False und wir können in der Hauptprozedure einen beschleuniger in Form eines bedingten Exit For vornehmen:
If Not Collection_füttern (C, .Cells(Z,1)) Then Exit For
Viel Erfolg
Yal