Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
972to976
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
972to976
972to976
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Tabellendaten verschieben

Tabellendaten verschieben
08.05.2008 09:07:00
Rainer
Hallo,
ich möchte in einer Tabelle die Daten von zwei Spalten neu organisieren. Die Tabelle hat folgende Struktur:
A;[leer];Name1
A;Name2;[leer] ;
A;[leer];Name3
B;[leer];Name4
B;Name5;[leer]
A;Name6;[leer]
In der Spalte 1 befindet sich ein Zeichencode. Ansonsten befindet sich in den Spalten B und C pro Zeile jeweils ein Name in einer Zelle (entweder in B oder C). Die anderen Zellen sind leer.
Ich möchte nun mittels eines Makros spaltenweise die Namen nach oben verschieben. Dieses darf allerdings nur geschehen, wenn der Zeichencode in der Spalte 1 übereinstimmt. Außerdem darf die Reihenfolge in der Spalte 1 nicht verändert werden und die namen zwischen den Spalten dürfen nicht getauscht werden. Ein sortieren kommt also nicht in Frage.
Die Tabelle sollte nach der Bearbeitung folgendermaßen aussehen. Eventuelle Formatierungen müssen mit übernommen werden.
A;Name2;Name1
A;Name6;Name3
A;[leer];[leer]
B;Name5;Name4
B;[leer];[leer]
A;[leer];[leer]
Ziel ist es, die Namen möglichst weit Spaltenweise nach oben zu verschieben und zwar an die erste freie Stelle, an der der zeichencode übereinstimmt.
Da die Daten zusätzlich weiterbearbeitet werden müssen, kommt ein Ansatz mittels Matrixformeln nicht in Frage.
Ich wäre für eure Hilfe sehr dankbar.
Gruß
Rainer

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Tabellendaten verschieben
08.05.2008 11:49:00
Chris
Servus Rainer,
evtl. so wie in der Bsp-Datei?
Einfach mal auf Button "Sortieren" drücken!
https://www.herber.de/bbs/user/52227.xls
Gruß
Chris

AW: Tabellendaten verschieben
08.05.2008 13:53:00
Chris
Servus Rainer,
ich hatte einen kleinen Denkfehler beim Sortieren.
Hier die nachgebesserte Form, aber das Makro von Erich funktioniert auch einwandfrei.
Die Makros sind in Tabelle1.
Wenn du an den gleichen ort zurückschreiben willst, musst du das Makro "schreib" wie folgt abändern:

Sub schreib()
Dim t As Long
For t = LBound(ArrA()) To UBound(ArrA())
Cells(ArrZeileA(t), 1) = ArrA(t)
Cells(ArrZeileA(t), 2) = ArrSp1Neu(t)
Cells(ArrZeileA(t), 3) = ArrSp2neu(t)
Next t
For t = LBound(ArrB()) To UBound(ArrB())
Cells(ArrZeileB(t), 1) = ArrB(t)
Cells(ArrZeileB(t), 2) = ArrSp1NeuB(t)
Cells(ArrZeileB(t), 3) = ArrSp2neuB(t)
Next t
End Sub


https://www.herber.de/bbs/user/52230.xls
Gruß
Chris

Anzeige
AW: Tabellendaten verschieben
08.05.2008 12:04:03
Erich
Hallo Rainer,
probier mal

Option Explicit
Sub Reorg()
Dim lngZ As Long, zz As Long, strC As String, ss As Long, zL As Long
Const spH As Long = 5   ' Nummer der (leeren) Hilfsspalte - anpassen
' (hinter der letzten gefüllten Spalte)
lngZ = Cells(Rows.Count, 1).End(xlUp).Row
With Range(Cells(1, spH), Cells(lngZ, spH))
.Formula = "=ROW()"
.Value = .Value
End With
Range(Cells(1, 1), Cells(lngZ, spH)).Sort _
Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
For ss = 2 To 3
zz = 1
While zz 

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: Tabellendaten verschieben
08.05.2008 13:49:00
Rainer
Hallo Erich und Chris,
vielen Dank für eure Antworten. Ich habe zwar noch nicht so ganz verstanden, was da im Code so alles gemacht wird, aber es kommt der Sache schon recht nahe. Bei Chris Beispielmappe werden allerdings die Zellen z.T. nicht weit genug nach oben verschoben.
Bei Erichs Code hatte ich erst einige Programmabstürze, die wohl daran lagen, dass die Tabelle noch eine Überschrift hat und in der Zelle A1 nichts drinstand. Ich habe den Code einmal bei einer großen Tabelle ausprobiert und die Hilfsspalte nach hinten verlegt. Ich habe festgestellt, dass hier nicht mehr alles korrekt nach oben gezogen wird. Muss ich im Code noch zusätzlich etwas anpassen?
Wenn eine Zelle rot markiert ist wird die Markierung mit versetzt, die ursprüngliche Zelle bleibt auch rot. Kann ich das ändern?
Danke für eure tolle Hilfe!
Rainer

Anzeige
AW: Tabellendaten verschieben
08.05.2008 15:35:00
Erich
Hi Rainer,
hier eine neue Version, die eine Überschriftzeile voraussetzt.
Statt "Cells(zz, ss).ClearContents" steht da jetzt "Cells(zz, ss).Clear",
damit auch die Formate gelöscht werden.

Sub ReorgU()
Dim lngZ As Long, zz As Long, strC As String, ss As Long, zL As Long
Const spH As Long = 6   ' Nummer der (leeren) Hilfsspalte - anpassen
' (hinter der letzten gefüllten Spalte)
lngZ = Cells(Rows.Count, 1).End(xlUp).Row
With Range(Cells(1, spH), Cells(lngZ, spH))
.Formula = "=ROW()"
.Value = .Value
End With
Range(Cells(1, 1), Cells(lngZ, spH)).Sort _
Key1:=Range("A2"), Order1:=xlAscending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
For ss = 2 To 3
zz = 2
While zz 

Wenn du ein Beispiel hast, bei dem nicht alles oder nicht weit genug "hochgeschoben" wird,
wäre ich dir für einen Upload dankbar - evtl. mit anonymisierten Daten.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: Tabellendaten verschieben
08.05.2008 22:42:24
Rainer
Hallo,
danke für den aktualisierten Code. Ich habe einmal eine kleine Testdatei hochgeladen. Sieh dir bitte mal die gelb markierten Zellen an. Die werden m.E. nicht weit genug hochgezogen.
Diese Phänomen tritt allerdings nur selten auf.
https://www.herber.de/bbs/user/52241.xls
Durch das Verschieben der Inhalte sind letztendlich viele Zeilen ohne Inhalt (mit Ausnahme der A-Spalte). Kann man den Code so erweitern, dass die "leeren" Zeilen gelöscht werden, damit die Tabelle etwas gestrafft wird.
Vielen Dank
Rainer

Anzeige
AW: Tabellendaten verschieben
09.05.2008 09:09:00
Erich
Hi Rainer,
sorry, da war noch bei zz = zL + 1 das "+1" manchmal zu viel, habe ich geändert.
Das Löschen der "leeren" Zeilen (leer in Spalten 2 und 3) habe ich auch eingebaut,
das kannst du mit der Konstanten ein- und ausschalten:

Option Explicit
Sub ReorgUD()
Dim lngZ As Long, zz As Long, strC As String, ss As Long, zL As Long, varZ
Const blnL  As Boolean = False   ' "Leere" Zeilen löschen?
Const spH As Long = 4            ' Nummer der (leeren) Hilfsspalte - anpassen
' (hinter der letzten gefüllten Spalte)
lngZ = Cells(Rows.Count, 1).End(xlUp).Row
With Range(Cells(1, spH), Cells(lngZ, spH))
.Formula = "=ROW()"
.Value = .Value
End With
Range(Cells(1, 1), Cells(lngZ, spH)).Sort _
Key1:=Range("A2"), Order1:=xlAscending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
For ss = 2 To 3
zz = 2
While zz 

Ich hoffe, jetzt ist kein Fehler mehr drin...
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort und: Schönes Wochenende!

Anzeige
AW: Tabellendaten verschieben
09.05.2008 13:47:00
Rainer
Hallo Erich,
ich habe das Einrücken getestet und bislang keine "Fehler" mehr gefunden. Vielen Dank!!!
Ein paar Fragen habe ich noch. Wenn ich eine Tabelle mit 30 Spalten habe, wo muss ich im Code überall Änderungen vornehmen? Einen Hinweis hast du mir ja schon mit einem Kommentar im Code gegeben.
Muss der Schleigenbeginn "For ss = 2 To 3" ebenfalls angepasst werden?
Wie muss die "Löschprozedur" angepasst werden?
Besteht eigentlich die Möglichkeit, anstelle eines Löschvorgangs auch eine Gliederung der leeren Zeilen vorzuzehmen, damit diese Zeile bei Bedarf schnell wieder benutzt werden können?
Vielen Dank für deine Mühe!
Rainer

Anzeige
AW: Tabellendaten verschieben
09.05.2008 17:00:00
Erich
Hi Rainer,
hier kannst du die relevanten Spalten leicht vorgeben. Jetzt gibt es vier Möglichkeiten,
mit den "leeren" Zeilen umzugehen. Habe ich damit etwas getroffen, was du mit "Gliederung" gemeint hast?
Viel Spaß mit

Sub ReorgUDS()
Dim lngZ As Long, zz As Long, strC As String, ss As Long, zL As Long, varZ
Const spV As Long = 2         ' Nummer ersten  "Verschiebe"-Spalte
Const spB As Long = 7         ' Nummer letzten "Verschiebe"-Spalte
Const spH As Long = 8         ' Nummer der (leeren) Hilfsspalte - anpassen
'   (hinter der letzten gefüllten Spalte)
Const intL As Integer = 0     ' Umgang mit "leeren" Zeilen
'    0: stehen lassen
'    1: an den Anfang sortieren
'    2: an das Ende   sortieren
'    3: löschen
Sheets(1).Select                                                     ' #TEST
Sheets(2).Range("A1:E35").Copy Cells(1, 1)                           ' #TEST
lngZ = Cells(Rows.Count, 1).End(xlUp).Row
With Range(Cells(1, spH), Cells(lngZ, spH))
.Formula = "=ROW()"
.Value = .Value
End With
Range(Cells(1, 1), Cells(lngZ, spH)).Sort _
Key1:=Range("A2"), Order1:=xlAscending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
For ss = spV To spB
zz = 2
While zz  0)       ' spez. Sort leerer Zeilen - nur bei intL > 0
For ss = spV To spB
If Len(Cells(zz, ss)) > 0 Then Exit For
Next ss
If ss > spB Then Cells(zz, spH) = IIf(intL = 1, -2, 1) * lngZ + zz
Next zz
Range(Cells(1, 1), Cells(lngZ, spH)).Sort _
Key1:=Cells(2, spH), Order1:=xlAscending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
If intL = 3 Then                       ' Löschen leerer Zeilen - nur bei intL = 3
varZ = Application.Match(lngZ + 1, Columns(spH), 1)
If IsNumeric(varZ) Then
If Cells(varZ, spH)  lngZ Then Range(Rows(varZ), Rows(lngZ)).Delete
End If
End If
'   Columns(spH).Clear
End Sub

Rückmeldung wäre nett! - Erich aus Kamp-Lintfort wünscht dir fröhliche Feiertage!

Anzeige
AW: Achtung - Testzeilen!
09.05.2008 17:04:00
Erich
Hi Rainer,
in der Prozedur, die ich gerade gepostet habe, stehen unter den Konstanten zwei mit ' #TEST markierte Zeilen.
Die solltest du löschen (oder vielleicht auch beim Testen verwenden...).
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

AW: Achtung - Testzeilen!
13.05.2008 14:09:35
Rainer
Hallo Erich,
ich habe die Datei gerade getestet. Vielen, vielen Dank! Du hast mir sehr geholfen!
Gruß
Rainer

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige