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

Forumthread: Zeile nach Beding. in anderes Tabellenblatt versch

Zeile nach Beding. in anderes Tabellenblatt versch
20.04.2017 11:19:07
Maria
Guten Morgen!
habe ein kleines Problemchen. Habe folgende Bsp-Datei: https://www.herber.de/bbs/user/113000.xlsm
Ich möchte nun, dass wenn in der Tabelle "AKTUELL" in der Spalte "J" ein "a" ist, dass die Zeile in das Tabellenblatt "ERLEDIGT" 1:1 verschoben wird, sortiert nach Datum und Uhrzeit (also Spalte B und C) und dass in dem Tabellenblatt "AKTUELL" alle nachfolgenden Zeilen hochrutschen, dass also keine Leerzeile entsteht.
Ich möchte an dieser Stelle erwähnen, dass mir bei einem ähnlichen Problem erfolgreich geholfen wurde (vielen Dank an dieser Stelle an Werner!), allerdings kann ich den Code nicht auf dieses Problem anpassen... weil ich keine Ahnung davon habe. ich habs mehrmals versucht und bin kläglich gescheitert!
Bitte um Hilfe.
Anzeige

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zeile nach Beding. in anderes Tabellenblatt versch
20.04.2017 12:37:37
Dieter
Hallo Maria,
du kannst das z.B. mit dem folgenden Programm machen:

Sub Verschieben()
Dim copVar As Variant
Dim letzteZeileA As Long
Dim letzteZeileE As Long
Dim wsA As Worksheet  ' Blatt "AKTUELL"
Dim wsE As Worksheet  ' Blatt "ERLEDIGT"
Dim zeileA As Long
Dim zeileE As Long
Set wsA = ThisWorkbook.Worksheets("AKTUELL")
Set wsE = ThisWorkbook.Worksheets("ERLEDIGT")
letzteZeileA = wsA.Cells(wsA.Rows.Count, "A").End(xlUp).Row
letzteZeileE = wsE.Cells(wsE.Rows.Count, "A").End(xlUp).Row
zeileE = letzteZeileE + 1
For zeileA = letzteZeileA To 2 Step -1
If wsA.Cells(zeileA, "J") = "a" Then
copVar = wsA.Cells(zeileA, "A").Resize(1, 10)
wsE.Cells(zeileE, "A").Resize(1, 10) = copVar
wsA.Rows(zeileA).Delete
zeileE = zeileE + 1
End If
Next zeileA
If zeileE > 2 Then
With wsE.Sort
With .SortFields
.Clear
.Add Key:=wsE.Range("B2")
.Add Key:=wsE.Range("C2")
End With
.Header = xlYes
.SetRange Rng:=wsE.UsedRange
.Apply
End With
End If
End Sub
Ich habe das Programm in deine Arbeitsmappe eingefügt:
https://www.herber.de/bbs/user/113004.xlsm
Viele Grüße
Dieter
Anzeige
AW: Zeile nach Beding. in anderes Tabellenblatt versch
20.04.2017 12:48:55
Maria
hi, auf den ersten Blick super. Kann man noch irgendwie machen, dass er die Schaltflächen mit überträgt?
AW: Zeile nach Beding. in anderes Tabellenblatt versch
20.04.2017 15:03:41
Dieter
Hallo Maria,
das könnte dann z.B. so aussehen:

Sub Verschieben()
Dim copVar As Variant
Dim letzteZeileA As Long
Dim letzteZeileE As Long
Dim wsA As Worksheet  ' Blatt "AKTUELL"
Dim wsE As Worksheet  ' Blatt "ERLEDIGT"
Dim zeileA As Long
Dim zeileE As Long
Set wsA = ThisWorkbook.Worksheets("AKTUELL")
Set wsE = ThisWorkbook.Worksheets("ERLEDIGT")
letzteZeileA = wsA.Cells(wsA.Rows.Count, "A").End(xlUp).Row
letzteZeileE = wsE.Cells(wsE.Rows.Count, "A").End(xlUp).Row
zeileE = letzteZeileE + 1
For zeileA = letzteZeileA To 2 Step -1
If wsA.Cells(zeileA, "J") = "a" Then
copVar = wsA.Cells(zeileA, "A").Resize(1, 10)
wsE.Cells(zeileE, "A").Resize(1, 10) = copVar
wsA.Cells(zeileA, "K").Copy Destination:=wsE.Cells(zeileE, "K")
wsA.Rows(zeileA).Delete
zeileE = zeileE + 1
End If
Next zeileA
If zeileE > 2 Then
With wsE.Sort
With .SortFields
.Clear
.Add Key:=wsE.Range("B2")
.Add Key:=wsE.Range("C2")
End With
.Header = xlYes
.SetRange Rng:=wsE.UsedRange
.Apply
End With
End If
End Sub
Viele Grüße
Dieter
Anzeige
AW: Zeile nach Beding. in anderes Tabellenblatt versch
20.04.2017 16:07:38
Maria
funktioniert wunderbar! kann ich das in der endlos schleife haben? damit ich das makro nicht immer wieder abspielen muss? (heißt das so? ist das mit einer "endlos schleife" gemeint?)
AW: Zeile nach Beding. in anderes Tabellenblatt versch
21.04.2017 09:57:37
Dieter
Hallo Maria,
das was du meinst, ist eine Ereignisprozedur, die auf das Ereignis "Änderung eines Wertes in einem bestimmten Tabellenblatt" wartet und bei Eintreten darauf reagiert, also eine Worksheet_Change-Prozedur.
Diese Prozedur steht im Code-Modul des Blattes "AKTUELL" (zu sehen ist die Prozedur, wenn die im Projektexplorer einen Doppelklick auf "Tabelle1(AKTUELL)" machst).

Private Sub Worksheet_Change(ByVal Target As Range)
Dim copVar As Variant
Dim wsE As Worksheet  ' Blatt "ERLEDIGT"
Dim zeileA As Long
Dim zeileE As Long
If Target.Cells.Count > 1 Then Exit Sub
If Target.Column  10 Then Exit Sub
If Target.Row = 1 Then Exit Sub
If Target = "a" Then
Application.EnableEvents = False
zeileA = Target.Row
Set wsE = ThisWorkbook.Worksheets("ERLEDIGT")
zeileE = wsE.Cells(wsE.Rows.Count, "A").End(xlUp).Row + 1
copVar = Me.Cells(zeileA, "A").Resize(1, 10)
wsE.Cells(zeileE, "A").Resize(1, 10) = copVar
Me.Cells(zeileA, "K").Copy Destination:=wsE.Cells(zeileE, "K")
Me.Rows(zeileA).Delete
If zeileE > 1 Then
With wsE.Sort
With .SortFields
.Clear
.Add Key:=wsE.Range("B2")
.Add Key:=wsE.Range("C2")
End With
.Header = xlYes
.SetRange Rng:=wsE.UsedRange
.Apply
End With
End If
Application.EnableEvents = True
End If
End Sub

https://www.herber.de/bbs/user/113026.xlsm
Übrigens ist eine Endlosschleife etwas sehr Unerwünschtes, nämlich eine Schleife, die nicht mehr aufhört zu arbeiten und nur mit Gewalt gestoppt werden kann.
Viele Grüße
Dieter
Anzeige
AW: Zeile nach Beding. in anderes Tabellenblatt versch
25.04.2017 08:15:15
Maria
Userbild
geht nicht... was stört da?
AW: Zeile nach Beding. in anderes Tabellenblatt versch
25.04.2017 09:59:11
fcs
Hallo Maria,
das Makro musst du mit den Schaltflächen im Blatt "AKTUELL" starten. In der Zeile mit dem Fehler wird der variablen oSchalter das Objekt(Form, Formularschaltfläche) zugewiesen, mit dem das Makro gestartet wurde.
Startest du das Makro anders -zum Beispiel direkt üner das Menü, dann gibt es den Fehler.
ggf. musst du den Schaltflächen das Makro "Drucken" neu zuweisen, da zumindest jetzt nach dem runterladen der Datei von Dieter bei mir der Link des Makros der Schaltflächen in eine andere Datei zeigt.
Gruß
Franz
Anzeige
AW: Zeile nach Beding. in anderes Tabellenblatt versch
25.04.2017 10:13:59
Maria
ja, ich hab das modulfenster zugemacht und schon hat es geklappt, weil ich mich ja nicht mehr darin befand sondern in der tabelle aktuell... ))) ich lerne hier ja jeden tag dazu! danke für die antwort :-)
AW: Zeile nach Beding. in anderes Tabellenblatt versch
25.04.2017 10:05:42
Maria
also an sich funktioniert es, ich denke, ich darf das Modulfenster nicht auf haben, sonst bockt er. hab es zu, und es funktioniert, warum auch immer.. verstehe ich nicht so ganz.
aber was ich mit einer endlosschlaufe meinte, was ja eigentlich das ereignisprozedur heißt.. also wenn ich jetzt die datei neu öffne und dann in die eine spalte das häkchen setze, dann schiebt er das nicht rüber. dann muss ich wieder der code aufmachen und auf makro abspielen klicken, erst dann passiert was. kann man das automatisch einstellen?
Anzeige
AW: Zeile nach Beding. in anderes Tabellenblatt versch
25.04.2017 10:38:57
Werner
Hallo Maria,
das Makro zum Verschieben der entsprechenden Zeilen gehört ins CodeModul des Blattes "AKTUELL" und dort ins Worksheet_Change Ereignis. Vermutlich hast du das in einem allgemeinen Modul.
Hier mal jetzt noch meine Version.
https://www.herber.de/bbs/user/113094.xlsm
Gruß Werner
Anzeige
AW: Zeile nach Beding. in anderes Tabellenblatt versch
25.04.2017 12:50:49
Maria
aha, so funkt! wußte ich auch nicht, wofür das ist... vielen lieben dank!
da ich aber noch eine spalte (wusste ich erst heute) dazu einfügen soll, werde ich das von Dieter nehmen, weil ich da den Inhalt eher nachvollziehen kann und die Spalten abändern kann. weil hier in diesem blicke ich nicht so durch...
aber wenn einfach, bitte erklären: warum, wenn die zeile rüberkopiert wird, wird in dem tabellenblatt alles markiert? warum ist das so?
Anzeige
AW: Zeile nach Beding. in anderes Tabellenblatt versch
20.04.2017 12:47:37
fcs
Hallo Maria,
mit folgendem Makro sollte das Verschieben und Sortieren funktionieren.
Gruß
Franz
Sub ErledigtVerschiebn()
Dim Zeile_Q As Long, Zeile_Z, Zeile As Long, Zeile_L As Long
Dim bolVerschoben As Boolean
Dim StatusCalc As Long, StatusCopyObjects As Boolean
Dim wksQ As Worksheet, wksZ As Worksheet
Set wksQ = ActiveWorkbook.Worksheets("AKTUELL")
Set wksZ = ActiveWorkbook.Worksheets("ERLEDIGT")
With Application
'ggf. Status für Kopieren von Objekten mit Zellen anpassen, damit Schaltflächen mit  _
verschoben werden
StatusCopyObjects = Application.CopyObjectsWithCells
If StatusCopyObjects = False Then
Application.CopyObjectsWithCells = True
End If
'Makrobremsen lösen
.ScreenUpdating = False
.EnableEvents = False
StatusCalc = .Calculation
.Calculation = xlCalculationManual
End With
With wksZ
'letzte Zeile im Zielblatt,, Spalte A
Zeile_L = .Cells(.Rows.Count, 1).End(xlUp).Row
Zeile_Z = Zeile_L
End With
With wksQ
'letzte Datenzeile im Quellblatt, Spalte A
Zeile_L = .Cells(.Rows.Count, 1).End(xlUp).Row
If Zeile_L > 1 Then
For Zeile_Q = 2 To Zeile_L
If .Cells(Zeile_Q, 10).Text = "a" Then 'erledigt
'Zeile verschieben
Zeile_Z = Zeile_Z + 1
.Rows(Zeile_Q).Cut Destination:=wksZ.Rows(Zeile_Z)
bolVerschoben = True 'Merker, das mindestens eine Zeile verschoben wurde
End If
Next
If bolVerschoben = True Then
'leerzeilen löschen in AKTUELL
With .Range(.Cells(2, 1), .Cells(Zeile_L, 1))
.SpecialCells(xlCellTypeBlanks).EntireRow.Delete Shift:=xlShiftUp
End With
With wksZ
'Einträge in "ERLEDIGT" nach Datum/Zeit aufsteigend sortieren
With .Range(.Rows(1), .Rows(Zeile_Z))
.Sort Key1:=.Range("B1"), Order1:=xlAscending, _
key2:=.Range("C1"), order2:=xlAscending, Header:=xlYes
End With
End With
End If
MsgBox "F E R T I G", vbOKOnly, "erledigte verschieben"
Else
MsgBox "keine Daten vorhanden in Blatt """ & wksQ.Name & """", _
vbOKOnly, "erledigte verschieben"
End If
End With
With Application
'Status ggf wierde zurücksetzen
If StatusCopyObjects  Application.CopyObjectsWithCells Then
Application.CopyObjectsWithCells = StatusCopyObjects
End If
'Makrobremsen zurücksetzen
.ScreenUpdating = True
.EnableEvents = True
.Calculation = StatusCalc
End With
End Sub

Anzeige
AW: Nachfragen
20.04.2017 12:47:43
Werner
Hallo Maria,
jetzt alles wieder umgeschmissen? Nichts mehr mit Pulldown?
Ein paar Fragen dazu:
Du hast eine Schaltfläche "Erledigte verschieben" auf dem Blatt "AKTUELL"
1. soll jetzt nur dann verschoben werden, wenn die Schaltfläche betätigt wird?
2. also nicht mehr automatisch, sobald in Spalte J das a eingetragen wird?
3. wie soll in "ERLEDIGT" soriert werden? Aktuellstes Datum oben, aktuellste Uhrzeit oben?
4. soll auch noch die Möglichkeit rein, dass die Daten aus "ERLEDIGT" wieder zurück nach "AKTUELL" sollen?
Warte auf deine Antworten.
Gruß Werner
Anzeige
AW: Nachfragen
20.04.2017 12:59:32
Maria
Hallo Werner!
nee, nichts umgeschmissen! das ist eine andere liste. das ist quasi die original telefonliste, bei der du mir mit dem "ausdrucken wenn man die schlatfläche anklickt" geholfen hast. mit der anderen ist der chef sehr zufrieden. jetzt will er die telefonliste auch so haben, dass die zeile aus seinen augen verschwindet, wenn er ein häkchen in spalte J setzt.
auf deine fragen:
1. nein, die schaltfläche ist ja zum ausdrucken da.
2. doch (darum brauche ich eine endlos-schleife (heißt das so?), damit ich das makro nicht immer wieder starten muss)
3. ich habs mir grad noch mal angeguckt, nach Spalte A, also die laufende Nummer
4. nein, in diesem fall nicht! aber, es wäre super, wenn die schaltflächen mit übertragen werden, weil ich kann es mir jetzt schon denken, der chef das ein oder das andere doch noch im nachhinein ausdrucken wollen wird...
wie gesagt, es handelt sich um die Ursprungstelefonliste. Genauso ist sie bei mir auf dem PC, nur mit anderem Inhalt.
Anzeige
AW: Nachfragen
20.04.2017 14:24:48
Werner
Hallo Maria,
ich dachte das soll automatisch passieren, sobald in Spalte J der Haken gesetzt wird?
Jetzt auf einmal doch mit einem separaten Button?
Na dann hast du ja jetzt deine Lösungen.
Gruß Werner
AW: Nachfragen
20.04.2017 15:59:20
Maria
hä? der Button ist zum drucken da, nicht damit die zeile in eine andere tabelle verschoben wird. ich brauche einen code, damit wenn man in der spalte J ein häkchen setzt, dann die zeile verschoben wird. habe ich was falsches geschrieben, oder reden wir jetzt an einander vorbei? die schaltflächen (die zum ausdrucken da sind) sollten möglichst mit auf das andere tabellenblatt übertragen werden, damit man auch von diesem tabellenblatt ausdrucken kann.
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Zeilen automatisch in ein anderes Tabellenblatt verschieben


Schritt-für-Schritt-Anleitung

Um Excel-Zeilen automatisch zu verschieben, wenn eine bestimmte Bedingung erfüllt ist, kannst Du das folgende VBA-Makro verwenden. Dieses Beispiel basiert auf der Annahme, dass Du in der Tabelle "AKTUELL" in Spalte J ein "a" setzt, um die Zeilen in das Tabellenblatt "ERLEDIGT" zu verschieben.

  1. Öffne Deine Excel-Datei und drücke ALT + F11, um den VBA-Editor zu starten.

  2. Klicke mit der rechten Maustaste auf das Tabellenblatt "AKTUELL" im Projekt-Explorer und wähle "Code anzeigen".

  3. Füge den folgenden Code ein:

    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim copVar As Variant
        Dim wsE As Worksheet  ' Blatt "ERLEDIGT"
        Dim zeileA As Long
        Dim zeileE As Long
    
        If Target.Cells.Count > 1 Then Exit Sub
        If Target.Column <> 10 Then Exit Sub  ' Spalte J
        If Target.Row = 1 Then Exit Sub
    
        If Target = "a" Then
            Application.EnableEvents = False
            zeileA = Target.Row
            Set wsE = ThisWorkbook.Worksheets("ERLEDIGT")
            zeileE = wsE.Cells(wsE.Rows.Count, "A").End(xlUp).Row + 1
            copVar = Me.Cells(zeileA, "A").Resize(1, 10)
            wsE.Cells(zeileE, "A").Resize(1, 10) = copVar
            Me.Rows(zeileA).Delete
            Application.EnableEvents = True
        End If
    End Sub
  4. Speichere die Änderungen (STRG + S) und schließe den VBA-Editor.

Jetzt wird die Zeile in das Tabellenblatt "ERLEDIGT" verschoben, sobald Du in Spalte J ein "a" setzt.


Häufige Fehler und Lösungen

  • Fehler 1: Das Makro funktioniert nicht.

    • Überprüfe, ob das Makro im richtigen Code-Modul (im Blatt "AKTUELL") eingefügt wurde.
  • Fehler 2: Schaltflächen werden nicht übertragen.

    • Stelle sicher, dass Du die Schaltflächen in der Zeile kopierst, bevor Du die Zeile löschst. Füge den entsprechenden Code in das Makro ein.
  • Fehler 3: Excel bleibt hängen.

    • Achte darauf, dass Du Application.EnableEvents = False verwendest, um unerwünschte Schleifen zu vermeiden.

Alternative Methoden

Wenn Du nicht mit VBA arbeiten möchtest, kannst Du die Excel-Funktion FILTER verwenden, um bestimmte Zeilen basierend auf Bedingungen in ein neues Tabellenblatt zu kopieren. Allerdings ist dies nicht so automatisiert wie das Makro.

  1. Wähle eine Zelle in deinem neuen Tabellenblatt.
  2. Verwende die Formel:
    =FILTER(AKTUELL!A:J, AKTUELL!J:J="a")
  3. Diese Formel filtert die Zeilen aus der Tabelle "AKTUELL", wo in Spalte J ein "a" steht.

Praktische Beispiele

Hier sind einige Beispiele, wie Du das Makro anpassen kannst:

  • Beispiel 1: Zeilen mit einem anderen Wert in Spalte J verschieben.

    Ändere If Target = "a" zu If Target = "b" für eine andere Bedingung.

  • Beispiel 2: Übertrage nur bestimmte Spalten.

    Ändere copVar = Me.Cells(zeileA, "A").Resize(1, 10) zu copVar = Me.Cells(zeileA, "A").Resize(1, 5) um nur die ersten fünf Spalten zu übertragen.


Tipps für Profis

  • Automatisierung optimieren: Verwende Application.ScreenUpdating = False, um die Performance zu verbessern, wenn viele Zeilen verschoben werden.

  • Makro an Schaltfläche binden: Du kannst das Makro mit einer Schaltfläche im Tabellenblatt verknüpfen, sodass Benutzer es einfach ausführen können.

  • Ereignisprozeduren nutzen: Nutze das Worksheet_Change-Ereignis für mehr Flexibilität, um auf Änderungen in anderen Zellen zu reagieren.


FAQ: Häufige Fragen

1. Kann ich das Makro auch für andere Spalten verwenden? Ja, du kannst die Spaltennummer in If Target.Column <> 10 ändern, um es für andere Spalten anzupassen.

2. Wie kann ich die Zeilen zurück nach "AKTUELL" verschieben? Du kannst ein ähnliches Makro erstellen, das die Zeilen von "ERLEDIGT" wieder in "AKTUELL" kopiert.

3. Funktioniert das in allen Excel-Versionen? Ja, das Makro sollte in allen modernen Excel-Versionen funktionieren, die VBA unterstützen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige