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

Kopier Algorythmus

Kopier Algorythmus
18.04.2016 21:06:33
Mirko Helbling

Geschätzte Spezialisten,
Arbeite nun an einem etwas grösseren Projekt, bei welchem ich nun einen Spezialisten brauche, welcher mir eine brillanten Lösungsweg empfehlen kann. Da ich nun schon X Stunden in das Problem investierte und noch keinen nur halbwegs funktionierenden Ansatz fand.
Da das originale Dokument zu kompliziert ist und über 90 Spalten und 900 Zeilen verfügt habe ich eine Variante nachgestellt, welche das gleiche Problem beschreibt:
Folgendes Szenario /*Beispiel ist im Anhang*/
Liste 1: Beinhaltet Daten über Häuser, die Häuser sind innerhalb einer Baumstruktur in Räume aufgeteilt. Jeder Raum besitzt Attribute wie Farben der Fenster. Jeder Raum, welcher auf der Liste 1 in 1-8 Zeilen aufgeteilt ist(Raumgrösse Variabel)muss auf die 2 Liste auf eine Linie kopiert werden. Der Kopiersyntax lässt sich aus dem Beispiel entnehmen. Die erste Linie unterhalb des Raumes soll in die Spalte F der Liste 2, die 2 Zeile unter dem Raum in die Spalte G usw. Ist eine Leerzeile vorhanden, dient die dafür, dass die Spalte F in der Liste 2 ausgelassen wird und der nächste Wert direkt in die Spalte G kommt.
Denke mit dem Beispiel, wird die Problemstellung Nachvollziehbarer.
Wäre sehr dankbar, wenn ein VBA Experte mir Support leisten würde.
Example 1: https://www.herber.de/bbs/user/105062.xlsx

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Kopier Algorythmus
19.04.2016 08:19:41
Michael
Hi Mirko,
etwa so:
Option Explicit
Sub kopieren()
Dim raum As Range, c As Range
Dim zmin&, zmax&, raumMax&, r&, z&, s&, p&, zeilen&()
Dim v As Variant
zmin = 3
zmax = Range("A" & Rows.Count).End(xlUp).Row
Set raum = Range("B" & zmin + 1 & ":B" & zmax).SpecialCells(xlCellTypeConstants, 23)
raumMax = raum.Count
ReDim zeilen(1 To raumMax)
r = 1
For Each c In raum: zeilen(r) = c.Row: r = r + 1: Next
For r = 1 To raumMax - 1
v = Range("A" & zeilen(r) & ":M" & zeilen(r + 1) - 1)
v(1, 3) = v(1, 2)
v(1, 2) = v(1, 13)
v(1, 1) = v(1, 12)
'usw. kannste selber
p = 5
For z = 2 To UBound(v)
p = p + 1
For s = 5 To 9
If v(z, s) <> "" Then
v(1, p) = v(z, s)
'        p = p + 1
Exit For
End If
Next
Next
Sheets("Liste2").Range("A" & r + 2 & ":M" & r + 2) = v
Next
End Sub
Die Datei: https://www.herber.de/bbs/user/105071.xlsm
Wichtig ist, daß Du eine Untergrenze der Daten festlegst, wie hier in Zeile 47.
Schöne Grüße,
Michael
P.S.: Nach dem Klick auf den Button passiert nur scheinbar nichts: es funktioniert aber brav, wovon Du Dich im Blatt Liste2 überzeugen kannst.

Anzeige
Schreibt sich Rhythmus nicht mit 2 h?
19.04.2016 11:27:58
RPP63
Sorry, aber der musste mal sein ;-)
https://de.wikipedia.org/wiki/Algorithmus
Gruß Ralf

AW: Kopier Algorythmus
19.04.2016 19:54:19
Piet
Hallo Michael,
ich bin erfreut das man den Thread bearbeitet hat, aber Sorry.
Ich sehe in deinem Beispiel keine Veraenderung, so wie ich die Aufgabe verstanden habe.
Lediglich in der Liste 2 vier weitere Texte Raum 1-4. Kopiert werden soll von Liste 2 in Liste 1
RPP63 ??? Ich meine ich haette den Namen schon einmal woanders gesehen, aber wo??? (Forum??)
Das erstaunliche an meinen Makros ist, sie funktionieren sogar mit einem "Alligator Rytmus!!"
Hallo Mirko,
anbei eine Beispiel Datei von mir. Ich hoffe ich habe die Aufgabe so halbwegs verstanden.
Einige Felder sind farblich markiert, weil mir noch nicht ganz klar ist warum du manchmal
nur zwei Zeilen farblich markiert hast, und manchmal drei Zeilen, wo nur ein Wert drinsteht.
Es kann sein das ich da noch etwas korrigieren muss.
Teste bitte erst einmal ob die Lösung so brauchbar ist, aendern können wir sie immer noch.
https://www.herber.de/bbs/user/105085.xls

Anzeige
AW: Kopier Algorythmus
19.04.2016 21:18:53
Mirko Helbling
Vorerst!, Besten Dank an jeden hier super Arbeit!!! Habt mir schon wirklich geholfen.
Die Skripts funktionieren auf meiner abstrahierten Mappe, ich versuchte nun diese Lösungsprinzipe in mein eigentliches Projekt zu implementieren. Ich scheiterte erneut...Ich wollte es allen ersparen die orginale Tabelle zu hinterlegen, da diese einfach "monstermässig unübersichtlich" ist. Ihr müsst euch das auch nicht antun!!, vielleicht liegt es nur dran, dass ich bei den Millionen Spalten die Übersicht verliere....
Für die, die wirklich Zeit haben(Selbes Lösungsprinzip nur andere Zeilen / Namen)
Kriterium 1: Liste1: B und C Werte kommen immer in Liste2 A und B
Kriterium 2: Liste1: CF und CG Werte kommen immer in Liste2 D und E
Kriterium 3: Liste1: Werte zwischen BX und CB kommen in Liste2 G bis N
Kriterium 4: Liste1: Werte CH kommen in Liste2 AE
Kriterium 5: Pro Element / Raum eine Zeile in der Liste 2
Kurzum, wieder jeder Baum ergibt eine Zeile in der ist Liste.
Auf der Liste 1 können bis zu 800 Zeilen mit diesen Elementen gefüllt sein.
Ich hoffe, dass ich es halbwegs verständlich erklärt habe.
Eigentlich müsste man nur die Parametrierung in euren Skripts machen, da die Logik stimmt. jedoch scheitere ich den ganzen Tag schon!!:)
Sorry für den Aufwand, habt bestimmt besseres zu tun.
https://www.herber.de/bbs/user/105090.xlsx

Anzeige
AW: Kopier Algorythmus
19.04.2016 22:16:27
Michael
Hi Mirko,
êigentlich geht es nur um diese Zeilen:
v = Range("A" & zeilen(r) & ":M" & zeilen(r + 1) - 1)
v(1, 3) = v(1, 2)
v(1, 2) = v(1, 13)
v(1, 1) = v(1, 12)
'usw. kannste selber
a) v ist als Variant deklariert und durch die Zuweisung zu einem Bereich "automatisch" ein sogenanntes Array. Das liest Du z.B. hier nach: http://www.online-excel.de/excel/singsel_vba.php?f=152
Das Array v ist im Prinzip eine Kopie eines rechteckigen Tabellenbereichs.
b) Zurückgeschrieben wird ja nur die 1. Zeile des mehrzeiligen Arrays, so daß alle Zuweisungen von Namen usw. in der ersten Zeile erfolgen.
Das sind die Zeilen mit v(1,x)=v(1,y), d.h. DIESE Schreibarbeit kannst Du selbst übernehmen; Du mußt nur x durch die Spalte ersetzen, wo was hinsoll und y durch die Spalte, wo es her kommt.
Für den "VBA-Profi" sollte das zumutbar sein.
Wichtig: Mein Codebeispiel enthält vom Fleck weg KEINE Fehlerbehandlung; d.h. falls mehr Zeilen da sein sollten als das Array breit ist, bleibt das Makro stehen.
Hier ist aber auch ein Widerspruch zwischen Deinem Text ("bis zu 8 Zeilen") und der Datei, in der Du auf "Liste2" nur die Spalten F-J, also fünf Spalten, nicht acht, vorgesehen hast.
Schöne Grüße,
Michael

Anzeige
Algorithmus erstellt
20.04.2016 11:51:19
Michael
Hi Mirko,
die neue Datei habe ich mir angesehen; dabei gibt es jedoch noch ein paar Fragen:
a) siehe gestern um 22:16: max. Anzahl der Zeilen bzw. Spalten: das läßt sich natürlich abfangen, nur: was soll passieren, wenn es mehr sein sollten?
b) was ist z.B. mit den Zeilen 87 und 88? Hier sind zwischen den "Überschriften" in Spalte B/C keine Zeilen mit Werten vorhanden. Sollen die ohne Werte übernommen werden? Oder gar nicht?
[werkel, werkel]
Eine gemeine Frage folgt aus Deinem statement jedoch scheitere ich den ganzen Tag schon!!:): Hast DU was besseres zu tun?
Ich schon, trotzdem habe ich mich der Geschichte angenommen. EIN Punkt, weshalb die bisherige Logik mit den specialcells nicht funktionieren konnte ist: siehe oben b).
Für die "Übersetzung" der Spalten von einer Tabelle in die andere habe ich ein gesondertes Array angelegt: so lassen sich die Spalten-Nummern zentral und übersichtlich anpassen.
Die Datei: https://www.herber.de/bbs/user/105103.xlsm
Die Ausgabe erfolgt im Moment in Liste ab Zeile 30, damit Du den direkten Vergleich hast.
"Machen" klicken und Liste2 angucken:
Die gelb markierten Zeilen wurden erzeugt, weil im Kopf des Codes
Const mitEinzelzeilen = True
festgelegt wurde (das sind die "Einzeiler" aus oben b)). Im Beispiel enthalten die ab BX auch keine Werte, deshalb werden sie gar nicht erst danach durchsucht.
Mit = false werden sie denn gar nicht übernommen - such Dir's aus.
Ach ja, wegen a) bei mehr als 8 kommt eine MsgBox.
Schöne Grüße,
Michael

Anzeige
AW: Algorithmus erstellt
20.04.2016 12:28:30
Mirko Helbling
Hallo und nochmals besten Dank an euch!!
@ Miachael
Frage B)
Diese Zeilen müssen ohne die Folgenden Paramter übernommen werden und in der Liste 2 in eine einzelne Zeile geschrieben werden. Da es Elemente ohne [Zusatzinformationen] sind.
Frage A)
Wenn es mehr Spalten sind soll eine msg Box erscheinen, damit wir den Code für diesen Spezialfall erweitern können. Oder eine Logik die die letzte Zeile definiert, diese müsste aber robust sein da es schon mal vorkommen kann, dass diverse Leerzeilen dazwischen vorkommen.
Zu dem Statement: Hoffe dass es nicht falsch verstanden wurde, weiss der Aufwand von euch sehr zu schätzen!!
Ich werde deine Lösung sehr gerne testen, Danke vielmal!!!!! inzwischen habe ich mir das ganze Problem mal aus trivialer Sichtweise angeschaut und folgenden Code geschrieben, ...
Jedoch ist er nicht sehr lesbar.
Userbild
Bereich etc. ist alles noch statisch für den Testlauf...
Danke vielmals und guten Appetit

Anzeige
AW: Algorithmus erstellt
20.04.2016 15:03:24
Michael
Hi Mirko,
wenn Du mein Skript im Projekt-Blatt aufrufst, mußt Du nur die allerletzte Zeile ändern: statt "Liste2" eben "Elemente".
Und, haut's hin?
Gruß,
Michael

AW: Algorithmus erstellt
20.04.2016 15:21:18
Mirko Helbling
Kann nur Sagen Top Skript!!! & Super Arbeit!!!!!!
Sorry für die Umstände...
Danke Vielmals!!
Schöne Grüsse
Mirko

lieber Alko-Rhythmus als ALGOL
20.04.2016 16:13:51
Michael
Hi Mirko,
na, das freut mich!
ALGOL war mal ne Programmiersprache, früher, ach was, ganz früher.
Laß Dich noch a bissl aufziehen...
Schöne Grüße & gute Zeit,
Michael

OT: Sie war sehr beliebt, weshalb sie anfangs ...
21.04.2016 23:42:56
Luc:-?
…der 60er modernisiert wurde, Michael;
sie war dann eine der ersten modernen, die uns noch lange begleitet hatten. BASIC gehörte dann auch noch zu diesem Typ. Erst mit den objektorientierten und den KI-Sprachen wurde dann ein höheres Level erreicht. Aber das ging auch schon Ende der 70er/Anfang der 80er los. Davon haben wir uns noch nicht weit entfernt.
Gruß, Luc :-?
Besser informiert mit …

Anzeige
das finde ich auch gut so
22.04.2016 14:36:36
Michael
Hi Luc:-?,
ich hatte ALGOL nie in den Fingern, aber natürlich mal kurz bei Wiki geschaut, um zu erfahren, daß Pascal auf dieser Basis entwickelt wurde: damit hatte ich angefangen, allerdings nie ernsthaft mit OOP gearbeitet - es scheint mir nichts zu bieten, was nicht auch prozedural geht.
Wenn Du Dich mit OOP auskennst, kannst ja mal in den aktuellen Luggesch-Faden gucken.
https://www.herber.de/forum/messages/1489030.html
Schöne Grüße,
Michael

VBA IST eine OOPL, Michael! ;-) owT
24.04.2016 03:56:25
Luc:-?
:-?

@Piet: bitte genau lesen...
19.04.2016 22:03:43
Michael
Hi Piet,
ich zitiere:Jeder Raum, welcher auf der Liste 1 in 1-8 Zeilen aufgeteilt ist(Raumgrösse Variabel)muss auf die 2 Liste auf eine Linie kopiert werden.
Also von 1 (EINS) nach 2 (ZWEI), *nicht* Kopiert werden soll von Liste 2 in Liste 1
Schöne Grüße,
Michael

Anzeige
AW: Kopier Algorythmus
20.04.2016 02:44:51
Piet
Hallo Michael,
vielleicht habe ich tatsaechlich etwas falsch gelesen oder verstanden.
Die zweite Beispiel Datei von Mirko ist ein Hammer, da blick ich nicht durch.
Macht nichts, ich gebe mir Mühe, dabei liegt man auch schon mal daneben.
Vielleicht bringt es Mirko trotzdem weiter. Viel Erfolg, mir ist das zu hoch!
mfg Piet

@Piet
20.04.2016 09:14:34
Michael
Hi Piet,
im Nachhinein hat es mir dann schon wieder leid getan, daß ich gar so besserwisserisch war.
Die inhaltlich vielleicht berechtigte Kritik hätte ich auch freundlicher rüberbringen können - sorry.
Ich überlese ja auch mal was, so isses nicht.
Also, schönen Tag & ebensolche Grüße,
Michael

Anzeige
AW: @Michael - hab deinen Unmut verstanden
20.04.2016 17:30:35
Piet
Hi Michael,
ich habe jetzt gerade deinen Unmut verstanden, vielleicht waere ich auch veraergert gewesen.
Zur Info:
ich halte meine Thread meistens sorgfaeltig nach. Dann kam Upps ....
In einer Excel Tabelle halte ich alle Thrads fest die ich bearbeite.
Vor allem kopiere ich mir auch alle Fragen und Antworten, zum nachlesen.
Dabei fiel mir auf das mir Mirko um 21:18:53 und deine Antwort 22:16:27 vorlag.
Gefolgt von meinem Lösungsvorschlag. Die gesamten Antworten dazwischen fehlten!!
Beim neuen Öffnen von Herber zeigte mir die Liste farblich an das ich alles was
dazwischen lag noch nicht gelesen hatte. Sonst haette ich mich wohl ausgeklinkt.
Warum ich es nicht im Server sah weiss ich nicht (war evtl. nicht aktualisiert??)
Ist aber schön wenn man so erkennt das man vieles nicht mitbekommen hat.
Freut mich wenn deine Lösung sehr zufriedenstellend lauft. Prima Arbeit....
mfg Piet

@Piet - ist schon recht
21.04.2016 22:51:41
Michael
Hi Piet,
die Geschichte ist eh erledigt, aber die Idee mit der Tabelle fürs Forum sollte ich vielleicht übernehmen.
Außerdem bin ich neugierig, ob Dir vielleicht ne "Transport"-Lösung einfällt...
Schöne Grüße,
Michael

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige