Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Werte in Array in Dictionary eintragen

Werte in Array in Dictionary eintragen
31.10.2020 12:44:41
Ben.Blake
Hallo,
ich hab mal wieder ein Problem(chen). Ich habe diverse benannte Bereiche, die ich einige hundert Mal abfragen muß. Deshalb hab ich die in Arrays gepackt. Allerdings sind dort in einzelnen (leeren) Zellen auch Farbinformationen, die dabei natürlich verloren gehen.
Also wollte ich die Bereiche dann nochmal abgrasen und die Farbwerte dann in die Arrays übertragen.
Da das ja für verschiedene Arrays und Bereiche immer wieder der gleiche Vorgang ist, bietes sich da ja eine Schleife an. Also hab ich ein bisschen gesucht und bin auf das Dictionary-Objekt gestoßen. Wenn ich da die einzelnen Felder einfach mit Zahlen versehe, müßte ich ja so dann per Schleife die Arrays wechseln können.
Das funktioniert soweit super. Aber sobald ich dann in das Array-Feld den Farbwert eintragen will, passiert nichts - das Feld bleibt leer.
Gibt es da einen besonderen Kniff und ist es überhaupt möglich, in Arrays in Dictionaries nachträglich Werte einzutragen (nicht anzuhängen sondern den Wert es Feldes zu ersetzen)? Dazu hab ich nämlich nichts gefunden. Soweit ich das verstanden habe, ist das Dictionary ja nur ein Index auf verschiedene Arrays, so daß ja das Array direkt angesprochen wird, also müßte es ja eigentlich funktionieren...
Vielen Dank schonmal
Gruß
Ben
Anzeige

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Werte in Array in Dictionary eintragen
31.10.2020 12:56:35
Daniel
Hi
Wie machs du das?
Was in der Regel funktioniert ist folgende:
Array aus Dictionary in ein normales Array kopieren.
Im normalen Array die Werte ändern.
Geändertes Array ins Dictionary zurückschreiben.
Gruß Daniel
AW: Werte in Array in Dictionary eintragen
31.10.2020 13:41:33
Ben.Blake
Danke für die schnelle Antwort.
Ich hab natürlich noch weiter gesucht und dann hier das: https://www.herber.de/forum/archiv/1220to1224/1222541_Schreibzugriff_auf_Array_in_Dictionary_ObjectItem.html gefunden und es dann genauso gelöst, wie Du es schreibst - ein zusätzliche Array angelegt, das aktuelle Dictionary-Array übertragen, den Eintrag aus dem Dictionary entfernt, den Wert in das zusätzlichen Array eingetragen und dann dieses an der gleichen Stelle wieder in das Dictionary "geaddet". Für die, die das gleiche Problem haben sollten:
Ich hatte dabei noch einen Fehler gemahct und die Arrays mit DicAr(#) = Array zugewiesen, was zwar erstmal funktionierte aber dann beim Ersetzen Probleme machte. Es sieht jetzt so aus:

Sub FarbwerteUebertragen()
Dim DicAr As Object
Dim cARng
Dim VerglListe
Rng1 = "Rng1"
Rng2 = "Rng2"
Rng3 = "Rng3"
Rng4 = "Rng4"
'Anlegen eines Arrays mit den Bereichsnamen um in der Schleife drauf zugreifen zu können
cARng = Array(Rng1, Rng2, Rng3, Rng4)
Arr1 = Range(Rng1)
Arr2 = Range(Rng2)
Arr3 = Range(Rng3)
Arr4 = Range(Rng4)
'Vergleichsliste in der gesucht wird, ob die Überschrift vorhanden ist und ob da Farbe drin  _
steckt
VerglListe = Range("Vergleichsliste")
Set DicAr = CreateObject("Scripting.Dictionary")
DicAr.Add "A1", Arr1
DicAr.Add "A2", Arr2
DicAr.Add "A3", Arr3
DicAr.Add "A4", Arr4
For i = 1 To 4
j = 0
Do: j = j + 1
'Leere Tabellenüberschriften werden übersprungen
If DicAr("A" & i)(1, j)  "" Then
'Suchen in Überschriften ob Spalte mit Farben
k = 0
Do: k = k + 1
fnd = False
If DicAr("A" & i)(1, j) = VerglListe(k, 1) And InStr(1, VerglListe(k, 1), " _
Marker", 0)  0 Then
fnd = True
End If
'Wenn eine gefunden, dann abgrasen der Zellen
If fnd Then
L = 0
Do: L = L + 1
DicAr("A" & i)(1, j) = 1
'Wenn Zelle nich farblos, dann Zellfarbe auslesen und in Array-Feld  _
schreiben
If Range(cARng(i)).Cells(L, 1)  "" And Range(cARng(i)).Cells(L, k). _
Interior.ColorIndex  xlNone Then
XArray = DicAr("A" & i)
DicAr.Remove ("A" & i)
XArray(L, k) = Range(cARng(i)).Cells(L, k).Interior.Color
DicAr.Add "A" & i, XArray
CTD = DicAr("A" & i)(L, k)
End If
Loop Until L = UBound(DicAr("A" & i), 1)
End If
Loop Until k = UBound(VerglListe, 1) Or fnd
End If
Loop Until j = UBound(DicAr("A" & i), 2)
Next i
End Sub
Ich hab es hierfür umgeschrieben, es können also Fehler drin sein aber das Prinzip sollte passen...
Gruß
Ben
Anzeige
AW: Werte in Array in Dictionary eintragen
31.10.2020 13:45:43
Ben.Blake
Noch ein Fehler gefunden: die k-Schleife wird nicht bei fnd abgebrochen...
AW: Werte in Array in Dictionary eintragen
31.10.2020 13:58:58
Daniel
Hi
Schön wenns klappt.
Ich schau mir das jetzt nicht im Detail an, aber:
Warum verwendest du nicht die Bereichsnamen als Key?
Dann könntest du leichter von den Dictionary-Werten aus den Zellbereich zurückschließen, falls du das mal brauchst.
Die Schleife über alle dictionay-Einträge geht dann so, wenn die Keys nicht durchnummeriert sind:
Dim K
For each K in Dict.Keys
Dict(K) ist dann der jeweilige Eintrag
Denn wenn du die Keys durchnummerierst um dann mit einer einfachen Zählschleife durch das Dictionary zu laufen, könntest du das auch mit einem einfachen eindimensionalen Array erledigen.
Das Dictionary setzt man ein, wenn die Keys beliebige freitexte sind. Sobald sich die Keys ohne großen Aufwand durch eine Ganzzahlfolge darstellen lassen, ist ein Normales Array die bessere Lösung.
Gruß Daniel
Anzeige
AW: Werte in Array in Dictionary eintragen
31.10.2020 15:03:13
Ben.Blake
Ich hab den Code nur gepostet für den Fall, daß jemand ein ähnliches Problem hat - ich hab nämlich ne ganze weile suchen müssen...
Und mittlerweile hab ich auch die restlichen Fehler gefunden, es läuft, wie es soll.
Was Du schreibst, ist mir nicht so richtig klar. Ich bin dieser "For each x in y" Konstruktion nur einmal bei einer Dateisuche begegnet und da war es um Welten langsamer als Dir - Auf Deutsch: Ich werd da nicht so richtig schlau draus ;)
Das K ist dann aber keine Integer-Variable sondern die Namen, oder?
Da ich ja parallel die Bereichsnamen in einem eindimensionalen Array hab un dann drauf zugreifen zu können brauch ich ja eine Integer-Variable. Oder könnte ich dann einfach Range(K) nutzen? Das wäre natürlich weniger umständlich.
"Denn wenn du die Keys durchnummerierst um dann mit einer einfachen Zählschleife durch das Dictionary zu laufen, könntest du das auch mit einem einfachen eindimensionalen Array erledigen.
Das Dictionary setzt man ein, wenn die Keys beliebige freitexte sind. Sobald sich die Keys ohne großen Aufwand durch eine Ganzzahlfolge darstellen lassen, ist ein Normales Array die bessere Lösung."
Das war ja meine erste Idee aber da bin ich auf nix gekommen. Damit, nicht das volle Potential eines Dictionaries ausgenutzt zu haben, käme ich klar ;). Ich hab das Dictionary dann genutzt, weil ich die gleiche Funktion nicht für alle Arrays gesondert schreiben wollte und eben in der Schleife auf die Namen der Arrays zugreifen mußte. Wenn es da noch eine andere Möglichkeit gäbe, wäre ich ganz Ohr... ;)
Die Übersichtlichkeit ist in diesem Falle kein Thema. Sobald das durchgerattert ist, werden die Dic-Arrays wieder zurückgeschrieben und das Dictionary ist dann Geschichte...
Anzeige
AW: Werte in Array in Dictionary eintragen
31.10.2020 15:14:40
Daniel
"Oder könnte ich dann einfach Range(K) nutzen? "
Genau das.
Gruß Daniel
AW: Werte in Array in Dictionary eintragen
31.10.2020 16:01:35
Ben.Blake
Das hab ich dann mal mit in meine Verbesserungsliste genommen, Danke.
Und was meintest Du mit "Denn wenn du die Keys durchnummerierst um dann mit einer einfachen Zählschleife durch das Dictionary zu laufen, könntest du das auch mit einem einfachen eindimensionalen Array erledigen." - da werd ich auch noch nicht ganz schlau draus...
Gruß
Ben
Anzeige
AW: Werte in Array in Dictionary eintragen
31.10.2020 18:20:30
Daniel
So wie du das Programmiert hast, brauchst du kein Dictionary.
Du kannst dein DicAr auch als Dim DicAr(1 to 4) as Variant deklarieren und als Index 1, 2, 3 und 4 anstelle von "A1", "A2", "A3" und "A4" verwenden und es funktioniert genau so.
Gruß Daniel
AW: Werte in Array in Dictionary eintragen
31.10.2020 18:51:33
Ben.Blake
Also Arrays in einem Array? Und dann sicherlich mit DicAr(#) = Arr# usw. die Arrays reinpacken? Genau danach hatte ich ja gesucht.
Hab mir gerade mal einen Testprogramm gemacht, die Notation mit DicAr(1)(1)(1) statt DicAr(1)(1,1) ist ein bisschen gewöhnungsbedürftig aber es scheint zu funktionieren...
Danke!
Anzeige
AW: Werte in Array in Dictionary eintragen
31.10.2020 19:06:19
Daniel
Hi
Ja auch in ein Array kannst du nicht nur Einzelwerte reinpacken, sondern auch weitere Arrays beliebiger Dimension.
Gruß Daniel
Korrektur ist einfach, ...
31.10.2020 13:26:17
Luc:?
…Ben:
    Dim dx As Dictionary   'bei Verweis auf Scripting.Runtime
Set dx = CreateObject("Scripting.Dictionary")
dx.Add "alfa", 11
Debug.Print dx("alfa")
dx("alfa") = 22
Debug.Print dx("alfa")
Ggf noch eine Verzweigung einbauen, dass nur falls der Key bereits existiert so geändert, ansonsten aber hinzugefügt wird.
Gruß, Luc :-?
„Die universelle Befähigung zur Unfähigkeit macht jede menschliche Leistung zu einem unglaublichen Wunder.“ Stapps ironisches Paradoxon
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Werte in Array in Dictionary eintragen


Schritt-für-Schritt-Anleitung

Um Werte aus einem Array in ein Dictionary in VBA zu übertragen, kannst Du folgende Schritte befolgen:

  1. Erstelle ein Dictionary: Verwende das Scripting.Dictionary Objekt, um ein neues Dictionary zu erstellen.

    Dim DicAr As Object
    Set DicAr = CreateObject("Scripting.Dictionary")
  2. Fülle das Dictionary mit Arrays: Füge Deine Arrays in das Dictionary ein. Verwende dabei eindeutige Schlüssel.

    DicAr.Add "Key1", Array(1, 2, 3)
    DicAr.Add "Key2", Array(4, 5, 6)
  3. Werte aus dem Array ändern: Um Werte in einem bereits bestehenden Array innerhalb des Dictionaries zu ändern, musst Du das Array zuerst aus dem Dictionary auslesen, die Änderungen vornehmen und dann das Array zurück ins Dictionary schreiben.

    Dim myArray
    myArray = DicAr("Key1")
    myArray(0) = 10  ' Ändere den ersten Wert
    DicAr("Key1") = myArray  ' Setze das geänderte Array zurück
  4. Schleifen zur Verarbeitung: Du kannst Schleifen verwenden, um durch alle Keys im Dictionary zu iterieren und so alle Arrays zu bearbeiten.

    Dim key As Variant
    For Each key In DicAr.Keys
       ' Hier kannst Du mit DicAr(key) arbeiten
    Next key

Häufige Fehler und Lösungen

  • Kein Array-Wert gefunden: Überprüfe, ob die Keys korrekt sind und ob das Array im Dictionary existiert. Versuche, die Keys mit DicAr.Exists("Key") zu überprüfen.

  • Fehler bei der Zuweisung: Wenn Du ein Array direkt zuweist, wie DicAr("Key") = Array(...), kann es Schwierigkeiten beim Ersetzen von Werten geben. Stelle sicher, dass Du das Array zuerst in eine Variable überträgst, es bearbeitest und anschließend zurückschreibst.


Alternative Methoden

Statt ein Dictionary zu verwenden, könntest Du auch ein Array von Arrays nutzen. Hierbei kannst Du ein mehrdimensionales Array erstellen, das die gleiche Funktionalität bietet, jedoch oft einfacher zu handhaben ist.

Dim DicAr(1 To 4) As Variant
DicAr(1) = Array(1, 2, 3)
DicAr(2) = Array(4, 5, 6)

In diesem Fall würdest Du die Arrays einfach wie folgt bearbeiten:

DicAr(1)(0) = 10  ' Ersetzt den ersten Wert im ersten Array

Praktische Beispiele

Hier ist ein einfaches Beispiel zur Verwendung des Scripting.Dictionary mit Arrays:

Sub Beispiel()
    Dim DicAr As Object
    Set DicAr = CreateObject("Scripting.Dictionary")

    DicAr.Add "Farbe1", Array("Rot", "Grün")
    DicAr.Add "Farbe2", Array("Blau", "Gelb")

    ' Zugriff und Änderung
    Dim arr
    arr = DicAr("Farbe1")
    arr(0) = "Schwarz"  ' Ändere den Wert
    DicAr("Farbe1") = arr

    Debug.Print DicAr("Farbe1")(0)  ' Gibt "Schwarz" aus
End Sub

Tipps für Profis

  • Verwende benannte Bereiche: Statt fester Keys kannst Du benannte Bereiche verwenden, um die Lesbarkeit Deines Codes zu erhöhen.

  • Optimierung: Achte darauf, dass Du bei großen Datenmengen die Performance im Blick behältst. Das Arbeiten mit Arrays kann oft schneller sein als das ständige Hin- und Herschreiben in ein Dictionary.

  • Verwendung von vba dictionary auslesen: Dies kann nützlich sein, um alle Werte und deren Keys zu überprüfen.


FAQ: Häufige Fragen

1. Wie kann ich ein Array aus einem Dictionary auslesen? Du kannst das Array einfach mit DicAr("Key") auslesen.

2. Was ist der Unterschied zwischen einem Dictionary und einem Array in VBA? Ein Dictionary ermöglicht es Dir, Daten mit beliebigen Schlüsseln zu speichern, während Arrays nur mit numerischen Indizes arbeiten. Dictionaries sind flexibler, bieten jedoch möglicherweise eine geringere Performance bei großen Datenmengen.

3. Wie kann ich einen Wert in einem Array in einem Dictionary ersetzen? Du musst das Array zuerst in eine Variable laden, den gewünschten Wert ändern und dann das Array wieder ins Dictionary zurückschreiben.

4. Kann ich ein Dictionary in einem anderen Dictionary speichern? Ja, Du kannst ein Dictionary als Wert in einem anderen Dictionary speichern, was eine vba array of dictionaries ermöglicht.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige