You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBA中如何创建包含未知数量子字典的嵌套字典?

问题分析与解决

你的核心问题出在子字典的初始化逻辑错误以及早期/后期绑定混用,导致无法正确创建嵌套字典结构。以下是具体问题和修正方案:

问题点拆解

  1. 循环内重复创建子字典:你在For循环的每一次迭代都执行Set kamags = New Dictionary,这会导致每次循环都生成全新的子字典,无法复用已存在的小时对应的子字典。
  2. 绑定方式不一致:外层字典hours用了后期绑定(CreateObject("Scripting.Dictionary")),但kamags声明为Dictionary(早期绑定),如果未引用Microsoft Scripting Runtime库,会直接报错。
  3. 未复用已有子字典:当小时已存在于外层字典时,没有取出对应的子字典进行后续的司机计数操作。

修正后的完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 22:47:01