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

Geht Dictionary ohne Schleife befüllen?

Geht Dictionary ohne Schleife befüllen?
28.10.2020 20:19:32
HannesStein
Hallo
kann man ein Dictionary direkt ohne Schleife mit Zellinhalten befüllen?
Hier ein Beispiel, wie es umgekehrt geht. Von einem Dictionary mit 3 Einträgen werden die Keys und Items in Zellen kopiert.
Sub Test_Dichtionary()
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
dict.Add "Blatt1", 46
dict.Add "Kern", 29
dict.Add "Schein", 4
Dim a As Variant
a = dict.keys()
'''  'Folgende Zeile geht leider nicht:
'''   dict.keys() = a
Range("B3:d3") = a
Range("B4:d4") = dict.items()
End Sub
dict.keys() ist ja ein dimensionsloses Array. Vielleicht gibt es einen Trick, wie man dict.keys() mit einem solchen befüllen könnte.
Gruss, Hannes

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Geht Dictionary ohne Schleife befüllen?
28.10.2020 20:47:04
Zwenn
Hallo Hannes,
soweit mir bekannt, geht das nur mit Arrays, weil Tabellen im Grunde auch Arrays sind. Ein Scripting.Dictionary ist eine dynamische Datenstruktur, während ein Array statisch ist. Die funktionieren also grundsätzlich unterschiedlich.
Warum es klappt aus den Keys direkt ein Array zu erstellen weiß ich auch nicht genau, habe das aber auch schon genutzt und war froh das es so einfach ging. Aber mit den Werten hinter den Keys geht das auch nicht.
Vielleicht kennst Du die Seite, aber hier bekommt man ziemlich viele gute Infos zum Dictionary:
https://excelmacromastery.com/vba-dictionary/
Viele Grüße,
Zwenn
Anzeige
AW: Geht Dictionary ohne Schleife befüllen?
28.10.2020 22:18:12
Rudi
Hallo,
das geht nicht. Die Keys-Methode gibt nur alle Schlüssel zurück.
Aber wo ist das Problem? Ein Dictionary per Schleife aus einem Array zu befüllen geht rasend schnell.
Gruß
Rudi
AW: Geht Dictionary ohne Schleife befüllen?
29.10.2020 13:20:28
HannesStein
Hallo
ok, wenn's nicht geht, auch gut. Hätte ja vielleicht sein können. Danke für Eure Antworten.
@Zwenn:
Danke für den Link, tatsächlich habe ich von dieser Seite viel gelernt. Sie ist, genauso wie die anderen Seiten und Videos von Paul Kelly, ansprechend, weil praxisorientiert, und sehr informativ. Empfehlungen für andere gute Seiten dieser Art gerne willkommen.
@Rudi
Du hast natürlich recht. Danke für Deine Antwort. Viele Arrayabfragen gehen wirklich schnell. Eigentlich war meine Frage eher interessenshalber.
@Prof. Luc:
Ja, ich habe keine verwendet, aber ich habe auch kein Dictionary mit Zellinhalten befüllt. Darauf bezog sich ja meine Frage. Dennoch danke für Deine Antwort. Deine erste, die ich vollständig verstanden habe.
Alles Gute und LG, Hannes
Anzeige
Falls du das meintest, ...
29.10.2020 20:05:13
Luc:?
…Hannes,
https://www.herber.de/forum/messages/1789710.html
solltest du dich ggf doch mal (noch) näher mit Arrays befassen oder meinen dortigen Vorschlag ausprobieren. ParamArrays gehören nämlich auch zu diesem anderen Typ und ähneln damit einem Dictionary bzw einer Collection, nur sind sie keine Objekte und verwenden auch keine assoziativen Keys.
Luc :-?
AW: Falls du das meintest, ...
29.10.2020 21:24:27
HannesStein
ja, Luc, dort zB. Schwer zu verstehen. Auch den Ausdruck "ParamArrays" kenne ich nicht. Könnte aber sein, dass damit vllt b(0)(0) gemeint sein kann. Auch kann ich mit dem Begriff "Tensor" nichts anfangen, auch nicht in den zahllosen Themen darüber in der Interent-Recherche. Zu wissen, was (0,1) oder [(1,0)] bedeutet, kannst Du von Excel-Normalos nicht voraussetzen. Vllt sind das Vektoren, zu denen man was hinzu multiplizieren muss, um eine Matrix zu bekommen?
Wie auch immer. Könnte eventuell interessant sein, aber für meine konkrete Frage, so wie ich das sehe, keinen Hinweis liefert.
Gruss, Hannes
Anzeige
Der Reihe nach erklärt, ...
30.10.2020 00:26:43
Luc:?
…Hannes:
1. Ein ParamArray kommt nur als SammelParameter bzw -Argument von Prozeduren vor, ist stets vom DatenTyp Variant (und 1dimensional und Optional und deshalb stets an letzter Position zu notieren) und kann in jedem seiner Elemente beliebige Werte, Bezüge oder auch Arrays enthalten.
2. Das m-dimensionale Array wird auch als VBA-Array bezeichnet, weil es der Struktur von Xl angepasst ist. In anderen OO-ProgrammierSprachen sind Arrays meist Objekte und folgen einem auf dem Tensor-Modell basierenden Typus, weshalb sie auch so indiziert wdn, wie du es mit b(0)(0) bereits angedeutet hast. Diese sind idR besser manipulierbar als VBA-Arrays.
3.Der Tensor ist ein bereits altes physikalisch-mathematisches Konzept, bei dem die Basis 1dimensionale Vektoren (vertikal) und Kovektoren (horizontal gerichtet) sind. Mehrere spannen einen Vektorraum [(r,s)-Tensorraum] auf, der bei einem Tensor(1,1) mathematisch einer rechteckigen Matrix entspricht, die aus einem Vektor besteht, dessen Elemente Kovektoren sind. Dieses Gebilde nennt man dann 2stufig (bzw -rangig), wobei sich die Stufe (der Rang) aus der Addition von r+s in folgd allgemeiner Schreibweise ergibt → Tensor(r,s), wobei das aus der Physik stammt und r die Kontravarianz, s die Kovarianz der jeweiligen Stufe angibt. Vektoren sind dabei stets kontravariant und Kovektoren kovariant, woraus sich ihr Tensor-Typ ergibt. Aber das kannst du wohl genauer auf Wikipedia (zumindest den allgemeineren Teil, wobei es dort noch mehr Bezüge geben sollte) oder anderswo nachlesen. ;-)
4. Der Hinweis bestand ja auch eher darin, zu zeigen, wie man einen quasi 1dimensionalen Vektor, der sonst ja immer 2dimensional wäre, in VBA konstruieren kann, nämlich nur mit dem anderen Array-Typ, der von VBAlern auch gern als Arrays in an Array bezeichnet wird, aber letztlich auf dem Tensor-Modell basiert.
Dazu hatte ich schon einiges geschrieben. Bei Interesse findest du in diesem Beitrag (zZ noch forumsaktuell) einige diesbzgl Links.
Morhn, Luc :-?
Anzeige
Mal ganz unmathematisch
30.10.2020 14:39:52
Daniel
Hi
ein ParamArray ist eine Möglichkeit, einer Funktion oder Prozedur eine veränderliche Anzahl an Werten zu übergeben.
Dabei werden wie Werte in einem eindimensionalen Array abgelegt.
was ein Tensor ist, kann man sich am besten verbildlichen, wenn man sich Variablen als Makramee-Arbeit vorstellt:
ein Einzelwert ist eine Perle
ein eindimensionales Array ist eine Perlenschnur
ein zweidimensionales Array ist ein rechteckiger regelmäßiger Perlenteppich
ein dreidimensionales Array ist ein Perlenquader.
ein Tensor entsteht, wenn man in eine Perlenschnur anstelle jeder Perle eine weitere Perlenschnur einsetzt (die natürlich wiederum weitere Perlenschnüre anstelle Perlen haben kann)
im Teppich kannst du eine einzelperle über "2. Zeile und 3. Spalte" addressieren (2, 3), im Tensor dann über "die 2. Perle in der 3. Perlenschnur" (2)(3)
da VBA-Variant-Variablen im Prinzip alles aufnehmen können vom Zahl/Text-Einzelwert über Objekte bis zu weiteren Variant-Arrays, kann man in VBA recht einfach mit solchen Strukturen arbeiten (sofern man sie versteht)
ein Dictionary ist im Prinzip ein eindimensionales Array, bei dem der Index nicht aus festgelegten Ganzzahlfolgen besteht, sondern aus beliebigen Freitexten.
Gruß Daniel
Anzeige
Um mal Daniels Bsp aufzugreifen, ...
31.10.2020 02:56:19
Luc:?
…Hannes,
• ein 2d-VBA-Array, also eine Matrix, ist einem PerlenTeppich bzw einer -Matte vglbar, deren Seiten alle fest zusammenhängen, während ein 2stufiger Tensor, die in den meisten Sprachen übliche Array-Form, eher einem PerlenVorhang gleicht, der nur oben fest zusammenhängt, so dass sich die einzelnen Schnüre frei bewegen können. Nur ist ein solches Array nicht von oben nach unten, sondern von links nach rechts orientiert, was bei einem Vorhang natürlich nicht sinnvoll wäre.
• Allerdings gibt's dabei auch Arrays, die man sich als einen PerlenVorhang mit nur einer Perle auf jeder Schnur vorstellen kann. Diese wdn von VBA ebenfalls automatisch vertikal als Vektor orientiert, wenn von den einzelnen Perlen jede auf einer Extra-Schnur angeordnet wird, die an der HauptSchnur hängt. So wird aus einem horizontalen ZeilenVektor (Kovektor) ein vertikaler (Spalten-)Vektor, während seine Elemente Kovektoren bleiben, egal wieviel Elemente (Perlen) sie enthalten. Diese können also auch quasi 0-dimensional sein, was nach der r+s-Regel an der GesamtStufigkeit des Tensors nichts ändert: (1,0)+(0,0)=(1+0,0+0)=1+0=1
• Das Tensor-Modell stellt eine Verallgemeinerung von Skalar, Vektor, Kovektor, Matrix und höherdimensionalen Strukturen dar, die man sich aus Vektoren und Kovektoren (0-1stufige Tensoren) aufgebaut vorstellt. In Xl wird generell nur mit echten Skalaren (Einzelwerten) und Matrizen gearbeitet, wobei hier auch noch zwischen ihren Quellen, berechnetes Datenfeld oder primärer ZellBereich, unterschieden wird. In VBA wird zwischen echten Skalaren (kein Array) und Arrays (und ebenfalls nach Quelle) unterschieden, die skalare Tensoren(0,0), Vektoren, Kovektoren und ihre Kombination beinhalten, oder aber m-dimensionale VBA-Arrays sein können. Das kann man auch miteinander kombinieren, so dass ein EinzelElement in einem solchen „4dStapel“ ggf auch so indiziert wdn muss → (i, j)(k, l)
• Direkt auf ein TabBlatt abbildbar sind aber nur echte Skalare, maximal 2stufige Tensoren (idR nur über eigene Fktt, UDFs) oder maximal 2dimensionale VBA-Arrays. Indirekt (mit verborgenem, aber auswertbarem Teil) auch 3-4stufige Tensoren oder „gestapelte“ Matrizen (TensorHybride aus Matrizen, deren Elemente ebenfalls Matrizen oder [Ko-]Vektoren sind, auch umgekehrt). Das kann man sich auch als PerlenTeppich vorstellen, dessen einzelne Perlen Eckpunkte je eines weiteren Teppichs oder einer PerlenSchnur darstellen (umgekehrt natürlich auch als Perlenschnur, an deren Perlen ganze Teppiche statt nur weiterer Schnüre hängen).
Übrigens, lässt man bei einem nur aus 1stufigen Tensoren bestehenden Array, von hinten angefangen, Indizes weg, erhält man auf einfache Weise die nächstgrößere Struktur. Das kann sehr hilfreich sein.
Morhn, Luc :-?
Anzeige
Was verstehst du unter 'Schleife', ...
29.10.2020 04:04:49
Luc:?
…Hannes;
du hast ja gar keine verwendet‽ Mit Schleife, also zyklisch, könnte das zB so aussehen:
Sub Test_Dictionary()
Const txKeys$ = "Blatt1 Kern Schein"
Dim i As Long, a, b As Variant, dict As Dictionary 'm.Verweis auf Scripting.Runtime
Set dict = CreateObject("Scripting.Dictionary")
a = Split(txKeys)
b = Array(46, 29, 4)
For i = 0 To UBound(a)
dict.Add a(i), b(i)
Next i
Range("B3:D3") = dict.Keys
Range("B4:D4") = dict.Items
Set dict = Nothing
End Sub
Morhn, Luc :-?
„Die universelle Befähigung zur Unfähigkeit macht jede menschliche Leistung zu einem unglaublichen Wunder.“ Stapps ironisches Paradoxon
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige