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

Forumthread: VBA Makro / Kopie in nächste freie Zeile

VBA Makro / Kopie in nächste freie Zeile
26.01.2022 19:48:38
Sven
Guten Abend liebes Forum,
ich habe folgendes Anliegen und hoffe, dass mir hier geholfen werden kann. Ich habe ein Makro, welches nur die gefilterten Daten vom "Tabellenblatt1" aus dem Zellenbereich I4:R kopiert und die Daten in das Tabellenblatt "Planung" in Zelle "E11" übergibt. Das funktioniert soweit Super. Nun möchte ich aber, dass bei weiteren Übergaben an Tabellenblatt "Planung", der letzte Eintrag nicht überschrieben wird, sondern erst in die nächste freie Zeile eingefügt wird. Ich habe bereits einige Lösungsvorschläge im Netz gefunden, diese aber nicht auf mein schon bestehendes Makro angepasst bekommen.

Sub KopiereFilterZeile()
'Ab Zeile 2 alle gefilterten Zeilen bis Spalte "D" kopieren
' -> das "D" bitte an Deine Tabelle anpassen
ActiveSheet.Range("F4:R" & ActiveSheet.UsedRange.Rows.Count). _
SpecialCells(xlCellTypeVisible).Copy
'...und ab "A2" in Tabelle2 einfügen
Worksheets("Planung").Range("D11").PasteSpecial
End Sub 
https://www.herber.de/bbs/user/150700.zip
Anzeige

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Makro / Kopie in nächste freie Zeile
26.01.2022 20:58:54
GerdL
Hallo Sven!
Es besteht ein gewisser Unterschied zwischen dem von dir gezeigten Code und deiner Beschreibung.
F ist nicht I und D ist nicht E. Aber die Spaltenbuchstaben kannst du dir sicher passend ändern.
Die Zellbezüge der Kommentare im Makro sind noch genauso zu überarbeiten.

Sub KopiereFilterZeile()
'Ab Zeile 2 alle gefilterten Zeilen bis Spalte "D" kopieren
' -> das "D" bitte an Deine Tabelle anpassen
ActiveSheet.Range("F4:R" & ActiveSheet.UsedRange.Rows.Count). _
SpecialCells(xlCellTypeVisible).Copy
'...und ab "A2" in Tabelle2 einfügen
With Worksheets("Planung")
.Range("D" & Application.Max(11, .Rows.Count, "D").End(xlUp).Row).PasteSpecial
End With
Applicaton.CutCopyMode = False
End Sub
Gruß Gerd
Anzeige
AW: Korrektur
26.01.2022 21:02:06
GerdL

---->.End(xlUp).Row + 1 ).PasteSpecial

AW: VBA Makro / Kopie in nächste freie Zeile
26.01.2022 21:19:23
Sven
Hallo Gerd,
vielen Dank für deine Zuarbeit. Ich muss Dir Recht geben bei deiner Bemerkung, leider war es notwendig, die Excel Tabelle abzuspecken, um diese hochladen zu können. Dabei sind die Spalten verrutscht.
Ich habe es nun angepasst und getestet, bekomme aber eine Fehlermeldung ( Objekt erforderlich )

Sub KopiereFilterZeile()
'Ab Zeile 4 alle gefilterten Zeilen bis Spalte "O" kopieren
' -> das "O" bitte an Deine Tabelle anpassen
ActiveSheet.Range("F4:O" & ActiveSheet.UsedRange.Rows.Count). _
SpecialCells(xlCellTypeVisible).Copy
'...und ab "D11" Planung einfügen
With Worksheets("Planung")
.Range("D" & Application.Max(11, .Rows.Count, "D").End(xlUp).Row).PasteSpecial
End With
Applicaton.CutCopyMode = False
End Sub

Grüße Sven
Anzeige
AW: VBA Makro / Kopie in nächste freie Zeile
26.01.2022 23:35:14
Yal
Hallo Sven,
falls keine Zeile in dem gegebenen Bereich sichtbar ist, bekommt "Copy" die Krise

Sub KopiereFilterZeile()
Dim R As Range
Set R = ActiveSheet.Range("F4:O" & ActiveSheet.UsedRange.Rows.Count).SpecialCells(xlCellTypeVisible)
If R Is Nothing Then Exit Sub
R.Copy
With Worksheets("Planung")
.Range("D" & Application.Max(11, .Rows.Count, "D").End(xlUp).Row + 1).PasteSpecial
End With
Applicaton.CutCopyMode = False
End Sub
ActiveSheet.UsedRange.Rows.Count führt übrigens, falls die erste(n) Zeile(n) der Tabelle nicht befüllt sind, zu einem falschen Ergebnis.

Set R = Intersect(ActiveSheet.Range("F4:O99999").ActiveSheet.UsedRange).SpecialCells(xlCellTypeVisible)
könnte passen (ungetestet).
VG
Yal
Anzeige
AW: VBA Makro / Kopie in nächste freie Zeile
27.01.2022 05:59:31
Sven
Hallo Yal,
vielen Dank für deine Zuarbeit. Ich habe das Makro angepasst und folgende Meldung erhalten.

Sub KopiereFilterZeile()
Dim R As Range
Set R = ActiveSheet.Range("F4:O" & ActiveSheet.UsedRange.Rows.Count).SpecialCells(xlCellTypeVisible)
If R Is Nothing Then Exit Sub
R.Copy
With Worksheets("Planung")
.Range("D" & Application.Max(11, .Rows.Count, "D").End(xlUp).Row + 1).PasteSpecial
End With
Applicaton.CutCopyMode = False
End Sub
Fehler -> Objekt erforderlich
und bei der zweiten Version,

Sub KopiereFilterZeile()
Dim R As Range
Set R = Intersect(ActiveSheet.Range("F4:O99999").ActiveSheet.UsedRange).SpecialCells(xlCellTypeVisible)
If R Is Nothing Then Exit Sub
R.Copy
With Worksheets("Planung")
.Range("D" & Application.Max(11, .Rows.Count, "D").End(xlUp).Row + 1).PasteSpecial
End With
Applicaton.CutCopyMode = False
End Sub
Fehler-> "Sub KopiereFilterZeile()" wird Gelb angezeigt und die Meldung "Fehler beim Kompilieren: Argument ist nicht optional" erscheint
Grüße Sven
Anzeige
AW: VBA Makro / Kopie in nächste freie Zeile
27.01.2022 09:48:09
Yal
Hallo Sven,
Unaufmerksamkeit:
nicht

Set R = Intersect(ActiveSheet.Range("F4:O99999").ActiveSheet.UsedRange).SpecialCells(xlCellTypeVisible)
sondern

Set R = Intersect(ActiveSheet.Range("F4:O99999"), ActiveSheet.UsedRange).SpecialCells(xlCellTypeVisible)
Ist doch klar, oder?
VG
Yal
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

VBA Makro: Daten in die nächste freie Zeile einfügen


Schritt-für-Schritt-Anleitung

  1. Öffne Deine Excel-Datei und öffne den VBA-Editor mit ALT + F11.

  2. Füge ein neues Modul hinzu: Rechtsklick auf "VBAProject (DeinDateiname)", dann Einfügen > Modul.

  3. Kopiere den folgenden Code in das Modul:

    Sub KopiereFilterZeile()
        Dim R As Range
        On Error Resume Next
        ' Bereich der gefilterten Zeilen setzen
        Set R = ActiveSheet.Range("F4:O" & ActiveSheet.UsedRange.Rows.Count).SpecialCells(xlCellTypeVisible)
        On Error GoTo 0
        If Not R Is Nothing Then
            R.Copy
            With Worksheets("Planung")
                .Range("D" & Application.Max(11, .Rows.Count, "D").End(xlUp).Row + 1).PasteSpecial
            End With
        End If
        Application.CutCopyMode = False
    End Sub
  4. Ändere die Zellbezüge nach Bedarf, um sicherzustellen, dass sie mit Deiner Tabelle übereinstimmen.

  5. Führe das Makro aus: Gehe zurück zu Excel, drücke ALT + F8, wähle KopiereFilterZeile und klicke auf Ausführen.


Häufige Fehler und Lösungen

  • Fehler: Objekt erforderlich: Stelle sicher, dass der Bereich, den Du kopieren möchtest, tatsächlich Daten enthält. Wenn keine Zeilen sichtbar sind, wird das Kopieren fehlschlagen. Überprüfe, ob der Filter richtig gesetzt ist.

  • Fehler: "Argument ist nicht optional": Achte auf die korrekte Syntax bei der Verwendung von Funktionen. Überprüfe, ob alle Klammern richtig gesetzt sind und ob Du die richtigen Argumente verwendest.


Alternative Methoden

Eine alternative Methode besteht darin, den Bereich dynamisch festzulegen, indem Du o99999 verwendest, um sicherzustellen, dass Du die gesamte mögliche Zeile bis zur Zeile 99999 abdeckst:

Set R = Intersect(ActiveSheet.Range("F4:O99999"), ActiveSheet.UsedRange).SpecialCells(xlCellTypeVisible)

Diese Technik kann nützlich sein, wenn Du sicherstellen möchtest, dass Du auch bei größeren Datenmengen das richtige Ergebnis erhältst.


Praktische Beispiele

Hier ist ein Beispiel, wie Du das Makro anpassen kannst, um eine spezifische Aktion auszuführen:

Sub BeispielMakro()
    ' Kopiere Daten aus "Tabelle1" und füge sie in die nächste freie Zeile in "Planung" ein
    Dim R As Range
    Set R = ActiveSheet.Range("I4:R" & ActiveSheet.UsedRange.Rows.Count).SpecialCells(xlCellTypeVisible)
    If Not R Is Nothing Then
        R.Copy
        With Worksheets("Planung")
            .Range("E" & Application.Max(11, .Rows.Count, "E").End(xlUp).Row + 1).PasteSpecial
        End With
    End If
    Application.CutCopyMode = False
End Sub

Dieses Makro kopiert die gefilterten Daten vom aktiven Blatt und fügt sie in die nächste freie Zeile in Spalte E des Blattes "Planung" ein.


Tipps für Profis

  • Verwende UsedRange.SpecialCells: Diese Methode hilft, nur die tatsächlich gefüllten Zellen zu berücksichtigen und erhöht die Effizienz Deines Makros.
  • Fehlerbehandlung einfügen: Implementiere Fehlerbehandlungsroutinen, um unerwartete Probleme zu vermeiden und die Benutzerfreundlichkeit zu erhöhen.
  • Teste das Makro in einer Kopie Deiner Datei: So kannst Du sicherstellen, dass keine Daten überschrieben oder verloren gehen.

FAQ: Häufige Fragen

1. Wie finde ich die nächste freie Zeile in einer anderen Spalte?
Du kannst den Code anpassen, indem Du die Spalte in der .Range-Methode änderst, z.B. .Range("E" & Application.Max(11, .Rows.Count, "E").End(xlUp).Row + 1).

2. Was ist der Unterschied zwischen UsedRange und SpecialCells?
UsedRange bezieht sich auf alle verwendeten Zellen in einem Blatt, während SpecialCells speziell die Zellen auswählt, die bestimmten Kriterien entsprechen, wie z.B. sichtbare Zellen oder Zellen mit bestimmten Formaten.

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