2017-04-11 17 views
1

私は、プロジェクトとしてExcelでVBAを使用して、スドクパズルを自動的に解決するプログラムを作成しようとしていました。実行時エラーを引き起こすループ中のReDim 9

ループを通過した後、配列に正しい値が割り当てられないという問題が発生しました。私は3x3マトリックスのためにこの設計作業をしましたが、9x3x3(IE Aの完全なスドクパズル)に問題があります。

私はReDimのドキュメントをチェックして、 。このため、最初の2つのディメンションのサイズを変更する必要がないようにロジックを処理しようとしました。私はまだ配列から値を呼び出そうとしているときに、配列の範囲を過度に超えていると誤っています。私は、デバッガを使用してプログラムをステップバイステップで実行し、すべての値が正しく割り当てられていることを確認しました。私はそれが働いていない理由について私の知恵の終わりにあるので、良い人が私に与えることができるアドバイスはありますか?

Dim guessArray() As integer 
Dim blockArray() As Integer 
Dim blockCheckArray() As integer 
Dim correctArray() As Integer 
Dim lenBlockArray (3, 3, 1) As Integer 
Dim lenBlockCheck(3, 3, 1) As integer 
Dim lenBlockCheckArray (3, 3, 1) As integer 
Dim counter as integer 

'Putting the sudoku into an array 


ReDim guessArray (9, 9) As integer 

For i = 1 to 9 

    For j = 1 to 9 

     guessArray (i, j) = Cells (i, j) 

    Next 

Next 

'Creating an array to find the numbers that are in a quadrant 

ReDim blockCheckArray(3, 3, 1) As integer 

For a = 1 to 3 

    For b = 1 to 3 

     For i = 1 to 3 

      For j = 1 to 3 

       'Looking through each quadrant for any number != 0 and dumping them into an array 

       If guessArray (i + ((a - 1) * 3), j + ((b - 1) * 3)) <> 0 Then 

        lenBlockArray (a, b, 1) = lenBlockArray (a, b, 1) + 1 

        ReDim Preserve blockArray (3, 3, lenBlockArray (a, b, 1)) As Integer 

        blockArray (a, b, lenBlockArray (a, b, 1)) = guessArray (i + ((a - 1) * 3), j + ((b - 1) * 3)) 

        End If 

      Next 

     Next 

    Next 

Next 

'Writing out the numbers in the quadrants for debugging 

counter = 1 

For a = 1 to 3 

    For b = 1 to 3 

     For i = 1 to lenBlockArray (a, b, 1) 

      Cells (counter, i + 10) = blockArray (a, b, i) 

     Next 

    Next 

Next 

私は、これはStackOverflowの上の私の最初のポストであり、それは(私は私のダウンタイムで仕事でこのプロジェクトをやっている)私の携帯からだそうエクセル2010を使用しているフォーマットや任意の仕様に変更があれば私が得ているエラーについては、お気軽にお問い合わせください。

+0

'lenBlockArray()'関数がありません。あなたのコードを援助する人が助けてくれるように投稿してください。 –

+0

@AdamVincentがソートされました。ありがとうございます。モバイルでの投稿の危険性。 – Hutsan

答えて

1

あなたの問題はあなたがlenBlockArray(a, b, 1)の現在の値が何であれに基づいてblockArrayの第3次元をリセットしていることである - しかし、その配列の様々な値が異なる可能性があります - lenBlockArray(1,1,1)は3だったので、blockArray(3,3,3)として配置されましたので、もしlenBlockArray(1,2,1)を1に設定すると、blockArray(3,3,1)に再設定します。

blockArrayUBound(blockArray,3)lenBlockArray(a,b,1)の大きい方にリダイレクトする必要があります。

If UBound(blockArray, 3) < lenBlockArray(a, b, 1) Then 
    ReDim Preserve blockArray (3, 3, lenBlockArray (a, b, 1)) As Integer 
End If 
+0

ありがとう! blockArrayをすべての反復に1または2に戻していたことをどのようにクリックしなかったのか分かりません。とても有難い。 – Hutsan

関連する問題