Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1840to1844
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

Tabelle ergänzen (Geschwindigkeit)

Tabelle ergänzen (Geschwindigkeit)
09.08.2021 09:32:22
Marcel
Hallo,
Ich habe ein SPEED Problem.
In befülle eine Tabelle mit durchschnittlich 3000 Zeilen (A4:W3004).
Dann sortiere ich die Datensätze gemäss Datum und ergänze in Spalte Q, ob die Daten undgültig oder abgelaufen sind.
Dazu berücksichtige ich mehrere Zellen in meiner Matrix (String & Datum).
Das Ziel besteht darin, auf Basis eines Stichdatum (M2) anzuzeigen welche Zeilen gültig, ungültig oder abgelaufen waren.
Mein Makro funktioniert wie es soll, nur wird es extrem langsam bei vielen Datensätzen, da ich jede einzelne Zeile in IF-Schlaufen mehrfach durchlaufen muss.
Könnte mir jemand einen Tipp geben wie ich diesen Vorgang beschleunigen könnte?
Gibt es eine Möglichkeit diese IF Schlaufen schneller in einer Array durchzulaufen?
Folgend mein Code:

Dim r As Integer
Dim k As Integer
Dim i As Integer
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual 'Formelkalkulation ausschalten
'Filter löschen
ThisWorkbook.Worksheets("IST Employee Skills").Range("A3").AutoFilter
ThisWorkbook.Worksheets("IST Employee Skills").Range("A3").AutoFilter
ThisWorkbook.Worksheets("IST Employee Skills").ListObjects("EmployeeSkills"). _
Sort.SortFields.Clear
ThisWorkbook.Activate
ThisWorkbook.Worksheets("IST Employee Skills").ListObjects("EmployeeSkills"). _
Sort.SortFields.Add Key:=Range("EmployeeSkills[[#All],[Erstellt am]]"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ThisWorkbook.Worksheets("IST Employee Skills").ListObjects( _
"EmployeeSkills").Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
ThisWorkbook.Worksheets("IST Employee Skills").Range("Q4:Q99999").ClearContents
'Aktive und inaktive Kompetenzen definieren
r = (ThisWorkbook.Worksheets("IST Employee Skills").Range("I1048576").End(xlUp).Row)
For k = r To 4 Step -1
If ThisWorkbook.Worksheets("IST Employee Skills").Cells(k, 8) 
Danke für eure Hilfe
Marcel

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Tabelle ergänzen (Geschwindigkeit)
09.08.2021 10:23:47
Daniel
Hi
Kannst du das Ergebnis auch per Formel erzielen?
Wenn ja wäre es schneller, per VBA eine entsprechende Formel in die Zellen zu schreiben.
Das geht schneller, weil man die Formel in alle Zellen gleichzeitig schreiben kann und nicht jede Zelle einzeln ausfüllen muss.
Gruß Daniel
AW: Tabelle ergänzen (Geschwindigkeit)
09.08.2021 13:14:31
Marcel
Danke Daniel
Wäre auch ne Möglichkeit, nur die Array Version von Rudi gefällt mir um einiges besser
AW: Tabelle ergänzen (Geschwindigkeit)
09.08.2021 10:56:23
Rudi
Hallo,
teste mal:

Sub marcel()
Dim vntTMP, vntOUT
Dim r As Integer
Dim k As Integer
Dim i As Integer
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual 'Formelkalkulation ausschalten
With ThisWorkbook
.Activate
'Filter löschen
With .Worksheets("IST Employee Skills")
.Range("A3").AutoFilter
.Range("A3").AutoFilter
With .ListObjects("EmployeeSkills").Sort
.SortFields.Clear
.SortFields.Add Key:=Range("EmployeeSkills[[#All],[Erstellt am]]"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
.Range("Q4:Q99999").ClearContents
vntTMP = .Range(.Cells(4, 1, .Cells(Rows.Count, 9).End(xlUp).Row, 17))
For k = UBound(vntTMP) To 1 Step -1
If vntTMP(k, 17) = "" Then
If vntTMP(k, 8) 
Gruß
Rudi
Anzeige
AW: Tabelle ergänzen (Geschwindigkeit)
09.08.2021 13:12:47
Marcel
Hallo Rudi,
Vielen Dank für deine Antwort.
Diese Funktioniert wunderbar!
Einzig folgende Zeile musste ich Anpassen

vntTMP = .Range(.Cells(4, 1), .Cells(.Cells(Rows.Count, 9).End(xlUp).Row, 17))
Wenn ich den Code richtig deute, passiert im Grunde nichts anderes als vorhin. Es wird Zeile für Zeile geprüft, nur nun in einer Array anstelle des Worksheets.
Trotzdem ist der Code massiv schneller.
Könntest du mir erklären warum die Geschwindigkeit so massiv schneller ist?
Vielen Dank nochmals
AW: Tabelle ergänzen (Geschwindigkeit)
09.08.2021 13:40:35
Daniel
Hi
das liegt an den Hintergrundaktivitäten, die Excel ausführen muss wenn du einen Zellwert änderst.
änderst du jeden Zellwert einzeln, dann muss Excel diese Aktivitäten auch bei jeder Zelle einzeln wiederholt ausführen
änderst du jedoch viele Zellen gleichzeitig in einem Schritt so beim zurückschreiben des Arrays in die Zellen, dann kann Excel diese Aktvitäten für alle Zellen geblockt und gemeinsam durchführen.
Ist wie beim Bäcker, wenn du jedes Brötchen einzeln bezahlst, dauert es länger als wenn du die Kosten zusammenaddierst und dann alle zusammen bezahlst.
auch das generelle Arbeiten ist einfacher.
Plakativ kann man sich das so vorstellen:
ein Exceltabellenblatt ist wie ein großes Bürogebäude und jedes Büro ist eine Zelle und auf dem Whiteboard steht der entsprechende Zellwert.
Arbeitest du direkt mit den Zellen, läufst du praktisch von Büro zu Büro und holst dir da die einzelnen Werte ab.
Verwendest du das Array, schriebst du dir alle Werte aus den Büros erstmal auf einen Zettel (Werte abschreiben geht auch von außen mit dem Fernglas) und arbeitest dann nur noch mit dem Zettel.
Bist du fertig, dann hälst du nur noch den Zettel hoch und die Angestellen in den Zellen schreiben den Zettelwert aufs Whiteboard.
daher ist das schneller
Gruß Daniel
Anzeige
Könntest du mir erklären
09.08.2021 13:45:05
Rudi
Hallo,
weil nur noch im Speicher gearbeitet wird und nicht mehr auf das Blatt zugegriffen werden muss.
Außerdem wird das Ergebnis (Q) in einem Rutsch geschrieben.
Gruß
Rudi
AW: Könntest du mir erklären
09.08.2021 13:57:42
Marcel
Danke Rudi
Sehr eindrücklich

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige