Ejecutar VBA a una hoja de excel diferente a la activa.

Sub aleatorio()
'Por Dante Amor
    Dim num As New Collection
    On Error Resume Next
    For Each cadafila In Selection.Rows
        Set num = Nothing
        fila = cadafila.Row
        ini = Columns("A").Column               'rango inicial
        fin = ini + Cells(fila, "U").Value - 1 'rango final
        col = Columns("Z").Column              'columna resultados
        n = Cells(fila, "W").Value            'valor cant  aleatorios
        '
        Do While num.Count < n
            columna = WorksheetFunction.RandBetween(ini, fin)
            valor = Cells(fila, columna).Value
            num.Add Item:=valor, Key:=CStr(valor)
        Loop
        For i = 1 To num.Count
            Cells(fila, col).Value = num(i)
            col = col + 1
        Next
    Next
End Sub

buenas tardes, tengo la siguiente macro, realmente me la proporcionaron por aqui hace tiempo asi que no se muy bien su estructura, solo modifico ciertos valores q necesito como son rangos y valores de acuerdo a la tabla donde la utilize.

El tema es que la macro funciona bien, lo que hace es que donde dice "valor cant aleatorios" si en esa celda dice 5, entonces busca 5 números entre el "rango inicial" y "rango final" y pega los resultados a partir de la columna donde dice "columna resultados"

La macro trabaja de acuerdo a la fila donde este seleccionado o activo, y funciona de maravilla.

PERO necesito ahora que la macro funcione en otra hoja diferente a la que tengo activa.

EJEMPLO: estoy activo en la hoja2 fila 5, al darle ejecutar, la macro se ejecute en segundo plano en la hoja3, ya que los datos los tengo en esa hoja, pero que mi hoja actual donde estoy activa, siga intacta y no me cambie de hoja, que toda la macro se ejecute en segundo plano en la hoja 3, ya que allí esta el rango, la celda donde dice cuantos números aleatorios y que también pegue los resultados en esa hoja3.

¿Se puede hacer eso?

1 respuesta

Respuesta
1

La macro lee datos de celdas.

De dónde quieres que lea esos datos, ¿de la hoja 2 o de la hoja 3?

¿O quieres que lea todos los datos de la hoja 2 y solamente escribir el resultado en la hoja 3?

Dante, todos los datos y resultados de la macro los necesito en la hoja 3. simplemente que voy a estar yo activo o situado en la hoja 2.

Osea, supongamos que la hoja 2 esta vacía, y yo estoy activo en la hoja 2, pero los datos están en la hoja 3, entonces yo en la hoja 2, ejecuto la macro. Pero todo se haga en segundo plano en la hoja3 "que es donde están los datos y también pegue los resultados en esa misma hoja3", pero sin yo moverme de la hoja 2.

espero  ser claro :/

DANTE, lo que pasa es que con esta macro tengo el siguiente inconveniente:

Si hay datos por delante de las columnas del rango establecido en la macro, que en este caso es de la columna A a la U. a la hora de ejecutarla, si hay números por delante de esas columnas los esta tomando en la aleatorio. Y solo debería tomar aleatorios de ese rango y no de columnas más adelante, entonces estoy pensando en colocar esos datos en una hoja aparte, sin más datos en ella.

Pero si hay manera de que en la macro a la hora de hacer el aleatorio, solo tome si o si los valores del rango y no se filtren valores, no tendría esa necesidad.

Quedo atento a si se puede solucionar. mil gracias..

Supongamos que la hoja 2 esta vacía, y yo estoy activo en la hoja 2

¿Cuántas filas vas a seleccionar en la hoja2?

La macro funciona con el número de fila seleccionada.

Entiendo que vas a estar en la hoja2, por ejemplo, si seleccionas la celda A5, ¿entonces la macro se va a ejecutar en la hoja3 pero con la fila 5?

El tema es que la macro funciona bien

Si la macro funciona bien entonces solamente la voy a cambiar para que funcione en la hoja3.

Prueba esto

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("Hoja3")
    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, "U").Value - 1 'rango final
        col = Columns("Z").Column              'columna resultados
        n = sh.Cells(fila, "W").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

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas