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

Sverweis und Performance im VBA

Sverweis und Performance im VBA
28.10.2018 21:07:57
Timo
Moin,
ich stolpere aktuell über den Excel Sverweis und die VBA Version und komme nicht vernünftig weiter. Ich hatte schon einen Beitrag gepostet, jedoch kam ich auch dort nicht weiter.
Meine Tabelle umfasst 20.000 Zeilen und diese müssen mit einer 30.000 und 40.000 Zeilen Tabelle abgeglichen werden. Aufgrund von Daten, welche ich nicht posten darf, kann ich diese nicht einfach online stellen.
Wenn ich hierzu einen im Excel einen SVerweis mit exaktem Abgleich mache
=WENN(ISTNV(SVERWEIS(C1234;DS!$B$2:$B$43743;1;FALSCH));WENN(ISTNV(SVERWEIS(C1234; Archiv!$B$2:$B$31180;1;FALSCH));"Neu";"Archiv");"Bestand")
dann dauert dies ~ 6 Sekunden ich könnte damit weiter arbeiten trotz aktiver Blatt Berechnung.
Wenn ich versuche, dies im VBA per Schleife nachzubilden per .vlookup oder .match bin ich immer langsamer was mich langsam verzweifeln lässt.
Hat jemand einen Tipp, woran das liegt?
Gruß Timo

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

Betreff
Datum
Anwender
Anzeige
AW: Sverweis und Performance im VBA
28.10.2018 21:16:02
SF
Hola,
bei Excel Profi kann deine Version nur unter 2007 liegen, sonst würdest du Wennfehler() verwenden.
Außerdem hast du bei deinem letzten Thread kein Feedback mehr gegeben!
Gruß,
steve1da
AW: Sverweis und Performance im VBA
28.10.2018 22:18:38
Timo
Moin,
meine Version zuhause war tatsächlich bisher 2003 bzw. eine davor - müsste ich jetzt prüfen. Arbeite jetzt seit ca. einem Monat mit 2016.
AW: Sverweis und Performance im VBA
28.10.2018 21:23:09
Daniel
hatte ich dir im anderen Thread nicht schon geschrieben, wie du das ganze beschleunigen kannst?
wenn ja, dann wäre der Tip: lerne lesen!
aber ich wiederhole es gerne nochmal für dich:
1. Sortiere die Tabellen im Blatt DS und im Blatt Archiv nach der ersten Spalte aufsteigend.
2. verwende folgende Formel für die Prüfung:
=WENN(SVERWEIS(C1234;DS!$B$2:$B$43743;1;WAHR)=C1234;"Bestand";WENN(SVERWEIS(C1234; Archiv!$B$2:$B$43743;1;WAHR)=C1234;"Archiv";"Neu"))
Gruß Daniel
Anzeige
AW: Sverweis und Performance im VBA
28.10.2018 21:24:51
onur
Du suchst einen Wert zuerst in 43000 Zeilen und dann ggf. in 31000 Zeilen, und das ganze 20000 mal.
Was erwartest du?
AW: Sverweis und Performance im VBA
28.10.2018 22:15:49
Timo
Moin,
wenn ich es mit der hauseigenen Sverweis Formel mache, dann hat er es in 6 Sekunden und dies erreiche ich in VBA aktuell nicht und das ist der Punkt, den ich nicht verstehe.
Ich mache aktuell den Schritt hin zum VBA, Arbeitsabläufe zu erleichern und um performanter zu werden. Aller Anfang ist schwer und daher die Fragen. Ich probiere gleich nochmal die Lösung vom 2. Tread aus vergleiche die Zeiten und stelle es dann nochmal online mit Codes.
AW: Sverweis und Performance im VBA
28.10.2018 23:28:16
onur
EXCEL-Funktionen sind nun mal in direkt C geschrieben und optimiert.
VBA-Code muss erst mal compiliert (in C "übersetzt") werden, und das Ergebnis kann niemals auch nur annähernd so schnell und kompakt sein wie die in C geschriebene Funktion, selbst wenn der VBA-Code so kompakt wäre, wie überhaupt möglich.
Wenn dagegen die Funktion direkt in Maschinensprache geschrieben wäre, könnte die in C geschriebene Version nicht mithalten.
Je höher die Programmiersprache ist, desto langsamer und umfangreicher wird der Code.
Anzeige
mit Dictionary
29.10.2018 12:32:03
Rudi
Hallo,
als Anregung:
Option Explicit
Public objNeu As Object, objBestand As Object, ObjArchiv As Object
Sub start()
Dim arr, i
Set objNeu = CreateObject("scripting.dictionary")
Set objBestand = CreateObject("scripting.dictionary")
Set ObjArchiv = CreateObject("scripting.dictionary")
arr = Range("A1:A20000")
For i = 1 To 20000
objNeu(arr(i, 1)) = 0
Next
arr = Range("b1:b30000")
For i = 1 To 30000
objBestand(arr(i, 1)) = 0
Next
arr = Range("c1:c40000")
For i = 1 To 40000
ObjArchiv(arr(i, 1)) = 0
Next
End Sub
Sub pruefen()
If objNeu Is Nothing Then Call start
MsgBox objBestand.exists(Range("A19980").Value)
End Sub

Gruß
Rudi
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige