Excel VBA Tutorial: Daten kopieren und verschieben

Melden

Dieses Tutorial führt dich Schritt für Schritt durch die verschiedenen Methoden, um Daten mit Excel VBA zu kopieren oder zu verschieben. Wir decken alles ab – vom einfachen Kopieren innerhalb eines Blattes bis hin zum Transfer zwischen verschiedenen Arbeitsmappen.

(Innerhalb eines Blattes, in andere Blätter & Arbeitsmappen)


1. Grundlagen: Kopieren vs. Verschieben

In VBA gibt es zwei Hauptmethoden:

  • .Copy: Kopiert die Daten (Original bleibt erhalten).
  • .Cut: Verschiebt die Daten (Original wird gelöscht).

Beide Methoden nutzen das Argument Destination, um das Ziel direkt anzugeben. Dies ist effizienter als die Nutzung der Zwischenablage (Copy & Paste).


2. Innerhalb eines Tabellenblatts kopieren

Dies ist die einfachste Form. Wir kopieren einen Bereich an eine andere Stelle im selben Blatt.

Sub InnerhalbBlattKopieren()
    ' Kopiert A1:B10 nach D1
    Range("A1:B10").Copy Destination:=Range("D1")

    ' Zum Verschieben einfach .Cut verwenden:
    ' Range("A1:B10").Cut Destination:=Range("D1")
End Sub

3. Daten in ein anderes Tabellenblatt kopieren

Hier müssen wir das Quell- und das Zielblatt explizit benennen.

Sub InAnderesBlattKopieren()
    Dim wsQuelle As Worksheet
    Dim wsZiel As Worksheet

    Set wsQuelle = ThisWorkbook.Sheets("Tabelle1")
    Set wsZiel = ThisWorkbook.Sheets("Tabelle2")

    ' Daten kopieren
    wsQuelle.Range("A1:C20").Copy Destination:=wsZiel.Range("A1")
End Sub

4. Daten in eine andere Arbeitsmappe kopieren

Damit dies funktioniert, müssen beide Arbeitsmappen geöffnet sein. Wenn die Zielmappe geschlossen ist, muss sie zuerst per Code geöffnet werden.

Sub InAndereArbeitsmappeKopieren()
    Dim wbQuelle As Workbook
    Dim wbZiel As Workbook

    ' Falls die Mappen bereits offen sind:
    Set wbQuelle = ThisWorkbook
    Set wbZiel = Workbooks("ZielDatei.xlsx") ' Dateiname muss stimmen

    ' Kopieren von Mappe A, Blatt 1 nach Mappe B, Blatt 1
    wbQuelle.Sheets("Tabelle1").Range("A1:E10").Copy _
        Destination:=wbZiel.Sheets("Tabelle1").Range("A1")
End Sub

5. Nur Werte kopieren (Ohne Formeln & Formate)

Oft möchte man keine Formeln kopieren, sondern nur das Ergebnis. Hier gibt es zwei Wege:

Methode A: PasteSpecial (Klassisch)

Sub NurWerteKopieren()
    Range("A1:A10").Copy
    Range("B1").PasteSpecial Paste:=xlPasteValues
    ' Auswahlmodus beenden (Ameisenkolonne entfernen)
    Application.CutCopyMode = False
End Sub

Methode B: Value-Transfer (Schneller & Eleganter)

Dies ist die performanteste Methode, da sie die Zwischenablage komplett umgeht.

Sub WerteDirektZuweisen()
    ' Zielbereich muss exakt die gleiche Größe haben wie Quellbereich
    Range("B1:B10").Value = Range("A1:A10").Value
End Sub

6. Dynamisches Kopieren (Letzte Zeile finden)

In der Praxis weiß man oft nicht, wie viele Zeilen Daten enthalten. Wir suchen daher die letzte beschriebene Zeile.

Sub DynamischKopieren()
    Dim letzteZeile As Long
    Dim wsQuelle As Worksheet

    Set wsQuelle = ThisWorkbook.Sheets("Daten")

    ' Findet die letzte Zeile in Spalte A
    letzteZeile = wsQuelle.Cells(wsQuelle.Rows.Count, "A").End(xlUp).Row

    ' Kopiert alles von A1 bis Spalte C (letzte Zeile) in ein neues Blatt
    wsQuelle.Range("A1:C" & letzteZeile).Copy Destination:=Sheets("Backup").Range("A1")
End Sub

7. Best Practices & Tipps

  1. Application.ScreenUpdating: Schalte das Bildschirmflackern aus, um den Makro-Lauf zu beschleunigen.
    Application.ScreenUpdating = False
    ' Dein Code...
    Application.ScreenUpdating = True
  2. Referenzierung: Nutze immer Sheets("Name") oder Variablen, anstatt dich auf ActiveSheet zu verlassen. Das verhindert Fehler, wenn der User während des Makros woanders hinklickt.
  3. Fehlerbehandlung: Wenn du in eine andere Arbeitsmappe kopierst, stelle mit einer If-Abfrage sicher, dass diese auch wirklich offen ist.

Zusammenfassung des Codes (Cheat Sheet)

Ziel Befehl
Alles kopieren Range.Copy Destination:=Range
Alles verschieben Range.Cut Destination:=Range
Nur Werte ZielRange.Value = QuellRange.Value
Letzte Zeile (Spalte A) Cells(Rows.Count, 1).End(xlUp).Row
0