Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1652to1656
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

Makro Optimierung

Makro Optimierung
26.10.2018 00:16:53
Timo
Moin,
ich habe aktuell das Problem, das ich Preislisten mit einem Datensatz bzw. einem Archiv abgleichen muss.
Hierzu habe ich die nötigen Spalten (ArtikelNr, wo auch Buchstaben enthalten sind) als String in ein Array geschrieben und suche dann per Formel.
... = Application.Match(Array_Neue_Liste(x), Array_Datensatz, 0)
und zweige danach in die unterschiedlichen Zweige per isNumeric ab
If IsNumeric(...) Then...
Daraus folgen beim durchsuchen vom Datensatz und Archiv und jeweils einer Numeric Prüfung dann folgende Möglichkeiten:
Name ist in Datensatz vorhanden
Name ist in Archiv vorhanden
Name ist nicht vorhanden und muss neu angelegt werden
Aufgrund der Größe des Datensatzes
18.000 Zeilen Neue_Liste
40.000 Zeilen bestehender_Datensatz
31.000 Zeilen Archiv
dauert eine Suche unglaublich lang.
Ich hatte mir eigentlich erhofft, durch den Einsatz von Arrays Laufzeit zu sparen. 15 Min auf ca. 5 Min ist aber nicht die erhoffte Erleichterung.
Gibt es einen weiteren Trick außer den Einsatz von Arrays, welcher Laufzeit sparen kann?
Gruß Timo
Dies ist ebenfalls schon drin.
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With

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

Betreff
Datum
Anwender
Anzeige
AW: Makro Optimierung
26.10.2018 01:19:59
Gerd
Moin,
ja,am Stück in die Tabelle(n) zurückschreiben.
Diese Antwort ist provokant u. soll daran anknüpfen, dass du die "zu verbessernde" Prozedur (bisher) überhaupt nicht gezeigt hast. :-)
Gruß Gerd
AW: Makro Optimierung
26.10.2018 07:59:52
Daniel
Hi
Der Liste Array_Datensatz muss aufsteigend sortiert werden.
Dann kannst du in der Match- oder VLookup-Funktion den letzten Parameter auf 1 setzen und damit die wesentlich schnellere binäre Suche verwenden.
Um zu prüfen, ob ein Wert im Datensatz vorhanden ist, verwendet man:
If VLookup(Suchbegriff, Suchmatrix, 1, 1) = Suchbegriff Then
Gruß Daniel
AW: Makro Optimierung
26.10.2018 21:42:20
Timo
Hallo,
anbei einmal der problematische Code, da ich auch mit vlookup bisher keine besseren Ergebnisse erzielen konnte oder ich setze es falsch ein.
Arrays sind tatsächlich Arrays mit Typ String mit ca.(20.000, 1), (30.000,1) und (40.000, 1). Darin sind aktuell nur die Artikelnummern enthalten, da ich in mehrspaltigen Arrays mit Application.Match nicht suchen kann bzw. nich weiss wie.
Um zu prüfen, ob meine Ergebnisse der Prüfung korrekt sind, habe ich mir ein Ausgabearray angelegt, worin die Ergebnisse geschrieben werden.
Somit schreibe ich aktuell keine Daten zurück in die Datei, sondern arbeite nur in Arrays. Trotzdem bleibt die Laufzeit bei 5 Minuten...
Vielleicht jemand noch eine Idee bzw. ihr kommt mit tatsächlichem Code weiter. Mein Fehler den nicht vorher zu posten..
Sub Pruefung_Artikel_in_DB_vorhanden()
Dim Lieferantennummer As String
'Alle Artikelnummern der Preisliste durchgehen und jeweils die Nummer einlesen
For x = Preisliste_Oberste_Zeile To Preisliste_Unterste_Zeile
Array_Suche_DS = Application.Match(Array_Preisliste(x), Array_DS, 0)
If IsNumeric(Array_Suche_DS) Then
' Falls die Lieferantennummer im Blatt DS gefunden wird- hier weiter
Array_Ausgabe(x) = "Vorhanden"
'Sheets("Preisliste").Range("U" & x).Value = "VORHANDEN"
Else
' Falls im Blatt DS nicht gefunden -> im Archiv suchen
Array_Suche_Archiv = Application.Match(Array_Motorenteile(x), Array_Archiv, 0)
If IsNumeric(Array_Suche_Archiv) Then
' Falls die Lieferantennummer im Blatt Archiv gefunden wird- hier  _
weiter
'Sheets("Preisliste").Range("U" & x).Value = "ARCHIVIERT"
Array_Ausgabe(x) = "Archiviert"
Else
' Falls die Lieferantennummer im Blatt DS UND Archiv NICHT gefunden  _
wird - hier weiter
'Sheets("Preisliste").Range("U" & x).Value = "Neuanlage"
Array_Ausgabe(x) = "Neuanlage"
End If
'Schleife Archivprüfung Ende
End If
Array_Suche_DS = 0
Array_Suche_Archiv = 0
Next
End Sub

Anzeige
AW: Makro Optimierung
26.10.2018 23:01:48
Daniel
Dann miss mal die Zeit, wie lang du brauchst, um die Liste zu Sortieren und das Ergebnis mit einer Formel in der Tabelle zu erzielen, die die von mir beschriebene Prüfung mit dem SVerweis mit 4. Parameter = Wahr verwendet.
Gruß Daniel
AW: Makro Optimierung
27.10.2018 02:47:41
Timo
Hallo,
wir bekomme ich denn dann eine Zeile (.row funktioniert nicht, da keine Range) um damit weiter zu arbeiten?
Gruß Timo
AW: Makro Optimierung
27.10.2018 08:16:42
Daniel
Hi
Naja du bist doch Excelprofi!
Dann solltest du eigentlich schon selber auf die Lösung kommen:
=wenn(SVerweis(Suchbegriff; Suchvektor; 1; Wahr)=Suchbegriff;Vergleich(Suchbegriff;Suchvektor;1);"")
Das schreibst du als Formel in eine Hilfsspalte. Die Formelergebnisse kannst du dann wieder in ein Array lesen und das in der Schleife durchgehen.
Oder du programmierst entsprechend:
If Application.VLookUp(Suchbegriff, Suchvektor, 1, true) Then
Zeilennummer = Application.Match(Suchbegriff, Suchvektor, 1)
Gruß Daniel
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige