在Excel中计算一个静态随机数(计算一次)

我正在寻找一种在Excel中计算一次随机数的方法。 所以它第一次计算它的计算,但是之后它不会改变。

例如,如果我在B1 RANDONCE(A1)有这样的事情,那么我第一次在A1中input一个值时,它会计算一个随机值,但是它不会再改变。 或者至less不会,直到我再次改变A1。

我想这样做,而不需要手动重新复制B1来将它从一个公式转换为这里所描述的值。 macros的使用很好。

你需要一个带有内存的UDF,所以它知道这个单元是否已经改变了

当被调用的调用改变时,这个UDF将返回一个新的随机值,否则返回最后一个随机值(即没有改变)
如果源单元格是空白的,也将返回空白(可能或可能不是你所需要的?)

注意:closures表单时存在Static值丢失的问题,所以每次打开表单时,值都会改变。

 Function randonce(r As Range) Static trigger As Variant Static v As Double If r <> trigger Then v = Rnd trigger = r End If If Len(r) <> 0 Then randonce = v Else randonce = vbNullString End If End Function 

我想我有一个更简单的方法来做到这一点。 完成电子表格,然后为该列数字应用= RANDBETWEEN函数。 然后这样做:

  1. 复制该列的结果。
  2. 突出显示列并select“特殊粘贴”并select“值”。

现在你有最近创build的值,它们是静态的。

您可以创build一个UDF(用户定义的函数):

 Public Function Rand_once(ByVal r As Range) Rand_once = Rnd End Function 

在你想要结果的单元格中,你可以放:

 =Rand_once(A1) 

只有当源值发生变化(aka A1 )时,该值才会改变(实际上是在重新计算)。

您也可以使用循环引用来创build一个纯粹的公式驱动的“切换开关”,允许用户计算一组随机数,然后closures进一步的重新计算。 closures循环引用警告 ,然后将此公式放在单元格B3中:

 =IF($B$1="YES",RAND(),B3) 

如果单元格B1包含“是”,则B3会在每个电子表格重新计算时生成一个新的随机数; 如果B1包含任何其他值,B3的当前值将被保留。

这显然不是最好的解决scheme,如果你必须跟踪许多单元格,但是如果它只是 A1,你需要跟踪更改,你可以使用一个事件在B1中完成你的function,然后在最后给它赋值它被给了。 我觉得这是最简单的解决scheme,它可以按照你的要求工作。

例:

 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" Then With Cells(1, 2) .Value = "=rand()" 'or whatever .Value = .Value End With End If End Sub