2011-11-04 192 views
8

我正在尋找一種方法來在Excel中計算一次隨機數。所以它第一次計算它的計算值,但之後它不會改變。例如,如果我在B1 RANDONCE(A1)中有這樣的事情,那麼我第一次在A1中輸入一個值時,它會計算一個隨機值,但是它不會再改變。或者至少在我再次改變A1之前。在Excel中計算一個靜態隨機數(計算一次)

我想這樣做,而不需要手動重新複製B1,將它從公式轉換爲描述爲here的值。宏的使用很好。

+1

值需要保持「固定」多長時間?只是在一個會議,或保存後,等? –

+0

如果你對一個不是真正「隨機」的值感到滿意,只是不透明,你可以使用從http://stackoverflow.com/questions/3498356/md5-hash-function-in-excel鏈接的東西來計算'A1'中的值的散列值。 – AakashM

+0

聽起來就像你想要一個事件。我在下面添加了一個答案。請注意,您可以在VBA中的一個步驟中將它的值(來自公式)分配給B1,因此您不需要像在他添加的鏈接中發佈的那樣執行它。 – aevanko

回答

3

你需要帶記憶功能的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

3

您可以創建一個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

我不同意。我認爲「但它不會再改變」排除完全重算的變化。 –

1

這顯然不會是最好的解決辦法,如果你要跟蹤多個細胞,但如果是只是 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

4

我想我有一個更簡單的方法來做到這一點。完成電子表格,然後爲該列數字應用= RANDBETWEEN函數。然後執行此操作:

  1. 複製該列的結果。
  2. 突出顯示列並選擇「粘貼特殊」並選擇「值」。

現在你有最近創建的值,它們是靜態的。

2

您也可以使用循環引用來創建一個純粹的公式驅動的「切換開關」,允許用戶計算一組隨機數,然後關閉進一步的重新計算。 Turn off circular reference warnings,然後把該式中細胞B3:

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

如果電池B1包含「YES」,B3將生成與每個電子表格重新計算一個新的隨機數;如果B1包含任何其他值,B3的當前值將被保留。