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

Copy von Listobject zu Listobject

Forumthread: Copy von Listobject zu Listobject

Copy von Listobject zu Listobject
14.12.2022 07:53:15
Listobject
Guten Morgen,
ich möchte aus einer "smarten Tabelle" auf einem Arbeitsblatt in die letzte Zeile einer anderen "smarten" Tabelle auf einem anderen Arbeitsblatt kopieren.
In der "Archiv"-Liste wird beim Ausführen des Makros immer eine neue Zeile am Ende hinzugefügt. Das klappt soweit. Dies sollte sicherstellen, dass die bestehenden archivierten Daten nicht überschrieben werden.
Dass die gewünschten Daten von A nach B kopiert werden, klappt soweit; leider bekomme ich es nicht, hin in die letzte Zeile, erste Zelle zu springen. Für Hilfe wäre ich denkbar.

Sub Filter_Kopieren()
Application.ScreenUpdating = False
Archiv.ListObjects("tbl_archiv").ListRows.Add AlwaysInsert:=True
'Variablen dimensionieren
Dim rng As Range
'Tabelle in Range einlesen
Set rng = Tabelle8.ListObjects("Tabelle1").Range
'Autofilter setzen
rng.AutoFilter 15, "Ja"
'Gefilterte Tabelle kopieren
ActiveSheet.ListObjects("Tabelle1").DataBodyRange.Copy Archiv.ListObjects("tbl_archiv").DataBodyRange
ActiveWorkbook.SlicerCaches("Datenschnitt_Meldung__Z_P_1").ClearManualFilter
Archiv.Select End Sub
Anzeige

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Copy von Listobject zu Listobject
14.12.2022 08:44:44
Listobject
Hi Fritz

Sub t()
Dim loQuelle As ListObject, loZiel As ListObject
Dim lR As ListRow
Set loQuelle = Tabelle8.ListObjects("Tabelle1")
Set loZiel = Archiv.ListObjects("tbl_archiv")
loQuelle.Range.AutoFilter 15, "Ja"
Set lR = loZiel.ListRows.Add
loQuelle.DataBodyRange.Copy lR.Range
End Sub
cu
Chris
Anzeige
AW: Copy von Listobject zu Listobject
14.12.2022 08:54:49
Listobject
Hallo Chris,
VIELEN Dank funktioniert. Sehe ich das korrekt, dass du als "Kopierziel" quasi die hinzugefügte Zeile als "Container" nutzt?
Wäre es vermessen, dich zu bitten, mit zu verraten, wie man die gefilterten Daten bzw. Zeilen aus "Tabelle1" auch gleich löschen kann?
LG Fritz
AW: Copy von Listobject zu Listobject
14.12.2022 09:48:03
Listobject
Hi
Ja, siehst du richtig.
Wenn die ganze Zeile gelöscht werden kann, dann so:

Application.DisplayAlerts = False
loQuelle.DataBodyRange.SpecialCells(xlCellTypeVisible).Delete
Application.DisplayAlerts = True
Sollte es neben der "smarten" Tabelle noch Inhalt geben, welcher nicht gelöscht werden darf, dann müsste ich noch einmal über die Bücher.
cu
Chris
Anzeige
AW: Copy von Listobject zu Listobject
14.12.2022 10:19:15
Listobject
Danke, super. :-)
Mr fällt grad ein: Wie fange ich denn das Problem ab, wenn es gar keine Daten zu kopieren gibt - also der Filter bei "15" leer ist?
LG Fritz
AW: Copy von Listobject zu Listobject
14.12.2022 10:36:47
Listobject
HalloFritz,
ich mach das so:

Sub test1()
Dim rg As Range
On Error Resume Next
Set rg = ActiveSheet.ListObjects("Tabelle1") _
.DataBodyRange.SpecialCells(xlVisible)
On Error GoTo 0
If rg Is Nothing Then
MsgBox "gefiltertes ListObjekt hat keine Daten"
Else
'mach was
End If
End Sub
Gruß von Luschi
aus klein-Paris
Anzeige
AW: Copy von Listobject zu Listobject
14.12.2022 10:55:07
Listobject
Hallo Fritz,
Luschi war schneller. Ich packe solche Check zweck Fehlertoleranz, die nur innerhalb eines Sub/Function gilt, immer in separaten Function.
Da ein "Trick" für den sichtbaren Bereich eines LO gefunde habe, poste ich trotzdem. Siehe Version 1 & 2: sichtbaren Bereich kann man mit Range("TabX[#Data]") markieren.

Sub Makro4()
Dim loQuelle As ListObject
Dim loZiel As ListObject
Dim LR As ListRow
'Init
Set loQuelle = ActiveSheet.ListObjects("Tabelle1")
Set loZiel = ActiveSheet.ListObjects("Tabelle13")
'Filter
loQuelle.Range.AutoFilter 'Reset Filters
loQuelle.Range.AutoFilter Field:=2, Criteria1:="Jan"
'Test & Copy
If CellTypeVisible_zählen(loQuelle) Then
Set LR = loZiel.ListRows.Add
'Version 1:
loQuelle.DataBodyRange.SpecialCells(xlCellTypeVisible).Copy LR.Range
'Version 2:
'        loQuelle.Parent.Range("Tabelle1[#Data]").Copy LR.Range
End If
'Reset Filter
loQuelle.Range.AutoFilter
End Sub
Private Function CellTypeVisible_zählen(ByRef LO As ListObject) As Long
'bleibt null, falls keine Zeilen sichtbar
On Error Resume Next
CellTypeVisible_zählen = LO.DataBodyRange.SpecialCells(xlCellTypeVisible).Rows.Count
End Function
VG
Yal
Anzeige
AW: Copy von Listobject zu Listobject
14.12.2022 12:42:40
Listobject
Erstmal danke; aber irgendwie kriege ich das nicht in meinen Code eingebaut; aktuell sieht es so aus:

Sub Filter_Kopieren()
Application.ScreenUpdating = False
Dim loQuelle As ListObject, loZiel As ListObject
Dim LR As ListRow
Dim i As Integer
Set loQuelle = Tabelle8.ListObjects("Tabelle1")
Set loZiel = Archiv.ListObjects("tbl_archiv")
loQuelle.Range.AutoFilter 15, "Ja"
i = MsgBox("Sollen Daten, die an XYZ gesendet wurden, archiviert werden?", vbYesNo, "Archivierung")
If i = vbNo Then
MsgBox "Daten wurden nicht kopiert!", vbCritical, "Achtung"
Exit Sub
ElseIf i = vbYes Then
Set LR = loZiel.ListRows.Add
loQuelle.DataBodyRange.Copy LR.Range
MsgBox "Daten wurden kopiert", vbOKOnly = ok, "Archiv"
Application.DisplayAlerts = False
loQuelle.DataBodyRange.SpecialCells(xlCellTypeVisible).Delete
Application.DisplayAlerts = True
End If
Tabelle8.Select
ActiveWorkbook.SlicerCaches("Datenschnitt_Meldung__Z_P_1").ClearManualFilter
End Sub
Leider fehlt "ganz oben" eben die Prüfung, bzw. der "Abbruch" des Makro, wenn Filter 15 leer ist.
Anzeige
AW: Copy von Listobject zu Listobject
14.12.2022 12:59:05
Listobject
Hi
Für meinen Geschmack etwas viel MsgBox, aber ok...

Sub t()
Dim loQuelle As ListObject, loZiel As ListObject
Dim lR As ListRow
Set loQuelle = Tabelle8.ListObjects("Tabelle1")
Set loZiel = Archiv.ListObjects("tbl_archiv")
With loQuelle
.AutoFilter.ShowAllData
If .ListRows.Count = 0 Then
MsgBox "Tabelle ist leer"
Exit Sub
End If
If WorksheetFunction.CountIf(.ListColumns(15).DataBodyRange, "Ja") = 0 Then
MsgBox "keine Daten, welche dem Kriterium entsprechen"
Exit Sub
End If
If MsgBox("Sollen Daten, die an XYZ gesendet wurden, archiviert werden?", vbYesNo, "Archivierung") = vbYes Then
.Range.AutoFilter 15, "Ja"
Set lR = loZiel.ListRows.Add
.DataBodyRange.Copy lR.Range
Application.DisplayAlerts = False
.DataBodyRange.SpecialCells(xlCellTypeVisible).Delete
Application.DisplayAlerts = True
.AutoFilter.ShowAllData
MsgBox "Daten wurden kopiert", vbOKOnly, "Archiv"
Else
MsgBox "Daten wurden nicht kopiert!", vbCritical, "Achtung"
End If
End With
End Sub
cu
Chris
Anzeige
AW: Copy von Listobject zu Listobject
14.12.2022 13:30:50
Listobject
Hi Chris,
Die MsgBox(en) sind der Wunsch vom Chef...
Herrlich ,es hat geklappt, wie geplant.
Vielen Dank an alle :-)
LG Fritz
Aber unter uns gesagt...
14.12.2022 16:39:19
Yal
... schon ein Glück, dass manche Beantworter mütterliche Gefüll haben, mir war es ein Bischen zu sehr "Mama, die Kartoffel in meinem Teller ist gar nicht geschält".
VBA ist nichts für Zuschauer. Was da geliefert wurde, ist Stufe 1. Wenn Du das nicht hinbekommst, lass es bleiben (ich rede nicht von Können, sondern von Wollen).
VBA wirft dich raus bei jeder Kurve. Knie dich rein und beherrsche das Ding. Sonst wird dein Chef für etwas anderes als Msgbox mekern.
Nicht böse gemeint. Sogar ganz im gegenteil zu deinem Wohl.
VG
Yal
Anzeige
;
Anzeige

Infobox / Tutorial

Daten von ListObject zu ListObject kopieren


Schritt-für-Schritt-Anleitung

Um Daten von einem ListObject in ein anderes ListObject zu kopieren, kannst du die folgende VBA-Anweisung verwenden. Stelle sicher, dass du die richtige Excel-Version verwendest, die VBA unterstützt. Hier ist eine einfache Methode:

Sub Filter_Kopieren()
    Application.ScreenUpdating = False
    Dim loQuelle As ListObject, loZiel As ListObject
    Dim lR As ListRow

    Set loQuelle = Tabelle8.ListObjects("Tabelle1")
    Set loZiel = Archiv.ListObjects("tbl_archiv")

    loQuelle.Range.AutoFilter 15, "Ja"
    Set lR = loZiel.ListRows.Add
    loQuelle.DataBodyRange.Copy lR.Range
    Application.DisplayAlerts = False
    loQuelle.DataBodyRange.SpecialCells(xlCellTypeVisible).Delete
    Application.DisplayAlerts = True

    MsgBox "Daten wurden kopiert", vbOKOnly, "Archiv"
    Application.ScreenUpdating = True
End Sub

Diese Funktion filtert die Daten in Tabelle1 und fügt die gefilterten Daten in das ListObject tbl_archiv ein.


Häufige Fehler und Lösungen

  1. Fehler: Daten werden nicht kopiert

    • Stelle sicher, dass der Filter korrekt angewendet wird. Überprüfe, ob die Spalte, die gefiltert wird, die richtige ist.
  2. Fehler: Zeile wird nicht hinzugefügt

    • Wenn das Ziel-ListObject keine Zeilen hat, hinzugefügt werden können, überprüfe, ob die Tabelle korrekt definiert ist.
  3. Fehler: "SpecialCells" gibt einen Fehler zurück

    • Dieser Fehler tritt auf, wenn keine sichtbaren Zellen vorhanden sind. Stelle sicher, dass du den Filter richtig gesetzt hast.

Alternative Methoden

Eine alternative Methode besteht darin, die .DataBodyRange-Eigenschaft des ListObjects zu verwenden, um nur die gewünschten Zellen zu kopieren. Eine mögliche Herangehensweise könnte so aussehen:

Sub Alternative_Kopie()
    Dim loQuelle As ListObject
    Dim loZiel As ListObject
    Dim lR As ListRow

    Set loQuelle = Tabelle8.ListObjects("Tabelle1")
    Set loZiel = Archiv.ListObjects("tbl_archiv")

    If loQuelle.ListRows.Count > 0 Then
        Set lR = loZiel.ListRows.Add
        loQuelle.DataBodyRange.Copy lR.Range
    Else
        MsgBox "Keine Daten zum Kopieren vorhanden."
    End If
End Sub

Diese Methode überprüft, ob das Quell-ListObject Daten hat, bevor der Kopiervorgang gestartet wird.


Praktische Beispiele

Hier sind einige Beispiele für den Einsatz von DataBodyRange in verschiedenen Situationen:

  1. Kopieren und Löschen gefilterter Daten:

    Sub KopierenUndLoeschen()
       Dim loQuelle As ListObject
       Dim loZiel As ListObject
    
       Set loQuelle = Tabelle8.ListObjects("Tabelle1")
       Set loZiel = Archiv.ListObjects("tbl_archiv")
    
       loQuelle.Range.AutoFilter 15, "Ja"
       If WorksheetFunction.CountIf(loQuelle.ListColumns(15).DataBodyRange, "Ja") > 0 Then
           loQuelle.DataBodyRange.Copy loZiel.DataBodyRange
           loQuelle.DataBodyRange.SpecialCells(xlCellTypeVisible).Delete
       Else
           MsgBox "Keine Daten zum Kopieren vorhanden."
       End If
    End Sub
  2. Kopieren in eine bestimmte Zielzeile:

    Sub KopierenInZielzeile()
       Dim loZiel As ListObject
       Set loZiel = Archiv.ListObjects("tbl_archiv")
    
       Dim ZielZeile As ListRow
       Set ZielZeile = loZiel.ListRows.Add
       ZielZeile.Range.Value = Tabelle8.ListObjects("Tabelle1").DataBodyRange.Value
    End Sub

Tipps für Profis

  • Nutze die .Range-Eigenschaft, um gezielt bestimmte Bereiche innerhalb deiner Tabelle zu bearbeiten.
  • Verwende Application.DisplayAlerts = False, um unerwünschte Dialoge zu vermeiden und das Skript flüssiger laufen zu lassen.
  • Setze On Error Resume Next ein, um Fehler abzufangen, die beim Kopieren oder Löschen von Daten auftreten können.

FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass nur gefilterte Daten kopiert werden? Um sicherzustellen, dass nur gefilterte Daten kopiert werden, verwende die Methode SpecialCells(xlCellTypeVisible).

2. Was ist der Unterschied zwischen DataBodyRange und Range in einem ListObject? DataBodyRange bezieht sich nur auf die Zellen mit Daten innerhalb des ListObjects, während Range das gesamte ListObject einschließlich der Kopfzeilen umfasst.

3. Wie kann ich überprüfen, ob das Quell-ListObject leer ist? Du kannst die Anzahl der Zeilen im ListObject mit ListRows.Count überprüfen. Wenn der Wert 0 ist, ist die Tabelle leer.

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