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 =====