Ralf hat Dir eigentlich die schnellste Methode gezeigt, wenn es um eine große Anzahl von Zeilen geht.
Darauf wollte ich eigentlich auch hinaus, deswegen meine Frage, ob Du Formeln in Deiner Tabelle hast, die beim Einfügen und wieder Löschen einer Hilfsspalte nicht mehr funktionieren würden.
Hier mal Ralfs Vorschlag etwas verallgemeinert und zusammengefasst mit einer temporären Hilfsspalte, die in Spalte 1 einfügt und wieder gelöscht wird:
da Du auch nach Matrixvarianten fragtest, hier meine Versionen. Die Geschwindigkeit ist hier stark abhängig von Zeilen- und Spaltenanzahl des Bereiches.
Code:
Sub LeerzeilenEinfuegen_Kuwer() Dim i As Long, j As Long, k As Long Dim lngStartTime As Long, lngStopTime As Long Dim lngSpalten As Long, lngZeilen As Long Dim varQ As Variant, varZ As Variant lngStartTime = GetTickCount varQ = Cells(1, 1).CurrentRegion.Value lngZeilen = UBound(varQ, 1) lngSpalten = UBound(varQ, 2) ReDim varZ(1 To lngZeilen * 2, 1 To lngSpalten) For i = 1 To lngZeilen k = i * 2 - 1 For j = 1 To lngSpalten varZ(k, j) = varQ(i, j) Next j Next i Cells(1, 1).Resize(lngZeilen * 2, lngSpalten).Value = varZ lngStopTime = GetTickCount MsgBox "Laufzeit " & (lngStopTime - lngStartTime) / 1000 & " Sekunden.", vbInformation End Sub
Sub LeerzeilenLoeschen_Kuwer() Dim i As Long, j As Long, k As Long Dim lngStartTime As Long, lngStopTime As Long Dim lngSpalten As Long, lngZeilen As Long Dim varQ As Variant, varZ As Variant lngStartTime = GetTickCount varQ = Cells(2, 1).CurrentRegion.Resize(Cells(Rows.Count, 1).Row).Value lngZeilen = UBound(varQ, 1) lngSpalten = UBound(varQ, 2) ReDim varZ(1 To lngZeilen, 1 To lngSpalten) For i = 1 To lngZeilen If Len(varQ(i, 1)) Then k = k + 1 For j = 1 To lngSpalten varZ(k, j) = varQ(i, j) Next j End If Next i Cells(1, 1).Resize(lngZeilen, lngSpalten).Value = varZ lngStopTime = GetTickCount MsgBox "Laufzeit " & (lngStopTime - lngStartTime) / 1000 & " Sekunden.", vbInformation End Sub
Ich habe mal eine Tabelle zum Spielen (auch mit anderen Varianten) erstellt.
Folgende(r) 1 Nutzer sagt Danke an Kuwer für diesen Beitrag:1 Nutzer sagt Danke an Kuwer für diesen Beitrag 28 • ChristaRohn
Ihr seid ja wirklich alle super!!! - Natürlich je mehr Optionen abgedeckt werden, umso besser. Ob mit Formeln oder ohne, jeder Code hat seine Vor- und Nachteile. Vor allem bringt er ganz neue Aspekte mit sich zum lernen. Ein solches Forum lebt einfach von solchen Experten wie euch!
Ich persönlich muss mich erstmal nächste Woche mit euren VBA - Varianten auseinandersetzen Es gibt für mich einiges zu lernen.
mit Deiner Sort-Variante kann ich mich auch anfreunden.
Noch etwas getrimmt ist sie auch bei nur einer Spalte schon doppelt so schnell wie meine. :22: :19:
Code:
Sub LeerzeilenEinfuegen_Atilla() Dim lngLetzte As Long Dim lngStartTime As Long, lngStopTime As Long Dim lngCalc As Long ' lngStartTime = GetTickCount With Application .ScreenUpdating = False lngCalc = .Calculation .Calculation = xlCalculationManual End With lngLetzte = Cells(Rows.Count, 1).End(xlUp).Row Columns(1).Insert With Range(Cells(1, 1), Cells(lngLetzte, 1)) .Formula = "=row()" .Formula = .Value Range(Cells(lngLetzte + 1, 1), Cells(lngLetzte * 2, 1)) = .Value End With Cells(1, 1).CurrentRegion.Sort , key1:=Cells(2, 1), order1:=xlAscending, Header:=xlNo Columns(1).Delete With Application .Calculation = lngCalc .ScreenUpdating = True End With ' lngStopTime = GetTickCount ' MsgBox "Laufzeit " & (lngStopTime - lngStartTime) / 1000 & " Sekunden.", vbInformation End Sub