Vervollständigen einer nummerierten Liste - VSuchlauf?

Liebes Forum,

ich hänge mal wieder an einem Suchlauf, hab schon alle Beiträge der letzten Jahre zum Thema durch und komme nicht weiter, Vielleicht (sicher:-) könnt Ihr mir helfen …

Aufgabe:
Ich habe eine (sehr lange) durchnummerierte Namensliste mit Sprüngen in den Zeilen (Rechenblatt "Eingang", alle Zellen als "Text"):

1 Mustermann, Klaus von 13.04.1970 8035576
2 Maier, Erwin 16.09.1980 3558076
4 Jackson, Michael 12.11.1990 8557036
5 Müller, Hermann 19.03.1960 5768035
7 Hempel, Achim 23.04.1950 8576035

Diese soll überführt werden in eine vollständige Liste mit einsprechenden leeren Zellen (Rechenblatt "DB"):

1 Mustermann, Klaus von 13.04.1970 8035576
2 Maier, Erwin 16.09.1980 3558076
3 (N.N.)
4 Jackson, Michael 12.11.1990 8557036
5 Müller, Hermann 19.03.1960 5768035
6 (N.N.)
7 Hempel, Achim 23.04.1950 8576035

Geht natürlich mit der Suchen-Funktion, kein Thema, aber ich habe mir gedacht, das ist doch ein typisches Suchlauf-Problem.

Also hab ich's mal so versucht:
VSuchlauf:
Parameter 1: Scanne Liste "Eingang":$A:$D
Parameter 2: Überprüfe, ob die Zeilennummer vorhanden ist
Parameter 3: Beginne bei 0
Parameter 4: Setze ggf. die gefundene Zeile in "Ausgang" ein
Parameter 5: Brich ab, wenn keine Nummer mehr kommt

VSuchlauf(
Eingang!$A:$D;
Suchen(Text(Zeile);Eingang!$A:$A)>0;
0;
SetzeZelle(Suchen(Text(Zeile);Eingang!$A:$A;Eingang!$A:$A);DB!$A:$A)&
SetzeZelle(Suchen(Text(Zeile);Eingang!$A:$A;Eingang!$B:$B);DB!$B:$B)&
SetzeZelle(Suchen(Text(Zeile);Eingang!$A:$A;Eingang!$C:$C);DB!$C:$C)&
SetzeZelle(Suchen(Text(Zeile);Eingang!$A:$A;Eingang!$D:$D);DB!$D:$D);
LfdZelle=''
)

Ergebnis:
Die 1. Zeile funktioniert, dann is Sabbat …

Vielen Dank im Voraus für Eure Ideen/Vorschläge.

Herzliche Grüße
Steffen
MacOS 10.8.5, RT 6.5.2

Re: Vervollständigen einer nummerierten Liste - VSuchlauf?

#12189 On 4 Juni, 2016 17:24 Thomas Kaegi said,

Hallo Steffen

Auch ich bin ein Fan der "Suchen"-Funktion. Aber hier ist sie fehl am Platz. Sie ist unnötig, um die Werte aus der Eingangstabelle zu holen. Die sind ja mit dem Suchlauf ohne Zusatzaufwand verfügbar. Hier die Formel, die wahrscheinlich das macht, was du möchtest:

VSuchlauf(Eingang!$A:$A;LfdIndex≤Max(Eingang!$A:$A);;SetzeZelle(LfdIndex;Ausgang!$A:$A;LfdIndex))&
VSuchlauf(Eingang!$A:$D;LfdZelle≠'';;
SetzeZelle(Spaltenwert(2);Ausgang!$B:$B;LfdZelle)&
SetzeZelle(Spaltenwert(3);Ausgang!$C:$C;LfdZelle)&
SetzeZelle(Spaltenwert(4);Ausgang!$D:$D;LfdZelle))

Erläuterung:
Die Formel besteht aus zwei mit & verknüpften VSuchläufen. Der erste macht nichts anderes, als in der Ausgangstabelle in Spalte A Zeile für Zeile lückenlos alle Nummern bis zum höchsten in Spalte A der Eingangstabelle vorkommenden Wert einzusetzen.
Der zweite Suchlauf läuft über Spalten A:D der Eingangstabelle so lange in Spalte A eine Nummer steht. Diese Nummer ist gleichzeitig der Index zur Zeile, in welche die Werte aus der aktuellen Zeile des VSuchlaufs in die Ausgangstabelle übertragen werden sollen.

Zu beachten: Die von mir immer wieder geäusserte Warnung vor der Funktion "Spaltenwert". Wenn du eine zusätzliche Spalte einfügst gerät alles durcheinander. Die Verwendung der Funktion "Index" vermeidet dieses Problem.

Auch zu beachten: Die Formel löscht keine Daten in der Ausgangstabelle, falls in der Eingangstabelle ein Eintrag gelöscht, oder die Nummer eines Eintrags korrigiert wird.

Gruss, Thomas

Re: Vervollständigen einer nummerierten Liste - VSuchlauf?

#12190 On 4 Juni, 2016 19:46 Steffen said,

Hallo Thomas,

vielen vielen Dank! Ohne Dich wär RagTime nur halb so schön :)

Deine Tipps mit dem Spaltenwert und dem initialen Löschen der Zellen beherzige ich schon seit langem.

Ich habe das jetzt noch eingebaut, einen Auslöseknopf hinzugefügt, einen Suchlauf für die Leerzeilen eingebaut, der die "(N.N.)" ergänzt, und jetzt ist es perfekt:

Knopf('Übertragen';
Wenn(IstLeer(DB!$A$1);'';VSuchlauf(DB!$A:$D; NICHT (IstLeer(LfdZelle));0;SetzeZelle('';DB!$A:$D;LfdIndex)))&
VSuchlauf(Eingang!$A:$A;LfdIndex≤Max(Eingang!$A:$A);;SetzeZelle(LfdIndex;DB!$A:$A;LfdIndex))&
VSuchlauf(Eingang!$A:$A;LfdZelle≠'';;
SetzeZelle(Index(Eingang!$B:$B;LfdIndex);DB!$B:$B;LfdZelle)&
SetzeZelle(Index(Eingang!$C:$C;LfdIndex);DB!$C:$C;LfdZelle)&
SetzeZelle(Index(Eingang!$D:$D;LfdIndex);DB!$D:$D;LfdZelle))&
VSuchlauf(DB!$B:$B;(IstLeer(LfdZelle)) UND (LfdIndex≤Max(Eingang!$A:$A));0;SetzeZelle('(N.N.)';DB!$B:$B;LfdIndex)))

Läuft halt locker ein paar Minuten;-)

Schönes WE allen und viele Grüße
Steffen