2015-08-31 12 views
0

У меня есть следующий набор кодаVBA создать вложенный словарь

Dim dic As Dictionary 
Dim dataArray() As Variant 
Dim headerRow(1 To 4) As Variant 
Dim mySheet As Worksheet 
Dim loopCounter As Long 
Dim endRow As Long 
Dim endColumn As Long 
Dim keyColumn As Long 
Dim x As Integer 
Dim wsName2 As String 
Dim duplicateDictionary As Dictionary 

wsName2 = ActiveSheet.Name 
Set duplicateDictionary = New Dictionary 

Set dic = New Dictionary 

With Worksheets(wsName2).Range("A1",Worksheets(wsName2).Range("A1").End(xlDown)) 
    keyColumn = 1 
    endColumn = 4 
    endRow = .Range("A1").End(xlDown).Row 
    dataArray = Range(.Cells(1, 1), .Cells(endRow, endColumn)).Value 
End With 

For x = 1 To endColumn 
    headerRow(x) = dataArray(1, x) 
Next x 

For loopCounter = 2 To endRow 
    Dim storeKey As Variant 
    Dim lineArray() 
    Dim itemNumber As String 
    Dim itemNumberAndDescription As String 
    Dim q As Variant 

    ReDim lineArray(1 To endColumn) 

    For x = 1 To endColumn 
     lineArray(x) = dataArray(loopCounter, x) 
    Next x 

    storeKey = lineArray(keyColumn) 

    If Not dic.Exists(storeKey) Then 
     dic.Add storeKey, New Collection 
    End If 

    'create duplicate dictionary if doesn't exist 
    If Not duplicateDictionary.Exists(storeKey) Then 
     duplicateDictionary.Add storeKey, New Dictionary 
    End If 

    dic(storeKey).Add lineArray 

    itemNumber = UCase(Trim(Left(lineArray(2), InStr(1, lineArray(2), " -", vbBinaryCompare)))) 

    'add item in the duplicate dictionary based on the storekey 
    duplicateDictionary(storeKey).Add itemNumber, itemNumber 
Next loopCounter 

Что я пытаюсь сделать, используя список ниже в качестве примера, чтобы создать вложенный словарь и каждый со своим собственным ключом , Цель этого заключается в том, что у меня есть отчет, который будет проверять словарь, созданный выше для дублирующего элемента, перед добавлением к нему.

Город --- Команда

LA Lakers ----

CHI ---- Быки

NY ---- Никс

DAL ---- Mavericks

BOS ---- Celtics

Я могу создать первый словарь (город), но я могу ' t, похоже, создал второй (вложенный) словарь для названия команды на основе города. Помощь будет отличной. Благодаря!

+0

В чем ваш вопрос? Вы спрашиваете, можно ли создать словарь, значения которого сами по себе являются словарями? В вашем примере - это «BOS» ключ для большого словаря и есть ли какой-то словарь «Celtics», который должен быть значением, которое имеет значение «BOS»? –

+0

Мой вопрос: каким будет код для создания вложенного словаря. Основываясь на моей таблице, «BOS» будет ключом, который будет иметь «celtics» по некоторым другим предметам. Моя конечная цель: у меня есть еще один отчет, который добавит к городу словарь на основе ключа, но добавляет не дублируемое имя. В этом случае он увидит, что «celtics» уже находится в словаре, связанном с «BOS», и не добавит другого. То же самое касается других городов. – Tim

ответ

3

Сначала создайте - затем добавьте новый словарь во внешний dict. Следующие подпункты должны дать вам некоторое представление:

Sub Test() 
    Dim DOD As New Dictionary 
    Dim InnerDict As Dictionary 

    'create one inner dictionary 
    Set InnerDict = New Dictionary 
    InnerDict.Add "A", 1 
    InnerDict.Add "B", 2 
    'add it to the dictionary of dictionaries 
    DOD.Add "dict1", InnerDict 

    'create another inner dictionary 
    Set InnerDict = New Dictionary 
    InnerDict.Add "A", 3 
    InnerDict.Add "B", 4 
    InnerDict.Add "C", 5 
    'add it to DOD 
    DOD.Add "dict2", InnerDict 

    'access like: 
    Debug.Print DOD("dict1")("A") 'prints 1 
    Debug.Print DOD("dict2")("A") 'prints 3 

    'can add new keys to inner dicts: 
    DOD("dict1").Add "C", 10 
    Debug.Print DOD("dict1")("C") 'prints 10 

End Sub 
0

Я нашел это очень легко создать вспомогательный словарь первый и добавить, что в основном словаре. В этом у меня есть «paydownDictionary» как основной, и я добавляю дополнительный словарь к нему с двумя значениями. Поэтому, если бы вы применили его к своему, то, что вы сделали бы, это получить список команд в каждом городе и сказать, например:

дополнительный словарь. добавить Клипперс, установленный 19 ??

дополнительный словарь. добавить Лейкерс, установленный 19 ??

если город меняет

добавить словарь суб словарю затем создать новый словарь суб к для следующего набора. Мой код выглядит следующим образом - отредактированный выглядеть как код

Option Explicit 
Public CityDictionary As New Scripting.Dictionary 

Sub theDictionary() 

Dim wsName2 As String 
Dim payDownDictionary As New Scripting.Dictionary 'set in public 
Dim subDictionary As Scripting.Dictionary 

wsName2 = ActiveSheet.Name 
'keyColumn = city ' column A 
'secondColumn = team 'column B 

lastColumn = Sheets(wsName2).Cells.Find(What:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByColumns).Column 
lastRow = Sheets(wsName2).Cells.Find(What:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row 
previousCell = "" 

For Each cell In xlfile.Sheets(wsName2).range(Sheets(wsName2).Cells(2, 1), Sheets(wsName2).Cells(lastRow, 1)) 'this is your key column 

    If cell.Value <> "" Then 

     If previousCell = "" Then 'it's the first item 
     'get the first item and add it to the subdictionary 
      Set subDictionary = New Scripting.Dictionary 
      subDictionary.Add cell.Offset(0, 1).Value, cell.Offset(0, 2).Value 'offest 1 would be team, offset 2 is date established 

     ElseIf cell.Value = previousCell Then 'we already have this cell value in the dictionary 
      subDictionary.Add cell.Offset(0, 1).Value, cell.Offset(0, 2).Value 

     Else ' new cell value for the dictionary 
      'previousCell is your primaryKey Column 
      CityDictionary.Add previousCell, subDictionary ' add the sub dictionary to the pay Down Dictionary 

      Set subDictionary = New Scripting.Dictionary 
      subDictionary.Add cell.Offset(0, 1).Value, cell.Offset(0, 2).Value 

     End If 
     previousCell = cell.Value 
    End If 
Next 

Я чувствую, что если вы хотите идти по этому пути может быть чище, чем ваш метод.

У меня около 15-200 в каждом подзадаче, так как я фиксировал ставки по облигациям до погашения. Итак, этот способ для меня велик, с max 3? команды в городе для НБА, это может быть не так эффективно, как другие методы.

+0

Я попробую ваш метод. благодаря! – Tim

+0

Конечно, рад помочь. если вам нужно, чтобы я отрегулировал его, чтобы быть более похожим на читателя для рабочих листов, которые я могу.так что если вы застряли, дайте мне знать – jamesC

+0

Привет, Джеймс, если вы в состоянии приспособиться к тому, чтобы быть похожим на рабочий лист, это определенно поможет вам приспособить его к моей. :) – Tim