Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Sverweis und Performance im VBA

Forumthread: 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
Anzeige

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.
Anzeige
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.
Anzeige
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
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige