2011-07-19 6 views
2

私の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経由のすべてを含まなければならないために

enter image description here

...が取り付けられています。しかし、私が得るのは、1つのレベル、すなわち、R8からR12とR14だけです...私は困惑しています。私はpreReqGraph.itemsのLBoundとUBoundを使ってみましたが、役に立たなかった。

+0

私はあなたの「サイクル検出」が特定の非サイクルで消滅するかもしれないと思います。 R8とR9の両方でR17が前提条件となっているとします。 – jtolle

+0

@jtolle:R8の場合、R17とR17には前提条件がないため、前提条件はありません。 R9でも同じです。私は一度に1つの要件に取り組んでいます - それぞれの要件に対して、私はちょうど依存関係グラフを逆方向にトレースしようとしています。私はそれが窒息するとは思わない。私は私の頭の中で「正しいことを証明する」ことができました:P – PhD

+0

私はそれがあなたが何をしようとしているのか分かりません。これは、For vs. Whileループの問題を除いて、R4を処理して、R8、R9、およびR10をリストに追加するようなものです。その後、R17を追加してR8を処理します。そして、あなたはR9を処理するでしょうが、R17はすでにそこにあって停止しています。しかしそれはサイクルではありません。通常、この種のことは再帰的に行い、すべてをいくつかのネストされたループに絞り込むことはしません。 – jtolle

答えて

3

forループをwhileループに変更し、手動でインデックス変数を増やすのが最も簡単です。

Dim preReqCount as Integer 
preReqCount = 0 

While preReqCount <= numberOfPreReqsToIterate 
    'Your Loop Logic 

    preReqCount = preReqCount + 1 
Wend 
+0

私はそれを考えました...試してみましょう。しかし、なぜそれがデータを「スキップする」のかについてまだ混乱していますか?それもやっていないだろうか?しかし、わからない – PhD

+2

ユーザーFinkはなぜ[ここ](http://stackoverflow.com/questions/3112751/why-doesnt-this-for-loop-process-the-full-data-set)に関するいくつかの洞察力を持っています/ 3114247#3114247) –

+0

正確に私が探していたもの:私は賢明に何かをして、私を愚かに感じさせなければならなかったことを知っていました:Dリンクは完全に明確になりました:) – PhD

関連する問題