version=3.1.3
vdate=07.01.2015
fname=cast_cdict.bas
ns=%NAMESPACE%
fpath=/vba/cast
{{keywords>vba,dictionary,cast,create dictionary,function}}
{{description>Diese Funktion erstellt auf verschiedene Arten ein Dictionary. V-%%version
%%}}
====== [VBA] cDict() ======
//Einfaches erstellen eines Dictionarays aus Arrays, Collections, String, Wertesammlungen.//
==Version %%version%% - %%vdate%%==
Diese Funktion erstellt auf verschiedene Arten ein Dictionary.
\\ Die Funktion alleinstehend macht mässig Sinn. ich brauche sie aber immer mal wieder in anderen Funktionen. zB [[vba:functions:strreplace]]
{{%%fname%%|Download %%fname%% (V-%%version%%)}}
>Um aus einem JSON-String ein Dictionary zu erstellen habe ich die Libraray [[vba:cast:json]] erstellt.
Darum wird dasnicht in der Funktion cDict() abgehandelt
===== Definitionen =====
Es gibt verschiedene Varianten um cDict() anzuwenden. Hier ist mal eine Liste verschiedener Anwendungsarten. Beispiele dazu sin weiter unten aufgeführt
Dictionary = cDict(key1, value1 [,key2, value2...[,key#, value#]])
Dictionary = cDict(array(key1 [,key2...[,key#]]), array(value1 [,value2...[,value#]])
Dictionary = cDict(array(value1 [,value2...[,value#]])
Dictionary = cDict(dictionary1 [,dictionary2...[,dictionary#]])
Dictionary = cDict(string)Public Function cDict(ParamArray iItems() As Variant) As dictionary
===== Beispiele =====
> Für die Ausgabe der Resultate verwendete ich die Funktion [[:vba:functions:print_r:]].
==== Key & value abwechselnd ====
Dictionary = cDict(key1, value1 [,key2, value2...[,key#, value#]])
Die Funktionsargumente sind abwechselnd Key, Value
'Normal: Gleich viele Keys wie Values
d cDict("A", 123, "B", now, "C", "Wert 'C'")
(
[A] => 123
[B] => 08.09.2014 12:24:51
[C] => 'Wert 'C''
)
'ungerade Anzahl Argument. Der letzte Key hat keinen Wert
d cDict("a", "A", "b", "B", "c")
(
[a] => 'A'
[b] => 'B'
[c] =>
)
'Nur ein Key ohne Value
d cDict(2)
(
[2] =>
)
'Ohne Keys. Der Key ist Empty. Der Zweite Wert überschreibt den ersten nicht
d cDict(,2,,3)
(
[] => 2
)
==== 1 Array: Ein Array mit Values ====
Dictionary = cDict(array(value1 [,value2...[,value#]])
Es wird nur ein Array übergeben. Dann wird dieser Array als Value-Array in ein Dictionary gewandelt mit dem Arrayindex als Key
'Ein nicht weiter spezifizierter Array. Index beginnt bei 0
d cDict(array(123, now, "Wert 'C'"))
(
[0] => 123
[1] => 08.09.2014 12:26:06
[2] => 'Wert 'C''
)
'Ein Array mit Index von 3 bis 5
Public Sub testCDict()
Dim arr(3 To 5) As String
arr(3) = "C"
arr(4) = "D"
arr(5) = "E"
print_r cDict(arr)
End Sub
'Ausgabe:
(
[3] => 'C'
[4] => 'D'
[5] => 'E'
)
==== 2 Arrays: Key-Array und Value-Array ====
Dictionary = cDict(array(key1 [,key2...[,key#]]), array(value1 [,value2...[,value#]])
Der Funktion werden 2 Arrays übergeben. Der erste beinhaltet alle Keys, der Zweite die Values. Die Anzahl Einträge hängt nur vom Key-Array ab
'Standard: Es sind gleich viele Values wie Keys
d cDict(array("A", "B", "C"), array(123, now, "Wert 'C'"))
(
[A] => 123
[B] => 08.09.2014 12:25:47
[C] => 'Wert 'C''
)
'Mehr Values als Keys
d cDict(Array(1,2,3), array("A", "B", "C", "D"))
(
[1] => 'A'
[2] => 'B'
[3] => 'C'
)
'Mehr keys wie Values
d cDict(Array(1,2,3), array(1))
(
[1] => 1
[2] =>
[3] =>
)
==== Ein Zuordnungsstring ====
Dictionary = cDict(string)
%%Ein Dictionary kann auch als String beschrieben werden. So ähnlich einem Set-Statement in einem SQL.
Dieser beinhalter jeweils ein Key (key in [], '' oder ""), eine Zuweisung(=>, = oder :) und einem Value ('' oder "" als Delemiter für Strings, ## für Datum und keine Delemiter für Zahlen). Es können mehrere Zuweisungen mit einem Komma getrent übergeben werden.%%\\
Ist ein Delemiter Bestandteil des Textes, kann er mit einem \ maskiert werden. Zum Beispiel 'Paddy O\'Brien'.
'2 Verschidene Zuordnungen: Zahl, Datum und Text.
'Man sieht auch die 3 verschiedenen KEy-Value Zuordnungsstrings '=>', '=', ':'
d cdict("'A'=>123456,'B':123.45,'C'=#11-1-2014#,'3.4':'abc'")
(
[A] => 123456
[B] => 123.45
[C] => 11.01.2014
[3.4] => 'abc'
)
'Ein Beispiel um Delemiter zu maskieren
d cDict("A=> 'Wert \'C\'', [B] => '[x]=>2, [y] => ""3""', 'C' => ""Wert \""C\""""")
(
[A] => 'Wert 'C''
[B] => '[x]=>2, [y] => "3"'
[C] => 'Wert "C"'
)
==== Dictionaries ====
Dictionary = cDict(dictionary1 [,dictionary2...[,dictionary#]])
Es können auch mehrere Dictionaries übergeben werden. Diese werden dann zusammengesetzt, wobei doppelte Keys nicht überschrieben werden
d cDict(cDict(array(1,2,3)), CDict("3=>4, 4=>5"))
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)
===== Code =====