domingo, 2 de abril de 2017

MACRO PARA GENERAR NUMEROS ALEATORIOS EN VBA

De acuerdo a la definición lo aleatorio es algo que depende del azar, de la suerte o de un proceso casual. Procede del vocablo latino aleatorius.

Para generar números aleatorios en VBA usamos la función RND, la función recibe como parámetro un valor de tipo single. Dependiendo de este parámetro será el valor retornado por la función RND:

Si el parámetro es menor que cero retorna el mismo número, mayor que cero el siguiente numero aleatorio en la secuencia, igual a cero el número generado por última vez, si se omite el parámetro retorna el siguiente número aleatorio en la secuencia.

Para ejemplificar el uso de la función RND , creamos una macro que genera números aleatorios en un rango de valores.

Tenemos la siguiente hoja de cálculo:


En la celda B4 se ingresa el valor inferior del rango y en la celda C4 el valor superior. En la celda C4 ingresamos la cantidad de números aleatorios que queremos generar.

Definimos una rutina principal


 Definimos una variable de tipo worksheet que nos sirve para identificar la hoja de cálculo, la variable ffinal que nos indicara cual es la última fila con datos en la columna E de la hoja de cálculo.

En esta rutina se valida que exista un valor inicial y otro final, además que el valor inicial sea menor al final. Si esta condición se cumple se borran los datos que tenga la columna E y se invoca la rutina generadora de números aleatorios.

La rutina recibe como parámetro el rango dentro del cual se generaran los números aleatorios. Definimos una variable en la que almacenaremos el número aleatorio encontrado, una variable para contar las filas de la hoja de cálculo y la iniciamos en cuatro.

Creamos un ciclo que inicia en el número cuatro hasta el valor contenido en la celda D4 de la hoja de cálculo.

Inicializamos el generador de números aleatorios con la función Randomize. Para encontrar el número aleatorio escribimos la siguiente instrucción:

aleatorio = CInt(((numfin - numini + 1) * VBA.Rnd()) + numini)

Donde numfin es el número mayor y numini el número menor

Espero que esta macro te sea útil, si tienes dudas o comentarios escríbenos a macrosymacros@gmail.com.


4 comentarios:

  1. hola me llamo gustavo. tengo un codigo en vbs para generar numeros aleatorios del numero 0 hasta el numero 45 con 6 cifras.
    el problema es que cuando abrimos el excel y precionamos el boton generar siempre el primer numero generado es el mismo, cerramos el excel y lo abrimos de nuevo y generamos un nuevo numero y el primer numero siempre es el mismo.
    se puede modificar el codigo para hacer que genere un numero diferente el cerrar y abrir el excel. se los agradeceria mucho.

    ResponderEliminar
  2. este es el codigo:

    Function AleatoriosUnicos(Inferior As Integer, Superior As Integer, Cantidad As Integer) As String

    Dim iArr As Variant
    Dim i As Integer
    Dim r As Integer
    Dim temp As Integer

    Application.Volatile

    ReDim iArr(Inferior To Superior)
    For i = Inferior To Superior
    iArr(i) = i
    Next i

    For i = Superior To Inferior + 1 Step -1
    r = Int(Rnd() * (i - Inferior + 1)) + Inferior
    temp = iArr(r)
    iArr(r) = iArr(i)
    iArr(i) = temp
    Next i

    For i = Inferior To Inferior + Cantidad - 1
    AleatoriosUnicos = AleatoriosUnicos & " " & iArr(i)
    Next i

    AleatoriosUnicos = Trim(AleatoriosUnicos)
    End Function

    ResponderEliminar
  3. Antes de la línea:
    r = Int(Rnd() * (i - Inferior + 1)) + Inferior
    debes introducir la función Randomize, de esta forma:

    Randomize
    r = Int(Rnd() * (i - Inferior + 1)) + Inferior

    ResponderEliminar
  4. hola y buen día
    verán estoy intentando generar hasta 2000 números aleatorios únicos, pero aparir de 500 obtengo el error de desbordamiento

    el código que uso es:
    Function AleatoriosUnicos(Inferior As Integer, Superior As Integer, Cantidad As Integer) As String (igual al del ejemplo del anterior usuario mas arriba para el calculo)

    y para el botón de acción, Private Sub CommandButton1_Click()
    Range("B21", "M37").Value = AleatoriosUnicos(Range("G2").Value, Range("H2").Value, Range("K2").Value)
    End Sub

    el motivo de este comentario es preguntarles si conocen un código que admita un mayor rango, de existir, u otro método que me recomienden. gracias

    ResponderEliminar