Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
excel vba排列超过1048576行_Excel_Vba - Fatal编程技术网

excel vba排列超过1048576行

excel vba排列超过1048576行,excel,vba,Excel,Vba,我试图在excel中为6个数字创建一个排列列表,每个数字在各自的a-F列中,每个数字都是1-38。当我运行VBA时,我发现排列远远超过excel中可用的1048576行,因此VBA在该点结束。我想要一个VBA,当任何工作表上的行数达到1048576,并且排列尚未完成时,它将只创建一个新工作表,并在上一工作表上停止的位置继续,并自动创建工作表,直到排列结束。我搜索了通过的问题,但没有找到有帮助的。任何专家的帮助都将不胜感激 代码: 这应该可以为您做到: Sub Perm() Dim a As I

我试图在excel中为6个数字创建一个排列列表,每个数字在各自的a-F列中,每个数字都是1-38。当我运行VBA时,我发现排列远远超过excel中可用的1048576行,因此VBA在该点结束。我想要一个VBA,当任何工作表上的行数达到1048576,并且排列尚未完成时,它将只创建一个新工作表,并在上一工作表上停止的位置继续,并自动创建工作表,直到排列结束。我搜索了通过的问题,但没有找到有帮助的。任何专家的帮助都将不胜感激

代码:


这应该可以为您做到:

Sub Perm()

Dim a As Integer
Dim b As Integer
Dim c As Integer
Dim d As Integer
Dim e As Integer
Dim f As Integer
Dim n As Long

Dim maxRows As Long
Dim sheetNumber As Integer
Dim loopCounter As Integer

 maxRows = 1048576
 loopCounter = 38

 sheetNumber = 1
 n = 1

ActiveWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count)
ActiveSheet.Name = "Sheet-" & sheetNumber

Application.ScreenUpdating = False

For a = 1 To loopCounter
For b = 1 To loopCounter
    For c = 1 To loopCounter
        For d = 1 To loopCounter
            For e = 1 To loopCounter
                For f = 1 To loopCounter


                  Cells(n, 1).Value = a
                  Cells(n, 2).Value = b
                  Cells(n, 3).Value = c
                  Cells(n, 4).Value = d
                  Cells(n, 5).Value = e
                  Cells(n, 6).Value = f

                  If n = maxRows Then
                       sheetNumber = sheetNumber + 1
                       ActiveWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count)
                       ActiveSheet.Name = "Sheet-" & sheetNumber
                       n = 0
                  End If

                  n = n + 1

                Next f
            Next e
        Next d
      Next c
    Next b
  Next a

Application.ScreenUpdating = False

End Sub
这将创建一个名为“sheet-1”的工作表,并将其填充到第1048576行。 然后,它将创建一个名为“sheet-2”的新工作表,并重复该操作,直到该工作表已满,以此类推

最好禁用
屏幕更新
以进行密集的单元格写入,因为这将大大缩短运行时间


祝你好运,因为这可能需要一段时间。正如另一张海报所说,它将需要近3000张工作表。希望您的机器上有足够的内存。

好的,我想问一个显而易见的问题:为什么???您知道这一切运行需要多长时间吗?(提示:这将是一个非常…长…时间…)如果你这样做是为了彩票,那么你想要的是组合,而不是排列。在排列中,顺序很重要(例如123与321不同),但在组合中,顺序并不重要(例如123与321相同)。@Jean-FrançoisCorbett,我是VBA新手,我只是想嘿,为什么不试试这个让我的脚湿一下?第二,你没有经历过excel行限制问题1048576吗?@YungKing作为一个学习练习,很公平。当我说很长一段时间时,可能需要几天的时间。这里的教训是,在长循环中引用工作表的速度非常慢,有一些方法可以避免这种情况。我不会通过提供答案来破坏乐趣,但是提示:查找Variant Array。我如何暂停程序以查看完成了多少,然后在准备好后继续。目前,代码正在运行,但我没有看到生成任何数字,因此我无法确认它是否执行了它应该执行的操作。其次,“如果n Mod maxRows=0”是什么意思?为什么程序从第1页开始?它完全忽略了已有的sheet1。如果按
ctrl-break
,则应停止代码,以便查看
n
的值。关于
n Mod maxRows
,请查看Mod函数的联机帮助,如果n=maxRows,您也可以使用
;这只是个人喜好。我的回答并不假设您对现有工作簿有任何了解,这就是为什么该方法只访问它创建的工作表;请随意修改以满足您的需要。
Sub Perm()

Dim a As Integer
Dim b As Integer
Dim c As Integer
Dim d As Integer
Dim e As Integer
Dim f As Integer
Dim n As Long

Dim maxRows As Long
Dim sheetNumber As Integer
Dim loopCounter As Integer

 maxRows = 1048576
 loopCounter = 38

 sheetNumber = 1
 n = 1

ActiveWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count)
ActiveSheet.Name = "Sheet-" & sheetNumber

Application.ScreenUpdating = False

For a = 1 To loopCounter
For b = 1 To loopCounter
    For c = 1 To loopCounter
        For d = 1 To loopCounter
            For e = 1 To loopCounter
                For f = 1 To loopCounter


                  Cells(n, 1).Value = a
                  Cells(n, 2).Value = b
                  Cells(n, 3).Value = c
                  Cells(n, 4).Value = d
                  Cells(n, 5).Value = e
                  Cells(n, 6).Value = f

                  If n = maxRows Then
                       sheetNumber = sheetNumber + 1
                       ActiveWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count)
                       ActiveSheet.Name = "Sheet-" & sheetNumber
                       n = 0
                  End If

                  n = n + 1

                Next f
            Next e
        Next d
      Next c
    Next b
  Next a

Application.ScreenUpdating = False

End Sub