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

Suchschleife viel zu langsam - die Zweite

Suchschleife viel zu langsam - die Zweite
02.04.2013 00:22:44
Jürgen
Hallo Forum,
ich bin noch immer am laborieren, ohne ersichtlichen Erfolg zu haben.
Nachfolgende UF (Suchschleife) sucht, isoliert in einem anderen Workbook einwandfrei und auch schnell genug.
Bei etwa 500 gefundenen Werten dauert der Suchlauf etwa zwei Sekunden.
Private Sub BegriffSuchen()
Dim Begriff$, Zeile As Long, c As Range, S_Zeile%
Dim firstAddress$, Fund As Long, S_länge%
S_länge = Wspt.Cells(Rows.Count, 11).End(xlUp).Row
If S_länge  firstAddress
End If
End With
Anzahl.Caption = Zeile: If Zeile = 0 Then Anzahl.Caption = "0"
End Sub
Füge ich diese UF in mein Gesamtprojekt ein, dauert der gleiche Suchlauf mehrere Minuten. Pro gefundenen Wert braucht das Teil dann etwa eine Sekunde und man kann das Füllen der Listbox bequem beobachten.
Wie man aus der Syntax erkennen kann, werden hier auch keine anderen Ereignisse, wie Change usw. angesprochen oder ausgelöst, was ich im Originalprojekt im Einzelschrittmodus nachvollzogen und geprüft habe.
Dinge, wie Application.ScreenUpdating = False und Deaktivierung der autom. Berechnung haben auch nichts bewirkt.
Welches Geheimnis habe ich hier noch nicht gelüftet?
Ich stehe vollkommen auf dem Schlauch.
Ich würde ja auch das ganze Projekt hier einstellen, wenn ich da nicht zu viel anonymisieren und der Größe wegen (max. 1 MB) abspecken müsste.
Das, worum es geht, habe ich aber hier eingestellt.
https://www.herber.de/bbs/user/84663.zip
Gruß
Jürgen

23
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Was ist bei dir 'ne UF? Morrn! owT
02.04.2013 00:51:31
Luc:-?
:-?

AW: Was ist bei dir 'ne UF? Morrn! owT
02.04.2013 00:58:33
Jürgen
Anbetrachts der nachfolgenden Syntax und Begriffen, wie ListBox sollte klar sein, dass es sich dabei um eine UeserForm handelt.

AW: Was ist bei dir 'ne UF? Morrn! owT
02.04.2013 01:03:48
Jürgen
Streiche UeserForm / Setze UserForm

DoEvents...
02.04.2013 07:10:32
Case
Hallo, :-)
eine Bremse ist in jedem Fall das "DoEvents", welches m. E. n. hier auch überflüssig ist, also lösche es mal raus (es sei denn, Du willst beim befüllen der ListBox zuschauen).
Servus
Case

AW: DoEvents...
02.04.2013 12:04:59
Jürgen
Hallo Case,
das "DoEvents" ist da normaler Weise auch gar nicht drin, denn eine normale Schleife braucht das nicht.
Wenn aber der Prozessor heiß läuft, weil man eine mehrere Minuten laufende Schleife hat, die man auch nicht unterbrechen kann, ist das schon sinnvoll.
Und nur dazu habe ich das temporär eingebaut.
Ohne "DoEvents" läuft es aber genau so lange.
Gruß
Jürgen

Anzeige
erst sammeln, ...
02.04.2013 10:05:40
Rudi
Hallo,
.. dann füllen.
Private Sub BegriffSuchen()
Dim Begriff$, Zeile As Long, c As Range, S_Zeile%
Dim firstAddress$, Fund As Long, S_länge%
Dim objList As Object, objPT As Object
S_länge = Wspt.Cells(Rows.Count, 11).End(xlUp).Row
If S_länge  firstAddress
End If
End With
If objList.Count Then
SuchErgebnisse.Column = WorksheetFunction.Transpose(objList.items)
Wspt.Cells(4, 11).Resize(objPT.Count, 7) = WorksheetFunction.Transpose(WorksheetFunction. _
Transpose(objPT.items))
End If
Anzahl.Caption = objList.Count
End Sub
und auch schnell genug.
Bei etwa 500 gefundenen Werten dauert der Suchlauf etwa zwei Sekunden.

Finde ich nicht gerade scnell.
Gruß
Rudi

Anzeige
AW: erst sammeln, ...
02.04.2013 12:39:23
Jürgen
Hallo Rudi,
lief ja sehr schnell durch aber das schreiben in die Seite "Protokoll" Spalte 11 bis 17, bei dem es eben hakte, habe ich vermisst.
Wo schreibt er das denn jetzt hin?
Gruß
Jürgen

AW: erst sammeln, ...
02.04.2013 12:46:27
Rudi
Hallo,
nach Protokoll!K4:Qx
Wspt.Cells(4, 11).Resize(objPT.Count, 7) = WorksheetFunction.Transpose(WorksheetFunction. _
Transpose(objPT.items))

Gruß
Rudi

AW: erst sammeln, ...
02.04.2013 13:05:24
Jürgen
Hallo Rudi,
ich gebe mir wirklich alle Mühe, verstehe hier aber irgend etwas nicht.
Die von Dir gezeigte Zeile ist doch so schon vorhanden.
Gruß
Jürgen

Anzeige
AW: erst sammeln, ...
02.04.2013 13:12:52
Rudi
Hallo,
Die von Dir gezeigte Zeile ist doch so schon vorhanden.
Genauuuu.
Ich wollte dir nur zeigen, wo ins Protokoll geschrieben wird.
Gruß
Rudi

AW: erst sammeln, ...
02.04.2013 13:20:04
Jürgen
Ok Rudi,
es wird aber nur eine Zeile in die Seite "Protokoll" geschrieben.
Gruß
Jürgen

Protokoll
02.04.2013 13:31:55
Rudi
Hallo,
bei deiner Testdatei habe ich 490 Zeilen im Protokoll.
Gruß
Rudi

AW: Protokoll
02.04.2013 13:52:09
Jürgen
Hallo Rudi,
ich muß für deine Geduld erst einmal Dank sagen.
Nun habe ich mir, der gleichen Testbedingungen wegen, noch einmal meine eigene Datei hier herunter geladen und das Ganze duchgespielt.
Es wird immer nur eine Zeile geschrieben. Hierbei handelt es sich immer um die letzte Fund-Zeile.
Gruß
Jürgen

Anzeige
ich bin dumm!
02.04.2013 14:20:38
Rudi
Hallo,
hab hier im Forum eine Zeile aus dem Code gelöscht.
.....
objPT(S_Zeile) = Array(Wsda.Cells(Fund, 1).Text, Wsda.Cells(Fund, 6).Text, _
Wsda.Cells(Fund, 18).Text, Wsda.Cells(Fund, 30).Text, _
Wsda.Cells(Fund, 34).Text, Wsda.Cells(Fund, 31).Text, _
Wsda.Cells(Fund, 32).Text)
S_Zeile = S_Zeile + 1
.....
Gruß
Rudi

AW: ich bin dumm!
02.04.2013 14:40:27
Jürgen
Hallo Rudi,
habe das jetzt mal in meine Originaldatei eingebaut und es funktioniert super schnell.
Die Funktionsweise mit den Arrays habe ich zwar nicht verstanden, wie ich hier vor ein paar Tagen schon mal schrieb, aber es läuft.
Ich danke dir für deine Mühe und dass Du am Ball geblieben bist.
Gruß
Jürgen

Anzeige
wenigstens den Betreff ...
02.04.2013 14:50:36
Rudi
hättest du ändern sollen ;-)

AW: wenigstens den Betreff ...
02.04.2013 15:04:16
Jürgen
Hallo Rudi,
ja das hätte ich können.
Dann aber käme bei den anderen Lesern schnell die Frage auf, warum ich die Funktion der Arrays nicht kenne. Diese Angriffsfläche wollte ich denen nicht bieten.
Daher habe ich das, was für dich ja nicht zutrifft, für mich gleich übernommen.
Es stört mich auch nicht, denn nur diese Erkenntnis treib an, weiter am Ball zu bleiben.
Gruß
Jürgen

Es sind doch noch Fragen offen.
02.04.2013 19:43:32
Jürgen
Hallo Rudi,
da sind bei mir doch noch ein paar Unstimmigkeiten aufgetaucht.
Wo kommt Die Zeilennummer in der ersten Spalte der ListBox her?
Abgefragt wurde doch nur - Fund-1 = ID.Nr / Fund-6 = Artikeltext
Fund-18 = Lieferlager / Fund 31 = Status / Fund-32 = Adresse
Nächste Frage
Zwischen einigen ListBox-Spalten möchte ich Platzhalter (2pt) ohne Inhalt einbauen,
wie ich es ursprünglich auch im Code (Siehe UserForm_Initialize) vorgesehen hatte.
Wie geht das jetzt bei deinem Code?
Ich habe die Datei noch einmal angehängt und mit mit logischen Texten versehen, damit es auch optisch leichter prüfbar ist.
https://www.herber.de/bbs/user/84681.zip
Gruß
Jürgen

Anzeige
Probleme Gelöst.
02.04.2013 22:47:12
Jürgen
Hallo Rudi,
habe mich da selbst durchgewurschtelt
Entsprechender Part:
objList(Fund) = Array(Wsda.Cells(Fund, 1).Text, Wsda.Cells(Fund, 6).Text, _
Platzh, Wsda.Cells(Fund, 18).Text, Platzh, Wsda.Cells(Fund, 31).Text, _
Platzh, Wsda.Cells(Fund, 32).Text
)
Hier gab es am Anfang hinter Klammer auf ein "Fund" zuviel.
Für die künstlichen Abstände habe ich einfach eine unbelegte Stringvariable (Platzh = "") eingesetzt.
Ob das nun die eleganteste Lösung ist, weiss ich nicht. Es funktioniert aber.
Gruß
Jürgen

AW: Probleme Gelöst.
02.04.2013 22:58:27
Rudi
Hallo,
habe mich da selbst durchgewurschtelt
die nachhaltigste Lernmethode. Anders mach ich's auch nicht.
Gruß
Rudi

Anzeige
AW: Es sind doch noch Fragen offen.
02.04.2013 22:53:59
Rudi
Hallo,
dann schmeiß mal Fund aus dem Array
objList(Fund) = Array(Wsda.Cells(Fund, 1).Text, Wsda.Cells(Fund, 6).Text, _
Wsda.Cells(Fund, 18).Text, Wsda.Cells(Fund, 31).Text, _
Wsda.Cells(Fund, 32).Text)
Gruß
Rudi

Me.SuchErgebnisse.Visible = False ... True
02.04.2013 23:16:04
Arthur
Hi Jürgen.
In normalen Berechnungsfunktionen würde ich den ScreenUpdate ausschalten. Keine Ahnung, wie das bei eine Userform geht, aber kurz mal das Zielobjekt ausblenden sollte einen Geschwindigkeitsvorteil bringen.
Me.SuchErgebnisse.Visible = False
[... code ...]
Me.SuchErgebnisse.Visible = True
Gruß, Arthur

Anzeige
AW: Me.SuchErgebnisse.Visible = False ... True
02.04.2013 23:48:06
Jürgen
Hallo Arthur,
danke für den Hinweis aber das einlesen in die ListBox war zeitlich nie das Problem.
Wo sich der Rechner (Intel Core i3 370M bei 2,6 GHz) zeitweise heiß lief, war das Schreiben in die andere Sheet.
Hier hat mir Rudi, wie Du weiter unten nachlesen kannst, sehr geholfen und das Teil saust jetzt ab wie Schmitts Katze.
Das Teil hat bis Jetzt etwa 1000 Zeilen bei 36 Spalten, die zu durchsuchen sind und das macht er jetzt in etwa einer Sek.
Damit bin ich zufrieden.
Gruß
Jürgen

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige