Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Zeile kopieren wenn bedingung Ja erfüllt ist

Zeile kopieren wenn bedingung Ja erfüllt ist
03.01.2019 08:52:47
Peter
Guten Tag zusammen.
Ich habe ein gutes Script im Netz gefunden um Zeilen zu kopieren wenn die Bedingung erfüllt ist.
Da ich mit VBA noch nicht lange arbeite, habe ich natürlich auch schon die ersten Probleme.
Wenn ich das Script ausführe, werden nicht alle Zeilen kopiert die ein "Ja" in Spalte R enthalten. Muss ich da noch was ergänzen?
Die letzten vier Zeilen die auch mit "Ja" markiert wurden, werden jeweils nicht in die Tabelle2 kopiert.
Sub BedingteKopieZeilen()
Dim Zeile As Long
Dim ZeileMax As Long
Dim n As Long
With Tabelle1
ZeileMax = .UsedRange.Rows.Count
n = 5
For Zeile = 1 To ZeileMax
If .Cells(Zeile, 18).Value = "Ja" Then
.Rows(Zeile).Copy Destination:=Tabelle2.Rows(n)
n = n + 1
End If
Next Zeile
End With
End Sub

Anzeige

29
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zeile kopieren wenn bedingung Ja erfüllt ist
03.01.2019 08:57:40
Hajo_Zi

Option Explicit
Sub BedingteKopieZeilen()
Dim Zeile As Long
Dim ZeileMax As Long
Dim n As Long
With Tabelle1
ZeileMax = .UsedRange.SpecialCells(xlCellTypeLastCell).Row
n = 5
For Zeile = 1 To ZeileMax
If .Cells(Zeile, 18).Value = "Ja" Then
.Rows(Zeile).Copy Destination:=Tabelle2.Rows(n)
n = n + 1
End If
Next Zeile
End With
End Sub

Beiträge von Werner, Luc, robert, J.O.Maximo und folgende lese ich nicht.
Die Beiträge werden auch ignoriert, es erfolgt keine Antwort.
Anzeige
AW: Zeile kopieren wenn bedingung Ja erfüllt ist
03.01.2019 09:12:18
Peter
Hallo Hajo
Herzlichen Dank! Funktioniert einwandfrei.
Dann lag es wohl bei der Bezeichnung "UsedRange.SpecialCells(xlCellTypeLastCell).Row"
Was bedeutet das mit dem Option Explicit? Wo und wie wende ich es an?
AW: Zeile kopieren wenn bedingung Ja erfüllt ist
03.01.2019 09:18:18
Hajo_Zi
das bedeutet das alle variablen vor der erten Verwendung definiert werden müssen. das kann man unter Optionen eionstellen.
Das machen nur Programmierer, Laien machen das fast nie.
Gruß Hajo
Anzeige
AW: Zeile kopieren wenn bedingung Ja erfüllt ist
03.01.2019 09:21:34
Peter
Danke Hajo, wieder was dazu gelernt.
AW: Zeile kopieren wenn bedingung Ja erfüllt ist
03.01.2019 09:13:46
Werner
Hallo Peter,
also ich würde die letzte belegte Zeile nicht über UsedRange ermitteln. Zudem zählst du in deiner Version die vorhandenen Zeilen in deinem UsedRange und stellst nicht die letzte belegte Zeile fest.
Die Schlefe zum Löschen dann aber von hinten nach vorne laufen lassen.
Sub BedingteKopieZeilen()
Dim Zeile As Range, n As Long
Application.Screenupdating = False
n = 5
With Tabelle1
For Zeile = .Cells(.Rows.Count, 18).End(xlUp).Row To 1 Step -1
If .Cells(Zeile, 18).Value = "Ja" Then
.Rows(Zeile).Copy Destination:=Tabelle2.Rows(n)
n = n + 1
End If
Next Zeile
End With
End Sub
Gruß Werner
Anzeige
AW: Zeile kopieren wenn bedingung Ja erfüllt ist
03.01.2019 09:19:39
Peter
Hallo Werner
Danke für dein Tipp.
Leider kommt beim Auslösen des Scripts ein Fehler. Das Wort Zeile wird dabei markiert und der Fehler lautet Typen unverträglich.
AW: Zeile kopieren wenn bedingung Ja erfüllt ist
03.01.2019 09:23:45
Werner
Hallo Peter,
mein Fehler, Zeile muss als Long Dimensioniert werden und nicht als Range.
Gruß Werner
AW: Zeile kopieren wenn bedingung Ja erfüllt ist
03.01.2019 09:26:43
Werner
Hallo Peter,
außerdem löschst du die Zeile im Blatt 1 ja gar nicht (keine Ahnung wie ich da drauf gekommen bin). Also braucht die Schleife auch nicht von unten nach oben zu laufen.
Sub BedingteKopieZeilen()
Dim Zeile As Long, n As Long
Application.ScreenUpdating = False
n = 5
With Tabelle1
For Zeile = 1 To .Cells(.Rows.Count, 18).End(xlUp).Row
If .Cells(Zeile, 18).Value = "Ja" Then
.Rows(Zeile).Copy Destination:=Tabelle2.Rows(n)
n = n + 1
End If
Next Zeile
End With
End Sub
Gruß Werner
Anzeige
AW: Zeile kopieren wenn bedingung Ja erfüllt ist
03.01.2019 09:33:58
Peter
Hallo Werner
Funktioniert jetzt auch.
Nun bin ich etwas ratlos. Was ist an deinem Script besser als das von Hajo? Oder besser gesagt, wo liegen die Vorteile?
AW: Zeile kopieren wenn bedingung Ja erfüllt ist
03.01.2019 09:51:31
Werner
Hallo Peter,
weil die Feststellung der letzten belegten Zeile über UsedRange ein "unsicherer" Kandidat ist.
Das ist nur dann zuverlässig, wenn Excel zuvor gespeichert wurde.
Teste mal mit folgender Datei:
1. direkt nach Öffnen der Datei mal auf die Schaltfläche klicken
In einer Messagebox wird dir jetzt zunächst die letzte belegte Zeile ausgegeben ermittelt über
UsedRange
In einer Messagebox wird dir dann die letzte belegte Zeile ausgegeben ermittelt über
Cells.Rows.Count
Ergebnis: Beide Werte sind gleich
2. Schreib in Spalte A, direkt in die erste freie Zeile mal ein Datum und klick danach wieder auf die Schaltfläche
Messagebox letzte Zeile über UsedRange
Messagebox letzte Zeile über Cells.Rows.Count
Ergebnis: Beide Werte sind gleich
3. Lösch das Datum in Spalte A wieder (Zelle auswählen und Entfernen Taste) und klick auf die Schaltfläche
Messagebox letzte Zeile über UsedRange
Messagebox letzte Zeile über Cells.Rows.Count
Jetzt gibt dir Excel einen "falschen" Wert in der ersten Messagebox aus. Das liegt daran, dass die Zelle für Excel noch zum UsedRange gehört, weil sie vorher mit dem Datum belegt war, obwohl sie zwischenzeitlich leer ist. Das wird nur zuverlässig angepasst, wenn Excel zuvor gespeichert wurde.
https://www.herber.de/bbs/user/126451.xlsm
Gruß Werner
Anzeige
AW: Zeile kopieren wenn bedingung Ja erfüllt ist
03.01.2019 10:42:21
Peter
Hallo Werner
Herzlichen Dank für deine sehr Ausführliche Erklärung. Leuchtet ein und macht Sinn. Zumal man nicht davon ausgehen kann dass jeder die Tabelle vor dem auslösen des Scripts speichert.
Ich wünsche dir noch einen angenehmen Tag.
Gruss Peter
AW: Zeile kopieren wenn bedingung Ja erfüllt ist
03.01.2019 11:20:28
Peter
äm Werner
Darf ich noch eine Frage stellen?
Da mit dem Script die ganze Zeile kopiert wird und die Formeln gleich mit, kann man auch definieren bis wo (welche Spalte) kopiert werden soll?
Dann überschreibt es mir nicht die Formeln in der Zieldatei.
Anzeige
AW: Zeile kopieren wenn bedingung Ja erfüllt ist
03.01.2019 12:55:55
Peter
äm Werner
Darf ich noch eine Frage stellen?
Da mit dem Script die ganze Zeile kopiert wird und die Formeln gleich mit, kann man auch definieren bis wo (welche Spalte) kopiert werden soll?
Dann überschreibt es mir nicht die Formeln in der Zieldatei.
AW: Zeile kopieren wenn bedingung Ja erfüllt ist
03.01.2019 15:34:42
Werner
Hallo Peter,
aber klar doch.
Sub BedingteKopieZeilen()
Dim Zeile As Long, n As Long
Application.ScreenUpdating = False
n = 5
With Tabelle1
For Zeile = 1 To .Cells(.Rows.Count, 18).End(xlUp).Row
If .Cells(Zeile, 18).Value = "Ja" Then
.Range(.Cells(Zeile, 1), .Cells(Zeile, 5)).Copy Tabelle2.Rows(n)
n = n + 1
End If
Next Zeile
End With
End Sub
Im Codebeispiel wird der Bereich von Spalte A (.Cells(Zeile, 1)
bis Spalte E (.Cells(Zeile, 5) kopiert.
Gruß Werner
Anzeige
AW: Zeile kopieren wenn bedingung Ja erfüllt ist
04.01.2019 06:32:41
Peter
Guten Morgen Werner
Herzlichen Dank für deine Ausführung. Langsam verstehe ich die Prozedur.
Anstelle des Rows wird nun der Bereich Cells vor dem Kopieren definiert. Nun, es wird wahrscheinlich noch dauern bis ich das vba verstehe. Aber anhand von solchen Erklärungen wie du sie geschrieben hast, kann ich das ganze auch nachvollziehen.
liebe Grüsse Peter
Anzeige
AW: Zeile kopieren wenn bedingung Ja erfüllt ist
04.01.2019 07:43:04
Peter
Hallo Werner
Nun habe ich probiert anhand von zwei Merkmalen den Script zu erweitern. Habe aber jetzt einen Fehler.
Meine Liste soll eben anhand vom Jahr (_2019, _2020 usw.) und wenn da schon was gemacht wurde, mit dem Kriterium (Ja) in die jeweiligen Tabellen vom Jahr _2019 usw. verschoben werden. Daher meine Komplizierte Lösung.
Sub BedingteKopieZeilen19()
ActiveSheet.Unprotect Password:=""
Tabelle10.Unprotect Password:=""
Dim Zeile As Long, n As Long
Application.ScreenUpdating = False
n = 5
With Tabelle7
For Zeile = 1 To .Cells(.Rows.Count, 7).End(xlUp).Row
If .Cells(Zeile, 7).Value = "_2019" Then
For Zeile = 1 To .Cells(.Rows.Count, 25).End(xlUp).Row
If .Cells(Zeile, 25).Value = "Ja" Then
.Range(.Cells(Zeile, 1), .Cells(Zeile, 19)).Copy Tabelle10.Rows(n)
n = n + 1
End If
Next Zeile
End With
ActiveSheet.Protect Password:=""
Tabelle10.Protect Password:=""
End Sub

Anzeige
AW: Zeile kopieren wenn bedingung Ja erfüllt ist
04.01.2019 08:49:44
Werner
Hallo Peter,
1. du kannst nicht zweimal die gleiche For - Steuervariabel im gleichen Code verwenden. Aber das hat dir der Debugger ja bereits gesagt.
2. Wenn du zwei For- Schleifen hast, dann brauchst du auch zweimal Next. Aber die zweite For-Schleife brauchst du gar nicht
3. Wenn du einen Blattschutz ohne Kennwort hast, dann brauchst du beim Entsperren/Sperren das nicht anzugeben.
Versuch mal:
Sub BedingteKopieZeilen19()
Dim Zeile As Long, n As Long
Application.ScreenUpdating = False
ActiveSheet.Unprotect
Tabelle10.Unprotect
n = 5
With Tabelle7
For Zeile = 1 To .Cells(.Rows.Count, 7).End(xlUp).Row
If .Cells(Zeile, 7).Value = "_2019" Then
If .Cells(Zeile, 25).Value = "Ja" Then
.Range(.Cells(Zeile, 1), .Cells(Zeile, 19)).Copy Tabelle10.Rows(n)
n = n + 1
End If
End If
Next Zeile
End With
ActiveSheet.Protect
Tabelle10.Protect
End Sub
Du prüfst in der Schleife erst, ob in Zelle G? "_2019" steht, wenn ja dann prüfst du ob in Zelle S? ein "Ja" steht. Sind beide Bedinungen erfüllt, dann wird kopiert. Ist eine der beiden Bedingungen nicht erüllt, dann wird nicht kopiert.
Gruß Werner
Anzeige
AW: Zeile kopieren wenn bedingung Ja erfüllt ist
04.01.2019 09:12:43
Peter
Hallo Werner
Ah, man schliesst lediglich die zwei If mit End If und End If ab, dann kann man mehrere Abfragen (wie in unserem Beispiel) hineinpacken.
Das mit dem Passwort ist eigentlich so gedacht dass wenn alles steht, ein Passwort hineingeschrieben wird und ich jetzt nicht immer das Passwort eingeben muss um das Blatt zu entsperren. Habe ich jetzt aber so gemacht wie du es vorgeschlagen hast.
Das ganze habe ich unterdessen auch schon ausprobiert und klappt hervorragend. Vielen lieben Dank!
Ich hoffe dass ich auch mal helfen kann, wenn jemand mal rat braucht.
liebe Grüsse Peter
Anzeige
Anmerkung
04.01.2019 10:43:58
Werner
Hallo Peter,
jetzt stellt sich lediglich die Frage von wievielen Daten wir da sprechen. Wenn es sich um eine größere Datenmenge handelt, die beide Bedingungen erfüllen und kopiert werden sollen, dann ist eine zeilenweise Abarbeitung (viele einzelne Kopiervorgänge) per Schleife zu langsam und ich würde da einen völlig anderen Ansatz (Autofilter per Makro) wählen.
Aber die Frage kannst nur du beantworten.
Gruß Werner
Anzeige
AW: Anmerkung
04.01.2019 11:09:08
Peter
Hallo Werner
Ach so. Ich habe im meinem File bis zu 1000 Zeilen die abgearbeitet werden müssen. Leider kann ich dir mein File aus Datenschutzgründen nicht zeigen, sonnst würdest du sofort sehen was ich meine oder wie ich es gedacht habe aufzubauen.
Es geht um Verträge die an einem bestimmten Datum Reguliert werden müssen. Sobald die Regulierung geschehen ist, sollen natürlich die neu dazukommenden Datensätze die alten nicht überschreiben. Daher das hin und her kopieren.
Anzeige
Was hindert dich daran...
04.01.2019 12:57:13
Werner
Hallo Peter,
...die Datei zu nanonymisieren. Deine Datei (Aufbau wie im Original) mit 10-15 Datensätzen würde reichen.
Gruß Werner
AW: Was hindert dich daran...
04.01.2019 13:18:46
Peter
Dann muss ich schauen wie ich das übers Wochenende rasch nachbauen kann (auf meinem Privaten PC) Denn bei uns in der Firma wird IT-Mässig alles gesperrt und Verschlüsselt. Wird ein Excel Extern verschickt, stehen schon die Sicherheitsleute auf der Matte.
Bilder kann man hier nicht einfügen?
Anzeige
AW: Was hindert dich daran...
04.01.2019 13:20:42
Werner
Hallo Peter,
schon, aber was soll ich mit einem Bild? Dann sollte ich auch noch wissen welcher Bereich dann letztendlich kopiert werden soll. Von Spalte ? bis Spalte ?
Gruß Werner
AW: Was hindert dich daran...
04.01.2019 13:30:21
Peter
Dann muss ich es nachbauen. Alles andere ist gesperrt. Sogar per USB kann ich nichts Speichern.
AW: Was hindert dich daran...
04.01.2019 13:33:14
Werner
Hallo Peter,
dann warte ich mal. Aber bitte die Datei als .xlsx hier einstellen (also ohne Makros). Bin am Wochenende am Arbeiten und .xlsm kann ich an meinem Arbeitsplatz nicht öffnen.
Gruß Werner
Anzeige
AW: Was hindert dich daran...
06.01.2019 12:40:54
Peter
Leider kann ich dir .xlsx Datei nich auswählen um hochzuladen. Weis nich wieso?
Alles genau gelesen, was auf der Uploadseite
06.01.2019 13:03:04
Daniel
Geschrieben steht und auch beachtet?
Wenn man das tut, sollte der Upload auch funktionieren.
Gruß Daniel
AW: Alles genau gelesen, was auf der Uploadseite
07.01.2019 07:19:00
Peter
Eventuell liegt es am Mac. Wenn ich das File auswählen möchte, ist es nur grau markiert und kann nicht ausgewählt werden.
Anzeige
Gerne u. Danke für die Rückmeldung. o.w.T.
03.01.2019 11:21:21
Werner
;

Forumthreads zu verwandten Themen

Anzeige
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 in ein anderes Tabellenblatt kopieren, wenn die Bedingung erfüllt ist


Schritt-für-Schritt-Anleitung

Um Zeilen in ein anderes Tabellenblatt zu kopieren, wenn die Bedingung erfüllt ist, kannst du das folgende VBA-Skript verwenden. In diesem Beispiel wird geprüft, ob in Spalte R der Wert "Ja" steht.

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Klicke auf Einfügen und wähle Modul, um ein neues Modul zu erstellen.

  3. Füge den folgenden Code in das Modul ein:

    Sub BedingteKopieZeilen()
        Dim Zeile As Long
        Dim ZeileMax As Long
        Dim n As Long
        With Tabelle1
            ZeileMax = .Cells(.Rows.Count, 18).End(xlUp).Row
            n = 5 ' Startzeile in Tabelle2
            For Zeile = 1 To ZeileMax
                If .Cells(Zeile, 18).Value = "Ja" Then
                    .Rows(Zeile).Copy Destination:=Tabelle2.Rows(n)
                    n = n + 1
                End If
            Next Zeile
        End With
    End Sub
  4. Schließe den VBA-Editor und gehe zurück zu Excel.

  5. Führe das Makro aus, um die Zeilen zu kopieren, wenn die Bedingung erfüllt ist.


Häufige Fehler und Lösungen

  • Fehler: „Typen unverträglich“
    Dieser Fehler tritt auf, wenn die Variable nicht korrekt deklariert ist. Stelle sicher, dass die Variablen als Long deklariert sind.

  • Problem: Nicht alle Zeilen werden kopiert
    Überprüfe, ob die Bedingung korrekt formuliert ist. Möglicherweise wird ein unerwarteter Wert in der Zelle gefunden. Verwende .End(xlUp) für eine zuverlässige Ermittlung der letzten belegten Zeile.


Alternative Methoden

  1. Autofilter verwenden:
    Du kannst den Autofilter in Excel verwenden, um nur die gewünschten Zeilen anzuzeigen und diese dann manuell zu kopieren. Dies ist besonders nützlich, wenn du die Daten nicht über VBA verarbeiten möchtest.

  2. Formeln nutzen:
    Verwende Formeln wie WENN oder INDEX und VERGLEICH, um die gewünschten Werte in einer neuen Tabelle anzuzeigen, ohne sie physisch zu kopieren.


Praktische Beispiele

Hier sind einige Beispiele, wie du das Skript anpassen kannst:

  • Kopieren einer bestimmten Spanne von Zellen:

    .Range(.Cells(Zeile, 1), .Cells(Zeile, 5)).Copy Tabelle2.Rows(n)

    In diesem Fall werden nur die Spalten A bis E der Zeile kopiert.

  • Kopieren basierend auf mehreren Bedingungen:

    If .Cells(Zeile, 18).Value = "Ja" And .Cells(Zeile, 7).Value = "_2019" Then

    Hier werden Zeilen kopiert, wenn beide Bedingungen erfüllt sind.


Tipps für Profis

  • Verwende Option Explicit am Anfang deines Codes, um sicherzustellen, dass alle Variablen deklariert sind. Das hilft, Fehler zu vermeiden.

  • Optimiere deine Schleifen, indem du über Application.ScreenUpdating = False und Application.ScreenUpdating = True den Bildschirm aktualisierst, um die Ausführung zu beschleunigen.

  • Teste dein Skript mit einer kleinen Datenmenge, bevor du es auf umfangreiche Datensätze anwendest.


FAQ: Häufige Fragen

1. Wie kann ich das Skript anpassen, um nur bestimmte Spalten zu kopieren?
Du kannst den Bereich, der kopiert wird, in der .Range-Methode anpassen, z.B. .Range(.Cells(Zeile, 1), .Cells(Zeile, 5)) für Spalten A bis E.

2. Funktioniert das Skript in allen Excel-Versionen?
Ja, das Skript sollte in den meisten modernen Excel-Versionen funktionieren, die VBA unterstützen.

3. Wie kann ich das Skript so einstellen, dass es automatisch bei Änderungen ausgeführt wird?
Du kannst das Skript in das Worksheet_Change-Ereignis einfügen, um es automatisch auszuführen, wenn eine Änderung vorgenommen wird.

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