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

Umwandlung einer Tabelle

Umwandlung einer Tabelle
Robert74
Hallo liebe Community,
ich habe eine letzte (wahrscheinlich recht simple) Aufgabenstellung die ich lösen müsste, aber ich hab leider keine Idee wie ich anfagen soll.....
Nachdem mir bereits sehr geholfen wurde, dachte ich dass ich nochmals mein Glück hier im Forum suche :)
Ich hab hier eine Datei im Anhang die ein Muster ist wie meine Tabelle aussieht (Obeerer Teil) und wie sie aussehen soll (unterer teil). Die neue Tabelle sollte optimaller Weise in einem neuen Arbeitsblatt erstellt werden.
https://www.herber.de/bbs/user/79881.xls
Ich habe leider nicht viel VBA erfahrung und weiss nciht wie ich das Problem beheben könnte...
Ich hoffe es fühlt sich jemand Angesprochen und nimmt sich meinem Problem an.
Ich freu mich über jeden der Versucht mir zu helfen und danke euch bereits im Vorraus für eure Zeit.
Gruß Robert

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Umwandlung einer Tabelle
21.04.2012 00:41:05
fcs
Hallo Robert,
das Grundgerüst ist ähnlich deiner letzten Umsortierung. Allerdings ist es hier viel komplizierter, da jede Menge Prüfungen eingebaut werden müssen, um die "x" zu setzen und doppelte Einträge zu vermeiden.
In der Textdatei findest du das entsprechend aufbereitete Makro.
https://www.herber.de/bbs/user/79889.txt
Im Makro war noch eine kleine Ungenaugkeit drin.
Zeile
    For lngOrig = 2 To .Cells(.Rows.Count, SpalteLeiter).End(xlUp).Row
ändern in
For lngOrig = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
Falls die letzte Zeile zufällig keinen Leiter hat, wird diese sonst nicht mit erfasst.
Gruß
Franz
Anzeige
Umorganisation einer Tabelle
21.04.2012 07:12:25
Erich
Hi Robert,
hier noch eine Variante zum Ausprobieren:

Option Explicit
Sub Umorg()
Dim lngQ As Long, arrQ, arS, qq As Long, arrW(), strZ As String
Dim ii As Long, zz As Long, nn As Long, cc As Long, arrZ(), arrN() As Long
With Sheets("Tabelle1")
lngQ = .Cells(.Rows.Count, 1).End(xlUp).Row
arrQ = .Cells(1, 1).Resize(lngQ, 8)                ' Quelldaten
End With
ReDim arrW(9, 1 To 2 * lngQ)                          ' Array für Werte
ReDim arrN(1, 1 To 2 * lngQ)                          ' Array für Nachfolgerkette
For qq = 2 To lngQ                                    ' Schleife über Quellzeilen
For nn = 6 To 8                                    ' Schleife über Funktionen
arS = Split(arrQ(qq, nn), ", ")                 ' Namen extrahieren
For cc = 0 To UBound(arS)                       ' Schleife über Namen
' Key zum Vergleich
strZ = arS(cc) & "#" & arrQ(qq, 2) & "#" & arrQ(qq, 3) _
& "#" & arrQ(qq, 4) & "#" & arrQ(qq, 5) & "#" & arrQ(qq, 1)
For ii = 1 To zz
If strZ = arrW(0, ii) Then                ' wenn Key schon da
arrW(nn - 4, ii) = "x"                    ' nur neue Funktion
Exit For
End If
Next ii
If ii > zz Then                              ' neuer Key
zz = zz + 1                               ' neue Zeile
If zz > UBound(arrW, 2) Then              ' evtl. Arrays vergrößern
ReDim Preserve arrW(9, 1 To 2 * UBound(arrW, 2))
ReDim Preserve arrN(1, 1 To UBound(arrW, 2))
End If
arrW(1, zz) = arS(cc)                     ' Werte eintragen
arrW(nn - 4, zz) = "x"                       ' Funktion
arrW(5, zz) = arrQ(qq, 2)
arrW(6, zz) = arrQ(qq, 3)
arrW(7, zz) = arrQ(qq, 4)
arrW(8, zz) = arrQ(qq, 5)
arrW(9, zz) = arrQ(qq, 1)
arrW(0, zz) = arrW(1, zz) & "#" & arrW(5, zz) & "#" & arrW(6, zz) _
& "#" & arrW(7, zz) & "#" & arrW(8, zz) & "#" & arrW(9, zz)
For ii = 1 To zz - 1
If arS(cc) = arrW(1, ii) Then
If arrN(1, ii) = 0 Then       ' wenn Spieler schon da?
arrN(1, ii) = zz              ' merke Nachfolgerzeile
arrN(0, zz) = 1               ' merke "ist Nachfolger"
Exit For
End If
End If
Next ii
End If
Next cc
Next nn
Next qq
ReDim arrZ(1 To zz, 1 To 9)                        ' Array für Ausgabe im Blatt
nn = 0
For qq = 1 To zz
If arrN(0, qq) = 0 Then                         ' wenn "ist kein Nachfolger"
nn = nn + 1                                     ' gib Satz aus
For cc = 1 To 9
arrZ(nn, cc) = arrW(cc, qq)
Next cc
ii = arrN(1, qq)                       ' 1. Nachfolger
While ii > 0                           ' Schleife über die Nachfolger
nn = nn + 1                            ' gib Satz aus
For cc = 2 To 9
arrZ(nn, cc) = arrW(cc, ii)
Next cc
ii = arrN(1, ii)
Wend
End If
Next qq
With Sheets("Tabelle3")                ' Ausgabe im Blatt "Tabelle3" (wird gelöscht!)
.Cells.ClearContents
.Rows(1).HorizontalAlignment = xlCenter
.Columns("B:D").HorizontalAlignment = xlCenter
.Cells(1, 1).Resize(, 9) = _
Split("Name Arbeiter Polier Leiter Bereich Land Region Subregion Kreis")
.Cells(2, 1).Resize(zz, 9) = arrZ
End With
End Sub
Ist das Absicht, dass in deiner Beispielmappe einige "Scherze" enthalten sind?
(Da gibt es einen philipp,lahm mit Komma in der Mitte, gerd.müller kommt in deinem Ergebnis gar nicht vor,
die Groß-/Kleinschreibung wechselt.)
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich
Anzeige
Ausgabe in neues Blatt
21.04.2012 07:23:29
Erich
Hi Robert,
kleine Änderung am Ende - dann kommt das Ergebnis wie gewünscht in ein neues Blatt:

Next qq
' Ausgabe in neues Blatt
With ActiveWorkbook.Worksheets.Add(after:=ActiveWorkbook.Worksheets("Tabelle1"))
.Rows(1).HorizontalAlignment = xlCenter
.Columns("B:D").HorizontalAlignment = xlCenter
.Cells(1, 1).Resize(, 9) = _
Split("Name Arbeiter Polier Leiter Bereich Land Region Subregion Kreis")
.Cells(2, 1).Resize(zz, 9) = arrZ
.Columns("A:I").AutoFit
End With
End Sub
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich
Sortieren ohne Sort
22.04.2012 08:45:27
Erich
Hi Robert,
hier noch eine Variante, etwas aufgeräumter und universeller einsetzbar:

Option Explicit
Sub UmSort()
Dim lngQ As Long, arrQ, arrW(), arrK() As String, qq As Long, nn As Long
Dim arS, cc As Long, strK As String, ii As Long, zz As Long, arrZ()
With Sheets("Tabelle1")
lngQ = .Cells(.Rows.Count, 1).End(xlUp).Row
arrQ = .Cells(1, 1).Resize(lngQ, 8)                ' Quelldaten
End With
ReDim arrW(1 To 9, 1 To lngQ)                         ' Array für Werte
ReDim arrK(1 To lngQ)                                 ' Array für Keys
For qq = 2 To lngQ                                    ' Schleife über Quellzeilen
For nn = 6 To 8                                    ' Schleife über Funktionen
arS = Split(arrQ(qq, nn), ", ")                 ' Namen extrahieren
For cc = 0 To UBound(arS)                       ' Schleife über Namen
' Key zum Vergleich
strK = arS(cc) & "#" & arrQ(qq, 1) & "#" & arrQ(qq, 2) & "#" & _
arrQ(qq, 3) & "#" & arrQ(qq, 4) & "#" & arrQ(qq, 5)
For ii = 1 To zz
If strK = arrK(ii) Then                   ' wenn Key schon da
arrW(nn - 4, ii) = "x"                    ' nur neue Funktion
Exit For
End If
Next ii
If ii > zz Then                              ' neuer Key
zz = zz + 1                               ' neue Zeile
If zz > UBound(arrW, 2) Then              ' evtl. Arrays vergrößern
ReDim Preserve arrW(1 To 9, 1 To 2 * UBound(arrW, 2))
ReDim Preserve arrK(1 To UBound(arrW, 2))
End If
arrK(zz) = strK                           ' Key merken
arrW(1, zz) = arS(cc)                     ' Werte eintragen
arrW(nn - 4, zz) = "x"                       ' Funktion
arrW(5, zz) = arrQ(qq, 2)
arrW(6, zz) = arrQ(qq, 3)
arrW(7, zz) = arrQ(qq, 4)
arrW(8, zz) = arrQ(qq, 5)
arrW(9, zz) = arrQ(qq, 1)
End If
Next cc
Next nn
Next qq
GrupSort arrW, arrZ, 1, 0, 1
' Ausgabe in neues Blatt
With ActiveWorkbook.Worksheets.Add(after:=ActiveWorkbook.Worksheets("Tabelle1"))
.Rows(1).HorizontalAlignment = xlCenter
.Columns("B:D").HorizontalAlignment = xlCenter
.Cells(1, 1).Resize(, 9) = _
Split("Name Arbeiter Polier Leiter Bereich Land Region Subregion Kreis")
.Cells(2, 1).Resize(zz, 9) = arrZ
.Columns("A:I").AutoFit
End With
End Sub
Sub GrupSort(arrA(), arrB(), lngK As Long, blnDup As Boolean, blnTra As Boolean)
'         Quelle  Ziel    Key-Zeile     mehrf. Ausgabe?    Transponieren?
Dim arrN() As Long, nn As Long, qq As Long, cc As Long, ii As Long
ReDim arrN(LBound(arrA, 2) To UBound(arrA, 2), 1)
ReDim arrB(LBound(arrA, 1 - blnTra) To UBound(arrA, 1 - blnTra), _
LBound(arrA, 2 + blnTra) To UBound(arrA, 2 + blnTra))
For qq = LBound(arrA, 2) To UBound(arrA, 2)
For ii = qq - 1 To 1 Step -1
If arrA(lngK, ii) = arrA(lngK, qq) Then ' wenn Key schon da
arrN(ii, 1) = qq                          ' merke Nachfolgerzeile
arrN(qq, 0) = 1                           ' merke "ist Nachfolger"
Exit For
End If
Next ii
Next qq
For qq = LBound(arrA, 2) To UBound(arrA, 2)
If arrN(qq, 0) = 0 Then                      ' wenn "ist kein Nachfolger"
nn = nn + 1                                  ' gib Satz aus
For cc = LBound(arrA) To UBound(arrA)
If blnTra Then arrB(nn, cc) = arrA(cc, qq) Else arrB(cc, nn) = arrA(cc, qq)
Next cc
ii = arrN(qq, 1)                          ' 1. Nachfolger
While ii > 0                              ' Schleife über die Nachfolger
nn = nn + 1                               ' gib Satz aus
For cc = LBound(arrA) To UBound(arrA)
If blnDup Or cc  lngK Then
If blnTra Then arrB(nn, cc) = arrA(cc, ii) Else arrB(cc, nn) = arrA(cc, ii)
End If
Next cc
ii = arrN(ii, 1)
Wend
End If
Next qq
End Sub
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich
Anzeige
AW: Umwandlung einer Tabelle
23.04.2012 08:54:50
Robert74
Hallo,
tut mir leid das ich mich jetzt erst melde, aber ich war über das Wochenende leider verhindert.
Ich muss sagen eure beiden Makros funktionieren einwandfrei!!
Also vielen dank franz das du dich wieder "erbamt" hast mir zu helfen :)
und Erich auch an dich ein ganz großes Dankeschön das deine Zeit in meine Aufgabe investiert hast und mir somit sehr zu helfen. TOP!
In diesem Sinne eine schöne Woche und leibe Grüße Robert
AW: Umwandlung einer Tabelle
23.04.2012 10:48:19
Robert74
Ich habe doch noch eine kleine Frage bezüglich dem VBA Code von Erich.
1. In meiner Ausgangstabelle hab ich nicht alle Namen konsequent mit leerzeichen getrennt sprich es kann sein das einmal: max.mustermann, hans.maier dasteht oder max.mustermann,hans.maier also ohne Leerzeichen hinter dem Komma. Ich bekomm es zwar hin dass nach dem Komma der Name gesplittet wird und nich nach blanks. Jedoch steht in meiner Neue Zeile der Name immer mit einem Leerzeichen Vornweg.... so können 2 eigentlich gleiche Namen nicht gematched werden da einer ein blank vorne dran stehen hat.
2. Ich habe meine Muster Datei wohl schlecht gewählt da diese nur 8 Zeilen hatte und meine Original Datei 11. Ich dachte das sei nicht weiter schlimm, da ich die Bezüge einfach manuell ändern könnte, aber ich hab die reihen neu sotier an der stelle
arrW(5, zz) = arrQ(qq, 2)
arrW(6, zz) = arrQ(qq, 3)
arrW(7, zz) = arrQ(qq, 4)
arrW(8, zz) = arrQ(qq, 5)
arrW(9, zz) = arrQ(qq, 1)
was recht simple war, da ich fehlende einfach hinzugefügt habe.
Was nicht passt ist das auf den neuen Tabellenblatt die "X" in die spalten 2-4 gesetzt werden. Wie ich den Bezug dafür ändern kann war mir leider nicht ersichtlich.... Ich hab zwar meine Schleife für die Funktion auf 9-11 geändert, aber ich bekomm ich die vorderen Spalte nach Name keine "X" bzw. Ich bekomm nur ein X bei Leiter und/oder Polier wenn dieser auch Arbeiter ist.
Ich hoffe meine Fragen sind halbwegs verständlich. Würde mich sehr freuen wenn man mir helfen könnte.
Bis dahinn bastel ich noch ein wenig herum, evtl komm ich noch ein Stück weiter
Gruß Robert
Anzeige
teilweise erledigt. BeiSpielMappe?
23.04.2012 13:14:25
Erich
Hi Robert,
das mit dem nur manchmal vorhandenen Leerzeichen bei der Namenstrennung ist wohl unten erledigt.
Getrennt wird nur noch nach dem Komma, die Leerzeichen bleiben bei den Namen stehen,
sie werden später per Trim() eliminiert (an 2 Stellen).
Bei den zusätzlichen Zeilen/Spalten stellt sich die Frage, ob deren Werte nicht auch in den
Vergleichskey strK einfließen müssten.
Es ist ja so, dass nur dann keine neue Zeile erzeugt wird, wenn der Name und alle (bisher 5) Werte gleich sind.
Gut wäre eine neue BeiSpielMappe, mit dem gewünschten Ergebnis.
Hier schon mal der Code mit neuer Namenstrennung:

Option Explicit
Sub UmSort()
Dim lngQ As Long, arrQ, arrW(), arrK() As String, qq As Long, nn As Long
Dim arS, cc As Long, strK As String, ii As Long, zz As Long, arrZ()
With Sheets("Tabelle1")
lngQ = .Cells(.Rows.Count, 1).End(xlUp).Row
arrQ = .Cells(1, 1).Resize(lngQ, 8)                ' Quelldaten
End With
ReDim arrW(1 To 9, 1 To lngQ)                         ' Array für Werte
ReDim arrK(1 To lngQ)                                 ' Array für Keys
For qq = 2 To lngQ                                    ' Schleife über Quellzeilen
For nn = 6 To 8                                    ' Schleife über Funktionen
arS = Split(arrQ(qq, nn), ",")                  ' Namen extrahieren
For cc = 0 To UBound(arS)                       ' Schleife über Namen
' Key zum Vergleich
strK = Trim$(arS(cc)) & "#" & arrQ(qq, 1) & "#" & arrQ(qq, 2) & _
"#" & arrQ(qq, 3) & "#" & arrQ(qq, 4) & "#" & arrQ(qq, 5)
For ii = 1 To zz
If strK = arrK(ii) Then                   ' wenn Key schon da
arrW(nn - 4, ii) = "x"                    ' nur neue Funktion
Exit For
End If
Next ii
If ii > zz Then                              ' neuer Key
zz = zz + 1                               ' neue Zeile
If zz > UBound(arrW, 2) Then              ' evtl. Arrays vergrößern
ReDim Preserve arrW(1 To 9, 1 To 2 * UBound(arrW, 2))
ReDim Preserve arrK(1 To UBound(arrW, 2))
End If
arrK(zz) = strK                           ' Key merken
arrW(1, zz) = Trim$(arS(cc))              ' Werte eintragen
arrW(nn - 4, zz) = "x"                       ' Funktion
arrW(5, zz) = arrQ(qq, 2)
arrW(6, zz) = arrQ(qq, 3)
arrW(7, zz) = arrQ(qq, 4)
arrW(8, zz) = arrQ(qq, 5)
arrW(9, zz) = arrQ(qq, 1)
End If
Next cc
Next nn
Next qq
GrupSort arrW, arrZ, 1, 0, 1
' Ausgabe in neues Blatt
With ActiveWorkbook.Worksheets.Add(after:=ActiveWorkbook.Worksheets("Tabelle1"))
.Rows(1).HorizontalAlignment = xlCenter
.Columns("B:D").HorizontalAlignment = xlCenter
.Cells(1, 1).Resize(, 9) = _
Split("Name Arbeiter Polier Leiter Bereich Land Region Subregion Kreis")
.Cells(2, 1).Resize(zz, 9) = arrZ
.Columns("A:I").AutoFit
End With
End Sub
Sub GrupSort(arrA(), arrB(), lngK As Long, blnDup As Boolean, blnTra As Boolean)
'         Quelle  Ziel    Key-Zeile     mehrf. Ausgabe?    Transponieren?
Dim lngV As Long, lngB As Long, arrZ() As Long, arrN() As Boolean
Dim nn As Long, qq As Long, cc As Long, ii As Long
lngV = LBound(arrA, 2)
lngB = UBound(arrA, 2)
ReDim arrZ(lngV To lngB)
ReDim arrN(lngV To lngB)
ReDim arrB(LBound(arrA, 1 - blnTra) To UBound(arrA, 1 - blnTra), _
LBound(arrA, 2 + blnTra) To UBound(arrA, 2 + blnTra))
For qq = lngV To lngB
For ii = qq - 1 To 1 Step -1
If arrA(lngK, ii) = arrA(lngK, qq) Then   ' wenn Key schon da
arrZ(ii) = qq                             ' merke Nachfolgerzeile
arrN(qq) = True                           ' merke "ist Nachfolger"
Exit For
End If
Next ii
Next qq
For qq = lngV To lngB
If Not arrN(qq) Then                         ' wenn "ist kein Nachfolger"
nn = nn + 1                                  ' gib Satz aus
For cc = LBound(arrA) To UBound(arrA)
If blnTra Then arrB(nn, cc) = arrA(cc, qq) Else arrB(cc, nn) = arrA(cc, qq)
Next cc
ii = arrZ(qq)                             ' 1. Nachfolger
While ii > 0                              ' Schleife über die Nachfolger
nn = nn + 1                               ' gib Satz aus
For cc = LBound(arrA) To UBound(arrA)
If blnDup Or cc  lngK Then
If blnTra Then arrB(nn, cc) = arrA(cc, ii) Else arrB(cc, nn) = arrA(cc, ii)
End If
Next cc
ii = arrZ(ii)
Wend
End If
Next qq
End Sub
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich
Anzeige
AW: teilweise erledigt. BeiSpielMappe?
23.04.2012 14:19:14
Robert74
Hi Erich,
danke für deine schnelle Antwort.
Meine 2 Fragen haben sich mittlerweile geklärt. Was die trennung von den Namen angeht hab ich lediglich bei: a rS = Split(arrQ(qq, nn), ",") ' Namen extrahieren vor das 2. Anführungszeichen einen blank eingeführt, sieht jetzt so aus : ), ", ") und hab den LTrim Befehl mit in die Schleife gebaut und eschon passts.
Jo und die 2. frage hat isch auch erledeigt ich hab die Zeile übersehen
arrW(nn - 4, zz) = "x" ' Funktion
dort hab ich die -4 durch die -7 ersetzt so wie ich das oben schon gemacht habe und voila es funktioniert :) vielen dank noch einmal für deine Mühen ich weiss es sehr zu schätzen das du /ihr euch die Zeit nehmt für mein Problem.
Gruß Robert
Anzeige
AW: teilweise erledigt. BeiSpielMappe?
23.04.2012 14:19:17
Robert74
Hi Erich,
danke für deine schnelle Antwort.
Meine 2 Fragen haben sich mittlerweile geklärt. Was die trennung von den Namen angeht hab ich lediglich bei: a rS = Split(arrQ(qq, nn), ",") ' Namen extrahieren vor das 2. Anführungszeichen einen blank eingeführt, sieht jetzt so aus : ), ", ") und hab den LTrim Befehl mit in die Schleife gebaut und eschon passts.
Jo und die 2. frage hat isch auch erledeigt ich hab die Zeile übersehen
arrW(nn - 4, zz) = "x" ' Funktion
dort hab ich die -4 durch die -7 ersetzt so wie ich das oben schon gemacht habe und voila es funktioniert :) vielen dank noch einmal für deine Mühen ich weiss es sehr zu schätzen das du /ihr euch die Zeit nehmt für mein Problem.
Gruß Robert
Anzeige
Danke für deine Rückmeldung, prima! (owT)
23.04.2012 15:20:36
Erich
ohne weiteren Text

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige