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

Forumthread: Kopieren von Spalten per VBA

Kopieren von Spalten per VBA
06.06.2016 15:14:44
Spalten
Hallo zusammen,
nachdem dieses tolle Forum mir schon eingige Male sehr geholfen hat, wende ich mich wieder vertrauensvoll an euch :)
Ich möchte per VBA Spalten aus einem Tabellenblatt in ein anderes kopieren. Dabei sollen nur Spalten kopiert werden, die in einer bestimmten Zeile einen Inhalt haben. Wenn die Spalte in dieser Zeile leer ist, soll sie nicht kopiert werden. Dies bekomme ich soweit auch schon ganz gut hin (siehe https://www.herber.de/bbs/user/106026.xlsm).
Das einzige was noch nicht ganz passt, ist, dass momentan die Spalten komplett (also inklusive Formeln, die in Tabelle1 stehen) kopiert werden. Ich möchte allerdings in Tabellenblatt2 nur die Werte haben. Alle meine dilletantischen Versuche mit PasteSpecial xlPasteValues sind leider gescheitert. Kann mir jemand anhand der Beispieldatei auf die Sprünge helfen?
Vielen Dank vorab und beste Grüße
Uli

Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Kopieren von Spalten per VBA
06.06.2016 16:23:46
Spalten
Hallo!
Du willst im Grunde Dein Blatt 1 ohne die optischen Aufbereitungen (Leerspalten, -zeilen) in Blatt 2 kopieren, nur mit Werten.
Evtl. ist's einfacher, Du wirfst alles aus Blatt 1 ins Blatt 2 (nur mit Werten) und löschst dann erst in Blatt 2 die nicht benötigten Spalten und Zeilen. Sehr grob etwa so:
Sub a()
Dim Wb As Workbook
Dim WsQ As Worksheet
Dim WsZ As Worksheet
Dim Spalten As Range
Dim Z As Range
Set Wb = ThisWorkbook
Set WsQ = Wb.Worksheets("Tabelle1")
Set WsZ = Wb.Worksheets("Tabelle3") 'testweise mit Blatt 3 als Ziel, ggf. anpassen
'Zielblatt komplett leeren
WsZ.Cells.ClearContents
With WsQ
'Verwendeten Bereich im Quellblatt komplett kopieren
.UsedRange.Copy
'nur Werte ins Zielblatt einfügen
WsZ.Range("A1").PasteSpecial xlPasteValues
End With
With WsZ
'im Zielblatt erste 4 Zeilen löschen
.Rows("1:4").EntireRow.Delete
'Danach alle Spalten mit Leerzellen in Zeile 1 löschen
Set Spalten = .Range("A1:" & .Cells(1, .Columns.Count).End(xlToLeft).Address)
For Each Z In Spalten
If Z.Value = vbNullString Then Z.EntireColumn.Delete
Next Z
'im Zielblatt zweite Zeile löschen
.Rows(2).Delete
End With
End Sub
Lg
Michael

Anzeige
AW: Kopieren von Spalten per VBA
07.06.2016 00:01:48
Spalten
Hallo Uli!
Ist mein erster Beitrag den ich in diesem Forum leiste :D
Willst du die leeren Zeilen "mitkopieren" oder nicht?
habe folgendes ausprobiert und bei mir hat es funktioniert...
Ich habe bei diesem Beispiel die leeren Zellen nicht "mitkopiert" sonder habe einfach die Zeilen
untereinander eingefügt.
Möchtest du die leeren Zellen mitkopieren, dann einfach das Fett und Kursive markierte weglassen!
Würde mich auf eine Antwort freuen :D

Sub Zellen_Kopieren()
Dim Zeile As Integer
Dim Spalte As Integer
'Zeilen von unten nach oben durchlaufen, kopieren und einfügen
Application.ScreenUpdating = False 'Bildschirmaktualisierung ausschalten
ls = Worksheets(2).Cells(1, Columns.Count).End(xlToLeft).Column 'Bestimmt die letzte Spalte von  _
Tabelle 2 wo etwas drinnen steht
Spalte = 2 'Der Spaltenwert ab wo eingefügt werden soll
For s = 1 To ls 'Schleife zum durchlaufen der Spalten
lz = Worksheets(2).Cells(Rows.Count, s).End(xlUp).Row 'Die letzte Zeile der aktuellen  _
Spalte bestimmen
Zeile = 7 'Zeilenwert (ab wo eingefügt werden soll) der immer wieder auf 7 zurückgesetzt  _
wird, damit er wieder ab diesen Zeilenwert einfügt
For i = 2 To lz 'Schleife um die Zeilen der aktuellen Spalte zu durchlaufen
If Worksheets(2).Cells(i, s)  "" Then 'Prüfen ob etwas drinnen steht
Worksheets(2).Cells(i, s).Copy 'wenn etwas drinnen steht, dann diesen Wert kopieren
Worksheets(1).Cells(Zeile, Spalte).PasteSpecial xlPasteValues 'Wert einfügen
Zeile = Zeile + 1 'Immer eine Zeile weiterwandern zwecks einfügen
End If
Next i
Spalte = Spalte + 2 'Immer 2 Spalten weiterwandern zwecks einfügen
Next s
Application.ScreenUpdating = True 'Bildschirmaktualisierung einschalten
End Sub

Anzeige
AW: Kopieren von Spalten per VBA
07.06.2016 09:00:47
Spalten
Hallo ihr beiden,
vielen Dank für Eure Mühe! Michaels Code funktioniert spitzenmäßig! Ich hatte dies auch gestern schon als Antwort gepostet, aber irgendwie ist der Post nicht mehr sichtbar?! Vielen Dank Michael!
Alen, wenn ich deinen Code einfüge, passiert leider gar nichts. Auch keine Fehlermeldung :) Da ich deinen Code mit meinen begrenzten Kenntnissen auch nicht wirklich nachvollziehen kann, weiß ich somit auch nicht wirklich, woran es liegt. Funktioniert er bei dir? Trotzdem vielen Dank für deine Antwort! :)
Viele Grüße
Uli

Anzeige
Gern! owT
07.06.2016 09:58:25
Michael
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Spalten per VBA kopieren in Excel


Schritt-für-Schritt-Anleitung

Um Spalten in Excel per VBA zu kopieren, kannst du den folgenden Code verwenden. Dieser Code kopiert nur die Spalten, die in einer bestimmten Zeile einen Inhalt haben und fügt nur die Werte in das Zielblatt ein.

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Klicke auf Einfügen > Modul, um ein neues Modul zu erstellen.
  3. Füge den folgenden VBA-Code ein:
Sub SpaltenKopieren()
    Dim Wb As Workbook
    Dim WsQ As Worksheet
    Dim WsZ As Worksheet
    Dim Spalten As Range
    Dim Z As Range

    Set Wb = ThisWorkbook
    Set WsQ = Wb.Worksheets("Tabelle1") ' Quellblatt anpassen
    Set WsZ = Wb.Worksheets("Tabelle2") ' Zielblatt anpassen

    ' Zielblatt leeren
    WsZ.Cells.ClearContents

    With WsQ
        ' Verwendeten Bereich im Quellblatt kopieren
        .UsedRange.Copy
        ' Nur Werte ins Zielblatt einfügen
        WsZ.Range("A1").PasteSpecial xlPasteValues
    End With

    With WsZ
        ' Alle Spalten mit Leerzellen in der ersten Zeile löschen
        Set Spalten = .Range("A1:" & .Cells(1, .Columns.Count).End(xlToLeft).Address)
        For Each Z In Spalten
            If Z.Value = vbNullString Then Z.EntireColumn.Delete
        Next Z
    End With
End Sub
  1. Schließe den VBA-Editor und drücke ALT + F8, um das Makro auszuführen.

Dieser Code kopiert alle relevanten Spalten und entfernt Spalten mit leeren Zellen in der ersten Zeile.


Häufige Fehler und Lösungen

  • Fehler: "Laufzeitfehler 1004: Anwendung oder Objekt definieren"
    Lösung: Überprüfe, ob die Blattnamen in Set WsQ und Set WsZ korrekt sind.

  • Fehler: Leere Spalten werden nicht gelöscht
    Lösung: Stelle sicher, dass die richtige Zeile für die Überprüfung auf leere Zellen angegeben ist.

  • Fehler: Werte werden nicht eingefügt
    Lösung: Überprüfe, ob der Befehl PasteSpecial xlPasteValues korrekt implementiert ist.


Alternative Methoden

Wenn du eine andere Methode ausprobieren möchtest, kannst du die Verwendung von Range.Copy und PasteSpecial vermeiden und direkt mit einer Schleife arbeiten, um die Werte zu kopieren. Hier ist ein Beispiel:

Sub AlternativeSpaltenKopieren()
    Dim Zeile As Integer
    Dim Spalte As Integer
    Dim lz As Integer

    Spalte = 1 ' Spaltenwert ab wo eingefügt werden soll

    For s = 1 To 10 ' Beispiel: bis zur 10. Spalte
        lz = Worksheets("Tabelle1").Cells(Rows.Count, s).End(xlUp).Row ' Letzte Zeile bestimmen
        Zeile = 1 ' Zeilenwert ab wo eingefügt werden soll

        For i = 1 To lz
            If Worksheets("Tabelle1").Cells(i, s) <> "" Then
                Worksheets("Tabelle2").Cells(Zeile, Spalte).Value = Worksheets("Tabelle1").Cells(i, s).Value
                Zeile = Zeile + 1
            End If
        Next i

        Spalte = Spalte + 1 ' Nächste Spalte im Zielblatt
    Next s
End Sub

Praktische Beispiele

Hier sind zwei praktische Beispiele zur Verwendung des VBA-Codes:

  1. Kopieren von Daten aus "Tabelle1" nach "Tabelle2": Verwende den ersten bereitgestellten Code, um Daten von einem Blatt in ein anderes zu übertragen.
  2. Kopieren und anpassen der Spalten: Nutze die alternative Methode, um gezielt nur die nicht-leeren Werte aus einer Spalte zu kopieren.

Tipps für Profis

  • Nutze Application.ScreenUpdating = False zu Beginn deines Codes, um die Ausführungsgeschwindigkeit zu erhöhen und die Bildschirmaktualisierung während des Kopiervorgangs zu deaktivieren.
  • Verwende Error Handling, um Fehler im Code zu erkennen und zu bearbeiten. Dies hilft dir, unerwartete Probleme zu vermeiden.
  • Teste deinen Code zuerst mit einer kleinen Datenmenge, um sicherzustellen, dass alles wie gewünscht funktioniert.

FAQ: Häufige Fragen

1. Wie kann ich den Code anpassen, um mehrere Blätter gleichzeitig zu bearbeiten?
Du kannst Schleifen verwenden, um durch alle Blätter zu iterieren und die oben genannten Codes anzupassen.

2. Welche Excel-Version benötige ich für diesen VBA-Code?
Der Code funktioniert mit Excel 2010 und höher, da die VBA-Umgebung in diesen Versionen ähnlich ist.

3. Kann ich den Code auch für andere Aufgaben verwenden?
Ja, der Code kann leicht angepasst werden, um Daten zu filtern oder auf andere Weise zu manipulieren.

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