Registriert seit: 11.08.2014
Version(en): 2013
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?
Registriert seit: 10.04.2014
Version(en): 97-2019 (32) + 365 (64)
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-2019+365)
Registriert seit: 11.08.2014
Version(en): 2013
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.
Registriert seit: 10.04.2014
Version(en): 97-2019 (32) + 365 (64)
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-2019+365)
Registriert seit: 11.08.2014
Version(en): 2013
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?!
Registriert seit: 10.04.2014
Version(en): 97-2019 (32) + 365 (64)
08.09.2014, 20:44
(Dieser Beitrag wurde zuletzt bearbeitet: 08.09.2014, 20:44 von schauan.)
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-2019+365)
Registriert seit: 11.08.2014
Version(en): 2013
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
Registriert seit: 25.07.2014
Version(en): 2013
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.