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

Zellen um übergeordnete Informationen erweitern

Zellen um übergeordnete Informationen erweitern
20.06.2016 18:12:58
Lukas
Schönen guten Tag,
ich habe ein komplexes Problem und wäre dankbar über Hilfe. Ich habe in Excel eine EinfachListe (bestehend aus 2 Spalten) mit folgendem Aufbau erhalten:
In Spalte A sind alle Datensätze (Kombination aus Zahlen / Text Strings mit Trennzeichen) enthalten. In Spalte B sind zum jeweiligen Datensatz die übergeordneten Informationen. Der jeweilige übergeordnete Datensatz ist wiederum in Spalte A zu finden. Für diesen gibt es auch wieder übergeordnete Information. (Die Liste ist eigentlich als Strukturbaum zu verstehen. Ich möchte die Datensätze gerne um die vorhandene Hierarchie bis zur Wurzel über die Zellen C - ? erweitern, sodass ich erkennen kann, welche Daten welche übergeordneten Informationen / Datensätze haben.
Versteht einer wie ich es meine? Ich habe auch ein kleines Beispiel als Bild angefügt. Wichtig wäre mir dass der unterste Datensatz (welcher kein übergeordneten mehr darstellt) wie im Bild ganz rechts ist und die Wurzel quasi ab C.
Danke
Userbild

31
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zellen um übergeordnete Informationen erweitern
20.06.2016 21:09:58
Matthias
Hallo! Ich habe mal was geschrieben. Bei klappt es - hab aber Excel 2003. Gehe aber davon aus, dass es auch in höheren Versionen klappt. Der Pfad verzweigt sich unten aber nicht oder? Bin zumindest davon ausgegangen, dass es nur linear ist. Man könnte das ganze wohl auch mit Formeln und SVerweisen lösen. Habe mich aber mal für VBA entschieden. Falls du es auch mit Formeln brauchst, nochmal melden. Schönen Abend noch
Sub baum()
Dim letzter
Dim i As Long
Dim j As Long
Dim spalte As Long
Dim ende As Boolean
Dim liste()
ReDim liste(0)
liste(0) = 0
letzter = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
'i geht ab erstem Eintrag los
For i = 2 To letzter
'werte suchen
liste(0) = liste(0) + 2
ReDim Preserve liste(liste(0))
liste(1) = ActiveSheet.Cells(i, 1)
liste(2) = ActiveSheet.Cells(i, 2)
ende = False
While ende = False
Set vorher = ActiveSheet.Columns(1).Find(liste(UBound(liste)), LookIn:=xlValues)
If Not vorher Is Nothing Then
liste(0) = liste(0) + 1
ReDim Preserve liste(liste(0))
liste(liste(0)) = vorher.Offset(0, 1)
Else
ende = True
End If
Wend
'werte eintragen
spalte = 3
If liste(0) > 0 Then
For j = UBound(liste) To 1 Step -1
ActiveSheet.Cells(i, spalte) = liste(j)
spalte = spalte + 1
Next j
End If
ReDim liste(0)
Next i
End Sub

Anzeige
AW: Zellen um übergeordnete Informationen erweitern
20.06.2016 22:06:25
Lukas
Matthias, Herrlich funktioniert das, vielen Dank! Krass mit wie wenig Zeilen man so viel erreichen kann...verrückt!
Ich bin echt begeistert, und das wäre genauso mit SVERWEIS gegangen? Hätte mich interessiert wie das aussieht, verstehe leider von VBA nichts kann also dein CODE so gut er auch ist nicht nachvollziehen...
Was ich jetzt noch gern erreichen würde ist, die Informationen, die jetzt bis zur Wurzel angefügt wurden so zu berücksichtigen, dass es die Informationen vererbt und aus der jeweils unteren Hierarchiestufe entfernt. Das hat zum Zweck, dass ich aufgrund der unsystematischen Aufbauschematik nicht übergreifend Regeln definieren kann wie ich Texte aus den Datensätze herauslöse, um diese weiter zu bearbeiten und mit anderen Datensätzen zu routen...Hättest du da auch noch so eine großartige Idee?
Habe nochmal ein Beispiel zur Verdeutlichung bereitgestellt...
DANKE
Userbild

Anzeige
AW: Zellen um übergeordnete Informationen erweitern
21.06.2016 09:50:50
Matthias
Moin! ALso hoffe mal das Problem richtig verstanden zu haben. Bei deinem Beispiel oben unterscheidet sich allerdings die Reihe. Im zweiten Zweig kommt noch ein BAH mit rein (welches später wieder fehlt). Hoffe mal das war nur ein Versehen - sonst könnte der Code falsch laufen. Das mit den Formeln und SVerweisen, könnte gehen. Allerdings sollte dann nach meiner Überlegung die Darstellung in umgekehrter Reihefenfolge laufen (man weiß ja nicht, wie weit es noch geht).
ALso unten jetzt die geänderte Version. Der Eintrag erfolgt ab einer vorgegebene Spalte. Je nachdem wie viele Zeilen deine Daten haben, könnte es weit hinten liegen. Ist im Code kommentiert. Dort ggf. noch anpassen. Lies sich aber erstmal nicht anders regeln, da beim Eintragen noch nicht klar ist, wie lange die anderen Zeilen werden. Kannst du im Code aber umstellen (s. Kommentar) Sieht dann für die anderen Zeilen aber ungeodnet aus. Wenn dies geordnet angezeigt werden soll, könnte man das auch noch ändern. Dann einfach melden.
Falls du ansonsten noch mehr Kommentare zum Nachvollziehen brauchst, einfach melden. Die jetztigen Kommentare sind nur zum Anpassen da. VG
Option Explicit
Sub baum()
Dim letzter
Dim i As Long
Dim j As Long
Dim spalte As Long
Dim ende As Boolean
Dim vorher
Dim liste()
ReDim liste(0)
liste(0) = 0
letzter = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
'i geht ab erstem Eintrag los
For i = 2 To letzter
'werte suchen
liste(0) = liste(0) + 2
ReDim Preserve liste(liste(0))
liste(1) = ActiveSheet.Cells(i, 1)
liste(2) = ActiveSheet.Cells(i, 2)
ende = False
While ende = False
Set vorher = ActiveSheet.Columns(1).Find(liste(UBound(liste)), LookIn:=xlValues)
If Not vorher Is Nothing Then
liste(0) = liste(0) + 1
ReDim Preserve liste(liste(0))
liste(liste(0)) = vorher.Offset(0, 1)
Else
ende = True
End If
Wend
'werte eintragen
spalte = 3
If liste(0) > 0 Then
For j = UBound(liste) To 1 Step -1
ActiveSheet.Cells(i, spalte) = liste(j)
spalte = spalte + 1
Next j
End If
'gesplittet eintragen, dazwischen mind. 1 freie Spalte,
'könnte ggf. weit hinten liegen
'alternativ die folgende Zeile durch spalte = spalte + 1 ersetzen
spalte = letzter + 2
If liste(0) > 0 Then
For j = UBound(liste) To 2 Step -1
ActiveSheet.Cells(i, spalte) = Replace(liste(j), "-" & liste(j - 1), "")
spalte = spalte + 1
Next j
ActiveSheet.Cells(i, spalte) = liste(1)
End If
ReDim liste(0)
Next i
End Sub

Anzeige
AW: Zellen um übergeordnete Informationen erweitern
21.06.2016 10:09:26
Lukas
Guten Morgen!
Vielen Dank schonmal, dein alter Code lasse ich gerade über die Datensätze drüber laufen (dauert ein wenig), wollte ihn jetzt mal komplett durchrechnen lassen bevor ich den neuen Code teste und dann abspeichern! Zu deiner Frage mit dem BAH: Es ist leider so, dass (auf der dritten Ebene von der Wurzel abwärts) eine Information in den Datensätzen vorkommt, der Teil vom String ist, aber nicht weiter gegeben wird...Meine Idee wäre gewesen die dritte Ebene zu "vernachlässigen"... Ein typischer hierarchischer Aufbau des Datensatzes sieht angelehnt an das obige Beispiel so aus:
HI12
12-34_3
12-34_3-BAH
12-34_3-GANDALF
12-34_3-GANDALF-LEO001
Das habe ich leider auch erst jetzt richtig so ablesen können...Ich vermute mal das verkompliziert die ganze Sache....
Also der Text auf der obersten Ebene wird nicht weiter getragen sondern nur dieser Numerik sowie auf der Ebene 3 ebenso nur dieser numerische String...
Lässt sich das überhaupt bewerkstelligen?
Klasse dass du mir das so weiterhilfst!!

Anzeige
AW: Zellen um übergeordnete Informationen erweitern
21.06.2016 10:23:13
Matthias
Also habe noch ne Änderunge und eine zweite Variante nachgeschoben. Wie soll bei der Darstellung oben die Ausgabe am Ende sein? So wie unten dargestellt? Also wäre alles an sich kein Problem - aber erst am Nachmittag. Müsste nur noch genau wissen, wie. VG
Ausgangsdarstellung nach Sortieren
HI12 | 12-34_3 |12-34_3-BAH |12-34_3-GANDALF |12-34_3-GANDALF-LEO001
Darstellung am Ende nach dem Splitten
HI12 |12-34_3 |BAH |GANDALF |LEO001

AW: Zellen um übergeordnete Informationen erweitern
21.06.2016 10:25:22
Lukas
Genau das wäre die Idee, ja!
VG

AW: Zellen um übergeordnete Informationen erweitern
21.06.2016 10:34:54
Lukas
Ah edit:
Ausgangsdarstellung nach Sortieren
HI12 | 12-34_3 |12-34_3-BAH |12-34_3-GANDALF |12-34_3-GANDALF-LEO001
Darstellung am Ende nach dem Splitten
HI12 | 34_3 (Da die 12 schon als Information bekannt) |BAH |GANDALF |LEO001
So jetzt aber! :)

Anzeige
AW: Zellen um übergeordnete Informationen erweitern
21.06.2016 11:30:36
Lukas
Was ich noch festgestellt habe, es gibt auch Strukturrisse, soll heißen, dass es Datensätze gibt, die keine durchgehende Hierarchie haben. Dieser Riss zeigt sich dann in der Tabelle an der Stelle, wo kein übergeordneter (Spalte B) mehr eingetragen ist. Da scheint der Code abzubrechen, kann man das noch irgendwie umgehen?
Viel Input, Sry!!
VG

AW: Zellen um übergeordnete Informationen erweitern
21.06.2016 14:56:12
Matthias
Hallo! Also hier mal eine geänderte Version. Ein bissl mehr Code, da auch die Rahmenbedingungen geändert sind. :-) Ich hoffe jetzt alle bekannten Besonderheiten mit erfasst zu haben. Bei einem Fehler der auftreten könnte, kommt eine Nachricht aber kein Programmabsturz. In diesem Falle würde die erste Auflistung passen und lediglich der hintere Teil in der entsprechenden Zeile ggf. fehlerhaft sein. Diese Variante sollte aber nicht auftreten (liegt vor, wenn im ersten Wert ein TRennstrich ist aber nicht in das zweite Feld mit übernommen wird) . Das mit dem Strukturriss ist auch berücksichtigt. Wobei es ja mE kein Riß ist sondern die Wurzel des Pfades (über de kommt ja nix mehr). Also mal bitte testen und ggf. melden wo es noch hakt. Viele Grüße
Option Explicit
Sub baum()
Dim letzter
Dim i As Long
Dim j As Long
Dim spalte As Long
Dim ende As Boolean
Dim vorher
Dim lange As Long
Dim weite As Long
Dim datensplit
Dim anztrenn
Dim k As Long
Dim liste()
ReDim liste(0)
liste(0) = 0
lange = 6
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
ActiveSheet.Range(Columns(3), Columns(ActiveSheet.Columns.Count)).ClearContents
letzter = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To letzter
If ActiveSheet.Cells(i, 1)  "" Then
'werte suchen
liste(0) = liste(0) + 2
ReDim Preserve liste(liste(0))
liste(1) = ActiveSheet.Cells(i, 1)
liste(2) = ActiveSheet.Cells(i, 2)
ende = False
If liste(2) = "" Then
liste(2) = liste(1)
liste(1) = ""
ende = True
End If
While ende = False
Set vorher = ActiveSheet.Columns(1).Find(Trim(liste(UBound(liste))), _
LookIn:=xlValues, Lookat:=xlWhole)
If Not vorher Is Nothing Then
If vorher.Offset(0, 1)  "" Then
liste(0) = liste(0) + 1
ReDim Preserve liste(liste(0))
liste(liste(0)) = Trim(vorher.Offset(0, 1))
Else
ende = True
End If
Else
If liste(0) > lange Then lange = liste(0)
ende = True
End If
Wend
'werte eintragen
spalte = 3
If liste(0) > 0 Then
For j = UBound(liste) To 1 Step -1
ActiveSheet.Cells(i, spalte) = Trim(liste(j))
spalte = spalte + 1
Next j
End If
ReDim liste(0)
liste(0) = 0
End If
Next i
For i = 2 To letzter
spalte = lange + 3
weite = ActiveSheet.Cells(i, Columns.Count).End(xlToLeft).Column
If weite > 2 Then
ActiveSheet.Cells(i, spalte) = Trim(ActiveSheet.Cells(i, 3))
spalte = spalte + 1
anztrenn = 1 + UBound(Split(Trim(ActiveSheet.Cells(i, 3)), "-"))
For j = 4 To weite
datensplit = Split(ActiveSheet.Cells(i, j), "-")
If UBound(datensplit) = anztrenn Then
ActiveSheet.Cells(i, spalte) = datensplit(UBound(datensplit))
spalte = spalte + 1
'prüfen auf BAH
If InStr(1, ActiveSheet.Cells(i, j), "BAH", vbTextCompare) > 0 _
And InStr(1, ActiveSheet.Cells(i, j + 1), "BAH", vbTextCompare) = 0 Then
anztrenn = anztrenn
Else
anztrenn = anztrenn + 1
End If
Else
If anztrenn > UBound(datensplit) Then
MsgBox "Der Fehler war noch nicht bekannt!"
Else
For k = anztrenn To UBound(datensplit)
ActiveSheet.Cells(i, spalte) = ActiveSheet.Cells(i, spalte) & datensplit(k)  _
Next k
ActiveSheet.Cells(i, spalte) = Left(ActiveSheet.Cells(i, spalte), _ Len( _
ActiveSheet.Cells(i, spalte)) - 1)
spalte = spalte + 1
If InStr(1, ActiveSheet.Cells(i, j), "BAH", vbTextCompare) > 0 And InStr(1,  _
ActiveSheet.Cells(i, j + 1), "BAH", vbTextCompare) = 0 Then
anztrenn = anztrenn + UBound(datensplit) - anztrenn
Else
anztrenn = anztrenn + 1 + UBound(datensplit) - anztrenn
End If
End If
End If
Next j
End If
Next i
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub

Anzeige
AW: Zellen um übergeordnete Informationen erweitern
21.06.2016 21:18:11
Lukas
Guten Abend Matthias! Vielen Dank für den Code, ich habe leider das Problem dass ich sobald ich auf ausführen gehe eine Fehlermeldung erhalte "Synthaxfehler", ich habe eine Grafik eingefügt welche Zeile es mir im Code markiert hat. Weißt du woran das liegen könnte? LG
Userbild

AW: Zellen um übergeordnete Informationen erweitern
21.06.2016 21:44:42
Matthias
Hallo! Fehler ist der Unterstrich vor Len. Es muss also Komma Leerzeichen Len heißen. Arbeite in meinem Code nicht mit diesen Zeilenumbrüchen und muss die hier dann reinbasteln. Da hat sich (warum auch immer) einer reingeschummelt. Hab nochmal geschaut, sollte de einzige Fehler sein. Schönen Abend noch

Anzeige
AW: Zellen um übergeordnete Informationen erweitern
21.06.2016 22:25:09
Lukas
Ah Prima Danke! Jetzt liefs durch (auch wenn sehr viele Fehlermeldungen erscheinen) Das liegt womöglich daran, dass du "BAH" definiert hast aber auf der Ebene noch andere Synonyme vorkommen? Wie kann ich denn weitere Synonyme neben diesem im Code ergänzen, die dann ebenso nicht berücksichtigt werden? LG und nochmals vielen lieben Dank!!

AW: Zellen um übergeordnete Informationen erweitern
21.06.2016 22:35:00
Lukas
EIne Sache wäre mir noch aufgefallen
In der ersten Phase wird alles schön aufgeschlüsselt (es geht leider bis zu 9 Ebenenen runter). Ab der vierten wird das Muster 12-34_3-GANDALF beibehalten, jedoch stehen anstatt dem GANDALF andere Wörter mit teilweise Zahlenkombinationen, die mit "-" verbunden sind, die optimalerweise auch noch aufgeschlüsselt werden sollten. War mein FEhler, im Beispiel hatte ich glaube ich immer nur von 5 Ebenen geredet!
Muster der größten Ebenengliederung:
HI-12 (1. Ebene)
12-34_3
12-34_3-BAH
12-34_3-GANDALF
12-34_3-LEO-150-001
12-34_3-TEST-001
12-34_3-TEST-BORIS-001
usw.
Wenn du da noch was machen könntest wär das super genial, wenn nicht passt das auch :)
LG

Anzeige
AW: Zellen um übergeordnete Informationen erweitern
22.06.2016 08:27:10
Matthias
Moin! Hatte schon im Code versucht vielen abzufangen. Da die Auflistung doch etwas anders ist noch ne Frage. Ab der zweiten Ebene wird nur noch 12-34_3 mitgeschleift (bis zum Schluß) der Rest dahiner ändert sich und es gibt nix, was mitgenommen wird? n Zeile 6 und 7 stehen da nämlich wieder verdächtige TEST . Letztendlich sollte an Hand deines Beispieles dann sowas hinten ausgegeben werden!?
HI-12 | 34_3 | BAH | GANDALF | LEO-150-001 | TEST-001 | TEST-BORIS-001
Passt das oder gibt es da Ändeurngen? Und gilt das so für alle oder gibt es noch allgemeinere Fälle? Würde im Laufe des Tages mal schauen. VG

Anzeige
Zellen um übergeordnete Informationen
22.06.2016 08:42:52
lubebi91
Guten Morgen,
es lässt sich leider kein eindeutiges Schema (bei weit über 1000 Datensätzen) rauslesen. Aber vom Prinzip her wäre es genau so wie du es beispielhaft dargestellt hast für mich optimal. Vielleicht noch ein entscheidender Hinweis: Die 34_3 ist variabel (Kann auch mal ein "N" sein oder nur eine zweistellige Ziffer), wichtig wäre eigentlich die Informationen zu vererben (und die gefundenen Informationen auf der nächsten Ebene) nicht mehr mitzuführen (also so etwas indirekteres, weiß nicht wie ich es besser ausdrücken kann). (In diesem Fall wäre es die 12 und dann die 34_3 als sich wiederholende Information.
Ich hoffe ich konnte das Problem damit ein wenig konkretisieren (leider kann ich vom Originaldatensatz keine Beispiele einstellen)...
VG!!

Zellen um übergeordnete Informationen erweitern
22.06.2016 09:11:34
lubebi91
Hier noch exemplarisch ein anderes Beispiel (andere Liste, gleiches Prinzip), welches vom Schemaaufbau anders ist, wo idealerweise der Code drauf anwendbar ist (Ich habe es versucht und die Aufschlüsselung klappt perfekt, das Abcutten teilweise auch aber noch nicht so, dass die Informationen die im String mit enthalten sind und darüber schon vorhanden waren komplett abgeschnitten werden:
A23-T-ABC-001-DE-FG (Muster der untersten Stufe
Hierarchie
A23
23-T
23-T-ABC
23-T-ABC-001
23-T-ABC-001-DE
23-T-ABC-001-DE-FG
Ergebnis nach Informationstrennung (rechts neben Aufschlüsselung):
A23
T
ABC
ABC-001
DE
FG
Diese hätte am obigen Beispiel die Änderung von TEST-BORIS-001 zu BORIS-001 die Folge. Der Einfachheit halber würde ich auch diese Ausgliederung der dritten Stufe verzichten und einfach mitreinnehmen, da bei anderen Datensätzen dies nicht erfordert.
Der Code nähert sich der Perfektion, DANK!!

Zellen um übergeordnete Informationen erweitern
22.06.2016 09:15:31
lubebi91
Noch ein Fehler zum Post gerade eben:
In aller Konsequenz natürlich das ABC-001 zu 001 ändern (Da ABC ja schon darüber bekannt).
So jetzt aber :)
VG

Zellen um übergeordnete Informationen erweitern
22.06.2016 11:20:32
lubebi91
Falls es zu Verwirrungen wegen meinem Benutzernamen kommt, Lukas = lubebi91 :)

AW: Zellen um übergeordnete Informationen erweitern
22.06.2016 15:30:24
Matthias
Moin! Das mit dem Namen passt schon. Keine Angst. Also hier der nächste Anlauf. :-) Habe den Code nochmal modifiziert. Zudem werden auf der Seite noch ein paar Formatierungen vorgenommen - damit man es besser sieht ( betrifft Spaltenbreite und alles als Text formatieren). Achja, war in der Vorgängerversion auch schon drin, es wird amAnfang ab Spalte 3 bis zum Ende erstmal alles gelöscht. Nur zur Info, falls du da am Ende noch was in das Blatt schreibst und den Code nochmal ausführst, ist dann alles weg! War nötig um im zweiten Schritt zu wissen, wie lange der Code in der Zeile werkeln soll.
Also der Code vergleicht jetzt aus der Sortierung die zwei folgenden Teile. Ist der Vorgänger im Nachfolger enthalten, wird das gelöscht. Wenn nicht wird geschaut, ob die 2 Texte bis zu einer gewissen Stelle identisch sind. Wenn ja, wird der Teil gelöscht, wenn nein, wird der Teil vor dem ersten auftreten des "-" eliminiert. Habe mal verschieden deiner Beispiele geprüft und passt. Zumindest bei mir. Wie immer, bitte schauen und melden was passiert. Achja, falls du den hintern Teil raushaben willst, der ist jetzt markiert. Wenn der Teil aus dem Code genommen wird, wird das aufsplitten am Ende nicht durchgeführt. Schönen Tag noch
Mustte zweimal posten (versuchen). Beim Len schummelt sich wohl wieder ein _ ein. Weiß nicht, wie das dahin kommt. WEnn es wieder da ist, bitte vorher wieder rausnehmen. Die sollen wirklich nur am Zeilenende stehen, wenn es darunter weitergeht und nicht im Code = Fehler. Gruß

Option Explicit
Sub baum()
Dim letzter
Dim i As Long
Dim j As Long
Dim spalte As Long
Dim ende As Boolean
Dim vorher
Dim lange As Long
Dim weite As Long
Dim datensplit
Dim anztrenn
Dim k As Long
Dim liste()
ReDim liste(0)
liste(0) = 0
lange = 6
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
ActiveSheet.Range(Columns(3), Columns(ActiveSheet.Columns.Count)).ClearContents
ActiveSheet.Range(Columns(3), Columns(ActiveSheet.Columns.Count)).NumberFormat = "@"
letzter = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To letzter
If ActiveSheet.Cells(i, 1)  "" Then
'werte suchen
liste(0) = liste(0) + 2
ReDim Preserve liste(liste(0))
liste(1) = ActiveSheet.Cells(i, 1)
liste(2) = ActiveSheet.Cells(i, 2)
ende = False
If liste(2) = "" Then
liste(2) = liste(1)
liste(1) = ""
ende = True
End If
While ende = False
Set vorher = ActiveSheet.Columns(1).Find(Trim(liste(UBound(liste))), _
LookIn:=xlValues, Lookat:=xlWhole)
If Not vorher Is Nothing Then
If vorher.Offset(0, 1)  "" Then
liste(0) = liste(0) + 1
ReDim Preserve liste(liste(0))
liste(liste(0)) = Trim(vorher.Offset(0, 1))
Else
ende = True
End If
Else
ende = True
End If
Wend
'werte eintragen
spalte = 3
If liste(0) > 0 Then
For j = UBound(liste) To 1 Step -1
ActiveSheet.Cells(i, spalte) = Trim(liste(j))
spalte = spalte + 1
Next j
End If
If liste(0) > lange Then lange = liste(0)
ReDim liste(0)
liste(0) = 0
End If
Next i
'der Teil für das gesplittet eintragen am Ende
For i = 2 To letzter
spalte = lange + 4
weite = ActiveSheet.Cells(i, Columns.Count).End(xlToLeft).Column
If weite > 2 Then
ActiveSheet.Cells(i, spalte) = CStr(Trim(ActiveSheet.Cells(i, 3)))
spalte = spalte + 1
For j = 4 To weite
If InStr(1, ActiveSheet.Cells(i, j), ActiveSheet.Cells(i, j - 1), vbTextCompare) >  _
0 Then
ActiveSheet.Cells(i, spalte) = CStr(Mid(ActiveSheet.Cells(i, j), _
Len(ActiveSheet.Cells(i, j - 1)) + 2, Len(ActiveSheet.Cells(i, j))))
spalte = spalte + 1
Else
For k = 1 To Len(ActiveSheet.Cells(i, j))
If InStr(1, Mid(ActiveSheet.Cells(i, j - 1), 1, k), _
Mid(ActiveSheet.Cells(i, j), 1, k), vbTextCompare) = 0 Then
Exit For
End If
Next k
If k = 1 Then
ActiveSheet.Cells(i, spalte) = CStr(Mid(ActiveSheet.Cells(i, j), _
InStr(1, ActiveSheet.Cells(i, j), "-", vbTextCompare) + 1, Len(ActiveSheet.Cells(i, j))))
Else
ActiveSheet.Cells(i, spalte) = CStr(Mid(ActiveSheet.Cells(i, j), _
k, Len(ActiveSheet.Cells(i, j))))
End If
spalte = spalte + 1
End If
Next j
End If
Next i
'####  Ende des Teiles zum splitten
ActiveSheet.Range(Columns(3), Columns(ActiveSheet.Columns.Count)).Columns.AutoFit
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub

AW: Zellen um übergeordnete Informationen erweitern
22.06.2016 19:59:11
Lukas
Geile Sache, vielen Dank!! Ich habe einzelne Datensätze rausgenommen (sinnvolle zusammenhängende Bereiche). Der Code läuft eigentlic dann einwandfrei durch, beim kompletten Datensatz (um die 15000 Daten) hängt / lädt er nach 2 / 3 Stunden immer noch, wo ich dann Escape drückte kam so eine Meldung mit "Visual Basic 400" irgendwas. Unterbrochen wurde er dann irgendwo bei 12000 rum, villeicht hätte er auch einfach noch gebraucht, ich probiers auch nochmal aus und meld mich dann! Vielen Dank !

AW: Zellen um übergeordnete Informationen erweitern
22.06.2016 20:14:24
Matthias
Hallo! Sind das 15000 Zeilen in Spalte A die beschreiben sind? Oder 15000 vollständige Pfade (vom untersten bis obersten, die Mitteldinger, die auch vorkommen, nicht mitgezählt) die angezeigt werden? Und hängt die Dauer am Endcode oder ist das sortieren am Anfang auch schon so lange? Würde es reichen, wenn du für den längsten Pfad die Auflistung hast oder brauchst auch die drunter.
HI-13 |
HI-13 |13-34_3
HI-13 |13-34_3 |13-34_3-BAH
HI-13 |13-34_3 |13-34_3-BAH |13-34_3-GANDALF
Also würde hier das Aufspalten für 4te Auflistung reichen, weil das der längste Pfad ist ( das darüber ich ja teilweise identisch)? Ziel der Fragen ist den Rechenaufwand zu minimieren. (ggf. durch Nutzung von Sortieren, Filtern etc.) 3 bis 4 Stunden ist entschieden zu lange. :-) Also wenn der erste Teil rel. flott geht, würde ich mal überlegen, ob man da für den zweiten nicht was anderes macht. VG

AW: Zellen um übergeordnete Informationen erweitern
22.06.2016 20:28:39
Lukas
In Spalte A/B sind 15.000 Zellen befüllt, mit Auflistung / Aufspaltung sind es dann noch wesentlich mehr. ICh brauche eigentliche alle Pfade, nicht nur den längsten, die Länge (Tiefenanzahl der Ebenen) ist nicht maßgeblich für die Relevanz der Daten, das längste sind 9 Ebenenen runter. Das Mittel ist so bei 6 Ebenen, das wäre eigentlich auch schon genug. Aber die Infos auf Ebene 5 und 6 wären doch ziemlich wichtig :). Das komische ist, dass es für einzelne Bereiche (also Auswahl einer Ebene 2 mit allen die darunter liegen) relativ zügig geht. Die Idee ist ja perfekt und genau so wie es für die Teilbereiche aussieht soll es eigentlich auch aussehen, meinst da kriegt man noch irgendwo ne Effizienzsteigerung? LG

AW: Zellen um übergeordnete Informationen erweitern
22.06.2016 20:35:51
Lukas
Achso, der Code war beim Abbrechen noch mit der Informationserweiterung / Aufschlüsselung beschäftigt. LG

AW: Zellen um übergeordnete Informationen erweitern
23.06.2016 17:10:30
Matthias
Hallo! Also bin schonmal am Versuch des optimierens. :-) Mal noch ne Frage zu den ganzen Daten. Stellen die einen Baum dar (bei dem es auch Verzweigungen geben kann) oder ist das alles linear also eine Liste. Also ist nur so was möglich
HI12 |12-34_3 |12-34_3-BAH |12-34_3-GANDALF |12-34_3-GANDALF-LEO001
HI12 |12-34_3 |12-34_3-BAH |12-34_3-GANDALF
HI12 |12-34_3 |12-34_3-BAH
HI12 |12-34_3
HI12
oder auch so was
HI12| 12-34_3| 12-34_3-BAH |12-34_3-GANDALF-test |12-34_3-GANDALF-test-ganz
HI12| 12-34_3| 12-34_3-BAH |12-34_3-GANDALF-test
HI12| 12-34_3| 12-34_3-BAH |12-34_3-GANDALF |12-34_3-GANDALF-LEO001
HI12| 12-34_3| 12-34_3-BAH |12-34_3-GANDALF
HI12| 12-34_3| 12-34_3-BAH
HI12| 12-34_3
HI12|
also ab 12-34_3-BAH verzweigt der Pfad einmal.
Wäre interessant und wichtig für das weitere optimieren. Hier mal eine vorläufige Version.
Die gibt nur beim Längsten Pfad das Aufsplitten an. Dabei werden die Daten aber sortiert
und liegen nicht mehr in der ursprünglichen Reihenfolge vor. Ist nur ein Schritt, um es evtl. schneller zu machen. Schau mal bitte, ob das so Probleme macht und wie es mit dem Bsp. oben aussieht. Würde dann noch eine Änderung hinter herschieben. VG
Option Explicit
Sub baum()
Dim letzter
Dim i As Long
Dim j As Long
Dim spalte As Long
Dim ende As Boolean
Dim vorher
Dim lange As Long
Dim weite As Long
Dim datensplit
Dim anztrenn
Dim k As Long
Dim wert
Dim wert2
Dim liste()
ReDim liste(0)
liste(0) = 0
lange = 6
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
ActiveSheet.Range(Columns(3), Columns(ActiveSheet.Columns.Count)).ClearContents
ActiveSheet.Range(Columns(3), Columns(ActiveSheet.Columns.Count)).NumberFormat = "@"
letzter = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To letzter
If ActiveSheet.Cells(i, 1)  "" Then
'werte suchen
liste(0) = liste(0) + 2
ReDim Preserve liste(liste(0))
liste(1) = ActiveSheet.Cells(i, 1)
liste(2) = ActiveSheet.Cells(i, 2)
ende = False
If liste(2) = "" Then
liste(2) = liste(1)
liste(1) = ""
ende = True
End If
While ende = False
Set vorher = ActiveSheet.Columns(1).Find(Trim(liste(UBound(liste))), _
LookIn:=xlValues, Lookat:=xlWhole)
If Not vorher Is Nothing Then
If vorher.Offset(0, 1)  "" Then
liste(0) = liste(0) + 1
ReDim Preserve liste(liste(0))
liste(liste(0)) = Trim(vorher.Offset(0, 1))
Else
ende = True
End If
Else
ende = True
End If
Wend
'werte eintragen
spalte = 3
If liste(0) > 0 Then
For j = UBound(liste) To 1 Step -1
ActiveSheet.Cells(i, spalte) = Trim(liste(j))
spalte = spalte + 1
Next j
End If
If liste(0) > lange Then lange = liste(0)
ReDim liste(0)
liste(0) = 0
End If
Next i
'Auflistung sortieren
ActiveSheet.Range("A2:" & Chr(66 + lange + 1) & letzter).Select
ActiveSheet.Sort.SortFields.Clear
For i = 1 To lange + 1
ActiveSheet.Sort.SortFields.Add Key:=Range(Chr(66 + i) & "2:" & Chr(66 + i) & letzter), _
SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
Next i
With ActiveSheet.Sort
.SetRange ActiveSheet.Range("A2:" & Chr(66 + lange + 1) & letzter)
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
ActiveSheet.Cells(1, 1).Select
'der Teil für das gesplittet eintragen am Ende
For i = 2 To letzter
If ActiveSheet.Cells(i, 3)  ActiveSheet.Cells(i - 1, 3) Then
spalte = lange + 4
weite = ActiveSheet.Cells(i, Columns.Count).End(xlToLeft).Column
If weite > 2 Then
ActiveSheet.Cells(i, spalte) = CStr(Trim(ActiveSheet.Cells(i, 3)))
spalte = spalte + 1
For j = 4 To weite
wert = ActiveSheet.Cells(i, j)
wert2 = ActiveSheet.Cells(i, j - 1)
If InStr(1, wert, wert2, vbTextCompare) > 0 Then
ActiveSheet.Cells(i, spalte) = CStr(Mid(wert, Len(wert2) + 2, Len(wert)))
spalte = spalte + 1
Else
For k = 1 To Len(wert)
If InStr(1, Mid(wert2, 1, k), Mid(wert, 1, k), vbTextCompare) = 0 Then
Exit For
End If
Next k
If k = 1 Then
ActiveSheet.Cells(i, spalte) = CStr(Mid(wert, _
InStr(1, wert, "-", vbTextCompare) + 1, Len(wert)))
Else
ActiveSheet.Cells(i, spalte) = CStr(Mid(wert, k, Len(wert)))
End If
spalte = spalte + 1
End If
Next j
End If
End If
Next i
'####  Ende des Teiles zum splitten
ActiveSheet.Range(Columns(3), Columns(ActiveSheet.Columns.Count)).Columns.AutoFit
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub

AW: Zellen um übergeordnete Informationen erweitern
24.06.2016 10:23:29
Lukas
Guten Morgen!
Vielen Dank für den optimierten Vorabcode, Ich kann es jetzt erst durchlaufen lassen werde dann direkt Rückmeldung geben! Zu deiner Frage: Ja,es handelt sich um einen Baumaufbau! LG

AW: Zellen um übergeordnete Informationen erweitern
24.06.2016 10:32:47
Lukas
Guten Morgen!
Vielen Dank für deinen Vorabcode, ich werde ihn jetzt testen!
Genau richtig, es handelt sich um einen "Baum", der dann ab der 2ten Ebene (Hi-12 ja immer Wurzel) beginnt zu teilen (also auch 12-34_3 oder 12-20_2) und dann analog zu deinem Beispiel!
VG und Danke!

AW: Zellen um übergeordnete Informationen erweitern
25.06.2016 00:37:07
Matthias
Moin! Also hier jetzt mal eine Version, die wieder alle gesplitteten Daten einträgt. Ich habe mal versucht die Zugriffe auf das Tabellenblatt so gering wie möglich zu halten (kostet am meisten Zeit). Ein paar Möglichkeiten würde es noch geben. Würde dazu die Pfade aus dem ersten Teil komplett in den Zwischenspeicher packen und dort vergleichen. Das wird aber ziemlich groß ( um die 15 MB ) und ich weiß nicht, ob das für das System so günstig ist. Würde es deshalb erstmal so wie unten lösen. Habe den Code unten mal todesmutig auf einem Datensatz von 15500 Pfaden getestet. Waren jetzt nicht so komplizierte Pfade (da fehlt mir die Datenmenge) aber doch schon nen Haufen. Die Rechenzeit war fast exakt 10 Minuten. Wäre ja schonmal eine Steigerung zu 4 Stunden und Programmabbruch. Bitte mal wieder testen und melden, was passiert ist. Wenn wir eine Lauffähige Version, die deinen Vorstellungen entspricht, bastel ich auch eine auskommentierte, damit du nachvollziehen kannst, was der Code macht und ihn ggf. später mal anpassen kannst. VG
Option Explicit
Sub baum()
Dim letzter
Dim i As Long
Dim j As Long
Dim spalte As Long
Dim ende As Boolean
Dim vorher
Dim lange As Long
Dim weite As Long
Dim datensplit
Dim anztrenn
Dim k As Long
Dim wert
Dim wert2
Dim liste()
ReDim liste(0)
liste(0) = 0
lange = 1
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
ActiveSheet.Range(Columns(3), Columns(ActiveSheet.Columns.Count)).ClearContents
ActiveSheet.Range(Columns(3), Columns(ActiveSheet.Columns.Count)).NumberFormat = "@"
ActiveSheet.Cells(1, 3) = Time
letzter = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To letzter
If ActiveSheet.Cells(i, 1)  "" Then
'werte suchen
liste(0) = liste(0) + 2
ReDim Preserve liste(liste(0))
liste(1) = ActiveSheet.Cells(i, 1)
liste(2) = ActiveSheet.Cells(i, 2)
ende = False
If liste(2) = "" Then
liste(2) = liste(1)
liste(1) = ""
ende = True
End If
While ende = False
Set vorher = ActiveSheet.Columns(1).Find(Trim(liste(UBound(liste))), _
LookIn:=xlValues, Lookat:=xlWhole)
If Not vorher Is Nothing Then
If vorher.Offset(0, 1)  "" Then
liste(0) = liste(0) + 1
ReDim Preserve liste(liste(0))
liste(liste(0)) = Trim(vorher.Offset(0, 1))
Else
ende = True
End If
Else
ende = True
End If
Wend
'werte eintragen
spalte = 3
If liste(0) > 0 Then
For j = UBound(liste) To 1 Step -1
ActiveSheet.Cells(i, spalte) = Trim(liste(j))
spalte = spalte + 1
Next j
End If
If liste(0) > lange Then lange = liste(0)
ReDim liste(0)
liste(0) = 0
End If
Next i
'Auflistung sortieren
ActiveSheet.Range("A2:" & Chr(66 + lange + 1) & letzter).Select
ActiveSheet.Sort.SortFields.Clear
For i = 1 To lange + 1
ActiveSheet.Sort.SortFields.Add Key:=Range(Chr(66 + i) & "2:" & Chr(66 + i) & _
letzter), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
Next i
With ActiveSheet.Sort
.SetRange ActiveSheet.Range("A2:" & Chr(66 + lange + 1) & letzter)
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
ActiveSheet.Cells(1, 1).Select
'der Teil für das gesplittet eintragen am Ende
spalte = lange + 4
For i = 2 To letzter
If ActiveSheet.Cells(i, 3)  "" Then
If (ActiveSheet.Cells(i, 3)  ActiveSheet.Cells(i - 1, 3) Or _
ActiveSheet.Cells(i, Columns.Count).End(xlToLeft).Column > weite) Then
weite = ActiveSheet.Cells(i, Columns.Count).End(xlToLeft).Column
Dim startliste
Dim zielliste
startliste = ActiveSheet.Range(ActiveSheet.Cells(i, 3), ActiveSheet.Cells(i, weite))
zielliste = startliste
If weite > 2 Then
zielliste(1, 1) = CStr(Trim(startliste(1, 1)))
For j = 2 To weite - 2
wert = startliste(1, j)  '   aktueller Wert
wert2 = startliste(1, j - 1) ' der Vorgänger
If InStr(1, wert, wert2, vbTextCompare) > 0 Then
zielliste(1, j) = CStr(Mid(wert, Len(wert2) + 2, Len(wert)))
Else
Dim test
Dim anzabs
test = Split(wert, "-")
anzabs = 0
For k = 0 To UBound(test)
If InStr(1, wert2, test(k), vbTextCompare) = 0 Then
Exit For
End If
anzabs = anzabs + Len(test(k)) + 1
Next k
If anzabs = 0 Then
zielliste(1, j) = CStr(Mid(wert, InStr(1, wert, "-", _
vbTextCompare) + 1, Len(wert)))
Else
zielliste(1, j) = CStr(Mid(wert, anzabs + 1, Len(wert)))
End If
End If
Next j
ActiveSheet.Range(Cells(i, spalte), Cells(i, spalte + weite - 3)) = zielliste
End If
Else
ReDim Preserve zielliste(1 To 1, UBound(zielliste, 2) - 1)
weite = weite - 1
ActiveSheet.Range(Cells(i, spalte), Cells(i, spalte + weite - 3)) = zielliste
End If
End If
Next i
'####  Ende des Teiles zum splitten
ActiveSheet.Cells(1, 4) = Time
ActiveSheet.Range(Columns(3), Columns(ActiveSheet.Columns.Count)).Columns.AutoFit
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
End Sub

AW: Zellen um übergeordnete Informationen erweitern
26.06.2016 13:36:06
Matthias
Hallo! Und hier mal noch eine Version, die noch weniger auf das Blatt zugreift, dafür mehr im Speicher arbeitet. Hatte erst Befürchtungen, dass es das System lahm legt aber läuft trotzdem. Hat aber kaum noch Zeitersparnis gebracht. Achja, der Code war unter Office2010 geschrieben. Bei einer früheren Version geht das mit dem sortieren so nicht. Kannst das sortieren aber auch rausnehmen, der Code (sollte :-) ) trotzdem durchlaufen. Dauert dann ggf. nen Ticken länger. VG

Option Explicit
Sub baum()
Dim letzter
Dim i As Long
Dim j As Long
Dim spalte As Long
Dim ende As Boolean
Dim vorher
Dim lange As Long
Dim weite As Long
Dim datensplit
Dim anztrenn
Dim k As Long
Dim wert
Dim wert2
Dim daten   'für alle daten
Dim daten2
Dim anzdat
Dim liste()
Dim anfang
Dim weiteakt
Dim weitetmp
ReDim liste(2)
lange = 1
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
ActiveSheet.Range(Columns(3), Columns(ActiveSheet.Columns.Count)).ClearContents
ActiveSheet.Range(Columns(3), Columns(ActiveSheet.Columns.Count)).NumberFormat = "@"
letzter = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
ReDim daten(1 To letzter, 1 To 2) 'das Datenfeld für alles
daten(1, 1) = Time
For i = 2 To letzter
anzdat = 2
If ActiveSheet.Cells(i, 1)  "" Then
'werte suchen
liste(1) = ActiveSheet.Cells(i, 1)
liste(2) = ActiveSheet.Cells(i, 2)
ende = False
If liste(2) = "" Then
liste(2) = liste(1)
liste(1) = ""
ende = True
End If
While ende = False
Set vorher = ActiveSheet.Columns(1).Find(Trim(liste(anzdat)), _
LookIn:=xlValues, Lookat:=xlWhole)
If Not vorher Is Nothing Then
If vorher.Offset(0, 1)  "" Then
anzdat = anzdat + 1
If UBound(daten, 2)  "" Then
daten(i, anfang) = Trim(liste(j))
anfang = anfang + 1
End If
Next j
If anzdat > lange Then lange = anzdat
Erase liste
ReDim liste(lange)
End If
Next i
'alles im Speicher jetzt eintragen
ActiveSheet.Range(ActiveSheet.Cells(1, 3), ActiveSheet.Cells(letzter, lange + 2)) = daten
'Auflistung sortieren
ActiveSheet.Range("A2:" & Chr(66 + lange + 1) & letzter).Select
ActiveSheet.Sort.SortFields.Clear
For i = 1 To lange + 1
ActiveSheet.Sort.SortFields.Add Key:=Range(Chr(66 + i) & "2:" & Chr(66 + i) & _
letzter), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
Next i
With ActiveSheet.Sort
.SetRange ActiveSheet.Range("A2:" & Chr(66 + lange + 1) & letzter)
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
ActiveSheet.Cells(1, 1).Select
'der Teil für das gesplittet eintragen am Ende
daten2 = daten
weitetmp = 0
For i = 2 To letzter - 1
Debug.Print i
If daten(i, 1)  "" Then
weiteakt = 1
For j = 2 To lange
If daten(i, j)  "" Then
weiteakt = weiteakt + 1
Else
Exit For
End If
Next j
If i = 2 Or (daten(i, 1)  daten(i - 1, 1) Or weiteakt > weitetmp) Then
weitetmp = weiteakt
If weitetmp > 1 Then
'zielliste(1, 1) = CStr(Trim(startliste(1, 1)))
For j = 2 To weitetmp
wert = daten(i, j)  '   aktueller Wert
wert2 = daten(i, j - 1) ' der Vorgänger
If InStr(1, wert, wert2, vbTextCompare) > 0 Then
daten2(i, j) = CStr(Mid(wert, Len(wert2) + 2, Len(wert)))
Else
Dim test
Dim anzabs
test = Split(wert, "-")
anzabs = 0
For k = 0 To UBound(test)
If InStr(1, wert2, test(k), vbTextCompare) = 0 Then
Exit For
End If
anzabs = anzabs + Len(test(k)) + 1
Next k
If anzabs = 0 Then
daten2(i, j) = CStr(Mid(wert, InStr(1, wert, "-", _
vbTextCompare) + 1, Len(wert)))
Else
daten2(i, j) = CStr(Mid(wert, anzabs + 1, Len(wert)))
End If
End If
Next j
End If
Else
weitetmp = weiteakt
For j = 2 To weitetmp
daten2(i, j) = daten2(i - 1, j)
Next j
End If
End If
Next i
'eintragen
ActiveSheet.Range(ActiveSheet.Cells(1, lange + 4), ActiveSheet.Cells(letzter, _
lange + 3 + lange)) = daten2
'####  Ende des Teiles zum splitten
ActiveSheet.Cells(1, 4) = Time
ActiveSheet.Range(Columns(3), Columns(ActiveSheet.Columns.Count)).Columns.AutoFit
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
End Sub

AW: Zellen um übergeordnete Informationen erweitern
21.06.2016 11:49:31
Lukas
Was ich noch festgestellt habe, es gibt auch Strukturrisse, soll heißen, dass es Datensätze gibt, die keine durchgehende Hierarchie haben.
Edit: Ich denke, die mit Hierarchiriss (also die nicht bis HI-12 gehen) würde ich im Code komplett ignorieren, sodass er durchlaufen kann. Also nicht nur diejenigen der Spalte A, wo kein Bezug in B steht, denn es könnte ja sein dass dieser in A wieder als übergeordneter fungiert und dann würde ja wieder ein Fehler kommen wenn er nicht bis zur Wurzel aufschlüsseln kann!
VG

AW: Zellen um übergeordnete Informationen erweitern
21.06.2016 10:13:52
Matthias
ich glaube bei der Variante hatte ich mich bei der Zuordnung verhauen - also was an welcher Stelle angehängt war. Probiere mal so. (falls alle Beispiele nicht passen, bitte nochmal ein Bild mit einer Beispielausgangsdatei posten). VG
Option Explicit
Sub baum()
Dim letzter
Dim i As Long
Dim j As Long
Dim spalte As Long
Dim ende As Boolean
Dim vorher
Dim liste()
ReDim liste(0)
liste(0) = 0
letzter = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
'i geht ab erstem Eintrag los
For i = 2 To letzter
'werte suchen
liste(0) = liste(0) + 2
ReDim Preserve liste(liste(0))
liste(1) = ActiveSheet.Cells(i, 1)
liste(2) = ActiveSheet.Cells(i, 2)
ende = False
While ende = False
Set vorher = ActiveSheet.Columns(1).Find(liste(UBound(liste)), LookIn:=xlValues)
If Not vorher Is Nothing Then
liste(0) = liste(0) + 1
ReDim Preserve liste(liste(0))
liste(liste(0)) = vorher.Offset(0, 1)
Else
ende = True
End If
Wend
'werte eintragen
spalte = 3
If liste(0) > 0 Then
For j = UBound(liste) To 1 Step -1
ActiveSheet.Cells(i, spalte) = liste(j)
spalte = spalte + 1
Next j
End If
'gesplittet eintragen, dazwischen mind. 1 freie Spalte,
'könnte ggf. weit hinten liegen
'alternativ die folgende Zeile durch spalte = spalte + 1 ersetzen
spalte = letzter + 2
If liste(0) > 0 Then
ActiveSheet.Cells(i, spalte) = liste(UBound(liste))
spalte = spalte + 1
For j = UBound(liste) - 1 To 1 Step -1
ActiveSheet.Cells(i, spalte) = Replace(liste(j), liste(j + 1) & "-", "")
spalte = spalte + 1
Next j
End If
ReDim liste(0)
Next i
End Sub

AW: Zellen um übergeordnete Informationen erweitern
21.06.2016 10:07:42
Matthias
Hier mal noch eine Version, die es am Ende sortiert anzeigen sollte. Hoffe es zumindest. :-)
Option Explicit
Sub baum()
Dim letzter
Dim i As Long
Dim j As Long
Dim spalte As Long
Dim ende As Boolean
Dim vorher
Dim lange As Long
Dim weite As Long
Dim liste()
ReDim liste(0)
liste(0) = 0
lange = 6
letzter = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
'i geht ab erstem Eintrag los
For i = 2 To letzter
'werte suchen
liste(0) = liste(0) + 2
ReDim Preserve liste(liste(0))
liste(1) = ActiveSheet.Cells(i, 1)
liste(2) = ActiveSheet.Cells(i, 2)
ende = False
While ende = False
Set vorher = ActiveSheet.Columns(1).Find(liste(UBound(liste)), LookIn:=xlValues)
If Not vorher Is Nothing Then
liste(0) = liste(0) + 1
ReDim Preserve liste(liste(0))
liste(liste(0)) = vorher.Offset(0, 1)
Else
If liste(0) > lange Then lange = liste(0)
ende = True
End If
Wend
'werte eintragen
spalte = 3
If liste(0) > 0 Then
For j = UBound(liste) To 1 Step -1
ActiveSheet.Cells(i, spalte) = liste(j)
spalte = spalte + 1
Next j
End If
ReDim liste(0)
Next i
For i = 2 To letzter
spalte = lange + 2
weite = ActiveSheet.Cells(i, Columns.Count).End(xlToLeft).Column
ActiveSheet.Cells(i, spalte) = ActiveSheet.Cells(i, 3)
spalte = spalte + 1
For j = 4 To weite
ActiveSheet.Cells(i, spalte) = _
Replace(ActiveSheet.Cells(i, j), ActiveSheet.Cells(i, j - 1) & "-", "")
spalte = spalte + 1
Next j
Next i
End Sub

299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige