Ejecutar macros desde una lista desplegable en cada hoja

En un libro tengo varias hojas Planning, Calendario, Agenda y Dias Trabajo, en cada una de ellas tengo unos botones con macros, que hacen distintas funciones, entre ellas pasar de una hoja a otra. Con el fin de minimizar un poco el contenido de cada hoja y eliminar los botones para hacerlo más estético y más profesional he pensado en agrupar en cada hoja sus macros en una lista desplegable de forma que cuando seleccione una macro se ejecute. He probado a hacer tanto con validación de datos como intentando asignarle las macros directamente y no me funciona.

1 Respuesta

Respuesta
1

H o l a:

Si las macros son las mismas en todas las hojas, y vas a poner, por ejemplo en la celda C3 de cada hoja la validación de datos con la lista de las macros, entonces agrega el siguiente evento en ThisWirkbook

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
'Por.Dante Amor
    Select Case Sh.Name
        Case "Hoja4", "Hoja5", "Hoja6"
            If Not Intersect(Target, Range("C3")) Is Nothing Then
                Select Case Target
                    Case "Imprimir": Call MacroImprimir
                    Case "Resumen": Call MacroProceso
                    Case "Copiar": Call MacroCopiar
                End Select
            End If
    End Select
End Sub

En esta línea de la macro, pon los nombres de las hojas que tendrán la lista de validación con las macros.

Case "Hoja4", "Hoja5", "Hoja6"

Cambia "C3" por la celda donde tienes la lista de validación.

Los nombres de las macros que te puse son ejemplos, deberás reemplazarlos por los nombres de tus macros.

Instrucciones para poner la macro en los eventos ThisWorkbook

  1. Abre tu libro de excel
  2. Para abrir Vba-macros y poder pegar la macro, Presiona Alt + F11
  3. Del lado izquierdo dice: VBAProject, abajo dale doble click a ThisWorkbook
  4. Del lado derecho copia la macro


Ahora, si las macros de cada hoja son diferentes, entonces deberás agregar en los eventos de cada hoja una macro como esta:

Private Sub Worksheet_Change(ByVal Target As Range)
'Por.Dante Amor
    If Not Intersect(Target, Range("C3")) Is Nothing Then
        Select Case Target
            Case "Imprimir": Call MacroImprimir
            Case "Resumen": Call MacroProceso
            Case "Copiar": Call MacroCopiar
        End Select
    End If
End Sub

De igual manera, deberás cambiar la celda C3 por la celda en donde tienes la lista de validación y los nombres de las macros.

Sigue las Instrucciones para poner la macro en los eventos de worksheet

  1. Abre tu libro de excel
  2. Para abrir Vba-macros y poder pegar la macro, Presiona Alt + F11
  3. Del lado izquierdo dice: VBAProject, abajo dale doble click a worksheet(tu hoja)
  4. Del lado derecho copia la macro


Avísame cualquier duda que tengas.


:)
S aludos. D a n t e A m o r. Recuerda valorar la respuesta. G r a c i a s
;) 

Tengo macros comunes en todas las hojas y luego macros especificas en cada hoja. También tengo otra consulta, en el ThisWorkbook del libro tengo este código que no se como combinar con el código que tu me pones. Muchas gracias.

Disculpa no te he puesto los códigos el primero lo tengo en el worksheet de la hoja planning y el segundo necesito ponerlo en el mismo sitio pero, verdad, no se como integrar ambos códigos. Gracias. Un saludo.

Private Sub Worksheet_Change(ByVal Target As Range)
'se controla lo ingresado en filas pares en rango C6:AR30
If Intersect(Target, Range("C16:AR26,C30:AR40")) Is Nothing Then Exit Sub
If Target.Row Mod 2 <> 0 Then Exit Sub
'si se modifica un rango o si se borra contenido no se ejecuta
If Target.Count > 1 Then Exit Sub
If Target.Value = "" Then Exit Sub
'tampoco se ejecuta si 'arriba'no hay nro de día
If Target.Offset(-1, 0) = "" Then Exit Sub
Dim busco
'se pasa fecha (fila anterior) y texto según valor de target. Tabla de conversión en col M
filx = Sheets("DIASTRABAJO").Range("A" & Rows.Count).End(xlUp).Row + 1
Sheets("DIASTRABAJO").Range("A" & filx) = Target.Offset(-1, 0)
Set busco = Sheets("REFE").Range("A:A").Find(Target.Value, LookIn:=xlValues, lookat:=xlWhole)
If Not busco Is Nothing Then
    Sheets("DIASTRABAJO").Range("B" & filx) = busco.Offset(0, 1)
End If
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
'Por.Dante Amor
    If Not Intersect(Target, Range("E1")) Is Nothing Then
        Select Case Target
            Case "AGENDA": Call Módulo5.AGENDA
            Case "DIASTRABAJO": Call Módulo5.DIASTRABAJO
            Case "CALENDARIO": Call Módulo5.CALENDARIO
        End Select
    End If
End Sub

Te anexo la macro integrada

Private Sub Worksheet_Change(ByVal Target As Range)
'Por.Dante Amor
    If Target.Count > 1 Then Exit Sub
    If Target.Value = "" Then Exit Sub
    '
    If Not Intersect(Target, Range("E1")) Is Nothing Then
        Select Case Target
            Case "AGENDA": Call Módulo5.AGENDA
            Case "DIASTRABAJO": Call Módulo5.DIASTRABAJO
            Case "CALENDARIO": Call Módulo5.CALENDARIO
        End Select
        Exit Sub
    End If
    '
    'se controla lo ingresado en filas pares en rango C6:AR30
    If Intersect(Target, Range("C16:AR26,C30:AR40")) Is Nothing Then Exit Sub
    If Target.Row Mod 2 <> 0 Then Exit Sub
    'si se modifica un rango o si se borra contenido no se ejecuta
    'tampoco se ejecuta si 'arriba'no hay nro de día
    If Target.Offset(-1, 0) = "" Then Exit Sub
    Dim busco
    'se pasa fecha (fila anterior) y texto según valor de target. Tabla de conversión en col M
    filx = Sheets("DIASTRABAJO").Range("A" & Rows.Count).End(xlUp).Row + 1
    Sheets("DIASTRABAJO").Range("A" & filx) = Target.Offset(-1, 0)
    Set busco = Sheets("REFE").Range("A:A").Find(Target.Value, LookIn:=xlValues, lookat:=xlWhole)
    If Not busco Is Nothing Then
        Sheets("DIASTRABAJO").Range("B" & filx) = busco.Offset(0, 1)
    End If
End Sub

Prueba y me comentas.


:)
S aludos. D a n t e A m o r. Recuerda valorar la respuesta. G r a c i a s
;) 

Perdona que te moleste, pero el código no me funciona, no da ningún mensaje simplemente no hace nada.

No es ninguna molestia.

De aquí no nos vamos hasta que te funcione.

En la hoja donde estás poniendo la macro, según entiendo, en la celda E1 tienes una lista de validación, en dicha lista debes tener 3 nombres:

"agenda", "diastrabajo" y "calendario"

Los nombres en las celdas deben estar escritos de igual manera que lo pusiste en la macro, incluyendo espacios y mayúsculas.

            Case "AGENDA": Call Módulo5.AGENDA
            Case "DIASTRABAJO": Call Módulo5.DIASTRABAJO
            Case "CALENDARIO": Call Módulo5.CALENDARIO

Si eliges "AGENDA" se debe ejecutar la macro Agenda.

También revisa que tengas habilitadas las macros.


Si ya revisaste la hoja y los nombres, las macros, y no te funciona, envíame tu archivo con todas las macros para revisarlo.

Mi correo [email protected]

En el asunto del correo escribe tu nombre de usuario “juan carlos bp” y el título de esta pregunta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas