AW: Excel Array Zeilen Kopieren
29.07.2024 10:19:31
daniel
HI
Arbeiten mit Array bringt dir hier nicht viel, da das Zeitaufwendige das Copy-Paste ist.
Dabei ist die Anzahl der Copy-Paste-Vorgänge das entscheidende. Wieviele Zeilen bei einem Copy-Paste dann kopiert werden, spielt kaum eine Rolle.
um die Anzahl dieser Schritte zu minimieren, gibt es zwei Wege.
a) man nutzt aus, dass Excel im Sortieren sehr schnell ist und sortiert die Liste zunächst so, das die Zeilen, die kopiert werden sollen, einen Block bilden.
dann ermittelt man erste und letzte Zeile dieses Blocks und kopiert in dann als ganzes:
Sub Kopieren_mit_Sortieren()
Dim ZeileMax As Long
Dim i As Long
Dim ZeileAb As Long
Dim ZeileBis As Long
With Tabelle1
ZeileMax = .UsedRange.Rows.Count
With .Range("3:" & ZeileMax)
.Sort key1:=.Cells(1, 1), order1:=xlAscending, key2:=.Cells(1, 2), order2:=xlAscending, Header:=xlNo
End With
For i = 3 To ZeileMax
If .Cells(i, 1).Value & "|" & .Cells(i, 2).Value = "A|13" Then Exit For
Next
ZeileAb = i
For i = i To ZeileMax + 1
If .Cells(i, 1).Value & "|" & .Cells(i, 2).Value > "A|13" Then Exit For
Next
ZeileBis = i - 1
.Range(.Rows(ZeileAb), .Rows(ZeileBis)).Copy Destination:=Tabelle5.Cells(3, 1)
End With
End Sub
b) man markiert zuerst die Zellen, die kopiert werden müssen so, dass man sie über das Inhalte auswählen als ganzes selektieren kann, den auch so kann man sie dann als ganzes kopieren. Da kann man machen, wenn die Liste nicht sortiert werden soll:
Sub Kopieren_Zellenwahl_per_Formel()
With Tabelle1.UsedRange
With .Columns(.Columns.Count + 1)
.FormulaR1C1 = "=IF(RC1&RC2=""A13"",1,"""")"
If WorksheetFunction.Sum(.Cells) > 0 Then
With .SpecialCells(xlCellTypeFormulas, 1)
.ClearContents
.EntireRow.Copy Destination:=Tabelle5.Cells(3, 1)
End With
End If
.ClearContents
End With
End With
End Sub
wie du siehst, wird der Code herfür sehr schlank, und kommt ohne Schleifen, IFs und auch ohne Variablen aus.
bei sehr großen Tabellen mit vielen Werten (10.000 Zeilen und mehr) würde ich aber auch hier ein Sortieren voranstellen, damit die zu kopierenden Zellen einen Block bilden.
Gruß Daniel