如何迭代动态增加的字典?似乎excel VBA预编译For循环的“限制”

如何迭代动态增加的字典?似乎excel VBA预编译For循环的“限制”,excel,vba,Excel,Vba,我的VBA代码中的Scripting.Dictionary对象遇到了一个奇怪的问题。我希望继续重复这本字典的总长度。我可能会在循环中向字典添加更多项,因此字典的大小可以说是动态变化的。它似乎只对字典中原来的元素进行迭代,而不是对新元素进行迭代 代码如下: 'Recursively continue to get all dependencies numberOfPreReqsToIterate = preReqGraph.Count - 1 For preReqCount =

我的VBA代码中的Scripting.Dictionary对象遇到了一个奇怪的问题。我希望继续重复这本字典的总长度。我可能会在循环中向字典添加更多项,因此字典的大小可以说是动态变化的。它似乎只对字典中原来的元素进行迭代,而不是对新元素进行迭代

代码如下:

'Recursively continue to get all dependencies

    numberOfPreReqsToIterate = preReqGraph.Count - 1
    For preReqCount = 0 To numberOfPreReqsToIterate
        listOfPreReqs = preReqGraph.items
        rowNumberOfDependency = Application.WorksheetFunction.Match(listOfPreReqs(preReqCount), Range("requirementNumber"), 0)
        listOfPreReqsForCurrentPreReq = Application.WorksheetFunction.Index(Range("preReqList"), rowNumberOfDependency)

        If listOfPreReqsForCurrentPreReq <> "" Then
            preReqs = Split(listOfPreReqsForCurrentPreReq, ",")

            'Add each prereq to dictionary
            For i = 0 To UBound(preReqs)

                'If prereq already exists implies cycle in graph
                If preReqGraph.Exists(Trim(preReqs(i))) Then
                    MsgBox ("YOU HAVE A CYCLE IN PREREQUISTE SPECIFICATION!")
                    End
                End If

                'If not then add it to the preReqGraph. The value for the key is the key itself
                preReqGraph.Add Trim(preReqs(i)), Trim(preReqs(i))
                numberOfPreReqsToIterate = numberOfPreReqsToIterate + 1

            Next i
        End If
    Next preReqCount
从概念上讲,我试图获得依赖关系的整个“图形”,如果是这样的话,还可以检测一个周期。我遍历这些单元格,找出这个图,看看是否存在循环。我需要能够不断迭代字典中的所有项,以查找存在的尽可能多的项。但是excel似乎以某种方式预编译了for循环,因此只采用了原始的上限/限制,而不采用新的上限/限制!我已经尝试过了,这就是我所拥有的…但是没有用

有什么想法吗

附件是一个带有虚拟数据的excel表格样本


对于R4,preReqGraph应该包含从R8到R17的所有内容。但我得到的只是一个等级,即只有R8到R12和R14……我被难住了。我甚至尝试过使用preReqGraph.items的LBound和UBound,但都没有用

最简单的方法是将for循环更改为while循环,然后手动增加索引变量

Dim preReqCount as Integer
preReqCount = 0

While preReqCount <= numberOfPreReqsToIterate
    'Your Loop Logic

    preReqCount = preReqCount + 1
Wend

我想到了…我会试试看。但我仍然不明白为什么它会跳过数据?你不会也这么做吗??不知道为什么用户Fink对我要找的东西有一些见解:我知道excel必须做一些聪明的事情,让我觉得自己很笨:D链接完全澄清了这一点:工作起来很有魅力!!感谢芬克的链接-这刚刚澄清了一切!我认为你的周期检测可能会在某些非周期上出现阻塞。假设R8和R9都有R17作为先决条件…@jtolle:所以对于R8来说,先决条件是R17,而R17没有先决条件,所以它继续。R9也一样。我一次只处理一个需求——所以对于每个需求,我只是想让它的依赖关系图向后追溯,可以这么说。我认为它不应该窒息。我设法在脑海中证明了这一点:我想我不明白你当时想做什么。看起来,除了For和While循环的问题,您需要处理R4,将R8、R9和R10添加到列表中。然后处理R8,添加R17。然后你会处理R9,但你会看到R17已经存在并停止。但这不是一个循环。通常情况下,你会递归地做这类事情,而不是试图将它们全部压缩到一些嵌套的循环中。@jtolle:Ahhh!我明白了:这是有意义的…它是嵌套循环的唯一原因是我不知道如何使用Excel VBA编写递归函数…我正在编写这段代码,因为没有其他专业知识,我是一个经常处理VBA细微差别的程序员:以下是一些Stackoverflow链接,您可能会发现它们很有用。VBA中的递归:;您的周期检测问题: