Erstellen Wörterbuch der Listen in vba

Habe ich in Python früher, wo es wirklich glatt haben ein Wörterbuch von Listen (D. H. eine Taste entspricht einer Liste von Sachen). Ich bin kämpfen, um das gleiche zu erreichen in vba. Sagen, ich habe die folgenden Daten in einem excel-sheet:

Flanged_connections 6
Flanged_connections 8
Flanged_connections 10
Instrument  Pressure
Instrument  Temperature
Instrument  Bridle
Instrument  Others
Piping  1
Piping  2
Piping  3

Nun möchte ich die Daten Lesen und speichern Sie es in einem Wörterbuch, wo die Schlüssel sind Flanged_connections, Instrument und Piping und die Werte sind die entsprechenden Werte in der zweiten Spalte. Ich möchte die Daten wie folgt Aussehen:

'key' 'values':

'Flanged_connections' '[6 8 10]'
'Instrument' '["Pressure" "Temperature" "Bridle" "Others"]'
'Piping' '[1 2 3]'

und dann in der Lage sein, um die Liste zu tun dict.Item("Piping") mit der Liste [1 2 3] als das Ergebnis. Also ich dachte etwas wie:

For Each row In inputRange.Rows

    If Not equipmentDictionary.Exists(row.Cells(equipmentCol).Text) Then
        equipmentDictionary.Add row.Cells(equipmentCol).Text, <INSERT NEW LIST>
    Else
        equipmentDictionary.Add row.Cells(equipmentCol).Text, <ADD TO EXISTING LIST>
    End If

Next

Dies scheint ein wenig langweilig zu tun. Gibt es eine bessere Vorgehensweise? Ich habe versucht, die Suche für die Verwendung von arrays in vba und es scheint ein bisschen anders als java, c++ und python, mit stuft, wie redim preserve und der gleichen. Ist dies der einzige Weg, um die Arbeit mit arrays in vba?

Meine Lösung:

Basierend auf @varocarbas' Kommentar habe ich erstellt, ein Wörterbuch der Sammlungen. Dies ist die einfachste Methode für meine Gedanken, um zu begreifen, was Los ist, obwohl es möglicherweise nicht die effizienteste sein. Die anderen Lösungen würden wohl so gut funktionieren (nicht getestet von mir). Das ist mein Lösungsvorschlag und liefert die korrekte Ausgabe:

'/--------------------------------------\'
'| Sets up the dictionary for equipment |'
'\--------------------------------------/'

inputRowMin = 1
inputRowMax = 173
inputColMin = 1
inputColMax = 2
equipmentCol = 1
dimensionCol = 2

Set equipmentDictionary = CreateObject("Scripting.Dictionary")
Set inputSheet = Application.Sheets(inputSheetName)
Set inputRange = Range(Cells(inputRowMin, inputColMin), Cells(inputRowMax, inputColMax))
Set equipmentCollection = New Collection

For i = 1 To inputRange.Height
    thisEquipment = inputRange(i, equipmentCol).Text
    nextEquipment = inputRange(i + 1, equipmentCol).Text
    thisDimension = inputRange(i, dimensionCol).Text

    'The Strings are equal - add thisEquipment to collection and continue
    If (StrComp(thisEquipment, nextEquipment, vbTextCompare) = 0) Then
        equipmentCollection.Add thisDimension
    'The Strings are not equal - add thisEquipment to collection and the collection to the dictionary
    Else
        equipmentCollection.Add thisDimension
        equipmentDictionary.Add thisEquipment, equipmentCollection
        Set equipmentCollection = New Collection
    End If

Next

'Check input
Dim tmpCollection As Collection
For Each key In equipmentDictionary.Keys

    Debug.Print "--------------" & key & "---------------"
    Set tmpCollection = equipmentDictionary.Item(key)
    For i = 1 To tmpCollection.Count
        Debug.Print tmpCollection.Item(i)
    Next

Next

Beachten Sie, dass diese Lösung geht davon aus, dass alle Anlagen sind sortiert!

...hinzufügen, alles zum Wörterbuch schlägt fehl, da der gleiche Schlüssel, der Hinzugefügt wird mehrfach (wie es sollte) ich habe nicht Folgen Sie. Auch in python, ein dict Objekt kann nur die eindeutigen Schlüssel-Werte.
können Sie nicht fügen Sie eine ID-Spalte und verwenden es als Schlüssel statt?
Können Sie das definitiv tun, und wenn Sie finden es zu ausführlich, dass ist leider die Natur von VBA, wenn im Vergleich zu einigen anderen Sprachen... Eine Sache, aber beachten Sie: versuchen Sie nicht, ändern Sie das array während es noch im Wörterbuch: Sie müssen ziehen Sie es durch die Zuweisung zu einer Variablen erweitern (mit Redim Preserve), und dann wieder weisen Sie es zurück, um das Wörterbuch.
Ja, schlechter Satz, dass das nicht jeder Wert auf die Frage. Es ist entfernt.
Was ist der Grund Sie können nicht ändern, die das array direkt? Etwas, das mit der übergabe per Referenz/Werte? Es scheint, wie dies der Fall für meine Lösung auch, mit der Sammlung gezogen werden Daten Hinzugefügt, entfernen Sie Sie aus dem Wörterbuch und fügen Sie es wieder in. Nicht, dass es darauf ankommt viel für an dieser Stelle, da diese statisch ist, nur-lese-Daten.

InformationsquelleAutor Krøllebølle | 2013-07-15

Schreibe einen Kommentar