excel vba排列超过1048576行
我试图在excel中为6个数字创建一个排列列表,每个数字在各自的a-F列中,每个数字都是1-38。当我运行VBA时,我发现排列远远超过excel中可用的1048576行,因此VBA在该点结束。我想要一个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
这应该可以为您做到:
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