Recorrer Hojas de un Libro Excel y ejecutar macro

Estimados no entiendo lo que esta pasando con el código que estoy utilizando para recorrer todas las hojas de un libro excel y en cada una ejecutar una macro. Para probarla hice un código sencillo que genere un con msgbox cada vez que pase de una hoja a otra y que en cada hoja escriba una nota en la celda A1 que diga "Comprobación de escritura" para verificar si funciona. Resulta que el mesgbox señala que efectivamente pasa de una hoja a otra pero solo escribe la nota en la hoja activa que tenga el libro antes de ejecutar el código. No comprendo el error. El código es el siguiente:

Sub RecorrerLibros()

Dim Hoja As Worksheet

For Each Hoja In Worksheets
MsgBox Hoja.Name
Range("a1").Select
ActiveCell.FormulaR1C1 = "Comprobacion de escritura en todas las hojas"
Next
End Sub

3 Respuestas

Respuesta
1

Antes de esta línea

MsgBox Hoja.Name

Pon esta línea

Hoja.select

Respuesta
1

Al igual que con el "MsgBox", le tienes que decir al Excel que "use" el rango de la hoja que en ese momento está "recorriendo", algo así:

Sub RecorrerLibros()
Dim Hoja As Worksheet
For Each Hoja In Worksheets
    'MsgBox Hoja.Name
    Hoja.Range("A1").Value = "Comprobacion de escritura en todas las hojas"
Next
End Sub

El uso de "Select" no es necesario e incluso a veces hace más lentos los procesos. Aquí algo que escribí al respecto:

https://abrahamexcel.blogspot.pe/2017/12/el-uso-y-abuso-de-select-y-selection-en.html 

Salu2

Abraham Valencia

Hola Abraham te aclaro que el texto lo escribí solo para comprobar si el código se ejecuta unicamente en la primera o en todas las hojas. Y realmente lo que esta pasando es que solo se escribe en la celda A1 en la hoja activa que tenga el fichero al momento de ejecutar el código, no lo escribe en las otras hoja. Realmente lo que quiero es que en cada hoja se ejecute una macro y para ello fue que trate de comprobarlo con la escritura.La macro corre también solo en la primera hoja activa, igual que la escritura del texto. Lo extraño es que el Msgbox Hoja.name si se actualizan todas las hojas pero solo reescribe el texto en la hoja activa que este antes de ejecutar el código

Es normal lo que te está ocurriendo, en el "MsgBox" sí sale como quieres porque lle antecediste el "Hoja" a la propiedad "Name". Si corres mi ejemplo verás que sí modifica todas las celdas "A1" de todas las hojas.

Si quieres hacer cambios que estén dentro del bucle "For - Each", debes indicar que hacer en cada hoja:

Hoja.Range("F1").Interior.ColorIndex = 3

Hoja.Range("A1:A12").Value = "Hola"

etc.

Si lo que tienes es una macro del tipo:

Range("F1").Interior.ColorIndex = 3

Range("A1:A12").Value = "Hola"

Y lo que haces es usar un "Call" dentro del "For Each" para intentar "correrla" en cada hoja, ahí si podrías usar una cosa así:

Hoja.Select

Call MiMacro

Pero OJO, debes revisar bien esa macro para evitar que tenga, a su vez, selecciones de otras hojas.

Abraham Valencia

Respuesta
1

Prueba esta macro recorrerá todas las hojas y en la celda a1 de cada una colocara el mensaje predefinido, no hace falta el cambiar de hoja, en la macro te anexo en lneas desactivadas como seria ejecutar una macro dependiendo de la hoja.

Sub recorrido()
For Each nhoja In Worksheets
    nombre = nhoja.Name
    Worksheets(nombre).Range("a1") = "Esta es una prueba"
    'if nombre="hoja1" then macro1
    'if nombre="hoja2" then macro2
    'if nombre="hoja3" then macro3
Next nhoja
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas