Как перебрать динамически растущий словарь?Кажется, Excel VBA прекомпилирует «предел» цикла For - PullRequest
2 голосов
/ 19 июля 2011

Я столкнулся с этой странной проблемой с объектом Scripting.Dictionary в моем коде VBA.Я хочу продолжить перебирать словарь по всей его длине.Я могу добавить больше элементов в словарь в цикле, так что размер словаря изменяется, так сказать, динамически.Кажется, что он перебирает только то количество элементов, которые изначально были в словаре, а НЕ новые !!

Вот код:

'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 с фиктивными данными ...

enter image description here

Для R4 preReqGraph должен содержать все от R8 до R17.Но то, что я получаю, это ТОЛЬКО один уровень, т.е. только R8 через R12 и R14 ... Я в тупике.Я даже пытался использовать LBound и UBound preReqGraph.items, но безрезультатно.

1 Ответ

3 голосов
/ 19 июля 2011

Самое простое, что можно сделать, это изменить цикл for на цикл while, а затем вручную увеличить индексную переменную.

Dim preReqCount as Integer
preReqCount = 0

While preReqCount <= numberOfPreReqsToIterate
    'Your Loop Logic

    preReqCount = preReqCount + 1
Wend
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...