Вложенный объект словаря не найден - PullRequest
1 голос
/ 14 июня 2019

Я пытаюсь создать подпрограмму в MS Access VBA с конечной целью взять в качестве входных данных некоторую таблицу, список полей для группировки и числовое поле и создать выходную таблицу, которая содержит поля группировки по и медианы для числового поля.

У меня это работает для одного поля для группировки, но я сталкиваюсь с проблемой, заставляющей это работать на нескольких полях. А именно, моя проблема в том, что я использую вложенные словари, чтобы в конечном итоге агрегировать мои значения сгруппированных полей и их медианы, но когда я пытаюсь получить доступ к внутреннему словарю, я получаю «424» Ошибка времени выполнения: требуется объект »и я не могу понять, в чем проблема. Когда я помещаю внутренний словарь во внешний словарь, я не могу получить к нему доступ, как можно было бы подозревать.

Вот мой код: `

Public Sub MedianByGroups(ByVal inputTable As String, ByVal strField As String, _
ByVal strGroup As String, ByVal outputTable As String, _
Optional ByVal strCriteria As String)

    DoCmd.SetWarnings False
    Dim db As DAO.Database: Set db = CurrentDb()
    Dim rstDomain As DAO.Recordset
    Dim strSQL As String
    Dim varMedian As Long: varMedian = 0
    Dim intRecords As Long
    Dim splitgroup As Variant

    splitgroup = Split(strGroup, ", ")

    strSQL = "SELECT DISTINCT " & strGroup & " INTO TMP_GROUPINGTABLE FROM " & _
    inputTable & ";"

    DoCmd.RunSQL (strSQL)

    Set rstDomain = db.OpenRecordset("TMP_GROUPINGTABLE")

    Dim i As Integer: i = 0

    Dim group_dict As New Dictionary
    Dim tmp_dict As Dictionary
    Set tmp_dict = New Dictionary

    If Not (rstDomain.EOF And rstDomain.BOF) Then
        rstDomain.MoveFirst
        Do Until rstDomain.EOF = True
            For Each Label In splitgroup
                tmp_dict.Add Label, rstDomain.Fields(Label).Value
            Next Label

            group_dict.Add i, tmp_dct
            Set tmp_dict = New Dictionary
            i = i + 1
            rstDomain.MoveNext
        Loop
    End If

    rstDomain.Close

    For Each key In group_dict.Keys
        For Each addlKey In group_dict(key).Keys
            Debug.Print addlKey, group_dict(key)(addlKey)
        Next addlKey
    Next key

    DoCmd.SetWarnings True
end sub

`

Если бы у кого-то был стол, который выглядел так: GROUP1 GROUP2 VAL1 A C 400 B D 500 И это называлось "MYTABLE" Можно было бы назвать эту подпрограмму как: call MedianByGroups ("MYTABLE", "VAL1", "GROUP1, GROUP2", "OUTPUTTABLE") И, пожалуйста, обратите внимание, что это не относится к медиане или каким-либо другим частям, так как я попадаю в этот камень преткновения со словарями. У меня должны быть все остальные части этого, когда я смогу получить доступ к этим внутренним словарям, но, как мы все знаем, ошибки MS ACCESS чрезвычайно расплывчаты и бесполезны.

Где это терпит неудачу, является внутренним циклом for на том, что вложено для цикла ближе к концу. For Each addlKey In group_dict(key).Keys

1 Ответ

2 голосов
/ 14 июня 2019

Не полный ответ - Я создал пример без специфичных для MS Access частей, и логика в вашем коде, кажется, работает нормально. Насколько я могу судить, нет реальной разницы в логике ниже и в вашем коде выше. Этот пример работает для вас?

Option Explicit

Sub TestingNestedDictionaries()
    Dim group_dict As New Dictionary
    Dim tmp_dict As Dictionary
    Set tmp_dict = New Dictionary

    Dim labels As Variant
    labels = Array("red", "orange", "yellow", "green", "blue", "indigo", "violet")

    Dim i As Long
    For i = 1 To 5
        Dim label As Variant
        For Each label In labels
            tmp_dict.Add label, label & "-" & i
        Next label
        group_dict.Add i, tmp_dict
        Set tmp_dict = New Dictionary
    Next i

    '--- pull out one color
'    Const THIS_COLOR As String = "green"
'    Dim group As Variant
'    For Each group In group_dict
'        Dim subDict As Dictionary
'        Set subDict = group_dict(group)
'        Debug.Print subDict(THIS_COLOR)
'    Next group

    Dim key As Variant
    Dim addlKey As Variant
    For Each key In group_dict.Keys
        For Each addlKey In group_dict(key).Keys
            Debug.Print addlKey, group_dict(key)(addlKey)
        Next addlKey
    Next key

End Sub
...