domingo, 26 de julio de 2015

Elegir elementos aleatorios de una lista

Descargar el archivo busca4aleatorios.xlsm

Dada una lista de 10 elementos deseamos elegir cuatro de ellos de forma aleatoria y sin repetición.

La lista puede estás formada por los elementos que sea. En este caso la lista está formada por los números del 1 al 10.

Esto se puede hacer programando en VBA una macro, pero deseamos hacerlo con la grabadora de macros para no tener que meternos a programar con código.


Hemos creado cinco macros con grabadora cuyas acciones son las siguientes.

  1. Macro1. Borra el rango D5:F14
  2. Macro2. Copia el rango C5:C14 que es donde se generan los aleatorios, en el rango D5:D14, y lo hace con pegado especial valores.
  3. Macro3. Copia el rango D5:D14 en el rango E5:E14, y lo hace con pegado especial valores.
  4. Macro4. Eliminamos duplicados del rango E5:E14
  5. Macro5. Tomamos únicamente los cuatro primeros valores de la columna E. Justamente tomamos el rango E5:E8 y lo pegamos en el rango F5:F8 que es el resultado final que buscábamos.
Creamos una macro denominada Obten que llama a las otras cinco macros en el orden correcto.

Sub Obten()
Macro1
Macro2
Macro3
Macro4
Macro5
End Sub


Creamos un botón que lance la macro Obten.

Un posible problema


Este sistema tiene la ventaja de que no ha sido necesario programar una macro compleja con VBA y lo hemos hecho con la ayuda de la grabadora de macros. Existe un inconveniente que pudiera darse y es que si el número de valores de la lista que se repiten es muy alto en algún caso podríamos tener menos de 4 valores diferentes, por lo que se tendría que volver a generar el proceso ya que con tres valores, por ejemplo, no nos valdría.

Para detectar si este fenómeno raro se da con cierta frecuencia hemos creado una macro que al ser lanzada busca incansablemente hasta que encuentra menos de cuatro valores distintos. La macro es la siguiente.

Sub busca()
Dim n As Byte
Do
  Obten
  n = Application.WorksheetFunction.Count(Range("E5:E14"))
  If n < 4 Then
    End
  End If
Loop
End Sub

He tenido corriendo esta macro unos minutos y no se ha parado, lo cual indica que no es fácil encontrar un caso donde el número de repetidos sea tan alto que nuestro procedimientos resuelto con grabadora de macros no sea efectivo.

Por cierto, para parar una macro de forma manual se han de pulsar las teclas Contro+Pausa La tecla pausa habitualmente se encuentra en el teclado en la parte superior derecha. En algunos ordenadores portátiles se ha de pulsar alguna tecla de función que suele ir marcada con algún color. Esto para cualquier macro que esté funcionando y deseemos detener. Es un STOP manual.