2011-11-04 13 views
8

Excelで乱数を計算する方法を探しています。だから最初に計算されたが、その後は変わらない。Excelで静的乱数を計算する(1回計算する)

たとえば、B1 RANDONCE(A1)にこのようなことがあった場合、最初に値をA1に設定すると、ランダムな値が計算されますが、再び変更されません。少なくとも私がA1を変更するまでは、少なくとも。

B1を手動でコピーして数式からhereのような値にする必要はありません。マクロの使用は問題ありません。

+1

値はどのくらい「固定」にしておく必要がありますか?セッションの前後、または保存した後など? –

+0

実際に「ランダム」ではなく、不透明な値に満足したい場合は、http://stackoverflow.com/questions/3498356/md5-hash-function-in-excelからリンクされたものを使用できますA1の値のハッシュを計算する。 – AakashM

+0

あなたがイベントをしたいように聞こえます。私は以下の答えを加えました。 B1をVBAの1ステップで(数式から)割り当てることができるので、追加したリンクに投稿されたようにする必要はありません。 – aevanko

答えて

3

それは、細胞が

を変更した場合、変更を呼び出すために参照さと、このUDFは、新しいランダムな値を返します知っているので、あなたがそうでなければ、最後のランダムな値(すなわち変更なし)を返し、メモリとUDFを必要とする
ソースセルが空白の場合は空白に戻ります。

注:シートが閉じられると値が失われるという問題があります。シートが開かれる。

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(ロング・ロング・ロング・ロング・ロング・レンジ、ロング・ロング・レンジ)**ロング・チェンジ** v = Rnd ** **〜** v = Int(Rnd *(High + 1 - Low))+ Low'と**は、RNGがリセットされることを確認するために宣言の後に** 'Randomize' **を追加します。 – 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

多くのセルを追跡する必要がある場合は、 'Intertersect'を使用してより読みやすくすることができます。しかし、私はこの解決策が非常に素晴らしいと思うので、明らかに値を変更しないでください(Full Recalcのときは、私の答えの下でChrisとの議論を参照してください)。 – JMax

4

私はこれを行うにはもっと簡単な方法があると思います。スプレッドシートを完成させ、その列に= RANDBETWEEN関数を適用します。次に、これを実行します。

  1. その列の結果をコピーします。
  2. 列を強調表示し、[特殊なペースト]を選択して[値]を選択します。

最近、最近作成された値があり、静的です。

2

また、循環参照を使用して純粋に数式駆動型の「トグルスイッチ」を作成し、ユーザーが乱数のセットを計算してさらに再計算をオフにすることもできます。 Turn off circular reference warnings、その後、セルB3に、この式を置く:

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

セルB1が「YES」が含まれている場合、B3は、各スプレッドシートの再計算を使用して新しい乱数を生成します。 B1に他の値が含まれている場合、B3の現在の値は保持されます。