domingo, 13 de junio de 2010

Ejecutar macro al abrir una Hoja de Excel.

Tiempo atrás un usuario me preguntó cómo podría ejecutar una macro de manera automática cada vez que abriera una hoja de su Libro de Excel. Se trataba de transponer un listado de datos de una Hoja a una segunda cada vez que abrieramos esta última.
Realmente será válida para cualquier macro que queramos que se autoejecute al abrir una Hoja.
La clave de esta opción es la instrucción SUB Worksheet_activate () que emplearemos para crear nuestra macro.
Veámoslo con un ejemplo.
Tenemos el siguiente listado en la Hoja1 de nuestro Libro:



Para ejemplificar esta instrucción usaré una macro sencilla que transpone nuestro listado vertical en horizontal. Este código se deberá editar desde la Hoja2 (no desde algún módulo). Accederemos al Editor de VBA bien presionando Alt+F11, para luego en la ventana del Explorador de Proyectos buscar la 'Hoja2', o bien con el botón derecho del ratón sobre la pestaña de 'Hoja2' seleccionando la opción desplegada de Ver código.

'ejecuta macro al abrir Hoja
Private Sub worksheet_activate()
'transpone listado en la columna A de la Hoja1 al abrir Hoja2
Dim y,f As Integer
y = Cells(WORKSHEETS("Hoja1").Range("A" & Rows.Count).End(xlUp).Row, 1).Row
For f = 1 To y
WORKSHEETS("Hoja2").Cells(1, f).Value = WORKSHEETS("Hoja1").Cells(f, 1).Value
Next f
End Sub



Con esta instrucción lograremos nuestro objetivo, esto es, cada vez que abramos nuestra Hoja2 se transpondrá el listado de valores que se encuentre en la columna A de la 'Hoja1'

28 comentarios:

  1. Realmente no entiendo esto de los macros si me pudieras ayudar

    Esto fue lo que el profesor me mando a hacer, pero realmente no lo entiendo

    "Punto 1 Cree un macro con el nombre macro01, que:
    Centralice y convine desde B15:K30 y que los datos escritos en estas celdas aparezcan en negrita, color azul, color de relleno amarillo y tamaño de la fuente en 16.5 ptos.

    Nota: Agrege en este comentario como podemos crear un boton para ejecutar el macro previamente creado."

    Ayudenme es mi examen para manana

    ResponderEliminar
  2. Hola Rodolfo,
    para crear la macro llamada macro01 utiliza el asistente de generación de macros
    Tienes un ejemplo en:
    http://excelforo.blogspot.com/2009/08/ejemplo-creacion-macro.html
    Se trata de que con el Asistente hagas lo que se te indica, lo que se quedará grabado en la macro, luego podrás asignar la macro a un botón.
    Para el último punto puedes ver este post:
    http://excelforo.blogspot.com/2009/09/boton-con-macro-en-excel-2007.html
    Espero te sea de utilidad.
    Slds

    ResponderEliminar
  3. muchas gracias la verdad no encontraba la forma de hacer esta acción. muy buen post gracias.

    ResponderEliminar
  4. Saludos quisiera una macro que cuando ingrese un dato y oulse el Enter que se ordene automaticamente. Asignandole a un botón lo puedo hacer pero necesito que solo con pulsar el enter se ejecute la macro. Gracias por vuestra ayuda

    ResponderEliminar
  5. Hola Anibal3,
    bueno, neceistas incorporar tu macro dentro de un evento
    Sub Worksheet_Change(ByVal Target As Range)
    '[tu código]
    End Sub

    e incluir este código en la hoja donde se vaya a realizar la introducción de datos.
    Slds cordiales

    ResponderEliminar
  6. Hola Buenas Tardes.
    Tengo una Tabla Dinamica y luego de hacer doble click para detallar, necesito que esta nueva hoja creada con el detalle, no muestre ciertas columnas, ademas quiero darle formato a otra columna de numeros de manera que salga sin decimales y con la separacion de miles.

    No se si hay alguna manera.
    Se me ocurrio a traves de una macro como he leido en este y otros foros, pero no se hacerlo ni si es posible.

    Muchas Gracias por la ayuda!

    Saludos

    ResponderEliminar
    Respuestas
    1. Hola Francisco,
      no creo que sea configurable esa opción de 'Mostrar detalle' al hacer doble clic sobre un elemento de valor de una TD.

      Lo que si podrías emplear para mostrar un cierto número de campos con los registros que verifiquen algunas condiciones es un filtro avanzado. Echa un vistazo a
      http://excelforo.blogspot.com.es/2013/02/algo-mas-sobre-filtros-avanzados-en.html

      así podrás controlar que campos mostrar... luego con una macro o selecionando el rango podrás cambiar el formato de las columnas.
      Slds

      Eliminar
  7. Comprendo lo que dices, el problema es que necesito que esto se haga automaticamente, ya que la tabla dinamica y por consiguiente el "mostrar detalle" sera revisado por una persona ajena y me gustaria le saliera el detalle de la forma que requiero, sin dejar ver mayor detalle del que necesitan.

    Conoces alguna manera de ejecutar una macro automaticamente al crear este detalle en una hoja nueva?

    Gracias!

    ResponderEliminar
    Respuestas
    1. Bueno Francisco,
      se podría aprovechar el hecho que al Mostrar detalle desde una Tabla dinámica se genera una Hoja nueva con una Tabla con los campos.
      Con lo cual generar en el editr de VB en ThisWorkbook un código con un evento _NewSheet que al generar una hoja nueva, de la tabla generada al Mostrar Detalle elimine los campos que quieras.
      Por ejemplo:
      Private Sub Workbook_NewSheet(ByVal Sh As Object)
      On Error Resume Next
      Range("A1").ListObject.ListColumns(2).Delete
      Resume
      End Sub

      Elimina el segundo campo de la Tabla generada...

      Espero te pueda servir.
      Slds

      Eliminar
  8. Hola
    como haria para que excel me muestre solo el formulario hecho en VBA y no la hoja de calculo solo el formulario

    ResponderEliminar
    Respuestas
    1. Hola,
      es algo raro lo que pides, podrías antes de mostrar el UserForm ocultar filas y columnas:
      Private Sub Worksheet_Activate()
      With Cells
      .EntireColumn.Hidden = True
      .EntireRow.Hidden = True
      End With
      UserForm1.Show
      End Sub

      o darles ancho y alto 0,:
      Private Sub Worksheet_Activate()
      With Cells
      .ColumnWidth = 0
      .RowHeight = 0
      End With
      UserForm1.Show
      End Sub

      Así no veras nada de la hoja, y sólo el formulario.
      Recuerda en todo caso que el Editor de VBA, normalmente al final siempre vuelca sobre la hoja de cálculo de alguna manera.
      Slds

      Eliminar
  9. buena noche quien me puede ayudar con un codigo de macro que haga lo siguiente

    1 cuando abra el archivo me ejecute un modulo que diga usuario y cable para ingreso

    2 que al momento del ingreso me guarde la fecha, nombre,hora de ingreso en un libro y que quede como historial

    3 los usuarios serian como 12 que ingresaran

    ResponderEliminar
    Respuestas
    1. Hola,
      podrías aplicar un evento Workbook_Open que abra un UserForm con controles ComboBox, uno que despliegue los 10 nombres de los usuarios y el otro el cable de ingreso.
      Luego se podría asociar un botón más que tras Aceptar registre la hora y día del sistema y el nombre desplegado en el comboBox de usuarios..

      Saludos

      Eliminar
    2. Es muy buena tu idea y suena fantástica pero la verda soy nuevo en esto y no se como hacerlo me gustaría que me ayudara creando el código en un libro de excel y me hicieras el grandísimo favor de enviarmelo a mi correo marcossalamanca1@hotmail.com te Dios te bendiga y te siga dando mucha sabiduría

      Eliminar
    3. Hola Marcos,
      mejor lee primero las Normas de uso del blog, y si te interesa, envíame un correo a
      excelforo@gmail.com
      junto con las explicaciones oportunas, y si puede ser un fichero con las estructuras de datos y toda la información para poder desarrollar lo que requieres.
      Un cordial saludo

      Eliminar
    4. Buena noche compañero ya te envié el archivo con una muestra a tu correo.

      Eliminar
    5. Buen dia Ismael ya te envié el archivo con una muestra a tu correo cordialmente marcos

      Eliminar
  10. hola buenas noches aguien me podria ayudar con macros en un libro? tengo un libro con 12 hojas y la 13a la llame indice que al abrirlo me manda directamente ahi pero kiero tambien que al abrirlo me produzca una cancion en mp3 . de antemano muchas gracias .

    ResponderEliminar
    Respuestas
    1. Hola Mauro,
      en próximas fechas subiré un post explicando la manera.
      un saludo

      Eliminar
    2. muchas gracias por tu atenciòn estare al pendiente de tu post que tengas buen dia

      Eliminar
  11. como puedo hacer que ejecute la macro una vez que termino de cargar la hoja ya que con el evento open marca error por que aun no termina de cargar la hoja

    ResponderEliminar
    Respuestas
    1. Hola, buenos días, que tal estás?
      Un gusto poder ayudarte.
      No termino de entender a qué proceso te refieres con cargar la hoja.

      Si con carga quieres indicar algún otro procedimiento Sub, bastaría que como última línea de esa Macro añadiera
      Call 'tu macro'

      Si, de otro lado, te refieres con carga a rellenar una plantilla en la hoja de cálculo, sería algo más complicado.. pero quizá un evento _Change con unos condicionales que verifiquen que todas las celdas están completas, y en ese caso, igual que antes:
      Call 'tu macro'

      Saludos cordiales

      Eliminar
  12. HOLA, QUISIERA UNA MACRO QUE ME PERMITA BUSCAR UNA HOJA CON NOMBRE ESPECIFICO, ESTE NOMBRE ESTARA EN UNA CELDA

    ResponderEliminar
    Respuestas
    1. Hola, para seleccionar una hoja concreta puedes hacer:
      Sheets(range("A1").value).select

      estando el nombre de la hoja en la celda A1
      Saludos

      Eliminar
  13. ayudenme:
    necesito crear un acceso directo con el cual pueda acceder a un formulario excel de inicio de sesion.
    gracias de antemano

    ResponderEliminar
    Respuestas
    1. Hola
      para hacer operativo un UserForm puedes usar el método Show:
      NombreFormulario.Show

      No se si es lo que preguntas... no entendí muy bien
      Saludos

      Eliminar
  14. Hola Ismael, me gustaría saber en esta fórmula de SI anidado =SI(C9=40,5;41,75;SI(C9=33,84;33,4;SI(C9=32,04;33,4;SI(C9=25,38;25,05;SI(C9=23,58;25,05;SI(C9=16,92;16,7;SI(C9=15,12;16,7;SI(C9=8,46;8,35;SI(C9=6,66;8,35))))))))) ¿cómo podría añadir una SUMA de celdas de otra Hoja del libro que a su vez son celdas formuladas igualmente?, no sé si me he explicado bien...
    Muchas gracias!

    ResponderEliminar
    Respuestas
    1. Hola Lucia,
      lo primero que te diría es que cambies la forma de trabajar.
      Construye una tabla auxiliar con las correspondencias, por ejemplo en la Hoja1 en el rango A1:B10
      dato-cantidad
      40,5 - 41,75
      33,84 - 33,4
      32,04 - 33,40
      25,38 - 25,05
      23,58 - 25,05
      16,92 - 16,7
      15,12 - 16,7
      8,46 - 8,35
      6,66 - 8,35

      luego en lugar de escribir ese condiciona emplea:
      =BUSCARV(C9;Hoja1!$A$1:$B$10;2;0)

      Respecto a tu cuestión.. en qué supuesto o condición tienes que incluir esa suma???

      Saludos

      Eliminar

Nota: solo los miembros de este blog pueden publicar comentarios.