Clever-Excel-Forum

Normale Version: Schwieriger Spaltentausch mit grosser Datenmenge
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo meine Freunde,

ich stehe vor folgendem Problem. Ich muss meine Spalten samt Inhalt tauschen und verschieben.
Dazu benzutze ich folgenden einfachen, syntaktisch richtigen und funktionsfähigen VBA Code:

Code:
'Beispielhaft:
Sub Spaltentausch()
x = 3 'variabler Verschiebungsfaktor
    Columns(ActiveCell.Column).Cut
    Columns(ActiveCell.Column + x).Insert Shift:=xlToRight
    Cells(ActiveCell.Row, ActiveCell.Column).Select
End Sub

Da ich in den zu verschiebenden Spalten aber sehr grosse Datenmengen habe, bricht mir der Rechner zusammen. Durch die Methode cut werden ja alle Daten in die Zwischenablage kopiert. Wie kann ich das Problem elegant lösen?
Hallo sotaros,
Bricht er gleich zusammen? Hast Du Formeln drin oder beziehen sich welche auf die Spalte mit den Daten?
Hallo André,
nein Formeln sind keine drin. Nur die Datenmenge ist einfach zu groß.
Die Frage ist, wie kann man es so clever programmieren, dass die
Spalten schnell getauscht werden.
Hallo sotaros,

wenn Excel nicht gleich bei der ersten Aktion abschmiert, könntest Du den Speicher zwischendurch freimachen. Einfache Variante wäre, das mit Application.CutCopyMode=false zu tun.

Ebenso gint es dafür API's:

Code:
Option Explicit
Declare Function CloseClipboard Lib "user32" () As Long
Declare Function EmptyClipboard Lib "user32" () As Long
Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
'-----------------------------------------------------------------
'--- Zwischenablage leeren ---
'-----------------------------------------------------------------
Sub ClearClipboard()
    OpenClipboard 0&
    EmptyClipboard
    CloseClipboard
End Sub

Wenn es schon beim ersten Mal Schwierigkeiten gibt, dann kannst Du das eventuell abschnittsweise tun, also z.B. immer 100 oder 1000 Zeilen verschieben und das nur bis zur letzten gefüllten Zelle.
Hallo André,

die Leerung der Zwischeablage hat leider nichts gebracht. Nach vielem
probieren erziele ich das beste Ergebnis mit folgendem Code:

Code:
Dim tmp As Range
With Sheets(ActiveSheet.Name)
    tmp = .Range("B1:B" & Cells(Rows.Count, 2).End(xlUp).Row)
    .Range("B1:B" & Cells(Rows.Count, 2).End(xlUp).Row).Value = .Range("C1:C" & Cells(Rows.Count, 3).End(xlUp).Row).Value
    .Range("C1:C" & Cells(Rows.Count, 3).End(xlUp).Row).Value = tmp
End With

Vielleicht hat jemand noch eine bessere Idee?!
Hallo sotaros,

das funktioniert? Ohne Set vor dem tmp müsstest Dir Excel einen Fehler 91 bekommen.

Wenn Du nur die Einträge übernehmen willst ohne Formatierungen, geht eventuell auch was in der Art:
arrdaten = Range("B1:B3").Value
Range("B1:B3").Value = Range("C1:C3").Value
Range("C1:C3").Value = arrdaten
Hallo André,

hab gerade noch mal alles kontrolliert und funktioniert auch ohne Set.
Bin aber nicht so fit wie du in VBA und nehme den Hinweis gerne an.

Danke
Hallo Leute,
der Spaltentausch zwecks Handhabung von grossen Datenmengen läßt sich wie folgt
programmieren:

Code:
Sub Inhalt()
'Inhalte zum Testen erzeugen:
Columns(1).Value = "Spalte A: Hier steht Text in der Spalte A"
Columns(2).Value = "Spalte B: Ein  Beispielsatz, geschrieben in Spalte B"
End Sub

Sub Spaltenttausch()
'Geeignet für grosse Datenmengen
Dim varA As Variant, varB As Variant

varA = Columns(1).Value
varB = Columns(2).Value
Columns(1).Value = varB
Columns(2).Value = varA

End Sub

Dieser Code ist bezüglich der Programmierung viel einfacher und zweitens auch wesentlich effektiver.