Problema con VBA que extrae aleatorios de un Rango
Sub aleatorio() 'Por Dante Amor Dim cadafila As Range, fila As Long, ini As Long, fin As Long Dim n As Variant, columna As Variant, valor As Variant Dim col As Long, sh As Worksheet, i As Long Dim num As New Collection Set sh = Sheets("Hoja1") On Error Resume Next For Each cadafila In Selection.Rows Set num = Nothing fila = cadafila.Row ini = Columns("A").Column 'rango inicial fin = ini + sh.Cells(fila, "AD").Value - 1 'rango final col = Columns("AG").Column 'columna resultados n = sh.Cells(fila, "AE").Value 'valor cant aleatorios ' Do While num.Count < n columna = WorksheetFunction.RandBetween(ini, fin) valor = sh.Cells(fila, columna).Value num.Add Item:=valor, Key:=CStr(valor) Loop For i = 1 To num.Count sh.Cells(fila, col).Value = num(i) col = col + 1 Next Next End Sub
muy buenas noches. La macro anterior fue proporcionada por un experto muy colaborador de esta pagina del cual me encuentro muy agradecido por su ayuda.
La macro trabaja muy bien, pero cuando se presenta en ciertas situaciones se queda pegada y no corre más. Como ilustro en la imagen, la macro extrae aleatoriamente datos de el rango y en la columna "AE" le dice que extraiga en este caso 5 datos aleatoriamente. Y los empiece a pegar a partir de la columna AG, aclaro que la macro trabaja solo la fila donde yo este activo, y en la hoja que este configurada en la macro, en este caso la hoja1. Independientemente de q hoja me encuentre en el libro. El tema es que la macro trabaja bien, pero en las filas q tienen datos completos en el rango.
En la imagen coloque 2 filas: la fila 3, tiene todos los datos llenos hasta la columna "AD" y como se puede apreciar en la foto, allí la ejecute y saco aleatoriamente los 5 números sin problemas. Todo perfecto :)
PERO si la ejecuto en una fila como es la fila 4, como se ve en la imagen, vemos que esta solo tiene datos hasta la columna "T", y así este vacío una sola fila en ese rango, la macro se queda pensando y el libro (no responde) y la única manera es forzar cerrado del libro.
¿Hay alguna manera de que la macro extraiga los datos así no este totalmente lleno el rango?
Dado el caso de que sea muy complicado, pienso en hacer una macro "extra" q reemplace esos valores vacíos por un valor "000" y luego a esta macro de aleatorio, modificarla para que extraiga pero indicándole que ignore ese valor "000" para que no los vaya a incluir en el aleatorio.
Es una opción que doy por si el arreglo a la macro es muy complicado :)
Hola Dante, una duda que consigo con la función Evaluate - Adriel Ortiz Mangia
La función Evaluate es para convertir un nombre de excel a un objeto o a un valor. En este caso estoy creando un arreglo con 1 a n items y al mismo tiempo llena el arreglo con los valore 1,2,3, hasta n. Revisa lo siguiente: https://docs.microsoft.com/en-us/office/vba/api/excel.application.evaluate - Dante Amor
Evaluate, si no es la más, es una de las más poderosas funciones de VBA. - Andy Machin
Muchas gracias Dante y Andy bendiciones - Adriel Ortiz Mangia