2011-11-04 23 views
8

Estoy buscando una forma de calcular un número aleatorio una vez en Excel. Entonces se computa la primera vez que se llama, pero luego no cambia después.Calcule un número aleatorio estático (cómpúdelo una vez) en Excel

Así que, por ejemplo, si tuviera algo como esto en B1 RANDONCE(A1), la primera vez que coloque un valor en A1 calcularía un valor aleatorio pero luego no cambiaría de nuevo. O al menos no hasta que cambie A1 nuevamente.

Me gustaría hacer esto sin volver a copiar manualmente B1 para convertirlo de una fórmula a un valor como se describe here. El uso de macros está bien.

+1

¿Cuánto tiempo debe mantenerse el valor "fijo"? ¿Solo a través de una sesión, o después de guardar, etc.? –

+0

Si está contento con un valor que no es realmente 'aleatorio', simplemente opaco, puede usar algo vinculado desde http://stackoverflow.com/questions/3498356/md5-hash-function-in-excel para calcular un hash del valor en 'A1'. – AakashM

+0

Parece que quieres un evento. Agregué una respuesta a continuación. Tenga en cuenta que puede asignar B1 a su valor (desde una fórmula) en un paso en VBA, por lo que no necesita hacerlo como lo publicaron en ese enlace que agregó. – aevanko

Respuesta

3

Se necesita un UDF con la memoria, por lo que sabe si la célula ha cambiado

Esta UDF devolverá un nuevo valor aleatorio cuando el referido a llamar a los cambios, de lo contrario devuelve el último valor aleatorio (es decir, sin modificar)
también volver en blanco si celda de origen está en blanco (puede o no puede ser lo que usted necesita?)

Nota: tiene el problema de que los Static valores se pierden cuando la hoja está cerrada, por lo que el valor cambia cada vez que el la hoja está abierta.

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

Gracias por esta respuesta, @ChrisNeilsen! Solo necesitaba algunos pequeños retoques para ser una solución todo en uno. ** Primera línea: ** 'Function RandOnce (Low As Long, High As Long, r As Range) As Long' ** Change **' v = Rnd' ** a ** 'v = Int (Rnd * (High) +1 - Bajo)) + Bajo' y ** agregue 'Aleatorizar' ** después de las declaraciones para asegurarse de que el RNG se restablezca. – TesseractE

3

Se puede crear una UDF (función definida por el usuario):

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

En la celda donde queremos el resultado, se puede poner:

=Rand_once(A1) 

El valor va a cambiar (en realidad, siendo recalculado) solo cuando cambia el valor de la fuente (también conocido como A1).

+2

-1 Esto cambiará el valor si la hoja tiene un recálculo completo (por ejemplo, presione ctrl-alt-F9) –

+0

Esto no fue precisado por OP y creo que esto será suficiente siempre que la información que proporcionó. – JMax

+2

No estoy de acuerdo. Creo que "pero luego no volvería a cambiar" excluye el cambio en recalc completo. –

1

Esto, obviamente, no va a ser la mejor solución si tiene que realizar un seguimiento de muchas células, pero si es simplemente A1 se necesita para realizar un seguimiento de los cambios, puede utilizar un evento para hacer su función en B1, luego, al final, asígnele el valor que se le dio. Encuentro que esta es la solución más simple y funciona como lo requieres.

Ejemplo:

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

Si tiene que rastrear muchas celdas, puede usar un 'Intersecar' para hacerlo más legible. Sin embargo, considero que esta solución es bastante buena, ya que obviamente no cambiará el valor (siempre que sea Recalc completo más o menos, vea el debate con Chris debajo de mi respuesta) hasta que 'A1' cambie (así que creo que esto requiere un +1 :)) – JMax

4

creo que tengo una manera mucho más fácil de hacer esto. Complete su hoja de cálculo, luego aplique la función = RANDBETWEEN para esa columna de números. A continuación, haga esto:

  1. Copie los resultados de esa columna.
  2. Resalte la columna y seleccione "pegar especial" y seleccione "valores".

Ahora tiene los valores creados más recientemente y son estáticos.

2

También puede usar referencias circulares para hacer un "interruptor de palanca" puramente basado en fórmulas, lo que le permite al usuario calcular un conjunto de números aleatorios y luego desactivar nuevos cálculos. Turn off circular reference warnings y, a continuación, poner esta fórmula en la celda B3:

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

Si la celda B1 contiene "SÍ", B3 generará un nuevo número aleatorio con cada nuevo cálculo de hoja de cálculo; si B1 contiene cualquier otro valor, se retendrá el valor actual de B3.

Cuestiones relacionadas