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

komplexes zeilenverschieben

komplexes zeilenverschieben
03.11.2007 16:52:00
John
Hallo allerseits,
ich habe zwei spalten (b und c) in denen dreistellige codes und leerzellen stehen. mein ziel ist es, die codes in spalte b immer soweit nach unten zu verschieben, dass sie eine zeile unterhalb des endes einer code-serie in der benachbarten spalte c beginnen.
die angehaengte datei verdeutlicht, was ich machen will.
https://www.herber.de/bbs/user/47366.xls
wichtig ist, dass die zahlen in den spalten d bis n mit den codes aus spalte b zusammen nach unten verschoben werden, denn diese werte gehoeren jeweils zu dem code aus spalte b.
dieses beispiel ist stark gekuerzt. die datei, auf die ich den macro anwenden will, hat ca. 8000 zeilen. ausserdem erstrecken sich die den codes aus spalte b zugehoerigen werte ueber die spalten d bis di.
hat jemand eine idee?
ueber antworten wuerde ich mich sehr freuen.
einen gruss an alle forumsmitglieder,
john.

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

Betreff
Datum
Anwender
Anzeige
AW: komplexes zeilenverschieben
04.11.2007 11:31:30
schauan
... das war doch schon gefragt ...
Hoffe geholfen zu haben Grüße von André aus Gera - Excel-97-2003

AW: komplexes zeilenverschieben
05.11.2007 09:51:00
Chris
Servus ,
keine Ahnung, ob das noch relevant ist:
Hier ein Makro (bzw. 3) für dein Beispiel:
Einzige Bedingung der Anfang der Blöcke muss in Spalte C sein und die Leerzeilen sollten gelöscht sein.
Option Explicit

Sub t()
Dim SucheB As Range
Dim SucheC As Range
Dim FindeB As Range, FindeC As Range
Dim LetzteB As Long, letzteC As Long, wsLetzte As Long
Dim zählerBE As Double, zählerCE As Double
Dim zählerBL As Double, zählerCL As Double
Dim strErsteB As String, strErsteC As String
LetzteB = IIf(IsEmpty(Cells(Rows.Count, 2)), Cells(Rows.Count, 2).End(xlUp).Row, Rows.Count)
letzteC = IIf(IsEmpty(Cells(Rows.Count, 3)), Cells(Rows.Count, 3).End(xlUp).Row, Rows.Count)
Sheets.Add After:=Sheets(1)
If LetzteB > letzteC Then
wsLetzte = LetzteB
Else
wsLetzte = letzteC
End If
Sheets(1).Range("A1:N" & wsLetzte).Copy ActiveSheet.Range("A1")
With ActiveSheet
.Columns("E:D").Insert
If .Range("B1")  "" Then
.Range("D1") = "ErsteB1"
zählerBE = 1
Else
zählerBE = 0
End If
If .Range("C1")  "" Then
.Range("E1") = "ErsteC1"
zählerCE = 1
Else
zählerCE = 0
End If
On Error Resume Next
Set FindeB = .Range("B1:B" & LetzteB + 1)
Set SucheB = FindeB.Find(what:="", LookAt:=xlWhole)
If Not SucheB Is Nothing Then
strErsteB = SucheB.Address
Do
If SucheB.Offset(-1, 0)  "" Then
zählerBL = zählerBL + 1
SucheB.Offset(-1, 2) = "LetzteB" & zählerBL
End If
If SucheB.Offset(1, 0)  "" Then
zählerBE = zählerBE + 1
SucheB.Offset(1, 2) = "ErsteB" & zählerBE
End If
Set SucheB = FindeB.FindNext(SucheB)
Loop While Not SucheB Is Nothing And SucheB.Address  strErsteB
End If
Set FindeC = .Range("C1:C" & letzteC + 1)
Set SucheC = FindeC.Find(what:="", LookAt:=xlWhole)
If Not SucheC Is Nothing Then
strErsteC = SucheC.Address
Do
If SucheC.Offset(-1, 0)  "" Then
zählerCL = zählerCL + 1
SucheC.Offset(-1, 2) = "LetzteC" & zählerCL
End If
If SucheC.Offset(1, 0)  "" Then
zählerCE = zählerCE + 1
SucheC.Offset(1, 2) = "ErsteC" & zählerCE
End If
Set SucheC = FindeC.FindNext(SucheC)
Loop While Not SucheC Is Nothing And SucheC.Address  strErsteC
End If
End With
Set SucheB = Nothing
Set SucheC = Nothing
Set FindeB = Nothing
Set FindeC = Nothing
Call tt
End Sub



Sub tt()
Dim SucheD As Range, FindeE As Range, FindeD As Range
Dim y As Long, letzteD As Long, letzteE As Long
Dim Suche As Range, FindeS As Range, SucheE As Range
Dim strErsteD As String, strZiffer As String
Dim Übergabe As Double, Differenz As Double
Dim letzteDRow As Long, letzteERow As Long, ErsteERow As Long, ErsteDRow As Long
With ActiveSheet
letzteD = IIf(IsEmpty(.Cells(Rows.Count, 4)), .Cells(Rows.Count, 4).End(xlUp).Row, Rows. _
Count)
letzteE = IIf(IsEmpty(.Cells(Rows.Count, 5)), .Cells(Rows.Count, 5).End(xlUp).Row, Rows. _
Count)
Set FindeS = .Range("D1:D" & letzteD)
Set Suche = FindeS.Find(what:="LetzteB" & "*", LookAt:=xlWhole)
If Not Suche Is Nothing Then
strErsteD = Suche.Address
Do
strZiffer = Right(Suche, Len(Suche) - 7)
Set Suche = FindeS.FindNext(Suche)
Loop While Not Suche Is Nothing And Suche.Address  strErsteD
End If
Übergabe = strZiffer
Differenz = Übergabe - 1
For y = 1 To Differenz
Set FindeD = .Range("D1:D" & letzteD)
Set SucheD = FindeD.Find(what:="ErsteB" & y + 1, LookAt:=xlWhole)
If Not SucheD Is Nothing Then
letzteDRow = SucheD.Row
End If
Set FindeE = .Range("E1:E" & letzteE)
Set SucheE = FindeE.Find(what:="LetzteC" & y, LookAt:=xlWhole)
If Not SucheE Is Nothing Then
ErsteERow = SucheE.Row
End If
Dim xy As Double
xy = ErsteERow - letzteDRow + 1
If Not xy 



Sub aus()
Dim SucheLeer As Range, FindeLeer As Range
Dim LeerRowB As Long, LeerRowC As Long
Dim LetzteLeerB As Long, LetzteLeerC As Long
With ActiveSheet
LetzteLeerB = IIf(IsEmpty(.Cells(Rows.Count, 2)), .Cells(Rows.Count, 2).End(xlUp).Row,  _
Rows.Count)
LetzteLeerC = IIf(IsEmpty(.Cells(Rows.Count, 3)), .Cells(Rows.Count, 3).End(xlUp).Row,  _
Rows.Count)
Set FindeLeer = .Range("B1:B" & LetzteLeerB)
Set SucheLeer = FindeLeer.Find(what:="", LookAt:=xlWhole)
If Not SucheLeer Is Nothing Then
LeerRowB = SucheLeer.Row
End If
Set FindeLeer = Nothing
Set SucheLeer = Nothing
Set FindeLeer = .Range("C1:C" & LetzteLeerC)
Set SucheLeer = FindeLeer.Find(what:="*", LookAt:=xlWhole)
If Not SucheLeer Is Nothing Then
LeerRowC = SucheLeer.Row
End If
If LeerRowC 


Gruß
Chris

Anzeige
AW: Nachtrag
05.11.2007 10:19:00
Chris
Servus,
ich meinte natürlich Spalte B (Anfang der Blöcke).
Gruß
Chris

Danke & Nachfrage
05.11.2007 13:14:00
John
Hi Chris!
Vielen Dank! Wahnsinn! Das hast Du doch nicht etwa alles selbst geschrieben?
Ein kleines Problem habe ich aber leider noch.
Nicht nur die Werte in den Spalten D bis N sollen korrespondierend zu den Codes in Spalte B mit nach unten gezogen werden, sondern auch die Werte in den Spalten O bis EA. Das Beispiel welches ich hochgeladen hatte, war stark gekuerzt.
Ich habe es selbst mit Deinem Makro versucht (N durch EA austauschen), aber es hat nicht funktioniert.
Gruss,
John.

Anzeige
AW: Danke & Nachfrage
05.11.2007 15:39:00
Chris
Servus John,
doch hab ich. Ist ja eigentlich auch ganz einfach!
Also ich hab mal das ganze in der Testdatei erweitert und das funktioniert einwandfrei.
Stehen die Blöcke im Wechsel (Voraussetzung für den Algorithmus)? Ist der erste Block in Spalte B, wie in der Bsp-Mappe, und sind alle Leerzeilen gelöscht?
Außerdem stehen die Daten auch in den entsprechenden Spalten ?
Hier modifiziert bis spalte EA:
Option Explicit

Sub t()
Dim SucheB As Range
Dim SucheC As Range
Dim FindeB As Range, FindeC As Range
Dim LetzteB As Long, letzteC As Long, wsLetzte As Long
Dim zählerBE As Double, zählerCE As Double
Dim zählerBL As Double, zählerCL As Double
Dim strErsteB As String, strErsteC As String
LetzteB = IIf(IsEmpty(Cells(Rows.Count, 2)), Cells(Rows.Count, 2).End(xlUp).Row, Rows.Count)
letzteC = IIf(IsEmpty(Cells(Rows.Count, 3)), Cells(Rows.Count, 3).End(xlUp).Row, Rows.Count)
Sheets.Add After:=Sheets(1)
If LetzteB > letzteC Then
wsLetzte = LetzteB
Else
wsLetzte = letzteC
End If
Sheets(1).Range("A1:EA" & wsLetzte).Copy ActiveSheet.Range("A1")
With ActiveSheet
.Columns("E:D").Insert
If .Range("B1")  "" Then
.Range("D1") = "ErsteB1"
zählerBE = 1
Else
zählerBE = 0
End If
If .Range("C1")  "" Then
.Range("E1") = "ErsteC1"
zählerCE = 1
Else
zählerCE = 0
End If
On Error Resume Next
Set FindeB = .Range("B1:B" & LetzteB + 1)
Set SucheB = FindeB.Find(what:="", LookAt:=xlWhole)
If Not SucheB Is Nothing Then
strErsteB = SucheB.Address
Do
If SucheB.Offset(-1, 0)  "" Then
zählerBL = zählerBL + 1
SucheB.Offset(-1, 2) = "LetzteB" & zählerBL
End If
If SucheB.Offset(1, 0)  "" Then
zählerBE = zählerBE + 1
SucheB.Offset(1, 2) = "ErsteB" & zählerBE
End If
Set SucheB = FindeB.FindNext(SucheB)
Loop While Not SucheB Is Nothing And SucheB.Address  strErsteB
End If
Set FindeC = .Range("C1:C" & letzteC + 1)
Set SucheC = FindeC.Find(what:="", LookAt:=xlWhole)
If Not SucheC Is Nothing Then
strErsteC = SucheC.Address
Do
If SucheC.Offset(-1, 0)  "" Then
zählerCL = zählerCL + 1
SucheC.Offset(-1, 2) = "LetzteC" & zählerCL
End If
If SucheC.Offset(1, 0)  "" Then
zählerCE = zählerCE + 1
SucheC.Offset(1, 2) = "ErsteC" & zählerCE
End If
Set SucheC = FindeC.FindNext(SucheC)
Loop While Not SucheC Is Nothing And SucheC.Address  strErsteC
End If
End With
Set SucheB = Nothing
Set SucheC = Nothing
Set FindeB = Nothing
Set FindeC = Nothing
Call tt
End Sub



Sub tt()
Dim SucheD As Range, FindeE As Range, FindeD As Range
Dim y As Long, letzteD As Long, letzteE As Long
Dim Suche As Range, FindeS As Range, SucheE As Range
Dim strErsteD As String, strZiffer As String
Dim Übergabe As Double, Differenz As Double
Dim letzteDRow As Long, letzteERow As Long, ErsteERow As Long, ErsteDRow As Long
With ActiveSheet
letzteD = IIf(IsEmpty(.Cells(Rows.Count, 4)), .Cells(Rows.Count, 4).End(xlUp).Row, Rows. _
Count)
letzteE = IIf(IsEmpty(.Cells(Rows.Count, 5)), .Cells(Rows.Count, 5).End(xlUp).Row, Rows. _
Count)
Set FindeS = .Range("D1:D" & letzteD)
Set Suche = FindeS.Find(what:="LetzteB" & "*", LookAt:=xlWhole)
If Not Suche Is Nothing Then
strErsteD = Suche.Address
Do
strZiffer = Right(Suche, Len(Suche) - 7)
Set Suche = FindeS.FindNext(Suche)
Loop While Not Suche Is Nothing And Suche.Address  strErsteD
End If
Übergabe = strZiffer
Differenz = Übergabe - 1
For y = 1 To Differenz
Set FindeD = .Range("D1:D" & letzteD)
Set SucheD = FindeD.Find(what:="ErsteB" & y + 1, LookAt:=xlWhole)
If Not SucheD Is Nothing Then
letzteDRow = SucheD.Row
End If
Set FindeE = .Range("E1:E" & letzteE)
Set SucheE = FindeE.Find(what:="LetzteC" & y, LookAt:=xlWhole)
If Not SucheE Is Nothing Then
ErsteERow = SucheE.Row
End If
Dim xy As Double
xy = ErsteERow - letzteDRow + 1
If Not xy 



Sub aus()
Dim SucheLeer As Range, FindeLeer As Range
Dim LeerRowB As Long, LeerRowC As Long
Dim LetzteLeerB As Long, LetzteLeerC As Long
With ActiveSheet
LetzteLeerB = IIf(IsEmpty(.Cells(Rows.Count, 2)), .Cells(Rows.Count, 2).End(xlUp).Row,  _
Rows.Count)
LetzteLeerC = IIf(IsEmpty(.Cells(Rows.Count, 3)), .Cells(Rows.Count, 3).End(xlUp).Row,  _
Rows.Count)
Set FindeLeer = .Range("B1:B" & LetzteLeerB)
Set SucheLeer = FindeLeer.Find(what:="", LookAt:=xlWhole)
If Not SucheLeer Is Nothing Then
LeerRowB = SucheLeer.Row
End If
Set FindeLeer = Nothing
Set SucheLeer = Nothing
Set FindeLeer = .Range("C1:C" & LetzteLeerC)
Set SucheLeer = FindeLeer.Find(what:="*", LookAt:=xlWhole)
If Not SucheLeer Is Nothing Then
LeerRowC = SucheLeer.Row
End If
If LeerRowC 


Gruß
Chris

Anzeige
AW: Tipp
05.11.2007 15:53:00
Chris
Servus John,
kleiner Tipp. Es sind ja nun drei Teilmakros, die das Ganze erledigen. Wenn es nicht funktionieren solte, dann lass mal die Teilmakros einzeln nacheinander laufen, um festzustellen, wo ein Bug drin sein könnte.
Ich geh mal davon aus, dass es, wenn 's nicht hinhaut, irgendwo im 2. Makro liegen muss.
Gruß
Chris

AW: Tipp
05.11.2007 17:19:06
John
Hi Chris,
danke fuer die Antwort.
Das mit Spalten O bis EA funktioniert jetzt.
Leider gibt es noch ein anderes Problem, was ich in meinem ersten Post nicht explizit gemacht hatte. Ich dachte, es waere durch das Beispiel deutlich geworden.
Nicht nur die Spalt-Bloecke aus B sollen bis hinter das Ende der Spalt-Bloecke aus C nach unten verschoben werden, sondern auch umgekehrt die Spalt-Bloecke aus C hinter das Ende der aus B. Wenn die Bloecke in B nach unten verschoben werden, ueberlappen sie sich haeufig mit dem naechsten Block in C. Wichtig ist, dass sich am Ende sich die Informationen aus beiden Spalten nicht ueberlappen.
Es waere toll, wenn Du das noch einarbeiten koenntest. Offenbar scheint Dir VBA recht leicht zu fallen.
Gruss,
John.

Anzeige
AW: Tipp
05.11.2007 18:39:00
Chris
Servus John,
ich verstehe nicht, was du meinst. Dazu brauch ich evtl. was Sichtbares.
Also es ist ja so, dass der Block in B aufhört und der Block in C eine Zeile nach der Verschiebung später anfängt. Dieser Block(C) hört dann irgendwann wieder auf und der nächste Block aus B fängt eine Zeile später an, u.s.w.. Also ist hier keine Zeilenüberlappung vorhanden, zumindest nicht in der Beispieldatei.
Gruß
Chris

AW: Tipp
05.11.2007 19:09:00
John
Hi,
also ich weiss nicht, woran es liegt, aber wenn ich die drei macros durchlaufen lasse, dann enstehen solche ueberlappungen (d.h. einige bloecke in spalte C stehen zu weit oben).
hier ein ausschnitt aus der datei, wo das der fall ist (wuerde auch einfach das komplette sheet anhaengen, aber das wuerde das Forenlimit ueberschreiten): die problemstellen (sowohl vorher als auch nachher) sind gelb markiert.

Die Datei https://www.herber.de/bbs/user/47433.xls wurde aus Datenschutzgründen gelöscht


Gruss,
John.

Anzeige
AW: Tipp
06.11.2007 17:18:06
Chris
Servus John,
99 % der Bugs beseitigt, habe aber jetzt keine Lust mehr.
Überlappungen gibt es keine mehr. Kann aber sein, das bei Einzelwerten in einer Spalte und am Ende, wenn in Spalte B nur ein Wert in bestimmten Konstellationen (spalteB kürzer als SpalteC am Ende) steht, die Verschiebung der letzten Spalte in B nicht einwandfrei ist.
Falls sowas auftritt, überleg dir halt, wie du das ausbessern kannst. Hab leider keine Zeit, alle Bugs zu beachten und aufzufangen.

Die Datei https://www.herber.de/bbs/user/47466.xls wurde aus Datenschutzgründen gelöscht


Makro befindet sich in Tabelle1
Gruß
Chris

Anzeige
danke
07.11.2007 11:12:30
John
Hey Chris,
cool, dass ich an so einen ehrgeizigen Excel-Experten geraten bin. :o)
Jetzt funktioniert alles mit dem Zeilenverschieben.
Vielen Dank fuer Deine Muehe!
Hast Du zufaellig ne Literaturempfehlung fuer einen Einstieg in VBA fuer Excel?
Viele Gruesse,
John.

AW: danke
07.11.2007 12:42:00
Chris
Servus John,
es gibt mit Sicherheit einige gute Bücher, aber ich hab keine Ahnung, welche das sind.
Ich hab mir die Programmiererei in Foren wie diesem selbst beigebracht.
Learning by doing
Gruß
Chris
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige