Создать словарь списков в VBA

Я работал в Python ранее, где действительно легко иметь словарь списков (то есть один ключ соответствует списку вещей). Я изо всех сил пытаюсь добиться того же в VBA. Скажем, у меня есть следующие данные в таблице Excel:

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

Теперь я хочу прочитать данные и сохранить их в словаре, где ключи,Flanged_connectionsInstrument а такжеPiping и значения являются соответствующими во втором столбце. Я хочу, чтобы данные выглядели так:

'key' 'values':

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

а затем возможность получить список, выполнивdict.Item("Piping") со списком[1 2 3] в результате. Поэтому я начал думать, делая что-то вроде:

For Each row In inputRange.Rows

    If Not equipmentDictionary.Exists(row.Cells(equipmentCol).Text) Then
        equipmentDictionary.Add row.Cells(equipmentCol).Text, 
    Else
        equipmentDictionary.Add row.Cells(equipmentCol).Text, 
    End If

Next

Это кажется немного утомительным, чтобы сделать. Есть ли лучший подход к этому? Я пытался искать использование массивов в VBA, и это выглядит немного иначе, чем Java, C ++ и Python, с Stuft, какredim preserve и лайки. Это единственный способ работы с массивами в VBA?

Мое решение:

Основано на @varocarbas ' комментарий Я создал словарь сборников. Для меня это самый простой способ понять, чтопроисходит, хотя это может быть не самым эффективным. Другие решения, вероятно, также будут работать (не проверено мной). Это мое предлагаемое решение, и оно дает правильный вывод:

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

Обратите внимание, что это решение предполагает, что все оборудование отсортировано!

Ответы на вопрос(3)

Ваш ответ на вопрос