按键循环字典值

3
以下是创建字典并从 3 列 (i,1) 键中分配值以及来自 getdates() 的日期数组从 startdate(i,2) 和 enddate(i,3) 的代码。
我的目标是按键打印每个日期(一个键可能有多个日期),但下面的代码给我类型不匹配的错误。
Sub Test_Dates()
    Dim TESTWB As Workbook
    Dim TESTWS As Worksheet

    Set TESTWB = ThisWorkbook
    Set TESTWS = TESTWB.Worksheets("TEST")

    Dim Dict As New Scripting.Dictionary

    For i = 2 To TESTWS.Cells(1, 1).End(xlDown).Row
        Dict.Add TESTWS.Cells(i, 1).Value, getDates(TESTWS.Cells(i, 2), TESTWS.Cells(i, 3))  
    Next i

    For Each Key In Dict.Keys
        Dim idate As Variant
        For Each idate In Dict.Items
            Debug.Print idate 'this line is where the error is
        Next idate
    Next Key
End Sub

这是一个获得在起始日期和结束日期之间的日期数组的函数

Function getDates(ByVal StartDate As Date, ByVal EndDate As Date) As Variant
    Dim varDates()      As Date
    Dim lngDateCounter  As Long

    ReDim varDates(0 To CLng(EndDate) - CLng(StartDate))

    For lngDateCounter = LBound(varDates) To UBound(varDates)
        varDates(lngDateCounter) = CDate(StartDate)
        StartDate = CDate(CDbl(StartDate) + 1)
    Next lngDateCounter

    getDates = varDates
End Function

1
每个 idate 都是一个数组,因此您不能将其作为字符串返回。为了测试代码是否正确返回到该点,请尝试 Debug.Print idate(0),idate(UBound(idate))。通过这种方式,它将从数组字典项中“提取” StartDateEndDate... - FaneDuru
@FaneDuru Debug.Print idate(0),idate(UBound(idate)) 可以打印出数组中的第一个和最后一个日期,但我想要打印出数组中所有的日期。 - Florian
我的建议只是为了测试代码是否正常运行,而且它确实正常。现在,你所说的每个日期的返回是什么意思?你只想在即时窗口中显示它们吗? - FaneDuru
@Florian,你的循环多了一个。请看下面的答案。 - Pᴇʜ
如果您在函数中声明Dim varDates,则可以简单地返回:Debug.Print Join(idate, ", ")。并且使用 StartDate = StartDate + 1 应该就足够了... - FaneDuru
显示剩余3条评论
3个回答

3

您可以使用一个循环来遍历字典,而不是两个循环。

Dim i As Long
For i = 0 To Dict.Count - 1
    Debug.Print Dict.Keys(i),      Join(Dict.Items(i), "|")
Next i

如果您需要将每个日期作为单独的项目,请使用两个循环。

Dim i As Long
For i = 0 To Dict.Count - 1
    Dim DateItem As Variant
    For Each DateItem in Dict.Items(i)
        Debug.Print Dict.Keys(i),      DateItem 
    Next DateItem
Next i

一个与字典一起使用的好资源:Excel VBA 字典 - 完整指南


啊,谢谢,这样可能更有效率。 - Florian
但是,如果我不仅仅是想打印日期而是要使用它,那么我该如何使用这个循环呢? - Florian
1
@Florian,请查看我的编辑。你需要两个循环,但不需要三个。 - Pᴇʜ
没问题,完美运行,谢谢。 - Florian

3

遍历字典中的项

遍历字典中的每个项并连接项数组的元素,请使用:

Dim Arr As Variant
For Each Arr In Dict.Items
    Debug.Print Join(Arr, ", ")
Next Arr

要遍历包含从零开始的数组的字典中的每个元素,请使用:

Dim Arr As Variant
Dim i As Long
For Each Arr in Dict.Items
    For i = 0 To Ubound(Arr)
        Debug.Print Arr(i)
    Next i
Next Arr

或者,使用双重For...Each循环:

Dim Arr As Variant
Dim Item As Long
For Each Arr in Dict.Items
    For Each Item in Arr
        Debug.Print Item
    Next Item
Next Arr

1
我发现在idate上再添加一个循环就可以解决问题:
For Each Key In Dict.Keys

    Dim idate As Variant

    For Each idate In Dict.Items

        Dim bdate As Variant
        
        For Each bdate In idate
        
        Debug.Print bdate
    
        Next bdate
    Next idate
Next Key

这是一个多余的循环。 - Pᴇʜ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接