Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

VBA For Schleife Performanceprobleme
#11
Hallo Bydo,

du willst ca.
-66.000 Zellen einzeln aus der Prüfliste und mehr als 2 Milliarden Zellen einzeln aus dem Inventar lesen und 154.000 Zellen einzeln in die Ausgabe schreiben.

Eine Geschwindigkeitsverbesserung vom Faktor > 10.000 dürfte hierbei kein Problem sein.

1) Wenn du die Eingangsarrays wie Fennek beschrieben hat mit je einem Befehl einliest und das Ausgangsarray mit einem Befehl ausgibst, sollte ein Verbesserungsfaktor > 100 möglich sein.

2) Wenn du zusätzlich nicht bei jeder Prüfliste immer das gesamte Inventar durchliest sollte zusätzlich ebenfalls ein Verbesserungsfaktor > 100 möglich sein.
Da die vier Vergleichsspalten in nur zwei Listen sind, wird die Nutzung von Dictionaries, wie Fennek vorgeschlagen hat, in diesem Fall  wohl schneller als eine Sortierung der Spalten sein.
helmut

Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität.
Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen."
Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.





Antworten Top
#12
Hi,

ersetze die Zeile durch diese

Code:
Set rngTreffer = Sheets("Inventar").Columns(3).Resize(, 2).Find(Sheets("Prüfliste").Cells(CHECKROW, 2).Value, LookIn:=xlValues, lookat:=xlWhole, SearchOrder:=xlByRows)
Gruß Stefan
Win 10 / Office 2016
Antworten Top
#13
Habe eine tolle Lösung im ms excel Forum erhalten:

http://www.ms-office-forum.net/forum/showthread.php?&t=342528
Antworten Top
#14
Hallo Bydo,

wie schnell ist denn Mc Santa's Programm auf deinem Datenbestand?
Hast du seine Anmerkung zur Nutzung von Dictionaries gelesen?

Wenn du "gelobst" Blush in Zukunft CP's nicht einzustellen oder wenigsten in allen Foren auszuweisen, wird dir bestimmt jemand Dictionaries einbauen.
helmut

Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität.
Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen."
Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.





Antworten Top
#15
Wie z.B. hier

http://www.vbaexpress.com/forum/showthre...erformance&p=361026&viewfull=1#post361026


Bitte verzichte auf crossposting !!
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top
#16
Hallo,

nachdem der Fragesteller schon durch exzessives CP (min. 5 Foren), möchte ich mich mit einem Vergleich der bereits sehr guten Anworten versuchen.

Aufbauend auf dem Code von snb (vbexpress) und Kommentaren von Zwenn (Herber, "Telefonbuch")  sollte dieser Code (vielleicht mit Ausnahme des "Filters") recht schnell sein. Ein weiteres Sheets("Neu") wird benötigt.


Code:
Sub Fen()

f1 = Sheets("inventar").Cells(1).CurrentRegion
f2 = Sheets("prüfliste").Cells(1).CurrentRegion

With CreateObject("system.collections.arraylist")
   For i = 2 To UBound(f1)
       .Add f1(i, 4)
   Next i
       .Sort
   For i = 2 To UBound(f2)
       If .contains(f2(i, 2)) Then .Add (f2(i, 1))
   Next
   fn = .toarray
   fn = Filter(fn, "Z")
   Sheets("Neu").Cells(2, 1).Resize(UBound(fn) + 1) = Application.Transpose(fn)
   Sheets("Neu").Cells(2, 2).Resize(UBound(fn) + 1, 3) = Array(Format(Now, "DD.MM.YYYY"), "bydo@vba.ms", "bydo")
End With
End Sub

Vielleicht gibt der Fragesteller die jeweiligen Laufzweiten an.

mfg

(auch "Arraylist" habe ich bei snb gefunden, einer der ganz wenigen Ansätze, VB bzw .Net aus xl anzusprechen)
(über "System.Security.Cryptography" gab es keine Diskussion)
Antworten Top
#17
@Fen

In statu nascendi: system.collections.sortedlist
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste