Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1468to1472
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

Mehrdimensionales assoziatives Array

Mehrdimensionales assoziatives Array
10.01.2016 20:56:22
Kay
Guten Abend an alle!
Ich versuche seit heute Nachmittag, eine Lösung zu finden, wie ich ein mehrdimensionales assoziatives Array in VBA abbilden kann.
Ich habe gelesen über Collections, Dictionaries und benutzerdefinierte Datentypen, aber dies hat mich nur teilweise weitergebracht.
Immerhin weiß ich jetzt schon mal, wie man ein eindimensionales assoziatives Array hinbekommt:
Dim d as Dictionary
Set d = New Dictionary
d("x") = 36
Was ich aber bräuchte, sind im einen Fall zwei Dimensionen und im anderen Fall drei Dimensionen, also so etwas wie:
d("key1", "key2") = value
bzw. d("key1", "key2", "key3") = value
Hat jemand von Euch eine Idee, wie man so etwas in VBA realisieren kann?
Vielen Dank schon mal!
Kay

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

Betreff
Datum
Anwender
Anzeige
AW: Mehrdimensionales assoziatives Array
10.01.2016 21:17:31
Daniel
Hi
einfacher trick: verkette die einzelnen Keys mit einem Trennzeichen zu einem weiteren Schlüsselbegriff:
d("key1-key2-key3") = value
andere Möglichkeit:
das Item eines Dictionarys kann auch wieder ein Dictionary oder auch ein normales Array sein.
das schreiben eines Wertes ist dann etwas umständlicher, den wenn du der zweiten Dimension etwas hinzufügen willst, musst du vorher prüfen, ob sie schon angelegt wurde:

if d.exists("key1") then
set x = d("key1")
else
set x = New Dictionary
end if
x("key2") = value
set d("key1") = x

auslesen kannst du dann mit
msgbox d("key1")("key2")
Gruss Daniel

Anzeige
AW: Mehrdimensionales assoziatives Array
10.01.2016 22:26:15
Kay
Hallo Daniel,
die Trick-Lösung, obwohl genial einfach, ist in meinem Fall nicht anwendbar, weil ich auf diese Weise zwar einzelne Elemente direkt ansprechen kann, aber nicht eins nach dem anderen mit For Each ... Next.
Deine zweite Idee habe ich jetzt mal ausprobiert, und diese funktioniert offenbar so! Ich werde das morgen auch noch mit drei Dimensionen (sozusagen) ausprobieren.
Auf jeden Fall vielen Dank,
so komme ich auf jeden Fall voran.
LG
Kay

AW: Mehrdimensionales assoziatives Array
10.01.2016 23:32:34
Daniel
ich glaube du verwechselst da was.
das Array muss nicht 3-Dimensional werden, nur weil weitere Informationen dazu kommen.
das sind dann nur mehr Speicherplätze für die 2. Dimension (im allgemeinen Sprachgebrauch auch "Spalten")
ist wie auf einem Tabellenblatt, das ist immer zweidimensional, auch wenn ich nicht nur die Spalten A und B, sondern auch C-XFD verwende.
ansonsten denke ich, dass dir ein einfaches 2-D-Array reichen würde, weil du die Kontonummern ja auch per Schleife suchen kannst. bei der geringen Datenmenge ist das schnell genug.
Gruss Daniel

Anzeige
AW: Mehrdimensionales assoziatives Array
11.01.2016 17:40:25
Kay
Ich habe das Ganze jetzt gelöst mit einem eindimensionalen Dictionary, bei dem die einzelnen Keys mit einem Trennzeichen zu einer Zeichenkette zusammengefügt sind. Die Kontonummern - so habe ich bemerkt - habe ich ohnehin in einem separaten Dictionary gespeichert, so dass ich mit Hilfe dieses zweiten Dictionaries die Elemente des ersten mit Hilfe einer For Each ... Next Schleife durchlaufen kann. Damit funktioniert es jetzt. Bei dem Lösungsansatz von Luc blicke ich offen gestanden nicht durch, mir fehlt hier wahrscheinlich noch zu viel Wissen. Auf jeden Fall ausdrücklichen Dank an Euch beide!
Kay

Anzeige
Muss es denn unbedingt assoziativ sein, ...
10.01.2016 21:53:26
Luc:-?
…Kay?
Ein einfaches VBA-Typ2-Array, Variant mit einem Array, auch als Arrays in einem Array möglich, tut's doch auch! Dann musst du auch nicht so herumjonglieren, wie Daniel vorschlägt.
Ich hatte seine Bildung bereits mehrfach erklärt, hier und besonders ausführlich wohl im alten OL-Forum-Xl. Deshalb hier mal in Kurzform:
1. (a) Einen Variant für den HptVektor bzw (b) einen Vektor als Variant deklarieren!
2. (a) Diesem eine VektorenGruppe auf 1× bzw (b) einzelelementweise beliebige Vektoren zuweisen!
Bsp Variante (a): Dim HVektor
HVektor = Array(Array(1, 2, 3), Array(4, 5))

Bsp Variante (b): Dim HVektor(1)
HVektor(0) = Array(1, 2, 3): HVektor(1) = Array(4, 5)

Die Indexierung erfolgt bei beiden Varianten so:
HVektor(0)(0) ist 1, HVektor(0)(2) ist 3, HVektor(1)(1) ist 5, HVektor(1)(2) ist Fehler (weil NV)!
Ein sog ParamArray (als Eingangswert) ist genauso aufbaubar.
Der Unterschied zu Dictionary und Collection besteht hptsächlich darin, dass diese Objekte sind, das Typ2-Array nicht.
Gruß, Luc :-?
Besser informiert mit …

Anzeige
AW: Muss es denn unbedingt assoziativ sein, ...
10.01.2016 22:42:39
Kay
Hallo Luc,
danke auch für Deinen Input.
Deine Idee mit dem multidimensionalen Array finde ich grundsätzlich sehr interessant, allerdings bin ich mir nicht ganz sicher, ob ein solches für meinen Fall hilfreich ist:
Was ich machen möchte, ist, Daten aus einem Kontenplan (Buchhaltung) einzulesen. Dies hatte ich ursprünglich versucht, mit einem zweidimensionalen Array zu erledigen:
arrKS(KontoNr, InfoNr)
Zu jeder KontoNr sollen drei (und später ggf. weitere) Informationen gespeichert werden: Der Kontotyp, die Kontobezeichnung, usw.
Das Problem ist, dass die Kontonummern von 00001 bis 99999 gehen, aber eigentlich nur ein paar (ca. 250 von den möglichen 99999) davon wirklich existieren/in Gebrauch sind, beginnend mit 3200, dann 5000, 5001, 5200 usw.
Wenn ich das mehrdimensionale Array wie oben aufgeführt verwende, wird sehr viel Speicherplatz unnötig belegt. (Bei den zwei Dimensionen ist das noch unkritisch, wenngleich doch sehr unschön, aber in einem weiteren Fall sind es drei Dimensionen, und da bekam ich schon Laufzeitfehler 7 "Nicht genügend Speicher". Dieser zwingt mich jetzt, auf die Suche nach einer besseren Lösung zu gehen.)
Es kommt mir also gerade darauf an, dass die Werte des ersten Indexes (KontoNr) NICHT fortlaufend sein sollen, daher kam mir das assoziative Array in den Sinn, so wie ich das von PHP her kenne.
Bei Deinem Vorschlag scheint es mir - obgleich ich zugegenermaßen noch nicht wirklich durchblicke - auch so zu sein, dass die Indizes fortlaufend sind...
Für weitere Ideen bin ich dankbar.
LG
Kay

Anzeige
Indizes sind hier immer flfd, ...
11.01.2016 00:30:03
Luc:-?
…Kay,
nur die Daten müssen es nicht sein. Man kann natürlich zu jedem flfd indizierten Vektor mit KontoNrn auch einen gleich­großen mit Werten bilden oder jedem Element eines Unter­Vektors einen Vektor aus KontoNr und Daten zuordnen oder ein Element eines HptVektors als 2dimen­sionale Matrix aus KontoNrn und zugeordneten Daten aufbauen.
Wenn die Unter- bzw Element­Vektoren des HptVektors horizontal gerichtete (1dimen­sionale) Vektoren sind, ist der HptVektor automatisch vertikal und 1dimensional, was sonst bei vbVektoren nicht möglich ist. Wenn man die Elemente-MaxAnzahl, UBound(HVektor(i))+1-LBound(HVektor(i)), aller Element­Vektoren des HptVektors ermittelt, kann man die ElementVektoren damit Preserve ReDimmen, so dass eine derartige irre­guläre Matrix als reguläre auf einen Zell­Bereich abgebildet wdn könnte (in UDFs xl-automatisch, in Sub­Prozeduren muss erst noch eine Operation zwischen­geschaltet wdn, am Besten eine verarbei­tungs­fähige WorksheetFunction wie bspw (2×) .Transpose.
For Each sollte darauf anwendbar sein. Man muss nur abfragen, ob die Lauf­Variable ein Array wiedergibt oder nicht (IsArray) und im True-Fall ein weiteres For Each nachschalten usw.
Luc :-?
Anzeige

136 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige