VBA中如何创建包含未知数量子字典的嵌套字典?
问题分析与解决
你的核心问题出在子字典的初始化逻辑错误以及早期/后期绑定混用,导致无法正确创建嵌套字典结构。以下是具体问题和修正方案:
问题点拆解
- 循环内重复创建子字典:你在
For循环的每一次迭代都执行Set kamags = New Dictionary,这会导致每次循环都生成全新的子字典,无法复用已存在的小时对应的子字典。 - 绑定方式不一致:外层字典
hours用了后期绑定(CreateObject("Scripting.Dictionary")),但kamags声明为Dictionary(早期绑定),如果未引用Microsoft Scripting Runtime库,会直接报错。 - 未复用已有子字典:当小时已存在于外层字典时,没有取出对应的子字典进行后续的司机计数操作。
修正后的完整代码
Sub Generate_report() Dim ws As Worksheet Dim kamagiData As Worksheet Dim incomesData As Worksheet Dim i As Long, lst As Long Dim currentTime As Variant Dim currentKamag As String Dim currentHour As Long ' 统一使用后期绑定,无需引用库,兼容性更好 Dim hours As Object Dim kamags As Object Set ws = ActiveSheet Set kamagiData = Sheets("Kamagi") Set incomesData = Sheets("Dane wjazdy") Set hours = CreateObject("Scripting.Dictionary") With kamagiData lst = .Cells(.Rows.Count, 1).End(xlUp).Row For i = 2 To lst currentTime = .Cells(i, 11).Value currentHour = Hour(currentTime) currentKamag = .Cells(i, 14).Value ' 处理外层字典:如果当前小时不存在,新建子字典并添加 If Not hours.Exists(currentHour) Then Set kamags = CreateObject("Scripting.Dictionary") hours.Add currentHour, kamags Else ' 小时已存在,取出对应的子字典 Set kamags = hours(currentHour) End If ' 处理子字典:统计司机编号出现次数 If Not kamags.Exists(currentKamag) Then kamags.Add currentKamag, 1 Else kamags(currentKamag) = kamags(currentKamag) + 1 End If ' 调试输出验证 Debug.Print "小时: " & currentHour Debug.Print "司机: " & currentKamag & " 次数: " & kamags(currentKamag) Next i End With ' 后续可以遍历字典生成报表,示例: ' Dim hourKey As Variant ' Dim kamagKey As Variant ' For Each hourKey In hours.Keys ' Set kamags = hours(hourKey) ' Debug.Print "=== 小时 " & hourKey & " ===" ' For Each kamagKey In kamags.Keys ' Debug.Print kamagKey & ": " & kamags(kamagKey) & "次" ' Next kamagKey ' Next hourKey 'Po utworzeniu odpowiednich słowników należy uzupełnić odpowiednie pola w tabeli, najpierw czyszcząc je z poprzednich wersji 'Dodać przycisk czyszczenia raportów 'Dodać instrukcję 'Obsłużyć liczenie wjazdów/wyjazdów z yardu End Sub
关键修正说明
- 统一后期绑定:将
hours和kamags都声明为Object,用CreateObject("Scripting.Dictionary")创建,避免因未引用库导致的错误,同时提升代码兼容性。 - 子字典复用逻辑:当当前小时已存在于外层字典时,通过
Set kamags = hours(currentHour)取出已有的子字典,而不是新建,保证计数的连续性。 - 恢复司机计数逻辑:解除你注释的子字典计数代码,实现每个小时内司机编号的次数统计。
调试验证
运行代码后,可以通过立即窗口(Ctrl+G调出)查看每个司机在对应小时的计数结果,也可以使用代码中注释的遍历逻辑,批量输出所有小时的统计数据。
内容的提问来源于stack exchange,提问作者Tomek Burzyński
相关产品推荐
相关产品推荐

