Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Anzeige
Inhaltsverzeichnis

Zelle nach oben / nach unten tauschen

Forumthread: Zelle nach oben / nach unten tauschen

Zelle nach oben / nach unten tauschen
08.03.2025 13:27:04
Kolja
Hallo zusammen,

---> ich suche nach einem VBA-Code um einzelne markierte Zellen oder Zellbereiche um eine Zeile nach oben bzw. nach unten zu verschieben.



Normal macht man das ja mit gedrückter Schift-Taste und gedrückter linker Maustaste - dann zieht man sich seine Zellen zwischen andere Zellen, sodass diese entsprechend nachrücken.

Ich hätte aber gerne zwei VBA-Code´s, um die mit Button´s zu verknüpfen.
Es sollen aber keine ganzen Zeilen sein (die Codes habe ich), sondern wirklich nur die selektierten Zellen oder Zellbereiche, da ich mehrere einpaltige Tabellen für Datenlisten nebeneinander habe und dort jeweils in einzelnen Tabellen Daten umsortieren möchte.
(P.S.: die Sortierfunktion ist bei den speziellen Daten nutzlos und bleibt außen vor - daher muss händisch einzeln umsortiert werden können).
Anzeige

26
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zelle nach oben / nach unten tauschen
08.03.2025 13:35:40
RPP63
Moin!
Ohne Fehlerbehandlung für nach oben:
Sub OneUp()

With Selection
.Cut
.Offset(-1).Insert xlDown
End With
End Sub


Gruß Ralf
AW: Zellen nach oben / nach unten tauschen
10.03.2025 15:40:49
GerdL
Moin im Gegenverkehr!
Sub Down_Under()

If TypeOf Selection Is Range Then
With Selection
If .Areas.Count = 1 Then
.Cut
.Cells(1).Offset(2 * .Rows.Count).Insert shift:=xlDown
End If
End With
End If
End Sub

Gruß Gerd
Anzeige
AW: Zellen nach oben / nach unten tauschen
10.03.2025 16:05:52
Kolja
Hallo Gerd, dein Code funktioniert leider nicht richtig.
Es werden der markierte Zellbereich um die Anzahl seiner Zeilen nach unten verschoben.
Bsp.:
Wenn ich einen Zellbereich mit 4 übereianderliegenden Zellen markiere und diesen Code ausführe, dann werden die markierten Zellen um 4 Zellen nach unten verschoben.
Anzeige
AW: Zellen nach oben / nach unten tauschen
10.03.2025 17:56:24
Yal
Genau gesehen: der Code funktioniert richtig, weil er tut, was es soll. Es tut nur nicht, was Du möchtest ;-)

Daher ist es nicht zielführend in Detail zu beschreiben, was der code macht. Wichtiger wäre zu beschreiben, was es machen soll, um deine Bedarf gerecht zu sein. oder?

VG
Yal
Anzeige
AW: Zelle nach oben / nach unten tauschen
08.03.2025 13:51:47
Kolja
Hab lieben Dank, das nach oben verschieben funzt bestens.

Ich weiß leider nicht, wie ich den Code für "nach unten" umändern muss. (Das was ich ausprobiert hatte klappt leider nicht.)

--> Könntest du mir da eventuell noch eine kleine Hilfestellung geben?
AW: Zelle nach unten tauschen
08.03.2025 17:53:32
Dieter(Drummer)
Hallo Kolja,

die aktive Zelle mit Inhalt ein Zelle runter, geht mit Code:
Sub Zellinhalt_runter()

ActiveCell.Insert Shift:=xlDown
End Sub


Gruß,
Dieter(Drummer)
AW: Zelle nach unten tauschen
08.03.2025 19:01:47
RPP63
Eher so, wenn man die Treaderöffnung beachtet:
Mein Code von oben,
die -1 im Offset gegen 2 tauschen.
Ich wollte mit meinem Link Hilfe zur Selbsthilfe geben, konnte aber wegen der Antwort von Dieter die Füße nicht still halten.

Gruß Ralf
Anzeige
AW: Zelle nach unten tauschen
08.03.2025 22:03:33
GerdL
Moin
Sub OneDown()

Selection.Insert xlDown
End Sub

Gruß Gerd
Geisterfahrer?
09.03.2025 12:55:49
RPP63
Sorry für den schrägen Vergleich!
Ich komme mir vor wie derjenige auf der "richtigen" Spur und mir kamen zwei Geisterfahrer entgegen.
Aus der Threaderöffnung:
»Normal macht man das ja mit gedrückter Schift-Taste und gedrückter linker Maustaste - dann zieht man sich seine Zellen zwischen andere Zellen, sodass diese entsprechend nachrücken.«
Eure Codezeile schiebt ab der aktiven Zelle alles nach unten und erzeugt eine leere Zelle.
Das war hier eindeutig nicht gewünscht!
Gewünscht war
Ausgangsposition
1
2
3
4
die 2 wird markiert und soll eine Zelle nach unten wandern. Ergebnis:
1
3
2
4
Deshalb:
Sub OneDown()

With Selection
.Cut
.Offset(2).Insert xlDown
End With
End Sub


Gruß Ralf
Anzeige
AW: Geisterfahrer?
10.03.2025 07:38:23
Kolja
Hallo Ralf, deine Tipps sind toll und helfen mir ungemein im Dazulernen. Stück für Stück verstehe ich immer mehr.
Bitte entschuldige mir daher meine weiteren Rückfragen dazu:

Beim Code
Sub Zellenbereich_verschieben_1x_hoch()

With Selection
.Cut
.Offset(-1).Insert xlDown
End With
End Sub

funktioniert alles ganz gut: Ich kann eine oder mehrere Zellen markieren - und zack - schiebt der Code mir das dann um 1 Zelle nach oben. Grandios.

Aber beim Code
Sub Zellenbereich_verschieben_1x_runter()

With Selection
.Cut
.Offset(2).Insert xlDown
End With
End Sub

klappt das nicht so gut:
- markiere ich 1 Zelle, dann funktioniert das (die "Neueinfügestelle" liegt unter der zweitnächsten Zelle incl. oberster aktiver Zelle)
- markiere ich 2 Zellen übereinander. dann passiert faktisch gar nichts (die "Neueinfügestelle" liegt hier direkt unter dem markierten Zellbereich, schiebt den Zellbereich quasi unter sich selbst und löscht den Unrprungsbereich --> Ergo faktisch gar nichts passiert.)
- markiere ich 3 Zellen oder mehr übereinander, dann kommt es zu einem Fehler (die "Neueinfügestelle" liegt hier innerhalb vom markierten Zellbereich und kann logischerweise die Handlung nicht ausführen.
Ich hoffe, ich habe das Prozedere so richtig verstanden: Dieses "Offset(2)" bezieht sich wohl immer auf die oberste linke Zelle eines markierten Zellbereiches als Ausgangspunkt und sagt, dass das Markierte 2 Zellen weiter unter wiedereigefügt werden soll.
(Das erklärt ja auch, warum der oben genannte Code für Hochschieben bestens funktioniert, denn Ausgangspunkt für das Verschieben ist ja die oberste Zelle des Markierungsbereiches.)

Wie kann ich also bei unterschiedlich hohen Markierungsbereichen sagen, dass das alles unter die nächste Zelle unterhalb des gesamten Markierungsbereiches verschoben werden soll? ---> Also Ausgangspunkt muss die unterste Zelle des Markierungsbereiches sein.

------------------

Als Gimmick obendrauf wäre es auch grandios, wenn die Zellmarkierung bei den Verschiebungen "mitrutscht" und nicht festgenagelt bleibt. Dadurch ist es optisch besser nachvollziehbar und es ist auch besser machbar, eine markierte Zelle oder Bereich mehrmals zu verschieben, ohne jedesmal Zeklle oder Bereich neu anwählen zu müssen.
---> Wie kann man die Markierung "mitrutschen" lassen?

Anzeige
AW: Geisterfahrer?
10.03.2025 11:01:36
Yal
Moin,

wenn deine "Listen" in Tabelle organisiert sind (Menü "EInfügen", "Tabelle"), dann sind diesen Objekte in VBA mit ListObject leichter zu erfassen.

Enum enRichtung

enRichtung_nachOben = -1
enRichtung_nachUnten = 2
End Enum

Public Sub NachOben()
Verschiebe enRichtung_nachOben
End Sub

Public Sub NachUnten()
Verschiebe enRichtung_nachUnten
End Sub

Private Sub Verschiebe(Richtung As enRichtung)
Dim LO As ListObject
Dim Zeile As Range

Set LO = ActiveCell.ListObject
If Not LO Is Nothing Then ' wenn die aktive Zelle tatsächlich innerhalb einer Listobjekt
Set Zeile = Intersect(ActiveCell.EntireRow, LO.DataBodyRange)
If Not Zeile Is Nothing Then 'Weil es sein könnte, dass akt.Zelle auf dem Header liegt
Application.ScreenUpdating = False
Zeile.Cut
Zeile.Offset(Richtung).Insert xlDown
ActiveCell.Offset(Richtung / Abs(Richtung)).Select
Application.ScreenUpdating = True
End If
End If
End Sub


VG
Yal
Anzeige
AW: Geisterfahrer?
10.03.2025 11:50:19
daniel
Hi
eine Möglichkeit wäre, dass du die Zelle, die unterhalb des Selektierten Bereichs liegt, auschneidest und oberhalb dessen einfügst:

Sub OneDown()

With Selection
.Rows(1).Offset(.Rows.Count).Cut
.Rows(1).Insert shift:=xlDown
.Select
End With
End Sub


Gruß Daniel
Anzeige
AW: Geisterfahrer?
10.03.2025 16:12:26
Kolja
Hallo Daniel,

sehr geil. Das funktioniert perfekt!!!
Und das Schöne an dieser Lösung ist, dass die markierten Zellen markiert bleiben - also faktisch dass die Markierung mitwandert. Das ist die Endlösung für nach unten verschieben.
Ich lerne hier im Forum so viel von euch Spezis - das ist eine wahre Freude.

--> Wie könnte man den Code umschreiben, dass das auch für nach oben funktioniert?

--> Und gänge das auch für seitliches Vertauschen nach links bzw. rechts?

Beste Grüße
Kolja
Anzeige
AW: Geisterfahrer?
10.03.2025 16:28:06
daniel
Hi
für nach oben hast du doch eine funktionierende Lösung.
da müsste dann nur noch das .Select hinzu.

links und rechts geht auch.
dazu muss man dann beim Offset noch ein Komma hinzufügen, da Verschiebung um Spalten dort im zweiten Parameter steht
beispiel:
Versatz um eine Zeile: .Offset(1, 0)
Versatz um eine Spalte: .Offset(0, 1)

aus Rows. wird .Columns und aus dem shift dann xltoLeft bzw xltoright.

probier erstmal, ob du selber weiter kommst

Gruß Daniel
Anzeige
AW: Geisterfahrer?
10.03.2025 16:49:21
Kolja
Hallo

Zitat: "für nach oben hast du doch eine funktionierende Lösung. da müsste dann nur noch das .Select hinzu."
---> Habe ich gemacht - das funktioniert jetzt ebenfalls grandios mit folgendem Code:
Sub OneUp()

With Selection
.Cut
.Offset(-1).Insert xlDown
.Select
End With
End Sub



Weiterhin:

Ich habe versucht, mit deinen Infos entwas zusammenzuschustern, aber da reicht mein Wissen noch nicht. Ich habe die Codes nicht zum Laufen bekommen, da kommen immer Abbrüche.
Hier einmal meine beiden Versuche für Verschiebung nach links und rechts:
Sub OneLeft()

With Selection
.Columns(1).Offset(.Columns.Count).Cut
.Columns(1).Insert xlToLeft
.Select
End With
End Sub


Sub OneRight()

With Selection
.Cut
.Offset(0, 1).Insert xlRight
.Select
End With
End Sub


Was habe ich hier falsch gemacht?
Anzeige
AW: Geisterfahrer?
10.03.2025 18:25:27
daniel
du hast zum einen nicht alles beachtet, was ich dir geschrieben habe.
z. b. das mit dem Offset
die Insert-option ist immer xlToRight. nach links kann man nicht verschieben.
du hast links und rechts vertausch.
das Nach-Links-Verschieben entspricht dem Nach-Oben´-Verschieben und das Nach-Rechts-Verschieben dem Nach-Unten

Gruß Daniel
Anzeige
AW: Geisterfahrer?
10.03.2025 20:06:35
Kolja
Ich habe es noch immer nicht geschafft, ich fische im Trüben.

Hier meine Versuche:
Sub OneRight()

With Selection
.Columns(1).Offset(.Columns.Count).Cut
.Columns(1).Insert shift:=xlToRight
.Select
End With
End Sub


Sub OneLeft()

With Selection
.Cut
.Offset(0, 1).Insert xlToRight
.Select
End With
End Sub


Wo liegen meine Fehler begraben?
Anzeige
AW: Geisterfahrer?
10.03.2025 20:13:56
Daniel
Fällt dir beim Offset nichts auf, auch wenn du mal beide Makros im Vergleich betrachtest?
AW: Geisterfahrer?
10.03.2025 21:23:32
Kolja
Sub OneRight()

With Selection
.Columns(0, 1).Offset(.Columns.Count).Cut
.Columns(0, 1).Insert shift:=xlToRight
.Select
End With
End Sub

Sub OneLeft()
With Selection
.Cut
.Offset(0, -1).Insert xlToRight
.Select
End With
End Sub


Nach links funktioniert jetzt, ich habe da -1 eingegeben.
Nach rechts hab ich mit herumprobieren noch kein Glück gehabt. Manchmal schiebt es mir die Zelle nach rechts, holt aber die darunterstehende Zelle hoch. Ich kann mir leider noch keinen Reim drauf machen.
Anzeige
AW: Geisterfahrer?
11.03.2025 07:11:53
Kolja
Hallo Daniel,
ich glaube, jetzt habe ich es so halbwegs zusammengepfriemelt. Aber es funktioniert noch nicht so, wie es soll:
Für nach oben und nach unten funktioniert es mit einem mehrzeiligen und mehrspaltigen Markierungsbereich tadellos.
Für nach links und nach rechts funktioniert es nur mit einem einspaltigen Bereich. Habe ich mehr Spalten, dann klappt das noch nicht.

--> Was mache ich hier falsch? (bei nach oben funktioniert es doch auch?)

---> Und: Ich habe noch so ein Fehlerding eingebaut, falls man mit seinem Bereich bereits an einem Rand ist und trotzdem dahin schieben will. Ist das so richtig?

---> Eine Frage brennt mir aber noch auf dem Herzen:
Wenn man das, was die Codes machen, einfach nur klassisch mit SHIFT + linke Maustaste macht, dann kann ich das wieder rückgängig machen.
Nicht so nach Ausführung der Codes, obwohl die ja irgendwie dasselbe tun - es gibt dann kein "Rückgängig" mehr.
Offenbar wird durch die Codeausführung der Rückgängigspeicher oder sowas gelöscht.
- Warum ist das so bei den Codes und warum nicht bei der Mausvariante?
- Lässt sich so etwas umgehen?

Hier nun meine geistigen Ergüsse:
Sub Zellenbereich_vert_1x_nach_unten()

On Error Resume Next
With Selection
.Rows(1).Offset(.Rows.Count).Cut
.Rows(1).Insert shift:=xlDown
.Select
End With
End Sub
Sub Zellenbereich_vert_1x_nach_oben()
On Error Resume Next
With Selection
.Cut
.Offset(-1).Insert xlDown
.Select
End With
End Sub
Sub Zellenbereich_hori_1x_nach_rechts()
On Error Resume Next
With Selection
.Columns(1).Offset(0, .Columns.Count).Cut
.Columns(1).Insert shift:=xlToRight
.Select
End With
End Sub
Sub Zellenbereich_hori_1x_nach_links()
On Error Resume Next
With Selection
.Cut
.Offset(0, -1).Insert xlToRight
.Select
End With
End Sub

Anzeige
AW: Geisterfahrer?
11.03.2025 08:00:21
Kolja
Ich habe nun herausgefunden, wann das Verschieben nicht funktioniert:

Vgl. hierzu Beispieldatei unten:

Ist man im Zahlenbereich 1, dann funktionieren alle 4 Code nicht, weil ein Tabellenbereich rechts bzw. unterhalb des Markierungsbereiches vorhanden ist.
Ist man im Zahlenbereich 2, dann funktionieren alle 4 Codes.

- Offenbar funktioniert horizontales Vertauschen nicht, wenn sich rechts eine Tabelle befindet.
- Offenbar funktioniert vertikales Vertauschen nicht, wenn sich unterhalb eine Tabelle befindet.

Woran liegt das?


https://www.herber.de/bbs/user/176205.xlsm
Anzeige
AW: Geisterfahrer?
11.03.2025 13:58:29
daniel
Hi
Rückgängig funktioniert nach Makroaktionen nicht, weil Microsoft das so programmiert hat.
ist so

ich würde für die Fehler beim Verschieben ab Position 1 kein On Error Resume next verwenden, sondern das direkt abfragen:
if Selection.Row = 1 / if Selection.Column = 1 dann kein Verschieben nach oben oder links

wenn du beim Insert Zellen nach rechts oder unten verschiebst, dann gilt das für die ganze Zeile oder Spalte
wenn du darunter weitere Daten hast, verschieben die sich dann auch.
Wenn das eine zusammenhängende Tabelle, ist würdest du, wenn du bei Teilen davon die Zellen verschiebst, die Tabellenstruktur zerstören.
Daher macht Excel das nicht.

Gruß Daniel
Anzeige
AW: Geisterfahrer?
12.03.2025 06:02:06
Kolja
Vielen lieben Dank für deine freundliche Hilfe zur Selbsthilfe.

Bei "if Selection.Row = 1 / if Selection.Column = 1" weiß ich leider nicht, wie die Verschiebung unterbunden werden soll. In Ermangelung entsprechender Kenntnisse kann ich leider nur bei "On Error Resume Next" bleiben - zumindest funktioniert das ja.

Und du hast recht: Auch mit Shift + linkeMaustaste kann ich links oder oberhalb von Tabellen nix vertauschen, auch das unterbindet Excel rigoros. Auch wenns eigentlich Quatsch ist, man muss das wohl so akzeptieren.

War toll gewesen, so eine super hilfreiche Anleitung hier zu bekommen.
Hab' Dank!
Anzeige
AW: Geisterfahrer?
12.03.2025 17:24:20
Piet
Hallo

den Tipp nur zu Ende denken, so geht es: --> if Selection.Row = 1 Then Exit Sub

mfg Piet
AW: Geisterfahrer?
10.03.2025 12:24:36
Ulf
Hi,
für ListObjects bist du ja versorgt


Option Explicit

Dim mySel As Range

Enum Bewegung
Oben = 0
Unten = 1
End Enum

Public Sub bewegen(Optional ByVal Richtung As Bewegung = Bewegung.Unten)
Dim lngStart As Long
Dim lngEnde As Long
Set mySel = Selection
With mySel
.Cut
Select Case Richtung
Case Unten
lngStart = mySel.Cells(1).Row + 1
lngEnde = mySel.Cells(mySel.Cells.Count).Row + 1
.Offset(mySel.Cells.Count + 1).Insert xlDown
Case Oben
lngStart = mySel.Cells(1).Row - 1
lngEnde = mySel.Cells(mySel.Cells.Count).Row - 1
.Offset(-1).Insert xlDown
End Select
End With
mySel.Worksheet.Range(mySel.Worksheet.Cells(lngStart, mySel.Column), mySel.Worksheet.Cells(lngEnde, mySel.Column)).Select
End Sub

Public Sub runter()
bewegen Unten
End Sub

Public Sub hoch()
bewegen Oben
End Sub

hth
Ulf
Anzeige

Forumthreads zu verwandten Themen

Anzeige
Anzeige