我制作了一个具有随机函数的代码生成器,但是当再次关闭和打开宏时,它会生成相同的代码。当在1次打开中多次运行宏时,它工作正常,但是当我使用宏关闭文件时,再次打开,它将生成相同的代码。就像这样-例子:
打开文件,生成:1111
For i = 15 To 38
ws2.Cells(i, 2) = Int((9999 - 0 + 1) * Rnd + 0)
ws2.Cells(i, 3) = Int((9999 - 0 + 1) * Rnd + 0)
ws2.Cells(i, 4) = Int((9999 - 0 + 1) * Rnd + 0)
ws2.Cells(i, 5) = Int((9999 - 0 + 1) * Rnd + 0)
ws2.Cells(i, 6) = Int((9999 - 0 + 1) * Rnd + 0)
ws2.Cells(i, 7) = Int((9999 - 0 + 1) * Rnd + 0)
ws2.Cells(i, 8) = Int((9999 - 0 + 1) * Rnd + 0)
ws2.Cells(i, 9) = Int((9999 - 0 + 1) * Rnd + 0)
ws2.Cells(i, 10) = Int((9999 - 0 + 1) * Rnd + 0)
ws2.Cells(i, 11) = Int((9999 - 0 + 1) * Rnd + 0)
ws2.Cells(i, 12) = Int((9999 - 0 + 1) * Rnd + 0)
ws2.Cells(i, 13) = Int((9999 - 0 + 1) * Rnd + 0)
Next i
预期结果(示例):
在循环前添加Randomize。 – BrakNicku
您不需要具有12(几乎)相同的代码行,只需将ws2.Cells(i,j)= Int((9999-0 + 1)* Rnd + 0)包装为一个循环:对于j = 2到13。另外:我可能会遗漏某些东西,但就我所知,-0和+ 0并没有实现任何目的。 – M.Schalk
Randomize
For i = 15 To 38
For j = 2 To 13
ws2.Cells(i, j) = Int(10000 * Rnd)
Next j
Next i
VBA Rnd
函数does not return a true random number的随机化是基于种子编号序列,您已经体验到,每次打开文件时,种子编号序列都可以重复。根据注释,WorksheetFunction.RandBetween
没有这种缺点,在这种情况下可以作为替代。同样,正如excel知道的那样,添加了Randomize
函数以对种子数进行随机化以获得更随机的数。
您已经从注释中发现了这一点,但是我仍然在发送我的答案,因为您的代码效率极低,并且可能需要很长时间才能运行(测试时我花了半分钟才打开文件)。我简直不能忽略这一点。因此,我将其更改为在数组中生成所有数字,然后将其粘贴到工作表中。这使代码几乎即时:
Private Sub workbook_Open()
Dim i As Integer, j As Integer
Dim arr(0 To 24, 0 To 12) As Variant
For i = 0 To 24
For j = 0 To 12
Randomize
arr(i, j) = Int(10000 * Rnd) 'WorksheetFunction.RandBetween(1, 10000)
Next j
Next i
Range("B15:M38") = arr
End Sub