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

For Schleife - Performanceprobleme

For Schleife - Performanceprobleme
11.05.2017 13:17:04
Bydo
Hallo zusammen,
ich habe eine Tabelle mit 22.000 Ids, welche ich in einer 55.000 Zeilen großen Bestandstabelle Suche und bei Treffer einen Wert in einer Nachbarspalte überprüfe. Je nach Zusammenstellung wird etwas in eine dritte Tabelle ausgespeichert.
Mein Problem: Dieser Vorgang dauer 20 Minuten+ (ich habe den Prozess an dieser Stelle beendet). Wieso braucht der Rechner so lange und wie kann ich die Arbeit zügiger erledigen lassen?
Beispieltabelle mit Code anbei, vorab vielen Dank und viele Grüße
Bydo
https://www.herber.de/bbs/user/113500.xlsm

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: For Schleife - Performanceprobleme
11.05.2017 13:29:35
dirk
Hallo!
Du lässt für jede checkrow die komplette inventro durchsuchen. Das sind dan bei 22000 checkrows 55000 checks. Summa Sumarum also 1210000000 aktionen. Da brauchst Du schon nen schnellen rechner ;-)
Probier docvh mal das mit .find zu realisieren. Falls die IDs, die Du suchst nur weniuge male (oder nur einmal) in der Suchtabelle vorkommen, reduziert sich die nummer der Interaktionen auf 22000 (mal die Anzahl der Vorkomnisse pro Suchkriterium).
Gruss
Dirk aus Dubai
AW: Antwort bei "clever-excel" owT
11.05.2017 13:29:57
Fennek
AW: For Schleife - Performanceprobleme
11.05.2017 13:41:18
Daniel
wenns woanders schon ne antwort gibt, brauche ich mir hier ja keine Mühe mehr zu machen.
Gruß Daniel
Anzeige
AW: For Schleife - Performanceprobleme
11.05.2017 13:55:20
Daniel
naja abwarten und Tee trinken, bis dort was kommt.
Gruß Daniel
AW: For Schleife - Performanceprobleme
11.05.2017 15:15:13
Daniel
Hi
probier mal das.

Sub Umformen()
Dim lZ As Long
Sheets("Ausgabe").Cells.Clear
'--- Kopfdaten übertragen (Spalte 1-4) ---
With Sheets("Prüfliste")
lZ = .Cells(.Rows.Count, 1).End(xlUp).Row
.Range("A2:B" & lZ).Copy
End With
With Sheets("Ausgabe").Range("A2:E" & lZ)
.Cells(1, 1).PasteSpecial xlPasteValues
.Columns(3).Value = Now
.Columns(4).Value = "bydo@vba.ms"
.Columns(5).Value = "bydo"
End With
'--- inventarliste umgestalten ---
Sheets.Add after:=Sheets("Inventar")
ActiveSheet.Name = "Inventar2"
With Sheets("Inventar2")
Sheets("Inventar").UsedRange.Copy
.Cells(1, 1).PasteSpecial xlPasteAll
.Columns(3).Copy .Columns(4)
Sheets("Inventar").UsedRange.Offset(1, 0).Copy
.Cells(1, 1).End(xlDown).Offset(1, 0).PasteSpecial xlPasteAll
.Columns(2).Copy
.Columns(5).Insert shift:=xlToRight
.Range("A:C").Delete
.UsedRange.Sort Key1:=.Cells(1, 1), order1:=xlAscending, Header:=xlYes
.Rows(2).Insert
.Cells(2, 1).Value = 0
End With
'--- Ergebnis Inventar eintragen
With Sheets("Ausgabe").Range("F2:I" & lZ)
.Columns(1).FormulaR1C1 = "=IF(VLOOKUP(RC2,Inventar2!C1,1,TRUE)=RC2," _
& "MATCH(RC2,Inventar2!C1,1),FALSE)"
.Columns(2).Resize(, 3).FormulaR1C1 = "=IF(NOT(RC6),""nicht gefunden""," _
& "IF(OR(INDEX(Inventar2!C4,RC6)=""aktiv""" _
& ",INDEX(Inventar2!C4,RC6)=""wartend""),""""," _
& "INDEX(Inventar2!C[-5],RC6)&""""))"
.Formula = .Value
.Columns(1).EntireColumn.Delete
End With
'-- Aufräumen
Application.DisplayAlerts = False
Sheets("Inventar2").Delete
Application.DisplayAlerts = True
With Sheets("Ausgabe")
.Columns(2).Delete
.Range("A1:D1").Value = Array("ZUGANG", "TIMESTAMP", "PRÜFERMAIL", "PRÜFER")
.Columns(2).AutoFit
.Select
End With
End Sub
Welche der Lösungsvarianten, die du erhalten hast, läuft denn mit deiner Datei besser?
Gruß Daniel
Anzeige
Problem wird nach "Telefonbuchmethode" gelöst
11.05.2017 16:26:29
Zwenn
Hi Bydo,
da ich nur in diesem Forum aktiv bin und auch nur, wenn ich Zeit habe, ärgert es mich auch, wenn jemand an drei verschiedenen Quellen um eine Lösung bittet, ohne die jeweils anderen beiden davon in Kenntnis zu setzen. Habe mir aber durchgelesen, was nun in den anderen Foren besprochen wurde und gehe mal davon aus, dass Du hier noch rein schaust.
Kurzes Gedankenspiel:
Du hast 22.000 IDs, von denen Du jede einzelne in 55.000 Zeilen einer anderen Tabelle suchst. Da die eine Hälfte der gesuchten Werte in der ersten Hälfte der zu durchsuchenden Zeilen liegen und die andere Hälfte der gesuchten Werte in der zweiten Hälfte der durchsuchten Zeilen, kommst Du mit Deiner Methode unterm Strich auf 22.000 * 55.000 / 2 = 605 Mio. Suchschritte. Genau das frisst Deine 20 Minuten auf.
Diese 605 Mio. kannst Du stark eindampfen, indem Du (wie schon andernorts angemerkt), beide Listen in jeweils ein Array packst. Diese beiden Arrays sortierst Du. Anschließend verwendest Du die "Telefonbuchmethode".
Ich habe keine Ahnung wie alt Du bist und ob Du jemals eine Telefonnummer in einem Telefonbuch aus Papier gesucht hast. Da stehen alle Namen alphabetisch sortiert von A bis Z drin. Wenn Du einen Namen suchst, dann schlägst Du das Telefonbuch in der Mitte auf. Liegt der Anfangsbuchstabe unter dem, der aufgeschlagenen Seite, verfällt die obere Telefonbuchhälfte direkt und Du musst nur in der ersten Hälfte weitersuchen. Ist der gesuchte Buchstabe größer als der auf der aufgeschlagenen Seite, verfällt hingegen die untere Hälfte des Telefonbuchs direkt und Du brauchst nur in der oberen Hälfte weitersuchen.
Dieses Verfahren setzt Du mit der gewählten Hälfte fort. Solange, bis Du den gesuchten Namen gefunden hast. Was Du mit Deiner bisherigen Methode machst ist, dass Telefonbuch jedesmal von vorne nach hinten durchblättern, bis Du den Namen gefunden hast.
Mathematisch gesehen benutzt Du zum Suchen also einen Binärbaum. Da sich dieser jede Ebene um den Faktor 2 zur vorherigen vergrößert, hat der imaginär genutze Binärbaum (wir bauen den nicht wirklich auf) 16 Ebenen, in denen bis zu 65.536 Werte untergebracht werden können. Das ergibt sich aus dem Logarithmus von 55.000 zur Basis 2 (daher Binär). Genau genommen kommt da 15,75 raus. Das ist die Anzahl der maximal notwendigen Zugriffe nach der Telefonbuchmethode, um in den 55.000 Zeilen auf einen gesuchten Index zu stoßen.
Der mittlere Zugriffswert für alle 22.000 IDs ist davon wieder die Hälfte. Du brauchst also statt der 605 Mio. Suchschritte plötzlich nur noch 22.000 * 15,75 / 2 = 173.219 Suchschritte. Das sind 0,029 % von 605 Mio. Auf die 20 Minuten bezogen bedeutet das, Du brauchst (theoretisch) nur noch 0,029 % von 20 * 60 Sekunden = 0,35 Sekunden.
Kleiner Unterschied ;-)
Theoretisch, weil Du ja auch noch Daten kopieren willst. Das ist ab der Implementierung der Telefonbuchmethode der Teil, der am meisten Zeit fressen wird. Weiterhin weiß ich nicht (habe nicht in Deine Datei geschaut), ob einzelne IDs öfter in den 55.000 Zeilen vorkommen können. Dann müssen zusätzlich immer noch die Nachbar der gefundenen IDs abgefragt werden. Durch die Sortierung müssen die dann direkt nebenan liegen.
Soweit erstmal von mir.
Viele Grüße,
Zwenn
Anzeige
AW: Problem wird nach "Telefonbuchmethode" gelöst
11.05.2017 16:38:10
Daniel
Hi Zwenn
die Telefonbuchmethode kann man in Excel/VBA ganz einfach über Funktionen SVerweis/VLookUp bzw Vergleich/Match verwenden (mit letztem Parameter = WAHR bzw 1).
ggf muss man hierzu die ausgangstabelle etwas umbauen und sortiern.
Schau dir mal mein Beispiel an.
Gruß Daniel
AW: Problem wird nach "Telefonbuchmethode" gelöst
11.05.2017 16:43:00
Zwenn
Hallo Daniel,
da hast Du sicher recht. Ich sitze noch im Büro und wollte dem Fragensteller nur aufzeigen, warum seine Methode so ungünstig ist. Ich habe Dein Beispiel gesehen, hatte jetzt aber keine Zeit, das mal anzutesten. Mache ich nachher, wenn ich zu Hause bin :-)
Viele Grüße,
Zwenn
Anzeige
AW: For Schleife - Performanceprobleme
11.05.2017 16:36:30
snb
und ach crosposted in VBA-Express
folgender Hinweis im VBA-Express Forum....
11.05.2017 16:47:12
Werner
Hallo,
...Crossposted in ca. 20 Fora:
Respekt!!!
Gruß Werner
AW:bin mal gespannt...
11.05.2017 16:51:13
Daniel
ob sich der Kollege die mühe macht, die Lösungen aus allen Foren zu überprüfen, miteinander zu vergleichen und dann das Ergebnis in allen Foren, in denen er gefragt hat, zu präsentieren.
aber es würde schon reichen, wenn er sich wenigstens in allen Foren, in denen er Antworten erhält, auch bedankt.
Gruß Daniel
AW: AW:bin mal gespannt...
17.05.2017 09:37:29
Werner
Hallo Daniel,
und...? hälst du die Spannung noch? ;-D
Gruß Werner

299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige