循环期间ReDim导致运行时错误9

时间:2017-04-11 01:04:54

标签: excel-vba vba excel

我一直在尝试使用Excel中的VBA作为项目创建一个自动解决数独谜题的程序。

我遇到了一个问题,我的数组在经过一个循环来获取它们之后没有获得分配给它们的正确值。我已经将这个设计工作用于3x3矩阵,但它遇到了9x3x3的问题(I. E.完全数独谜题。)

我检查了ReDim文档并意识到它只能重新分配数组的最后一个维度。因此,我试图使用逻辑,因此它永远不需要改变前两个维度的大小。我仍然得到一个错误,当试图从数组中调用一个值时,我认为这超出了数组的范围。我已经使用调试器逐步完成了该程序,并检查它是否正确分配了所有值,它看起来如此。我最终知道为什么它不起作用所以有什么建议你可以给人好吗?

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

我正在使用Excel 2010.这是我在stackOverflow上的第一篇文章,它来自我的手机(我在停机时正在做这个项目)所以如果格式化或任何有关错误的细节有任何变化我得到了,随便问。

1 个答案:

答案 0 :(得分:1)

您的问题是,您正在根据blockArray的当前值重置lenBlockArray(a, b, 1)的第三维 - 但该数组中的各种值可能不同 - 所以如果{{1} }为3,因此lenBlockArray(1,1,1)标注为blockArray,然后当您将(3,3,3)设置为1时,您会将lenBlockArray(1,2,1)重新定位到blockArray

您应该将(3,3,1)重新调整为blockArrayUBound(blockArray,3)中的较大者。

lenBlockArray(a,b,1)