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

VBA中Dictionary存储ArrayList数据丢失问题及解决方案咨询

问题解决:Dictionary中存储日期对丢失的问题

你推测的完全正确——问题根源在于ArrayList是引用类型。你只创建了一个arrListToDict对象,每次循环将它添加到字典后调用Clear,字典里所有的Item其实都是指向同一个ArrayList实例的引用,最终所有条目都会变成空的。

下面提供几种可行的解决办法:

方案1:每次循环新建ArrayList实例

不再复用同一个ArrayList,每次循环创建独立的对象,确保字典每个条目对应唯一的实例:

Function myDict() As Object
    Dim dict As Object, keyList As Object, arrListToDict As Object
    Dim keyListCount As Long, iLoop As Long
    Dim dateToday As Date, date1 As Date, date2 As Date
    
    Set dict = CreateObject("Scripting.Dictionary")
    Set keyList = CreateObject("System.Collections.ArrayList")
    
    keyList.Add "Hey"
    keyList.Add "Hello"
    keyListCount = keyList.Count
    dateToday = Date

    For iLoop = 0 To keyListCount - 1
        ' 每次循环新建ArrayList实例
        Set arrListToDict = CreateObject("System.Collections.ArrayList")
        date1 = DateAdd("d", Int(20000 * Rnd), dateToday)
        date2 = DateAdd("d", Int(20000 * Rnd), dateToday)
        arrListToDict.Add date1
        arrListToDict.Add date2
        dict.Add key:=keyList(iLoop), Item:=arrListToDict
    Next iLoop
    
    Set myDict = dict
End Function

方案2:使用VBA原生数组(无需依赖ArrayList)

直接用VBA内置的数组存储日期对,数组作为值类型传递,不会出现引用共享的问题:

Function myDict() As Object
    Dim dict As Object, keyList As Object
    Dim keyListCount As Long, iLoop As Long
    Dim dateToday As Date, date1 As Date, date2 As Date
    Dim datePair As Variant
    
    Set dict = CreateObject("Scripting.Dictionary")
    Set keyList = CreateObject("System.Collections.ArrayList")
    
    keyList.Add "Hey"
    keyList.Add "Hello"
    keyListCount = keyList.Count
    dateToday = Date

    For iLoop = 0 To keyListCount - 1
        date1 = DateAdd("d", Int(20000 * Rnd), dateToday)
        date2 = DateAdd("d", Int(20000 * Rnd), dateToday)
        ' 创建包含两个日期的数组
        datePair = Array(date1, date2)
        dict.Add key:=keyList(iLoop), Item:=datePair
    Next iLoop
    
    Set myDict = dict
End Function

调用时通过dict("Hey")(0)和dict("Hey")(1)即可获取对应的两个日期。

方案3:使用VBA Collection

用Collection存储日期对,同样每次循环新建独立的Collection:

Function myDict() As Object
    Dim dict As Object, keyList As Object, dateCol As Collection
    Dim keyListCount As Long, iLoop As Long
    Dim dateToday As Date, date1 As Date, date2 As Date
    
    Set dict = CreateObject("Scripting.Dictionary")
    Set keyList = CreateObject("System.Collections.ArrayList")
    
    keyList.Add "Hey"
    keyList.Add "Hello"
    keyListCount = keyList.Count
    dateToday = Date

    For iLoop = 0 To keyListCount - 1
        Set dateCol = New Collection
        date1 = DateAdd("d", Int(20000 * Rnd), dateToday)
        date2 = DateAdd("d", Int(20000 * Rnd), dateToday)
        dateCol.Add date1
        dateCol.Add date2
        dict.Add key:=keyList(iLoop), Item:=dateCol
    Next iLoop
    
    Set myDict = dict
End Function

调用时用dict("Hey")(1)和dict("Hey")(2)获取日期(Collection索引从1开始)。

内容的提问来源于stack exchange,提问作者BarBaDos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 11:26:20