Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Anzeige
Inhaltsverzeichnis

Dictionary automatisch Key erstellen verhindern

Forumthread: Dictionary automatisch Key erstellen verhindern

Dictionary automatisch Key erstellen verhindern
29.01.2025 17:56:46
Spoiler
Hallo Zusammen,

wenn auf einen Key im Dictionary zugegriffen wird, den es noch nicht gibt, erstellt VBA diesen Key automatisch und belegt ihn mit einem leeren Wert (empty).

Beispiel:



Set Dict = CreateObject("Scripting.Dictionary")

with Dict
.add "eins", 1
.add "zwei", 2
end with

MsgBox Dict("drei")


Danach gibt es 3 Einträge im Dictionary "eins", "zwei", "drei" ... wobei "drei" eben leer ist.

Ich möchte dieses Verhalten gerne verhindern oder zumindest darauf reagieren, denn ein leerer Eintrag bringt beim Rechnen im Anschluss nur Murks.
(es handelt sich um die Prüfung eines Schichtplans mit mehreren tausend Einträgen, warum da Werte drin stehen, die in der Zuordnung (Dict) nicht eingetragen sind, sei mal dahin gestellt)
Kann ich das irgendwie abfangen?

Vielen Dank im Voraus.

mit besten Grüßen
Anzeige

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Dictionary automatisch Key erstellen verhindern
29.01.2025 18:02:59
Onur
If dict.exists("drei") Then MsgBox dict("drei")
AW: Dictionary automatisch Key erstellen verhindern
29.01.2025 18:20:56
Spoiler
Das Prüfen, ob ein Schlüssel existiert ist nicht das Problem.

LastTime = Datum - 1 + oZuOrd(AktZelle.Offset(0, -1).value)


Wenn es hier in oZuord den Schlüssel AktZelle.Offset(0, -1).value nicht gibt, wird er erstellt, ist leer, wird also als 0 (Null) gewertet und ergibt eine falsche Zeit.

Von diesen Zeilen gibt es viele ... muss ich dann vor jeder Rechnung prüfen, ob der Schlüssel existiert?
Anzeige
AW: Dictionary automatisch Key erstellen verhindern
29.01.2025 18:40:47
Onur
Dann halt so:
x = AktZelle.Offset(0, -1).Value

If x > "" Then
LastTime = Datum - 1 + oZuOrd(x)
Else
'MACH WAS
End If

'ODER ABER

x = AktZelle.Offset(0, -1).Text
If oZuOrd.exists(x) Then
LastTime = Datum - 1 + oZuOrd(x)
Else
'MACH WAS
End If

Anzeige
AW: Dictionary automatisch Key erstellen verhindern
30.01.2025 10:22:50
Spoiler
Das ist soweit richtig, führt aber dazu, dass ich bei 1000 Einträgen im Plan und sagen wir mal 10 Berechnungen pro Eintrag zusätzliche 10000 "If" ausführe.

Das macht die Sache doch unnötig langsam. Gibt es da keine bessere Lösung?
AW: Dictionary automatisch Key erstellen verhindern
30.01.2025 10:28:17
Onur
" 10 Berechnungen pro Eintrag" ???
Du kannst doch alle 10 innerhalb der IF-THEN-Schleife ausführen:
x = AktZelle.Offset(0, -1).Text

If oZuOrd.exists(x) Then
LastTime = Datum - 1 + oZuOrd(x)
Else
'MACH WAS
End If
Anzeige
unnötig langsam
30.01.2025 11:26:59
Yal
Hallo Spoiler,

ich habe mir die Frage gestellt und geprüft: "Exists" führt zu keinem Caching, sodass sowohl bei "Exists" als auch bei dem Zugriff die volle Suche gemacht wird. Also die Zeiten werden doppelt.
Es ist bei 10.000 nicht messbar. Bei 10 Mio Betragt die Zeit 0,7 Sek (nur Zugriff) und 1,4 Sek (Exists + Zugriff). Die Argumentation "unnötig langsam" kann man getrost zur Seite stellen.

Schwierig ist eher, dass Du dein Code an zu vielen Stellen anpassen müsste, aber das wäre einen Zeichen, dass Du deinen Code besser strukturieren müsste. Gern unterstützen wir genau an dieser Stelle.

VG
Yal

Der Test-Code:
Private Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long


Sub Dictionary_Test()
Dim D As New Dictionary
Dim T, i, Elt

'Dictionary befüllen
For i = 97 To 103 '"a" bis "g"
D(Chr(i)) = i
Next i
'Nur Zugriff
T = GetTickCount
For i = 0 To 10000000
Elt = D("m") 'man greift absichtlich auf eine nicht vorhanden Key, um die vollständige Suche zu haben (binary tree)
Next
Debug.Print "Nur Zugriff: " & vbTab & GetTickCount - T & " ms"
'Exists + Zugriff
T = GetTickCount
For i = 0 To 10000000
If D.Exists("m") Then Elt = D("m")
Next
Debug.Print "Ex. + Zugr.: " & vbTab & GetTickCount - T & " ms"
End Sub
Anzeige
AW: unnötig langsam
30.01.2025 11:32:24
Onur
Dichtionaries sind so schnell, dass sie in vielen (wenn nicht sogar in den meisten) Fällen Formellösungen in Sachen Tempo schlagen können, obwohl Formeln Multithread benutzen..
Geschwindigkeit der Dictionary
30.01.2025 15:34:15
Yal
Ja, aber die Geschwindigkeit wird dadurch erzeugt, dass die Schlüssel entlang eines binary Tree* abgelegt werden, dass heisst, diese werden beim Aufbau erzeugt (kostet Zeit), um dann bei der Suche wesentlich schneller zu sein.

Daher ist es abzuwägen, wieviel Suche in einem festen Bestand gemacht wird. Wenn nur eine einzige Wert gesucht wird, wird die Formel vermutlich schneller sein.
Aber um 2 Listen miteinander zu vergleichen oder zusammenzuführen, ist es sinnvoll die Liste gesuchte Liste in einem Dictionary zu packen. Voraussetzung ist, dass es eine eindeutigen Schlüssel gibt.

VG
Yal

*: https://www.geeksforgeeks.org/binary-search-tree-data-structure/
Anzeige
AW: unnötig langsam
30.01.2025 11:35:19
Spoiler
Ja, da ist auch noch Code dabei, der schon einige Jahre und Erfahrungsdefizite auf dem Buckel hat.
Ich hatte gehofft, es gibt eine "kostengünstige" Variante, wie es aussieht, werde ich den Code wohl entsprechend anpassen und strukturieren müssen.

Manchmal isses so und manchmal anders.

Vielen Dank für eure Hilfe und eine gute Zeit
Anzeige
AW: unnötig langsam
30.01.2025 20:13:13
daniel
Wenn du dir um die Verarbeitungsgeschwindigkeit Sorgen machst, solltest du erstmal alle benötigten Daten aus dem Tabellenblatt in ein Array laden und mit diesem arbeiten anstatt mit direktem Zellzugriff.

Auch Ergebnisse sollte man erst in ein Array schreiben und dann dieses am Schluss ins Tabellenblatt.

Gruß Daniel
Anzeige

Forumthreads zu verwandten Themen

Anzeige
Anzeige