Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1568to1572
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

Do loop until Verschachteln

Do loop until Verschachteln
27.07.2017 15:54:07
Florian
Hey Leute,
ich arbeite gerade an einem Projekt und habe eine Do loop until Schleife aufgebaut die nach einen String sucht und diesen in eine andere Tabelle kopiert, welches auch wunderbar funktioniert! Nun soll diese Schleife auch die Zeilen kopieren die vom 1.Fund bis zum nächsten Fund zwischen liegen.
Ich habe es mit einer Exit do und Continue-Do versucht, aber wurde natürlich nichts draus....
Welchen Befehl brauche ich denn dafür bzw wie sollte ich den Code dafür gestalten?

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Do loop until Verschachteln
27.07.2017 16:01:32
mmat
Habe vorhin unter der Überschrift "Fortlaufende Nummerierung aller Duplikate" einen Code veröffentlicht, der, wenn man ein wenig abstrakt denkt, alles enthält was du brauchst, nämlich eine Schleife innerhalb der Schleife.
Vielleicht hilft dir das weiter...
AW: Do loop until Verschachteln
27.07.2017 16:11:23
Florian
Hey danke mmat für deine schnelle Antwort. Das mit while hört sich nach einer Lösung an,aber noch ganz dahinter bin ich nicht gekommen. Wie binde ich dieses denn jetzt in die Schleife ein?
Ein Beispiel für Dich...
27.07.2017 16:05:14
Michael
Florian,
...hier: https://www.herber.de/bbs/user/115081.xlsm
Starte Makro "a" - dieses kopiert alle Vorkommen des Begriffs "ipsum" aus Tabelle1 fortlaufend nach Tabelle2. Code siehe Modul1.
Passt?
LG
Michael
Anzeige
AW: Ein Beispiel für Dich...
27.07.2017 16:11:46
Florian
Hey Danke dir auch Michael. Dies ist der Punkt wo ich schon angekommen bin nun möchte ich das die Zeilen zwischen diesen Funden auch kopiert werden.
Achso...
27.07.2017 16:39:06
Michael
Florian,
...das ist dann etwas aufwändiger. Dann müsstest Du einmal alle Fundstellen durchlaufen, und die jeweiligen Adressen zwischenspeichern (zB in einem Array). Danach durchläufst Du das Array und bildest aus der ersten Zell-Adresse plus der nachfolgenden einen Bereich - dieser Bereich wird kopiert und ins Ziel-Blatt übertragen, und es geht weiter mit der übernächsten Zell-Adresse im Array usw.
Soweit schematisch; da kommen noch einige Überlegungen dazu, zB was passiert bei einer ungeraden Anzahl an Fundstellen? Dann hängt zumindest das letzte Vorkommen "in der Luft" - wie soll dann der Kopierblock gebildet werden? Bis zum Ende der Daten? Das kann man aber alles nicht wirklich wissen, ohne Deine Datenstruktur zu kennen. Dafür würde sich evtl. eine Bsp-Mappe anbieten.
Ich bin leider jetzt schon weg, und erst ab Dienstag wieder im Forum, ich stell Dich daher auf offen, evtl. steigt dazu jemand anderer ein.
LG
Michael
Anzeige
Mit einer Boolean Variable
27.07.2017 17:33:30
Zwenn
Hallo zusammen,
wenn man zusätzlich eine Variable vom Typ Boolean deklariert, kann man diese als Kopier-Schalter verwenden und braucht dann auch keine zweite Schleife, wenn ich das richtig verstanden habe.
Die Variable wird mit false initialisiert. Das bedeutet, es werden keine Zeilen kopiert. Wenn der gesuchte String das erste mal gefunden wurde, wird die Varialble auf true gesetzt und es werden solange Zeilen kopiert, bis der String das zweite Mal gefunden wurde. Dann wieder auf false, damit der Kopiervorgang abgeschaltet wird.
Man muss dann in jedem Schleifendurchgang den Teil, der die Zeile kopiert in einer If-Abfrage auf den Boolean Wert kapseln.
Das würde für das von Michael angesprochene Verhalten bei einer ungeraden Zahl von String-Treffern bedeuten, die letzten Zeilen werden einfach kopiert, auch wenn kein schließender Suchtreffer mehr stattfindet. Das könnte man aber auch abfangen, indem man sich einfach die Zeile + 1 des letzten öffnenden Strings merkt. Ggf. löscht man dann am Ende die zuviel kopierten Zeilen einfach wieder.
Viele Grüße,
Zwenn
Anzeige
AW: Mit einer Boolean Variable
29.07.2017 19:16:22
Florian
Hallo Zwenn,
Danke für dein Verweis aus dem anderen Thread.
Wie genau funktioniert das mit dem If und kapseln ?
Vielen Dank für deine Mühe jetzt schonmal !
Vg Florian
AW: Mit einer Boolean Variable
29.07.2017 20:50:07
Zwenn
Hallo Florian,
der Verweis auf diesen Thread, in dem Du ja die gleiche Frage gestellt hast, war gar nicht böse gemeint, falls das so rüber kam. Es ist halt nicht gern gesehen, wenn das gleiche Thema noch einmal eröffnet wird, solange es noch in einem anderen Thread aktiv ist. Andere machen sich dann unter Umständen noch einmal die Gedanken, die im ersten Thread schon abgearbeitet wurden. Aktive Threads (also die, auf die man noch antworten kann) verschwinden nach 7 Tagen im Archiv. Danach das gleiche Thema noch einmal zu eröffnen, wenn die Frage nicht gelöst ist, unter Verweis auf den "abgelaufenen" Thred, ist dann völlig in ordnung.
So zum Thema.
Sofern ich es richtig verstanden habe, hast Du eine Tabelle, in der die gleiche Zeichenkette öfter vorkommt. Du willst diese Liste durchgehen und jedesmal, wenn der betreffende String gefunden wird, soll das Kopieren von Zeilen entweder ein- oder abgeschaltet werden. Genau dieses Ein- und Abschalten kannst Du mit einer Varibalen vom Typ Boolean steuern, ohne eine zweite Schleife zu benötigen.
Du hast bereits eine Schleife, die über alle Zeilen Deiner Tabelle (Liste) läuft. Sobald Du den betreffenden String findest, wird die entsprechende Zeile in eine andere Tabelle kopiert. Genau an dieser Stelle kannst Du die Variable vom Typ Boolean auf true umschalten und dafür sorgen, dass alle Zeilen kopiert werden, solange diese Variable auf true steht.
Auf false schaltest Du sie wieder, wenn der Steuer-String (so nenne ich ihn mal), erneut gefunden wird. Dann wird das kopieren von Zeilen ausgesetzt.
Diese Umschaltung und damit das Kopieren einer Zeile wird durch eine einfache Entscheidung über eine If Then Struktur gesteuert:

DIM kopieren AS Boolean
DIM zeilen as long
DIM blockSchluss as Boolean 'Schließende Zeile des Steuer-Strings einschließen zum kopieren
kopieren = False
blockSchluss = False
For zeilen = ERSTE-ZEILE to LETZTE-ZEILE
If STEUER-STRING-GEFUNDEN then
Not kopieren 'Umkehrung des aktuellen Wertes. False wird zu True, True wird zu False
Not blockSchluss 'Den schließenden Steuer-String auf "auch kopieren" setzen
End If
If kopieren or blockSchluss then 'Abfrage, ob kopiert werden soll
AKTUELLE ZEILE KOPIEREN
End If
If kopieren = false Then
Not blockSchluss 'Der aktuell zu kopierende Block wird geschlossen
End If
Next zeilen
Das ist das Muster, nach dem der Kopiervorgang einfach umgeschaltet wird. Mit Kapselung in If meinte ich nur, das man die If Strukturen einbauen muss. Man kann das Makro noch beschleunigen, wenn man nicht jede Zeile kopiert, sondern sich die Zeilennummer des öffnenden Steuer-Strings und des schließenden Steuer-Strings in Variablen schreibt. Sobald die schließende Zeile feststeht, kann man einfach den ganzen Block in die andere Tabelle kopieren. Das macht sich zeitlich aber erst bei größeren Listen bemerkbar.
Kannst Du damit was anfangen? Ansonsten bitte ich Dich, mal eine Beispielmappe hochzuladen, mit dem Makro, das Du bisher hast. Da schaue ich dann mal drauf und passe es ggf. an.
Es ist auch notwendig, dass Du die von Michael aufgeworfene Frage beantwortest, was passiert mit den letzten Zeilen, wenn der Kopier-Block geöffnet, aber nicht wieder geschlossen wird. Sollen die Zeilen des Endes der Liste dann auch kopiert werden oder nur die öffnende Zeile, in der der Steuer-String steht?
Viele Grüße,
Zwenn
Anzeige
Vergessen die schließende Zeile auch zu kopieren
29.07.2017 20:58:55
Zwenn
Eine schematische Zeile in der blockSchluss Abfrage zugefügt

DIM kopieren AS Boolean
DIM zeilen as long
DIM blockSchluss as Boolean 'Schließende Zeile des Steuer-Strings einschließen zum kopieren
kopieren = False
blockSchluss = False
For zeilen = ERSTE-ZEILE to LETZTE-ZEILE
If STEUER-STRING-GEFUNDEN then
Not kopieren 'Umkehrung des aktuellen Wertes. False wird zu True, True wird zu False
Not blockSchluss 'Den schließenden Steuer-String auf "auch kopieren" setzen
End If
If kopieren or blockSchluss then 'Abfrage, ob kopiert werden soll
AKTUELLE ZEILE KOPIEREN
End If
If kopieren = false Then
AKTUELLE ZEILE KOPIEREN
Not blockSchluss 'Der aktuell zu kopierende Block wird geschlossen
End If
Next zeilen

Anzeige
Noch ein Fehler ;-)
29.07.2017 21:06:50
Zwenn
So,
man muss natürlich auch für die richtige logik sorgen. Wie bisher angegeben, würde auch jede zweite Zeile derer kopiert werden, die nicht kopiert werden sollen. Eine kleine Erweiterung schafft Linderung ;-)

DIM kopieren AS Boolean
DIM zeilen as long
DIM blockSchluss as Boolean 'Schließende Zeile des Steuer-Strings einschließen zum kopieren
kopieren = False
blockSchluss = False
For zeilen = ERSTE-ZEILE to LETZTE-ZEILE
If STEUER-STRING-GEFUNDEN then
Not kopieren 'Umkehrung des aktuellen Wertes. False wird zu True, True wird zu False
Not blockSchluss 'Den schließenden Steuer-String auf "auch kopieren" setzen
End If
If kopieren or blockSchluss then 'Abfrage, ob kopiert werden soll
AKTUELLE ZEILE KOPIEREN
End If
If kopieren = false and blockSchluss = True Then
AKTUELLE ZEILE KOPIEREN
Not blockSchluss 'Der aktuell zu kopierende Block wird geschlossen
End If
Next zeilen

Anzeige
Oh man, einen Schritt zurück
29.07.2017 21:23:09
Zwenn
Ist nicht mein Logik-Abend
Es stimmte bereits davor. Die letzte Änderung ist nicht notwendig. Die letzte Zeile (blockSchluss) wird bereits in der mittleren IF-Abfrage abgehandelt und kopiert.
Also gilt:

DIM kopieren AS Boolean
DIM zeilen as long
DIM blockSchluss as Boolean 'Schließende Zeile des Steuer-Strings einschließen zum kopieren
kopieren = False
blockSchluss = False
For zeilen = ERSTE-ZEILE to LETZTE-ZEILE
If STEUER-STRING-GEFUNDEN then
Not kopieren 'Umkehrung des aktuellen Wertes. False wird zu True, True wird zu False
Not blockSchluss 'Den schließenden Steuer-String auf "auch kopieren" setzen
End If
If kopieren or blockSchluss then 'Abfrage, ob kopiert werden soll
AKTUELLE ZEILE KOPIEREN
End If
If kopieren = False and blockSchluss = True Then
Not blockSchluss 'Der aktuell zu kopierende Block wird geschlossen
End If
Next zeilen

Anzeige
AW: Mit einer Boolean Variable
30.07.2017 19:49:11
Florian
Hey Zwenn,
ich habe das noch nicht so richtig verstanden, weil irgendwie das mit den Boolean noch nicht in meinen Kopf gelangt ist.
Ich habe jetzt die Bedingung gestellt sobald die Suche true wird wird auch parallel dazu kopieren true und die Schleife kopiert alles bis schließlich durch das wiederfinden von Suche kopieren auf false gesetzt wird. Ich hoffe, so ist es richtig!
Nun werden bei mir etliche Fehler angezeigt, da irgendwie immer Loop ohne Do oder wird ein Object oder Variant benötigt ausgegeben wird.
Vg Florian
P.S. Es wird solange gesucht bis es eine Zelleninhalte mehr gibt bzw sobald kein String mehr gefunden wurde dann soll das Sub exiten.
Anzeige
AW: Mit einer Boolean Variable
31.07.2017 10:19:39
Zwenn
Hallo Florian,
kannst Du Deine Datei mit dem Makro mal hochladen? So kann niemand sehen, warum Dir die Fehler angezeigt werden. Oder poste wenigstens den Quellcode hier. Meine If Geschichte hatte ich zwar 3 mal an dem Abend korrigiert, sie stimmt aber so noch immer nicht. Nichts desto trotz funktioniert das Grundprinzip so, ohne eine zweite Schleife zu benötigen.
Viele Grüße,
Zwenn

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige