Workbook_open事件中的Rnd函数返回相同的值

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

我创建了一个使用 Rnd 函数的宏。该函数总共随机化 1-10。

Public Sub Welcome()  
    Dim WelcomeStart As String  
    wsAssistant.Range("D2") = 1 + Round(Rnd * 9, 0)  
    WelcomeStart = WorksheetFunction.VLookup(wsAssistant.Range("D2"),wsAssistant.Range("B2:C11"), 2, 0)  
    wsAssistant.Range("E2") = WelcomeStart  
End Sub

单元格 B2:B11 包含从 1 到 11 的数字。
单元格 C2:C11 中有文本。

抽出的数字是vlookup函数查找的值,其中包含返回值。
模块的启动程序有效。返回随机数和欢迎短语。

当我将此过程放入 Workbook_open 事件中时,Rnd 函数为每个值返回 7。

Private Sub Workbook_Open()  
    Application.DisplayFullScreen = True  
    UserForm1.Show  
    Welcome 
    wsAssistant.Range("E2").Speak  
End Sub

这个想法是,当文件打开时,将读取随机问候语。

当第7项的返回不断返回时,这个解决方案就不再有意义了。
我尝试添加一行代码来清除单元格 D2,这样当文件打开时,该单元格将为空白。

Rnd 函数在打开文件时是否可以返回随机值?

excel vba
1个回答
1
投票

要修复您的代码,您应该首先了解:

Rnd 生成一个伪随机数:对于任何给定的初始种子,都会生成相同的数字序列,因为对 Rnd 函数的每次连续调用都使用前一个数字作为序列中下一个数字的种子。

您在

Round(Rnd * 9, 0)
中的种子始终如一。 要修复您的代码,您必须使用一些初始 random 值作为种子:通常我们在之前的行中使用
Randomize
来使用当前系统时钟作为种子。
所以:

Public Sub Welcome()  
    Dim WelcomeStart As String  
    
    Randomize '<= just this
    wsAssistant.Range("D2") = 1 + Round(Rnd * 9, 0)  
    WelcomeStart = WorksheetFunction.VLookup(wsAssistant.Range("D2"),wsAssistant.Range("B2:C11"), 2, 0)  
    wsAssistant.Range("E2") = WelcomeStart  
End Sub

编辑:
当然,对于安全关键应用程序和物联网来说,使用当前时间播种并不是一个好主意,因为它是可预测的。

© www.soinside.com 2019 - 2024. All rights reserved.