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

Cut/Paste bei Klick in Zelle

Cut/Paste bei Klick in Zelle
10.01.2017 12:29:58
Olli
Hallo zusammen,
habe folgendes Anliegen:
2 Bereiche in Tabelle1
1. Range A2:F60
2. Range U2:Z60
Bei Klick z.B. in Zelle F6 soll A6:F6 ausgeschnitten werden und in die erste freie Zeile der 2. Range kopiert werden.
Bei Klick in F18 soll A18:F18 ausgeschnitten werden und in erste freie Zeile der 2. Range kopiert werden. Usw.
Gleichzeitig sollen die Daten aus der 1. Range von unten "nachrücken". Also Zeile F6 bzw F18 soll nicht leer bleiben. Es soll aber nicht die komplette Zeile gelöscht werden.
Ich hoffe, ich konnte mich einigermaßen verständlich ausdrücken.
Danke schon mal für die Hilfe und Gruß
Olli

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

Betreff
Datum
Anwender
Anzeige
AW: Cut/Paste bei Klick in Zelle
10.01.2017 14:01:23
Silas
Hallo Olli,
ich habe mal schnell etwas zusammengebastelt. Hoffe, das tut, was es soll.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.EnableEvents = False
Dim rng1 As Range
Dim rng2 As Range
Set rng1 = Range(Cells(2, 6), Cells(60, 6))
If Not Application.Intersect(Target, rng1) Is Nothing Then
Dim copy As Range
Dim lastrow As Integer
Dim i As Integer
For i = 2 To 60
If Cells(i, 21).Value = "" Then
Dim r As Integer
r = Target.Row
Range(Cells(Target.Row, 1), Cells(Target.Row, 6)).Cut _
Range(Cells(i, 21), Cells(i, 24))
Range(Cells(r + 1, 1), Cells(60, 6)).Cut Cells(r, 1)
Exit For
End If
Next i
End If
Application.EnableEvents = True
End Sub
Gibt bestimmt bessere Varianten aber funktionieren tut es erstmal.
Gruß
Silas
Anzeige
AW: Cut/Paste bei Klick in Zelle
10.01.2017 14:25:26
Olli
Hallo Silas,
Überragend! Es läuft, wie ich es mir vorgestellt habe. Vielen Dank.
Eine Frage habe ich aber noch:
Ich muss ehrlich gestehen, der Text ist für mich unverständlich.
Ich möchte ihn auch gerne umkehren, um von der 2. Range zurück in die 1. Range zu kopieren.
Evtl auch über den Klick auf eine andere Zelle.
Wo wird denn der Klick auf die Zelle in Spalte F definiert?
AW: Cut/Paste bei Klick in Zelle
10.01.2017 14:49:26
Olli
Und mir ist gerade noch eine Sache aufgefallen.
Ich lasse anhand dieser Daten diverse Berechnungen laufen.
Habe jetzt festgestellt, dass sich der Zellbezug in anderen Tabellen "mit verschiebt"
Wenn etwas ausgeschnitten wird und neue Daten "nachrutschen", laufen die Berechnungen in anderen Formeln immer noch mit den ausgeschnittenen Daten an der neu eingefügten Stelle.
Kann man dem entgegen wirken?
Anzeige
AW: Cut/Paste bei Klick in Zelle
10.01.2017 15:04:10
Olli
Konnte das Bezugs-Problem gerade selber lösen mit einer "INDIREKT" Formel.
Wäre super, wenn du mir den Text noch erklären könntest, so dass ich ihn evtl auch noch verändern und anderswo einsetzen kann.
Vielen Dank!
AW: Cut/Paste bei Klick in Zelle
10.01.2017 15:55:17
Silas
Hier ist der Code mit (relativ) ausführlichen Kommentaren. Am besten fügst du ihn bei Excel ein, damit du die Farben siehst (ist übersichtlicher).
Viel genauer kann ich es per Ferndiagnose nicht erklären, also falls du immer noch Probleme beim Verstehen hast, würde ich mir an deiner Stelle ein wenig VBA-Grundwissen aneignen.
Natürlich kannst du weiterhin Fragen stellen, allerdings werde ich frühestens morgen wieder antworten können.
Hoffe, du kommst damit zurecht :)
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.EnableEvents = False
Dim rng1 As Range
Dim ersteSpalte_Cut As Integer
Dim letzteSpalte_Cut As Integer
Dim ersteSpalte_Paste As Integer
Dim letzteSpalte_Paste As Integer
Dim ersteZeile As Integer
Dim letzteZeile As Integer
' erste Zeile allgemein (beide Ranges)
ersteZeile = 2
' letzte Zeile allgemein (beide Ranges)
letzteZeile = 60
' erste Spalte der Tabelle, aus der kopiert werden soll
ersteSpalte_Cut = 1
' letzte Spalte der Tabelle, aus der kopiert werden soll -> entspricht Spalte F
letzteSpalte_Cut = 6
' erste Spalte der Tabelle, in die eingetragen werden soll
ersteSpalte_Paste = 21
' letzte Spalte der Tabelle, in die eingetragen werden soll
letzteSpalte_Paste = 26
' Um die Ranges zu tauschen, einfach die 1 mit der 21 tauschen, und die 6 mit der 26.
' In diesem Bereich muss man klicken, damit die Daten verschoben werden -> entspricht  _
momentan Spalte F.
' Wenn man eine andere Zelle anklicken soll (nicht in Spalte F), dann muss hier statt " _
letzteSpalte_Cut"...
' ...der gewünschte Spaltenindex stehen (Spalte D wäre demnach 4, Spalte X wäre 24)
Set rng1 = Range(Cells(ersteZeile, letzteSpalte_Cut), Cells(letzteZeile, letzteSpalte_Cut))
' Hier wird kontrolliert, ob die aktuell ausgewählte Zelle im gewünschten Bereich ist (rng2) _
If Not Application.Intersect(Target, rng1) Is Nothing Then
Dim i As Integer
' Hier läuft eine Schleife von der ersten bis zur letzten Zeile
For i = ersteZeile To letzteZeile
' Hier wird kontrolliert, ob die Zelle leer ist (i ist die Zeile -> kommt von der  _
Schleife).
' Dadurch, dass von oben (ersteZeile) angefangen wird, erhalten wir hiermit die  _
erste Zeile, die leer ist -> i.
If Cells(i, ersteSpalte_Paste).Value = "" Then
Dim r As Integer
' Hier holt man sich die Zeile der Zelle, die momentan ausgewählt ist (target)  _
und speichert dies in "r".
r = Target.Row
' Hier wird die ausgewählte Zeile ausgeschnitten und im Anschluss in die andere  _
Range eingefügt.
Range(Cells(Target.Row, ersteSpalte_Cut), Cells(Target.Row, letzteSpalte_Cut)). _
Cut _
Range(Cells(i, ersteSpalte_Paste), Cells(i, letzteSpalte_Paste))
' Hier wird der gesamte Bereich unter der Zeile, welche gerade verschoben wurde, _
ausgeschnitten und ...
' ... um eine Zeile nach oben versetzt wieder eingefügt (Dadurch verschwindet  _
die leere Zeile).
Range(Cells(r + 1, ersteSpalte_Cut), Cells(letzteZeile, letzteSpalte_Cut)).Cut  _
Cells(r, ersteSpalte_Cut)
Exit For
End If
Next i
End If
Application.EnableEvents = True
End Sub
Gruß
Silas
Anzeige
AW: Cut/Paste bei Klick in Zelle
10.01.2017 15:25:51
Silas
Guck dir den Code etwas an und achte auf meine Kommentare.
Wenn du nun aus der 2. Range zurück in die 1. Range verschieben willst, dann musst du lediglich den Wert von "ersteSpalte_Cut" mit dem Wert von "ersteSpalte_Paste" tauschen. Genauso mit "letzteSpalte_Cut" und "letzteSpalte_Paste".
Wenn du eine andere Spalte (statt F) auswählen willst, um das Makro auszulösen, dann musst du bei der Wertzuweisung der Range "rng1" einen anderen Wert statt "letzteSpalte_Cut" eintragen.
In den Kommentaren des Codes steht nochmal alles was du wissen musst.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.EnableEvents = False
Dim rng1 As Range
Dim ersteSpalte_Cut As Integer
Dim letzteSpalte_Cut As Integer
Dim ersteSpalte_Paste As Integer
Dim letzteSpalte_Paste As Integer
''''''''' erste Spalte der Tabelle, aus der kopiert werden soll
ersteSpalte_Cut = 1
''''''' letzte Spalte der Tabelle, aus der kopiert werden soll -> entspricht Spalte F
letzteSpalte_Cut = 6
''''''''' erste Spalte der Tabelle, in die eingetragen werden soll
ersteSpalte_Paste = 21
''''''''' letzte Spalte der Tabelle, in die eingetragen werden soll
letzteSpalte_Paste = 26
''''''''' Um die Ranges zu tauschen, einfach die 1 mit der 21 tauschen, und die 6 mit der  _
26
'''''''' In diesem Bereich muss man klicken, damit die Daten verschoben werden ->  _
entspricht momentan Spalte F.
'''''''' Wenn man eine andere Zelle anklicken soll (nicht in Spalte F), dann muss hier  _
statt "letzteSpalte_Cut"...
''''''''' ...der gewünschte Spaltenindex stehen (Spalte D wäre demnach 4, Spalte X wäre 24)
Set rng1 = Range(Cells(2, letzteSpalte_Cut), Cells(60, letzteSpalte_Cut))
If Not Application.Intersect(Target, rng1) Is Nothing Then
Dim copy As Range
Dim lastrow As Integer
Dim i As Integer
For i = 2 To 60
If Cells(i, ersteSpalte_Paste).Value = "" Then
Dim r As Integer
r = Target.Row
Range(Cells(Target.Row, ersteSpalte_Cut), Cells(Target.Row, letzteSpalte_Cut)). _
Cut _
Range(Cells(i, ersteSpalte_Paste), Cells(i, letzteSpalte_Paste))
Range(Cells(r + 1, ersteSpalte_Cut), Cells(60, letzteSpalte_Cut)).Cut Cells(r,  _
ersteSpalte_Cut)
Exit For
End If
Next i
End If
Application.EnableEvents = True
End Sub
Falls noch etwas unverständlich ist, sag einfach Bescheid.
Anzeige
AW: Cut/Paste bei Klick in Zelle
12.01.2017 14:15:13
Olli
Hallo Silas,
da komme ich leider nicht mit klar.
Ich habe jetzt versucht folgendes zu basteln:
Bei Klick in Spalte J wird A-F der selben Spalte ausgeschnitten und in die erste freie Spalte U-Z rein kopiert.
Das gleiche soll andersrum genau so funktionieren.
Bei Klick in Spalte AD wird U-Z der selben Zeile ausgeschnitten und in die erste freie Spalte A-F eingefügt.
Egal was ich versucht habe, ich stoße nur auf Laufzeitfehler und "Fehler beim Kompilieren".
AW: Cut/Paste bei Klick in Zelle
13.01.2017 09:12:59
Olli
Hallo Silas,
ich habe alles hinbekommen, was ich wollte.
Die Erklärungen haben mir sehr geholfen, auch wenn ich der VBA Sprache immer noch nicht mächtig bin.
Ein entsprechendes Grundlagen Seminar ist aber für dieses Jahr in Planung.
Danke nochmal und Gruß
Anzeige
AW: Cut/Paste bei Klick in Zelle
13.01.2017 10:57:11
Silas
Hallo Olli,
sorry, dass ich erst so spät antworte, aber ich kam nicht früher dazu. Ich habe den Code jetzt nochmal so geändert, dass er genau das macht, was du willst und du ihn leicht verändern kannst. In den Kommentaren des Codes (Du weißt aber, was Kommentar und was Code ist, oder?) steht genau beschrieben, was du machen musst, um Änderungen vorzunehmen. Falls du das immer noch nicht verstehst, oder du noch mehr ändern willst, dann würde ich dir empfehlen, dich etwas in VBA einzulesen.
Hier der Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.EnableEvents = False
Dim rng As Range
Dim i As Integer
Dim r As Integer
Dim ersteSpalte_Range1 As String
Dim letzteSpalte_Range1 As String
Dim ersteSpalte_Range2 As String
Dim letzteSpalte_Range2 As String
Dim ersteZeile As Integer
Dim letzteZeile As Integer
Dim klickSpalte1 As String
Dim klickSpalte2 As String
Dim klickRange1 As Range
Dim klickRange2 As Range
' Dies ist die erste Zeile der beiden Tabellen/Ranges.
ersteZeile = 2
' Dies ist die letzte Zeile der beiden Tabellen/Ranges. Beide Werte kannst du verändern.
letzteZeile = 60
' Dies sind die Spalten, die den Bereich eingrenzen, der ausgeschnitten werden soll.
' Möchtest du statt den Spalten A-F die Spalten C-K ausschneiden, musst du hier das "A"  _
durch ein "C" ...
' ... und das "F" durch ein "K" ersetzen.
ersteSpalte_Range1 = "A"
letzteSpalte_Range1 = "F"
' Dies sind die Spalten, die den anderen Bereich eingrenzen, der ausgeschnitten werden soll. _
' Möchtest du statt den Spalten U-Z die Spalten S-Y ausschneiden, musst du hier das "U"  _
durch ein "S" ...
' ... und das "Z" durch ein "Y" ersetzen.
ersteSpalte_Range2 = "U"
letzteSpalte_Range2 = "Z"
' Im Folgenden gibt man die beiden Spalten an, auf die man drücken muss, um die Werte  _
auszuschneiden.
' Möchtest du auf Spalte "H" klicken, um die Spalten A-F auszuschneiden, ...
' ... musst du hier das "J" durch ein "H" ersetzen.
klickSpalte1 = "J"
' Möchtest du auf Spalte "T" klicken, um die Spalten U-Z auszuschneiden, ...
' ... musst du hier das "AD" durch ein "T" ersetzen usw.
klickSpalte2 = "AD"
Set klickRange1 = Range(Cells(ersteZeile, GetCol("" & klickSpalte1)), Cells(letzteZeile,  _
GetCol("" & klickSpalte1)))
Set klickRange2 = Range(Cells(ersteZeile, GetCol("" & klickSpalte2)), Cells(letzteZeile,  _
GetCol("" & klickSpalte2)))
Set rng = Union(klickRange1, klickRange2)
If Not Application.Intersect(Target, rng) Is Nothing Then
If ActiveCell.Column = GetCol("" & klickSpalte1) Then
For i = ersteZeile To letzteZeile
If Cells(i, GetCol("" & ersteSpalte_Range2)).Value = "" Then
r = Target.Row
Range(Cells(Target.Row, GetCol("" & ersteSpalte_Range1)), Cells(Target.Row,  _
GetCol("" & letzteSpalte_Range1))).Cut _
Range(Cells(i, GetCol("" & ersteSpalte_Range2)), Cells(i, GetCol("" &  _
letzteSpalte_Range2)))
Range(Cells(r + 1, GetCol("" & ersteSpalte_Range1)), Cells(letzteZeile,  _
GetCol("" & letzteSpalte_Range1))).Cut Cells(r, GetCol("" & ersteSpalte_Range1))
Exit For
End If
Next i
ElseIf ActiveCell.Column = GetCol("" & klickSpalte2) Then
For i = ersteZeile To letzteZeile
If Cells(i, GetCol("" & ersteSpalte_Range1)).Value = "" Then
r = Target.Row
Range(Cells(Target.Row, GetCol("" & ersteSpalte_Range2)), Cells(Target.Row,  _
GetCol("" & letzteSpalte_Range2))).Cut _
Range(Cells(i, GetCol("" & ersteSpalte_Range1)), Cells(i, GetCol("" &  _
letzteSpalte_Range1)))
Range(Cells(r + 1, GetCol("" & ersteSpalte_Range2)), Cells(letzteZeile,  _
GetCol("" & letzteSpalte_Range2))).Cut Cells(r, GetCol("" & ersteSpalte_Range2))
Exit For
End If
Next i
End If
End If
Application.EnableEvents = True
End Sub
Function GetCol(col As String) As Integer
GetCol = Range("" & col & "1").Column
End Function
Beachte, dass ich noch eine kleine Funktion (GetCol) geschrieben habe. Gibt man ihr den Buchstaben einer Spalte, bekommt man den Spaltenindex zurück (z.B. "H" -> 8).
Ich hoffe, du kannst jetzt damit arbeiten! Achte einfach nur auf den Abschnitt des Codes, der auch kommentiert ist.
Grüße
Silas
Anzeige
AW: Cut/Paste bei Klick in Zelle
13.01.2017 11:09:16
Olli
Hallo Silas,
Vielen Dank!
Mein Code tut jetzt genau das, was er tun soll.
Habe es anhand deiner letzten Beschreibung schon geschafft, auf meine Bedürfnisse umzuschreiben.
Hat wunderbar funktioniert!
Bin begeistert, und mein Chef auch ;)
AW: Cut/Paste bei Klick in Zelle
13.01.2017 11:32:35
Silas
Freut mich, dass ich dir helfen konnte! Und danke, dass du nochmal Feedback gegeben hast :)

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige