2011-11-04 6 views
8

Szukam sposobu obliczenia losowej liczby raz w programie Excel. Więc jego obliczenie po raz pierwszy jest wywoływane, ale potem nie zmienia się później.Oblicz statyczną liczbę losową (oblicz ją raz) w Excelu

Na przykład, gdybym miał coś takiego w B1 RANDONCE(A1), to po pierwszym umieszczeniu wartości w A1 wyliczyłaby losową wartość, ale potem nie zmieniłaby się ponownie. A przynajmniej nie, dopóki nie zmienię A1 ponownie.

Chciałbym to zrobić bez ręcznego przekopiowania B1, aby przekształcić ją ze wzoru na wartość opisaną jako here. Używanie makr jest w porządku.

+1

Jak długo wartość musi pozostać "stała"? Po prostu przez sesję lub po zapisaniu itp.? –

+0

Jeśli będziesz zadowolony z wartości, która nie jest w rzeczywistości "losowa", po prostu nieprzejrzysta, możesz użyć czegoś powiązanego z http://stackoverflow.com/questions/3498356/md5-hash-function-in-excel na oblicz wartość skrótu wartości w "A1". – AakashM

+0

Wygląda na to, że chcesz wydarzenie. Dodałem odpowiedź poniżej. Zauważ, że możesz przydzielić B1 jego wartość (z formuły) w jednym kroku w VBA, więc nie musisz tego robić tak, jak pisali w tym dodanym łączu. – aevanko

Odpowiedz

3

Trzeba UDF z pamięci, więc nie wie, czy komórka zmieniła

to UDF powróci nową wartość losową gdy skieruję wywołać zmiany, w przeciwnym razie zwraca ostatnią wartość losową (czyli bez zmian)
powrócić także puste jeśli komórka źródłem jest pusty (może lub nie może być to, czego potrzebujesz?)

Uwaga: ma problemu, że wartości Static zostaną utracone, gdy arkusz jest zamknięta, więc wartość zmieni się za każdym razem, gdy arkusz jest otwarty.

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

Dziękuję za tę odpowiedź @ChrisNeilsen! Potrzebował tylko kilku drobnych usprawnień, aby być rozwiązaniem "wszystko w jednym". ** Pierwsza linia: ** 'Funkcja RandOnce (tak długo, tak długo, tak długo jak r) Jak długo' ** Zmień ** 'v = Rnd' ** to **' v = Int (Rnd * (wysoki + 1 - Low)) + Low' i ** dodaj 'Randomize' ** po deklaracjach, aby upewnić się, że RNG zostanie zresetowany. – TesseractE

3

Można utworzyć UDF (funkcji zdefiniowanej przez użytkownika):

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

W celi, w którym chcesz wynik, można umieścić:

=Rand_once(A1) 

wartość będzie się zmieniać (faktycznie, są ponownie obliczane) tylko wtedy, gdy zmieni się wartość źródłowa (aka A1).

+2

-1 To zmieni wartość, jeśli arkusz ma pełne przeliczenie (np. Naciśnij ctrl-alt-F9) –

+0

To nie zostało sprecyzowane przez OP i myślę, że to wystarczy pod warunkiem, że podał on informacje. – JMax

+2

Nie zgadzam się. Myślę, że "ale potem to się już nie zmieni" wyklucza zmianę przy pełnym rekalcowaniu. –

1

To oczywiście nie będzie najlepszym rozwiązaniem, jeśli masz do śledzenia wiele komórek, ale jeśli jest to tylko A1 trzeba śledzić zmian, można użyć zdarzenie, aby zrobić swoją funkcję w B1, następnie na końcu przypisz mu podaną wartość. Uważam to za najprostsze rozwiązanie i działa tak, jak tego potrzebujesz.

Przykład:

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

Jeśli musisz śledzić wiele komórek, możesz użyć opcji "Intersect", aby była bardziej czytelna. Jednak uważam to rozwiązanie za świetne, ponieważ oczywiście nie zmieni wartości (za każdym razem, gdy Full Recalc lub tak, zobacz debatę z Chrisem poniżej mojej odpowiedzi), dopóki "A1" się nie zmieni (więc myślę, że to pozbawia +1 :)) – JMax

4

myślę, że mają o wiele łatwiejszy sposób, aby to zrobić. Uzupełnij arkusz kalkulacyjny, a następnie zastosuj funkcję = RANDBETWEEN dla tej kolumny liczb. Następnie wykonaj następujące czynności:

  1. Skopiuj wyniki z tej kolumny.
  2. Podświetl kolumnę i wybierz "wklej specjalne" i wybierz "wartości".

Teraz masz ostatnio utworzone wartości i są one statyczne.

2

Można również użyć odwołań kołowych, aby utworzyć "sterowany przełącznik" o wyłącznie formułach, umożliwiający użytkownikowi obliczenie zestawu liczb losowych, a następnie wyłączenie dalszych ponownych obliczeń. Turn off circular reference warnings, a następnie umieścić ten wzór w komórce B3:

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

Jeżeli komórka B1 „TAK”, B3 wygenerować nowy numer losowo z każdej przeliczenia kalkulacyjnego; jeśli B1 zawiera jakąkolwiek inną wartość, bieżąca wartość B3 zostanie zachowana.