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

问题描述:

我正在寻找一种方法来在Excel中计算一次随机数。所以它第一次计算它的计算值,但之后它不会改变。例如,如果我在B1 RANDONCE(A1)中有这样的事情,那么我第一次在A1中输入一个值时,它会计算一个随机值,但是它不会再改变。或者至少在我再次改变A1之前。在Excel中计算一个静态随机数(计算一次)

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

+1

值需要保持“固定”多长时间?只是在一个会议,或保存后,等? –

+0

如果你对一个不是真正“随机”的值感到满意,只是不透明,你可以使用从http://*.com/questions/3498356/md5-hash-function-in-excel链接的东西来计算'A1'中的值的散列值。 – AakashM

+0

听起来就像你想要一个事件。我在下面添加了一个答案。请注意,您可以在VBA中的一个步骤中将它的值(来自公式)分配给B1,因此您不需要像在他添加的链接中发布的那样执行它。 – aevanko

你需要带记忆功能的UDF,因此它知道如果小区已经改变

此UDF将返回一个新的随机值当refered调用的变化,否则返回最后一个随机值(即没有变化)
也返回空白,如果源小区是空白的(可能是也可能不是您需要什么?)

注:它在纸张被关闭了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 
+0

谢谢你的回答@ChrisNeilsen!它只需要进行一些小的调整即可成为一体化解决方案。 **第一行:**'函数RandOnce(Long As Long,Long As Long,r As Range)As Long' ** Change **'v = Rnd' ** to **'v = Int(Rnd *(High + 1 - 低))+低“和**在声明后添加”随机化“**以确保RNG得到重置。 – TesseractE

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

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

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

=Rand_once(A1) 

的值将改变(实际上,只有当源值发生变化时(也就是A1)才会被重新计算)。

+2

-1如果工作表有完整的重新计算(例如按Ctrl-Alt-F9),这将改变值, –

+0

这并未被OP精化,我认为这将足以提供他提供的信息。 – JMax

+2

我不同意。我认为“但它不会再改变”排除完全重算的变化。 –

这显然不会是最好的解决办法,如果你要跟踪多个细胞,但如果是只是 A1您需要跟踪更改,您可以在B1使用事件做你的功能,然后在最后给它赋值。我发现这是最简单的解决方案,它可以按照您的要求运行。

例子:

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 
+0

如果您必须跟踪许多单元格,则可以使用'Intersect'使其更具可读性。然而,我发现这个解决方案相当不错,因为它显然不会改变它的价值(每当Full Recalc左右,请参阅我的回答下面的Chris的辩论),直到A1会发生变化(所以我认为这值得+1 :)) – JMax

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

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

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

您也可以使用循环引用来创建一个纯粹的公式驱动的“切换开关”,允许用户计算一组随机数,然后关闭进一步的重新计算。 Turn off circular reference warnings,然后把该式中细胞B3:

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

如果电池B1包含“YES”,B3将生成与每个电子表格重新计算一个新的随机数;如果B1包含任何其他值,B3的当前值将被保留。