私のVBAコードでScripting.Dictionaryオブジェクトに関するこの奇妙な問題に直面しています。私は、その全長について辞書を繰り返し処理したいと思っています。ループ内の辞書に項目を追加することがあります。そのため、辞書のサイズは動的に変化します。それは、元々は辞書の中の多くの要素に対してのみ繰り返され、新しいものではないと思われます!概念的に、私は依存関係の全体の「グラフ」を取得し、また、すべてのことであれば、サイクルを検出しようとしている動的に増加する辞書を反復処理する方法は? VBAの "制限"をForループのExcelよりも優れているようです。
'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
場合です:
は、ここでは、コードです。私はこのグラフを調べ、サイクルが存在するかどうかを調べるためにセルを繰り返します。私は、存在する多くの項目について、辞書内のすべての項目を繰り返し処理できるようにする必要があります。しかし、それは何らかの形で "precompiles" forループのように見えるので、元の上限/限度だけが取られますが、新しいものではありません!私はハッキングしようとしましたが、これは私が持っているものです...しかし役に立たない。
アイデア?
は、ダミーデータのExcelシートのサンプルは、R4 preReqGraphは、R8からR17経由のすべてを含まなければならないために
...が取り付けられています。しかし、私が得るのは、1つのレベル、すなわち、R8からR12とR14だけです...私は困惑しています。私はpreReqGraph.itemsのLBoundとUBoundを使ってみましたが、役に立たなかった。
私はあなたの「サイクル検出」が特定の非サイクルで消滅するかもしれないと思います。 R8とR9の両方でR17が前提条件となっているとします。 – jtolle
@jtolle:R8の場合、R17とR17には前提条件がないため、前提条件はありません。 R9でも同じです。私は一度に1つの要件に取り組んでいます - それぞれの要件に対して、私はちょうど依存関係グラフを逆方向にトレースしようとしています。私はそれが窒息するとは思わない。私は私の頭の中で「正しいことを証明する」ことができました:P – PhD
私はそれがあなたが何をしようとしているのか分かりません。これは、For vs. Whileループの問題を除いて、R4を処理して、R8、R9、およびR10をリストに追加するようなものです。その後、R17を追加してR8を処理します。そして、あなたはR9を処理するでしょうが、R17はすでにそこにあって停止しています。しかしそれはサイクルではありません。通常、この種のことは再帰的に行い、すべてをいくつかのネストされたループに絞り込むことはしません。 – jtolle