Excel VBA随机函数问题-关闭工作文件时不工作
我制作了一个带有随机函数的代码生成器,但当再次关闭和打开宏时,它会生成相同的代码。当在1次打开时运行宏更多次时,它工作正常,但当我用宏关闭文件,再次打开时,它会生成相同的代码。它是这样的-例如:Excel VBA随机函数问题-关闭工作文件时不工作,excel,vba,random,Excel,Vba,Random,我制作了一个带有随机函数的代码生成器,但当再次关闭和打开宏时,它会生成相同的代码。当在1次打开时运行宏更多次时,它工作正常,但当我用宏关闭文件,再次打开时,它会生成相同的代码。它是这样的-例如: 打开excel文件,生成:1111,生成:2222,关闭 用宏打开文件,生成:1111,生成2222,生成3333关闭工作表 打开文件,生成:1111 For i = 15 To 38 ws2.Cells(i, 2) = Int((9999 - 0 + 1) * Rnd + 0) ws2.C
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
For i = 15 To 38
For j = 2 To 13
ws2.Cells(i, j) = Int(10000 * Rnd)
Next j
Next i
在循环之前添加布拉克尼库
您不需要有12行(几乎)相同的代码,只需将ws2.Cells(i,j)=Int((9999-0+1)*Rnd+0)封装在For循环中:对于j=2到13。另外:我可能遗漏了一些东西,但是-0和+0在我看来并没有实现任何目标沙尔克先生
Randomize
For i = 15 To 38
For j = 2 To 13
ws2.Cells(i, j) = Int(10000 * Rnd)
Next j
Next i
VBA
Rnd
的作用是,随机化基于种子编号序列,该序列可以在每次打开文件时重复,正如您已经体验到的那样。根据注释,工作表function.randbween
没有这样的缺点,在这种情况下可以作为替代品使用。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
VBA
Rnd
的作用是,随机化基于种子编号序列,该序列可以在每次打开文件时重复,正如您已经体验到的那样。根据注释,工作表function.randbween
没有这样的缺点,在这种情况下可以作为替代品使用。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
请注意:您不需要有12行(几乎)相同的代码,只需将
ws2.Cells(i,j)=Int((9999-0+1)*Rnd+0)
包装在For
循环中:For j=2到13
。另外:我可能遗漏了一些东西,但就我所知,-0
和+0
没有实现任何目标。这个公式类似于10000*Rnd
,因此如果启用自动计算,它应该会为您带来不同的值。少了什么?你在存钱吗?你有自动计算吗?在循环之前添加。当我想到它时,也许它与保护有关,但不确定如何。计算设置为自动如果您尝试了WorksheetFunction.randbween
?请注意:您不需要有12行(几乎)相同的代码,只需将ws2.Cells(i,j)=Int((9999-0+1)*Rnd+0)
封装在For
循环中:For j=2到13
。另外:我可能遗漏了一些东西,但就我所知,-0
和+0
没有实现任何目标。这个公式类似于10000*Rnd
,因此如果启用自动计算,它应该会为您带来不同的值。少了什么?你在存钱吗?你有自动计算吗?在循环之前添加。当我想到它时,也许它与保护有关,但不确定如何。计算设置为自动您是否尝试了工作表函数.randbween
?