2016-07-28 49 views
2
Sub Lottery() 
Dim A As Long 
Dim B As Long 
Dim C As Long 
Dim D As Long 
Dim E As Long 
Dim N As Long 
Dim xLot() As String 

N = 0 
ReDim xLot(1 To 169911) 
For A = 1 To 27 
    For B = A + 1 To 28 
     For C = B + 1 To 29 
      For D = C + 1 To 30 
       For E = D + 1 To 31 
        N = N + 1 

        xLot(N) = A & "-" & B & "-" & C & "-" & D & "-" & E 
        'Debug.Print xLot(N), N 
        'Range("a" & N).Value = xLot(N) 

       Next E 
      Next D 
     Next C 
    Next B 
Next A 

Range("A1:A169911").Resize(169911, 1).Value = Application.WorksheetFunction.Transpose(xLot) 

End Sub 

使用转置运行时错误13类型不匹配。我在另一个博客上读到我无法写入超过65535个单元格。在另一个例子中,在第38840至169911行(组合数)之后,这些单元具有#N/A。我已经在立即窗口中运行它,并为所有组合的数组帐户。任何帮助将不胜感激。将1维阵列写入单个列时发生错误

回答

2

转置的上限约为65k项。

如果改为

ReDim xLot(1 To 169911, 1 to 1) 
'.... 
xLot(N, 1) = A & "-" & B & "-" & C & "-" & D & "-" & E 
'... 

,那么你就不必移调:

Range("A1:A169911").Value = xLot 
+0

我调整了我的代码以反映所提出的更改,现在我得到一个“脚本超出范围”,我期望它现在需要为ReDim xLot(1到169911,1到1)的第二维。我已经将它直接写入表单,但大约需要7分钟。在我的机器上。 – floatpilot99

+0

你们摇滚!!!!!!!!!!!!!!!!!!谢谢soooooooooooo多。 – floatpilot99

+0

我在上面的答案中写的代码应该用不到几秒钟的时间来运行,我不知道为什么需要7分钟,您是否尝试过复制/粘贴它?另外,您能否将这些答案中的一个标记为“回答”? –

4

你不能使用超过65535个值的转置功能,因为转部分列转换成行的范围(反之亦然),并且在Excel工作表中只能有65535列。您可以通过给阵列的第二维度绕过转功能,所以更改ReDim语句:

ReDim xLot(1 To 169911,0) 

和你的赋值语句:

xLot(N,0) = A & "-" & B & "-" & C & "-" & D & "-" & E 

...最后是你的范围语句:

Range("A1:A169911").Resize(169911, 1).Value = xLot 

编辑:只是测试它,该代码为我工作:

Sub Lottery() 
    Dim A As Long 
    Dim B As Long 
    Dim C As Long 
    Dim D As Long 
    Dim E As Long 
    Dim N As Long 
    Dim xLot() As String 

    N = 0 
    ReDim xLot(1 To 169911, 0) 
    For A = 1 To 27 
     For B = A + 1 To 28 
      For C = B + 1 To 29 
       For D = C + 1 To 30 
        For E = D + 1 To 31 
         N = N + 1 

         xLot(N, 0) = A & "-" & B & "-" & C & "-" & D & "-" & E 
         'Debug.Print xLot(N), N 
         'Range("a" & N).Value = xLot(N) 

        Next E 
       Next D 
      Next C 
     Next B 
    Next A 

    Range("A1:A169911").Resize(169911, 1).Value = xLot 
End Sub 
+0

也许会使第二维1为基础,就像第一个? – ThunderFrame

+0

如果你喜欢,你可以这样做,但它的糟糕做法通常是在0以外的任何地方启动一个数组。在VBA中,它会*增加内存开销。我没有关于这是否适用于数组的每个元素的任何数据,所以我不希望在有6位数字的情况下使用1的lbound来诱惑命运。不管怎么说,这个代码运行的时间只有几微秒。 –

+1

在可以的情况下同意使用基数0,但*混合基数比使用基数1,IMO差。可能会更好,使他们都基地0. – ThunderFrame