Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.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随机函数问题-关闭工作文件时不工作_Excel_Vba_Random - Fatal编程技术网

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

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

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

  • 打开excel文件,生成:1111,生成:2222,关闭
  • 用宏打开文件,生成:1111,生成2222,生成3333关闭工作表
  • 打开文件,生成: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
    
  • 预期结果(示例):

  • 打开文件,生成:1111,生成:2222,关闭
  • 使用macor打开文件,生成:3333,生成4444,生成5555关闭工作表
  • 打开文件,生成:6666
  • 在循环之前添加布拉克尼库

    您不需要有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
    
    在循环之前添加布拉克尼库

    您不需要有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