Создать словарь списков в 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_connections
Instrument
а также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
Обратите внимание, что это решение предполагает, что все оборудование отсортировано!