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

Makro Zeilenblock verschieben

Makro Zeilenblock verschieben
Florian
Guten Morgen liebe Leute.
Ich hätte ein großes Problem.
Ich soll aus einem generierten Report aus einem ERP System einen verwertbaren Bericht in Excel machen und dazu muss ich einige Sachen ändern.
Da nun aber nicht alle Zellen zu den jeweiligen Überschriften passen, wollte ich mir da mit einem Marko helfen, denn der Bericht wird mich öfter heimsuchen.
Mein Problem ist nun folgendes
Ein Teil der Daten ist um je 2 Zeilen versetzt, da die Daten variieren kann ich nicht immer die gleichen Zellen verschieben, aber dies lässt sich mit Strg und nach unten in der Spalte (CB) sehr gut rausfinden.
Wenn ich nun die Reihe habe, muss ich 7x (Strg und links) drücken und dann den markierten Block um 2 Spalten nach links schieben. Nun habe ich aber das Problem, dass mir das makro die aktiven Zeilen nicht nehmen will.
Ich habe mich mal in VBA versucht und bin aber zu keinem Ergebnis gekommen.
So sieht mal mein Versuch aus:
Columns("BK:CC").Select
Selection.UnMerge
Range("CB3").Select
Selection.End(xlDown).Select
Range(Selection, Selection.End(xlDown)).Select (Markieren des Zeilenblocks)
Range(Selection, Selection.End(xlToLeft)).Select (7x nach links)
Range(Selection, Selection.End(xlToLeft)).Select
Range(Selection, Selection.End(xlToLeft)).Select
Range(Selection, Selection.End(xlToLeft)).Select
Range(Selection, Selection.End(xlToLeft)).Select
Range(Selection, Selection.End(xlToLeft)).Select
Range(Selection, Selection.End(xlToLeft)).Select
Selection.Cut Destination:=Range(Selection, Selection).Select (dort soll er die aktiven Zellen ausschneiden)
Range(Cells(ActiveCell.Row, 2), Cells(ActiveCell.Row - 2)).Select (und hierhin verschieben)
Für eure hilfe wäre ich äußerst dankbar.
Beste Grüße
Florian

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

Betreff
Benutzer
Anzeige
AW: Makro Zeilenblock verschieben
20.08.2010 09:02:35
JogyB
Hallo Florian,
bitte poste mal eine Beispieldatei wie Du es bekommst und wie es am Ende aussehen soll.
Sowas bekommt man normalerweise ohne ein einziges Select hin.
Gruß, Jogy
AW: Makro Zeilenblock verschieben
20.08.2010 09:23:34
Florian
Hallo Jogy.
Ich habe gerade nachgefragt und wir sollen keine xls freigeben, bin leider nur ein kleiner Praktikant.
Aber ich habe einen anonymisierten screenshot erstellt, wo man das Problem ganz gut sieht.
Userbild
Der untere Zellenblock ist aufgrund der Werte in Spalte BM36:BM55 um 2 Zellen verschoben, daher muss ich vorher den ganzen Bereich auflösen und dann die unteren Werte (Zeile 36:55), welche aber nicht immer die gleiche Anzahl haben müssen (kann auch 0 sein) um 2 Spalten nach links verschieben muss.
Vielen herzlichen Dank für deine Hilfe
Anzeige
AW: Makro Zeilenblock verschieben
20.08.2010 10:37:47
JogyB
Hallo Florian,
wenn die verschobenen Zellen immer verbunden sind, dann probier mal das aus:
Sub format_Korrektur()
Dim myRng As Range
Dim i As Long
With ActiveSheet
For i = 1 To .Cells.SpecialCells(xlCellTypeLastCell).Row
' Überprüft, ob in der Zelle was verbunden ist
If .Rows(i).MergeCells Or VarType(Rows(i).MergeCells) = vbNull Then
' Speichert die entsprechenden Zeilen zwischen
If myRng Is Nothing Then
Set myRng = .Rows(i)
Else
Set myRng = Union(myRng, Rows(i))
End If
End If
Next
' Wenn es verbundene Zellen gab
If Not myRng Is Nothing Then
' Verbund auflösen
myRng.UnMerge
' dadurch sind leere Zellen entstanden, die nun löschen
Intersect(.UsedRange, myRng).SpecialCells(xlCellTypeBlanks).Delete _
Shift:=xlShiftToLeft
End If
End With
End Sub

Das Makro wird im aktiven Arbeitsblatt ausgeführt.
Gruß, Jogy
Anzeige
AW: Makro Zeilenblock verschieben
20.08.2010 10:49:22
Florian
Hej Jogy.
Das hab ich probiert.
Das Problem ist, dass auch einige Zellen leer sind (die aber trotzdem verbunden sind und dann löscht er mir dir auch raus und daher passen die Überschriften überhaupt nicht mehr zu den jeweiligen Spalten.
Ich bräuchte nur das Makro, dass mir die Spaltenteile (mit dem Inhalt 2-10) unter die jeweiligen Spalten schiebt. Aber eben so dass das flexibel ist, denn der Report kommt dann immer irgendwie raus, (kann auch sein, dass alles passt, dann ists wieder doof ;-( ).
Aber vielen herzlichen Dank für deine Hilfe.
Beste Grüße
Florian
AW: Makro Zeilenblock verschieben
20.08.2010 11:08:55
JogyB
Hallo Florian,
jetzt muss ich nochmal nachfragen: Soll bei den leeren verbundenen Zellen gar nichts gemacht werden oder sollen die gleich behandelt werden wie die gefüllten verbundenen Zellen, d.h. es fliegt alles bis auf eine Zelle raus?
Gruß, Jogy
Anzeige
AW: Makro Zeilenblock verschieben
20.08.2010 11:14:01
Florian
Hallo Jogy, tut mir leid, dass ich das so lückenhaft formuliert habe.
Mein Makro trennt zum Schluss dann die gesamte Arbeitsmappe auf und löscht die leeren Spalten (welche sich aber nach der Überschriftenspalte orientieren). mit den Spalten die leer sind (aber eben nur keine Werte enthalten, weil es da keine gibt), die sollen bestehen bleiben.
Also eigentlich sollte im Moment da nur der Block (BK36:CC55) aufgetrennt werden, und dann der gesamte Block (BM36:CC55) auf (BK36:CA55) verschoben werden um eben all die Werte unter den jeweiligen Spaltenüberschriften zu haben. Ich weiß das ist etwas doof, aber ich hoffe es ist nun verständlich was ich gerne hätte.
Beste Grüße
Florian
Anzeige
AW: Makro Zeilenblock verschieben
20.08.2010 11:46:26
JogyB
Hallo Florian,
das hat jetzt leider auch nicht im Detail beantwortet, was ich wissen wollte, mir ging es konkret um die verbundenen Zellen im relevanten Bereich.
Ok, ich habe das jetzt auf die Spalten BK bis BM eingeshränkt. Formuliert ist der Code allgemeiner, aber so hatte ich ihn jetzt schon fertig (könnte man durch die Einschränkungen wohl kürzer machen, die Laufzeit tendiert aber eh gegen null). Bei leeren verbundenen Zellen in dem Bereich bleibt immer eine stehen.
Sub format_Korrektur()
Dim zeLLe As Range
Dim rowArr() As Long
Dim delRange As Range
Dim i As Long
Dim k As Long
Dim suchRange As Range
ReDim rowArr(0 To 0)
With ActiveSheet
Set suchRange = Range(.Columns(63), Columns(65))
For i = 2 To .Cells.SpecialCells(xlCellTypeLastCell).Row
' Überprüft, ob in der Zelle was verbunden ist
If Intersect(.Rows(i), suchRange).MergeCells Or _
VarType(Intersect(.Rows(i), suchRange).MergeCells) = vbNull Then
' Speichert die entsprechenden Zeilen zwischen
If UBound(rowArr) = 0 Then
ReDim rowArr(1 To 1)
rowArr(1) = i
Else
ReDim Preserve rowArr(1 To UBound(rowArr) + 1)
rowArr(UBound(rowArr)) = i
End If
End If
Next
' Wenn es verbundene Zellen gab
If UBound(rowArr) > 0 Then
For i = 1 To UBound(rowArr)
For Each zeLLe In Intersect(.UsedRange, .Rows(rowArr(i)), suchRange)
With zeLLe
If .MergeCells And .Address = .MergeArea.Cells(1, 1).Address Then
If delRange Is Nothing Then
Set delRange = Range(Cells(.Row, .Column + 1), _
Cells(.Row, .Column + zeLLe.MergeArea.Columns.Count - 1))
Else
Set delRange = Union(delRange, _
Range(Cells(.Row, .Column + 1), _
Cells(.Row, .Column + zeLLe.MergeArea.Columns.Count - 1)))
End If
End If
End With
Next
Next
' Verbund aufheben
' geht über delrange, da fehlt zwar immer die erste Zelle
' funktioniert aber trotzdem
delRange.UnMerge
delRange.Delete Shift:=xlShiftToLeft
End If
End With
End Sub

Gruß, Jogy
Anzeige
spezieller
20.08.2010 12:07:10
JogyB
Oder ganz speziell für Deinen Fall:
Sub format_Korrektur2()
Dim myRng As Range
Dim suchRng As Range
Dim i As Long
With ActiveSheet
For Each suchRng In Intersect(.Columns(64), .UsedRange)
' Überprüft, ob in der Zelle was verbunden ist
If suchRng.MergeCells Or _
VarType(suchRng.MergeCells) = vbNull Then
' Speichert die entsprechenden Zeilen zwischen
If myRng Is Nothing Then
Set myRng = suchRng
Else
Set myRng = Union(myRng, suchRng)
End If
End If
Next
' Wenn es verbundene Zellen gab
If Not myRng Is Nothing Then
' Verbund auflösen
myRng.UnMerge
' dadurch sind leere Zellen entstanden, die nun löschen
Union(myRng, myRng.Offset(0, 1)).SpecialCells(xlCellTypeBlanks).Delete _
Shift:=xlShiftToLeft
End If
End With
End Sub

Gruß, Jogy
Anzeige
AW: spezieller
20.08.2010 13:00:18
Florian
Hallo Jogy.
Vielen herzlichen Dank.
Jetzt funktionierts, aber ich muss das Marko 2 mal ausführen, dann passts perfekt ;-)
Danke schön.
LG
Florian
AW: spezieller
20.08.2010 13:38:04
JogyB
Hallo Florian,
seltsam, wenn ich Dein Beispiel nachbaue, dann klappt es bei mir mit einer Ausführung. Aber das ist das Problem, wenn man keine Beispieldateien hat ;).
Gruß, Jogy
AW: spezieller
20.08.2010 13:46:38
Florian
tut mir leid, aber das darf ich leider nicht und da ich dazu noch relativ neu bin, will ich es mir nicht verscherzen, aber ich lass das marko einfach 2 mal laufen und dann passts genau.
Nochmals vielen herzlichen dank und ein schönes Wochenende.
LG aus Tirol
Florian
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige