Другой подход - словарь словарей:
Option Explicit
Public Sub nestedList()
Dim ws As Worksheet, i As Long, j As Long, x As Variant, y As Variant, z As Variant
Dim itms As Dictionary, subItms As Dictionary 'ref to "Microsoft Scripting Runtime"
Set ws = Worksheets("Sheet1")
Set itms = New Dictionary
For i = 2 To ws.UsedRange.Rows.Count
Set subItms = New Dictionary '<-- this should pick up a new dictionary
For j = 2 To ws.UsedRange.Columns.Count
' Key: "Property 1", Item: "A"
subItms.Add Key:=ws.Cells(1, j).Value2, Item:=ws.Cells(i, j).Value2
Next
' Key: "Item 1", Item: subItms
itms.Add Key:=ws.Cells(i, 1).Value2, Item:=subItms
Set subItms = Nothing '<-- releasing previous object
Next
MsgBox itms("Item 3")("Property 3") 'itms(ws.Cells(3, 1))(ws.Cells(1, 3)) = "I"
End Sub
.
Он регулирует динамически общее число строк и столбцов, поэтому нет необходимости
Преимущества над коллекциями обслуживания является то, что вы можете проверить, если ключей существуют или нет
Самой медленной части добавления все элементы в словарях, но когда сделали доступ к детали очень быстро
Примечание: словари не могут иметь дубликаты ключей
.
Edit:
Если вы пошагово код, который вы сможете увидеть следующие объекты:
.
Если заменить MsgBox строку со следующим:
For Each x In itms.Keys
For Each y In itms(x)
If InStr(y, 1) > 0 Then
Debug.Print vbNullString
Debug.Print x & " ---> Key: '" & y & "' -> Item: '" & itms(x)(y) & "'"
Else
Debug.Print vbTab & vbTab & " -> Key: '" & y & "' -> Item: '" & itms(x)(y) & "'"
End If
Next
Next
Вы получите:
Item 1 ---> Key: 'Property 1' -> Item: 'A'
-> Key: 'Property 2' -> Item: 'B'
-> Key: 'Property 3' -> Item: 'C'
Item 2 ---> Key: 'Property 1' -> Item: 'D'
-> Key: 'Property 2' -> Item: 'E'
-> Key: 'Property 3' -> Item: 'F'
Item 3 ---> Key: 'Property 1' -> Item: 'G'
-> Key: 'Property 2' -> Item: 'H'
-> Key: 'Property 3' -> Item: 'I'
или типа
For Each x In itms.Keys: For Each y in itms(x): Debug.Print x & " -> " & y & " -> " & itms(x)(y): Next: Next
в окне отладки
Что такое вопрос? –
Почему бы вам не использовать класс и коллекцию? – sous2817
То, как я определил словарь, не работает. Я просто написал это, чтобы описать, что, как мне кажется, должно произойти. Я не использую коллекцию, потому что мне нужна ключевая функция словаря, чтобы выборочно извлекать данные. то есть иметь возможность получать информацию о конкретном элементе, который я имею в виду. – newdimension