VBA随机函数问题-关闭工作文件时不起作用

问题描述 投票:1回答:2

我制作了一个具有随机函数的代码生成器,但是当再次关闭和打开宏时,它会生成相同的代码。当在1次打开中多次运行宏时,它工作正常,但是当我使用宏关闭文件时,再次打开,它将生成相同的代码。就像这样-例子:

  1. 打开Excel文件,生成:1111,生成:2222,关闭
  2. 带宏的打开文件,生成:1111,生成2222,生成3333关闭工作表
  3. 打开文件,生成: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
    

预期结果(示例):

  1. 打开文件,生成:1111,生成:2222,关闭
  2. 使用macor打开文件,生成:3333,生成4444,生成5555关闭工作表
  3. 打开文件,生成:6666
excel vba random
2个回答
0
投票

在循环前添加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

0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.