Я пытаюсь создать подпрограмму в 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