Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Schwieriger Spaltentausch mit grosser Datenmenge
#1
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?
Antwortento top
#2
Hallo sotaros,
Bricht er gleich zusammen? Hast Du Formeln drin oder beziehen sich welche auf die Spalte mit den Daten?
   \\\|///      Hoffe, geholfen zu haben.
   ( ô ô )      Grüße, André aus G in T  
 ooO-(_)-Ooo    (Excel 97-2016)
Antwortento top
#3
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.
Antwortento top
#4
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.
   \\\|///      Hoffe, geholfen zu haben.
   ( ô ô )      Grüße, André aus G in T  
 ooO-(_)-Ooo    (Excel 97-2016)
Antwortento top
#5
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?!
Antwortento top
#6
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
   \\\|///      Hoffe, geholfen zu haben.
   ( ô ô )      Grüße, André aus G in T  
 ooO-(_)-Ooo    (Excel 97-2016)
Antwortento top
#7
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
Antwortento top
#8
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.
Antwortento top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste