Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1012to1016
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
Inhaltsverzeichnis

Suchschleife ohne wiederholte Ergenisse

Suchschleife ohne wiederholte Ergenisse
10.10.2008 18:48:00
Iro
Hallo Excel-Gemeinde,
ich schreibe an einer Suchscleife, die wie folgt aussieht:

Sub Zuordnung_User(Name_User As String)
Dim i As Integer
Dim j As Integer
For i = 6 To 50    For j = 4 To 8
If Worksheets("Tabelle1").Cells(i, j) Like "*" & Name_User & "*" Then
Worksheets("Tabelle1").CB_Legal_Entity.AddItem Worksheets("Tabelle1").Cells(i, 1)
End If
Next
Next
End Sub


Kurz gesagt, wenn ich den Zellen D6 bis H50 der gesuchte name autaucht soll die Nummer in der ersten Zeile notiert werden.
Das Problem ist, dass jede Nummer nur einmal auftauchen soll, jedoch wiederholen sich die Nummern in der ersten Zeile mitunter, z.B. dass in A30:A40 11-mal die Nummer 503 auftaucht, und dazu 11-Mal der Name XY auftaucht. Entsprechend notiert sich die Schleife den namen 11 Mal, was sie nicht soll.
Außerdem kann ein name mehrfach in der gleichen Spalte auftauchen, d.h. von D8:D10 3-Mal. entsprechend notiert sich die Schleife die zugehörige Nummer 3 Mal.
Vielleicht fällt ja hier jemanden eine schöne Lösung ein.
Schon Mal Vielen Dank im Voraus für jede Hilfe.

1
Beitrag zum Forumthread
Beitrag zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
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

Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige