Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1852to1856
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Copy mit Kriterien

Copy mit Kriterien
19.10.2021 16:05:20
Chris
Hallo zusammen,
ich habe untenstehendes Makro, dass mir Zellen nach zwei Kriterien sucht, den Bereich vergrößert und kopiert.
Funktioniert soweit prima.
Soweit ich das sehe, wird bei diesem Makro jede Zelle einzeln angesprochen, was Zeit in Anspruch nimmt. Kann man dies beschleunigen?

Sub x()
Dim i, i2, i3 As Long
With Sheets("Test")
i2 = 1
i3 = 1
For i = 1 To .Cells(.Rows.Count, "A").End(xlUp).Row
Select Case .Cells(i, "B")
Case "5"
.Cells(i, "B").Offset(, -1).Resize(, 9).Copy Destination:=Worksheets("5").Cells(i2, 1)
i2 = i2 + 1
Case "6"
.Cells(i, "B").Offset(, -1).Resize(, 9).Copy Destination:=Worksheets("6").Cells(i3, 1)
i3 = i3 + 1
End Select
Next i
End With
End Sub

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Copy mit Kriterien
19.10.2021 16:19:55
Werner
Hallo,
teste mal:

Sub x()
Dim i As Long, raCopy As Range, raCopy1 As Range
Application.ScreenUpdating = False
With Sheets("Test")
For i = 1 To .Cells(.Rows.Count, "A").End(xlUp).Row
Select Case .Cells(i, "B")
Case "5"
If raCopy Is Nothing Then
Set raCopy = .Cells(i, "B").Offset(, -1).Resize(, 9)
Else
Set raCopy = Union(raCopy, .Cells(i, "B").Offset(, -1).Resize(, 9))
End If
Case "6"
If raCopy1 Is Nothing Then
Set raCopy1 = .Cells(i, "B").Offset(, -1).Resize(, 9)
Else
Set raCopy1 = Union(raCopy1, .Cells(i, "B").Offset(, -1).Resize(, 9))
End If
Case Else
End Select
Next i
End With
If Not raCopy Is Nothing Then
raCopy.Copy Worksheets("5").Cells(1, 1)
End If
If Not raCopy1 Is Nothing Then
raCopy1.Copy Worksheets("6").Cells(1, 1)
End If
Set raCopy = Nothing: Set raCopy1 = Nothing
End Sub
Gruß Werner
Anzeige
AW: Copy mit Kriterien
19.10.2021 16:33:21
Chris
Hallo Werner,
funktioniert super schnell! Vielen Dank. Kannst du mir den Teil erklären:

Case "5"
If raCopy Is Nothing Then
Set raCopy = .Cells(i, "B").Offset(, -1).Resize(, 9)
Else
Set raCopy = Union(raCopy, .Cells(i, "B").Offset(, -1).Resize(, 9))
End If
Danke Chris
AW: Copy mit Kriterien
19.10.2021 17:13:21
Daniel
Hi
hier werden die zu kopierenden Zellen nicht sofort und damit einzeln kopiert, sondern die Zellen werden zunächst mal in einer Range-Variable gesammelt um dann alle zusammen in einem einzigen Schritt kopieren zu können.
ist im Prinzip wie wenn du in einem Haus die Fenster erneuern lässt.
wenn du das für jedes Fenster einzeln machen lässt, muss der Handwerker für jedes Fenster extra anfahren und du bekommst auch für jedes Fenster eine eigene Rechnung. Das dauert dann länger, als wenn du dem Handwerker einen Auftrag über alle Fenster gibst und dieser dann nur einmal anfahren muss und dabei schon alle neuen Fenster dabei hat und dir auch nur eine Rechnung schreiben muss. Es spart in Excel internen Aufwand, wenn man nicht jede Zelle einzeln bearbeitet, sondern möglichst wendige, dafür große Zelleberiche in einem Schritt.
ich hätte das ganze ohne Schleife über die Zellen gemacht.
zunächst hätte ich die Liste nach Spalte B sortiert, und dann für den jeweiligen Bereich die erste und letzte Zelle ermittelt und dann alle Zellen dazwischen als lückenlosen Block kopiert:

dim Zelle1 as Range
dim Zelle2 as range
With Sheets("Test")
.usedrange.Sort key1:=.cells(1, 2), order1:=xlascending, header:=xlno
set Zelle1 = .Columns(2).Find(what:="5", lookat:=xlwhole, lookin:=xlvalues, searchdirection:=xlnext)
set Zelle2 = .Columns(2).Find(what:="5", lookat:=xlwhole, , lookin:=xlvalues, searchdirection:=xlprevious)
Range(Zelle1, Zelle2).offset(0, -1).Resize(, 9).Copy Worksheets("5").Cells(1, 1)
set Zelle1 = .Columns(2).Find(what:="6", lookat:=xlwhole, lookin:=xlvalues, searchdirection:=xlnext)
set Zelle2 = .Columns(2).Find(what:="6", lookat:=xlwhole, , lookin:=xlvalues, searchdirection:=xlprevious)
Range(Zelle1, Zelle2).offset(0, -1).Resize(, 9).Copy Worksheets("6").Cells(1, 1)
End with
wenn, dann kann man hier die Schleife über den Suchbegriff laufen lassen, so dass man den ganzen Vorgang nur einmal programmieren und nicht wiederholen muss

dim Zelle1 as range
dim Zelle2 as range
dim X
With Sheets("Test")
.usedrange.Sort key1:=.cells(1, 2), order1:=xlascending, header:=xlno
for each X in Array("5", "6")
set Zelle1 = .Columns(2).Find(what:=X, lookat:=xlwhole, lookin:=xlvalues, searchdirection:=xlnext)
set Zelle2 = .Columns(2).Find(what:=X, lookat:=xlwhole, , lookin:=xlvalues, searchdirection:=xlprevious)
Range(Zelle1, Zelle2).offset(0, -1).Resize(, 9).Copy Worksheets(X).Cells(1, 1)
Next
End with
Gruß Daniel
Anzeige
AW: Copy mit Kriterien
19.10.2021 18:28:34
Chris
Hi Daniel,
danke für die ausführliche Erklärung. Das verstehe ich sogar :-) Auch dieses Makro läuft und spart Zeit, weil ich das Array um weitere Suchstrings ergänzen kann.
LG
Chris
AW: Copy mit Kriterien
19.10.2021 18:29:40
Chris
Hi Daniel,
danke für die ausführliche Erklärungen. Das Makro spart Zeit und ich kann das Array durch weitere Suchstrings ergänzen!
LG
Chris
nur geschlossen, weil gelöst (owT)
20.10.2021 08:15:43
Pierre

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige