Créer un dictionnaire de listes dans vba

J'ai travaillé en Python antérieures où il est vraiment bon d'avoir un dictionnaire de listes (c'est à dire une clé correspond à une liste de trucs). J'ai du mal à réaliser la même chose en vba. Dire que j'ai les données suivantes dans une feuille excel:

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

Maintenant je veux lire les données et de les stocker dans un dictionnaire dont les clés sont Flanged_connectionsInstrument et Piping et les valeurs sont celles qui leur correspondent dans la deuxième colonne. Je veux que les données à ressembler à ceci:

'key' 'values':

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

et ensuite être en mesure d'obtenir la liste en faisant dict.Item("Piping") avec la liste [1 2 3] comme résultat. J'ai donc commencé à penser à faire quelque chose comme:

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

Cela semble un peu fastidieux à faire. Est-il une meilleure approche? J'ai essayé de chercher de l'aide de tableaux en vba et il semble un peu différente de celle de java, c++ et python, avec stuft comme redim preserve et l'aime. Est-ce le seul moyen de travailler avec des tableaux en vba?

Ma solution:

@Varocarbas' commentaire que j'ai créé un dictionnaire de collections. C'est la façon la plus simple à mon esprit pour comprendre ce qu'il se passe, même si cela peut ne pas être la plus efficace. Les autres solutions serait probablement travailler aussi bien (pas testé par moi). C'est ma proposition de solution et il offre la sortie appropriée:

'/--------------------------------------\'
'| 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

Noter que cette solution suppose que tous les équipements sont triés!

source d'informationauteur Krøllebølle