10 Stimmen

Ändern von Array-Werten in einem VBA-Wörterbuch

Ich habe ein Stück Code, das nicht das zu tun scheint, was es tun soll. VBA-Arrays sind auf jeden Fall veränderbar, aber es scheint, dass sie nicht mehr veränderbar sind, wenn sie als Werte einiger Schlüssel in einem Dictionary gespeichert werden. Hat jemand eine Idee?

Sub foo()
    Dim mydict As New Dictionary
    mydict.Add "A", Array(1, 2, 3)
    MsgBox mydict("A")(1)
    ''# The above shows 2, which is fine
    mydict("A")(1) = 34
    MsgBox mydict("A")(1)
    ''# The above also shows 2, which is not fine
End Sub

1 Stimmen

Das Problem ist, dass Sie, wenn Sie das Array mit mydict("A") aus dem Wörterbuch holen, eine Kopie und keine Referenz erhalten. Siehe: stackoverflow.com/questions/1402876/

13voto

Es scheint, dass Sie noch eine weitere Variable setzen müssen, um den Array-Wert zu aktualisieren.

mArray = mydict.Item(1)
mArray(1) = 34
mydict.Item(1) = mArray

2voto

Ich habe ein Verfahren entwickelt, um das gleiche Problem zu lösen, damit ich es als "Oneliner" beibehalten kann:

Private Sub pReplaceDicArray(Dic As Object, kEy As Variant, Element As Integer, NewValue)
    Dim tempArray As Variant
    tempArray = Dic(kEy)
    tempArray(Element) = NewValue
    Dic(kEy) = tempArray
End Sub
' call as:
' Call mReplaceDicArray(Dic, "A", 1, 8)

0voto

Sepehr Moravej Punkte 44

Ich hätte diese Antwort als Kommentar zu Herrn Irizarrys Antwort geschrieben, aber das ist nicht erlaubt. Wie auch immer.... Ich habe versucht, die letzte Codezeile (unten) zu schreiben, um das Array dem ersten Element des Wörterbuchs zuzuweisen, aber es hat nicht funktioniert. Das Array in diesem Element blieb, wie es vorher war.

mydict.items(1) = mArray

Nach dem, was ich anderswo gelesen habe, scheint es mit der Instanz des Wörterbuchs zu tun zu haben, die Sie aufrufen. Ich änderte es in die folgende Zeile und es funktionierte.

mydict(mydict.keys(1)) = mArray

Ich bin mir immer noch nicht sicher, warum das der Fall ist, aber es ist so.

0voto

szozz Punkte 145

Kopieren Sie das Array und aktualisieren Sie den Wert:

mydict("A") = Array(mydict("A")(0), 34, mydict("A")(2))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X