AW: Suchen und kopieren mit variabler Liste
01.08.2014 13:08:08
fcs
Hallo Pochi,
eine Möglichkeit zur Beschleunigung:
In der Quelltabelle mit dem Autofilter arbeiten, dann kann man alle Werte aus der Pivot als Array für die Filterwerte übergeben. Im Zielblatt müssen die kopierten Zeilen ggf. noch nach der ID-sortiert werden, wenn diese als Zeilenblöcke vorliegen sollen. Diese Methode kopiert allerdings keine Formeln, sondern nur Formate und Werte.
Zusätzlich kann evtl. noch Beschleunigung erreichen, indem während der Makroausführung die Bildschirmaktualiierung deaktiviert und der Berechnungsmodus auf Manuel geetzt wird.
Nachfolgend ein Beispielmakro. Tabellennamen sowie Zeilen und Spaltennummern musst du ggf. anpassen.
Gruß
Franz
Sub Filtern()
Dim wksPivot As Worksheet, wksQ As Worksheet, wksZ As Worksheet
Dim ZeileP As Long, ZeileQ As Long, ZeileZ As Long
Dim arrFilter() As String, intF As Integer
Set wksQ = ActiveWorkbook.Worksheets("Quelle")
Set wksZ = ActiveWorkbook.Worksheets("Ziel")
Set wksPivot = ActiveWorkbook.Worksheets("Pivot")
'Filterwerte in Pivot in Array einlesen
With wksPivot
For ZeileP = 5 To .Cells(.Rows.Count, 2).End(xlUp).Row
With .Cells(ZeileP, 2)
If .Value "" Then
intF = intF + 1
ReDim Preserve arrFilter(1 To intF)
arrFilter(intF) = .Text
End If
End With
Next
End With
If intF > 0 Then
With wksQ
'Autofilter in Quelle vorbereiten
If .AutoFilterMode = True Then
If .FilterMode = True Then .ShowAllData
Else
ZeileQ = .Cells.SpecialCells(xlCellTypeLastCell).Row
.Range(.Rows(1), .Rows(ZeileQ)).AutoFilter
End If
ZeileQ = .Cells.SpecialCells(xlCellTypeLastCell).Row
'Autofilter setzen für Spalte mit ID-Werten
.AutoFilter.Range.AutoFilter Field:=2, Criteria1:=arrFilter, Operator:=xlFilterValues
ZeileQ = .Cells.SpecialCells(xlCellTypeLastCell).Row
If ZeileQ = 1 Then
MsgBox "keine Zeilen zu Filterwerten in Quelltabelle gefunden"
Else
'nächste freie Zeile in Spalte mit ID
ZeileZ = wksZ.Cells(wksZ.Rows.Count, 2).End(xlUp).Row + 1
.Range(.Rows(2), .Rows(ZeileQ)).Copy wksZ.Cells(ZeileZ, 1)
End If
'in Quelle alle Daten wieder anzeigen
.ShowAllData
'kopierte Daten in Zieltabelle nach der ID in Spalte B sortieren
With wksZ
With .Range(.Rows(ZeileZ), .Rows(.Cells(.Rows.Count, 2).End(xlUp).Row))
.Sort key1:=.Range("B1"), Order1:=xlAscending, Header:=xlNo
End With
End With
End With
Erase arrFilter
Else
MsgBox "keine Filterwerte in Pivottabelle gefunden"
End If
End Sub