............ Foro Excel
Si no lo has hecho aún: REGISTRATE!!!

Menú Excel Personalizado [aporte]

Ver el tema anterior Ver el tema siguiente Ir abajo

Menú Excel Personalizado [aporte]

Mensaje por P@li el Jue Nov 13, 2008 10:35 pm

Hola a todos,
Hoy les traigo un aporte que a mi me resulto interesante lograrlo, tenía que hacer un menú personalizado en una planilla de excel del trabajo, me costo, pero el resultado final cumplió con todas las expectativas, y superó incluso la imaginación de muchos que tienen conocimientos de excel (no VBA).




La idea de este aporte es mostrar de qué manera se puede crear un menú, con VBA, dentro del menú desplegable de opciones de celda (el que aparece al hacer clic derecho sobre un rango cualquiera), teniendo en cuenta algunos cosas que lo hacen bastante interesante, y ya que me costó casi un día completo de trabajo, quisiera compartirlo con los amigos del foro. Las consideraciones a tener en cuenta fueron:
Debe crearse al abrir el libro

Que el menú debe habilitese o deshabilitarse según determinadas propiedades de la celda seleccionada
En este caso
1 la celda corresponde a un rango determinado (la columna B)
2 la celda pertenece a una determinada hoja (Hoja1)
3 la hoja pertenece a un libro determinado (El actual)
4 el valor de la celda debe ser númerico mayor a 0
5 solo debe haber una celda seleccionada

Que a su vez el menú contenga una serie de botones, a los cuales se le asigna un procedimiento que va a ejecutarse al presionarlos, y según el botón elegido se realiza una acción distinta.

Por ultimo que el menu se elime al cerrar el libro

Para probarlo sola hay que hacer clic derecho sobre las celdas b21:b31
En todos los casos el menu va a estar habilitado, en el resto de las celdas no.
Si colocan un numero mayor a 0 en otra celda de la columna 2, tambien va a habilitarse en aquella automaticamente
En el resto de las columnas no


Como especie de bonus track, también explico como colocar un icono a cada botón.
En un módulo estándard
Código:
Dim eventos As clsEventosHoja
Dim listo As Boolean

Public Sub Procedimiento(ByVal accion As Integer)

    'de no hacer este paqueño chequeo
    'el codigo se ejecuta dos veces
    'en un bug aparentemente
    If listo Then
        listo = False
        Exit Sub
    Else
        listo = True
    End If
   
    'según la accion que se ha presionado vamos a ejecutar el codigo necesario para el caso
    'para ejemplificar un poco
    'voy a escribir la accion elegida en la celda derecha a la activa
    Select Case accion
        Case 1
        'código para el caso 1
        Range(eventos.celdaActiva)(1, 2) = "accion 1"
        Case 2
        'código para el caso 2
        Range(eventos.celdaActiva)(1, 2) = "accion 2"
        Case 3
        'código para el caso 3
        Range(eventos.celdaActiva)(1, 2) = "accion 3"
        Case 4
        'código para el caso 4
        Range(eventos.celdaActiva)(1, 2) = "accion 4"
        Case 5
        'código para el caso 5
        Range(eventos.celdaActiva)(1, 2) = "accion 5"
    End Select
   
   
    'muestro un mensaje
    'MsgBox "Ud. ha presionado el botón 'Accion " & accion & "'." & vbCrLf & "La celda activa es: " & Range(eventos.celdaActiva).Address
End Sub

Public Sub auto_open()
    listo = False
    'creo una instancia de la clase clsEventosHoja
    Set eventos = New clsEventosHoja
    'asigno la hoja con la cual va a trabajar la clase
    Set eventos.Hoja = Sheets("Hoja1")
    'asigno el rango disponible para el menu personalizado
    eventos.Rango = Sheets("Hoja1").Columns(2)
End Sub

Public Sub auto_close()
    'elimino la instancia de la clase clsEventosHoja
    Set eventos = Nothing
End Sub

En un módulo de Clase denominado "clsEventosHoja"

Código:
'defino la variable varHoja para captar los eventos de la hoja en cuestion
Dim WithEvents varHoja As Worksheet

'defino la variable local para saber cual es el rango en que debe encontrarse la celda
Dim varRango As String

'defino la variable que va a devolver la celda activa
Dim varCeldaActiva As String

'defino esta propiedad Set,
'para que desde el módulo se pueda asignar a nuestra variable local
'la hoja que queremos asignar
Public Property Set Hoja(newHoja As Worksheet)
    'seteo la variable local desde la hoja que se pasa desde el codigo
    Set varHoja = newHoja
End Property

Public Property Get celdaActiva() As String
    'seteo la propiedad qe se va a devolver con la variable local varCeldaActiva
    celdaActiva = varCeldaActiva
End Property

Public Property Let Rango(newRango As Range)
    'seteo la variable local del rango
    varRango = newRango.Address(True, True, xlA1, True)
End Property

Private Sub Class_Initialize()
    crearMenu
End Sub

Private Sub Class_Terminate()
    On Error Resume Next
    Application.CommandBars("Cell").FindControl(, , "Menu Personalizado").Delete
    On Error GoTo 0
End Sub

'capto el evento change
Private Sub varHoja_SelectionChange(ByVal Target As Range)
    'variable para guardar el resultado de la validacion
    Dim validacion As Boolean
   
    'destruyo la variable local de celda activa
    varCeldaActiva = ""
   
    If Not varRango = "" Then
        If Not Application.Intersect(Target, Range(varRango)) Is Nothing Then
            If IsNumeric(Target.Value) Then
                If Target.Value > 0 Then
                    validacion = True
                    'seteo la cariable local con la celda activa
                    varCeldaActiva = Target.Address(True, True, xlA1, True)
                End If
            End If
        End If
    End If

    'habilito el menu personalizado en caso de haberse validado la celda correctamente
    'de lo contrario la variable validacion va a ser False, y se va a deshabilitar el menu
    Application.CommandBars("Cell").FindControl(, , "Menu Personalizado").Enabled = validacion

       
End Sub

Public Sub crearMenu()
    Dim cb As CommandBar
    Dim cbMenu As CommandBarControl
    Dim cbButton As CommandBarButton
   
    'evito errores  y trato de eliminar algun posible menu llamado "Menu Personalizado"
    On Error Resume Next
    Application.CommandBars("Cell").FindControl(, , "Menu Personalizado").Delete
    On Error GoTo 0
   
    'cargo en la variable cb, el CommandBars Cell, que es la que corresponde al popup
    'que aparece al hacer clic derecho sobre una celda
    Set cb = Application.CommandBars("Cell")
   
    'creo un nuevo control en este popup
    Set cbMenu = cb.Controls.Add(msoControlPopup, , , 1, True)
   
    'lo hago llamar "Menu Personalizado"
    cbMenu.Caption = "Menu Personalizado"
    cbMenu.Tag = "Menu Personalizado"
   
    'creo en este Menu, cinco botones, los hago llamar Accion #, y le asigno un procedimiento
    'que debe estar alojado en un modulo
    'al que se le  pueden pasar parametros, segun las necesidades
    'el parametro usado en este caso es un número del 1 al 5
    'para diferenciar la accion elegida
    Set cbButton = cbMenu.Controls.Add(msoControlButton, , , 1, True)
    'defino el texto visible en el boton
    cbButton.Caption = "Acción 1"
    'cuando se presiona este boton,
    'el mismo llama automaticamente al procedimiento público alojado en un módulo
    'que se le asigna
    cbButton.OnAction = "modProcedimiento.Procedimiento(1)"

    'EN LAS PROXIMAS DOS INSTRUCCIONES LE ASIGNO A ESTE PRIMER BOTON
    'UN ICONO PERSONALIZADO
    'El shape icono es una imagen insertada por mi
    'en la hoja iconos
    'la imagen antes de cargarla desde Insertar -> Imagen -> Desde archivo...
    'era un archivo gif, de 16 x 16 pixeles
   
    'de esta manera copio la imagen del shape que contiene el icono que necesito
    Sheets("iconos").Shapes("icono1").CopyPicture
   
    'y así lo pego en el espacio de icono del boton
    cbButton.PasteFace
   
    'idem al anterior boton
    Set cbButton = cbMenu.Controls.Add(msoControlButton, , , 2, True)
    cbButton.Caption = "Acción 2"
    cbButton.OnAction = "modProcedimiento.Procedimiento(2)"
    Sheets("iconos").Shapes("icono2").CopyPicture
    cbButton.PasteFace
   
    Set cbButton = cbMenu.Controls.Add(msoControlButton, , , 3, True)
    cbButton.Caption = "Acción 3"
    cbButton.OnAction = "modProcedimiento.Procedimiento(3)"
    Sheets("iconos").Shapes("icono3").CopyPicture
    cbButton.PasteFace
   
    Set cbButton = cbMenu.Controls.Add(msoControlButton, , , 4, True)
    cbButton.Caption = "Acción 4"
    cbButton.OnAction = "modProcedimiento.Procedimiento(4)"
    Sheets("iconos").Shapes("icono4").CopyPicture
    cbButton.PasteFace
   
    Set cbButton = cbMenu.Controls.Add(msoControlButton, , , 5, True)
    cbButton.Caption = "Acción 5"
    cbButton.OnAction = "modProcedimiento.Procedimiento(5)"
    Sheets("iconos").Shapes("icono5").CopyPicture
    cbButton.PasteFace
   
 
   
    'elimino las isntancias creadas
    Set cb = Nothing
    Set cbMenu = Nothing
    Set cbButton = Nothing
End Sub

Espero que puedan sacarle provecho.
Saludos,


Última edición por GalileoGali el Miér Sep 01, 2010 7:35 pm, editado 2 veces (Razón : incluyo el codigo y explicaciones para facilitar la bùsqueda de los Motores)

P@li
Admin

Masculino Cantidad de envíos : 243
Edad : 33
Ciudad - Pais : Buenos Aires, Argentina
Version de Excel : Microsoft Excel 2002 (10.2614.2625)
Fecha de inscripción : 03/03/2008

Volver arriba Ir abajo

Re: Menú Excel Personalizado [aporte]

Mensaje por GalileoGali el Vie Nov 14, 2008 7:14 am

Excelente!!!!
Acabo de probarlo en Excel 2007, donde pareciera que ya nada fuera posible en materia de Menues (sin acudir a editores XML), y funciona perfectamente, con lo cual creo que para los que no quieren incursionar en XML y necesitan Barras de Herramientas para cualquier parte de la Hoja con un click, creo que la presente alternativa junto con la de armarlas sobre Userforms son las soluciones VBA, más adecuadas
Gracias P@li
(habrá que "digerir" tu còdigo ayudados por tus acotaciones)

_________________
GalileoGali
M.A.P. 2010-2013
Microsoft Active Professional
avatar
GalileoGali
Admin

Masculino Cantidad de envíos : 1962
Edad : 61
Ciudad - Pais : QUIROGA, Argentina
Version de Excel : 2000-2003-2007-2010
Fecha de inscripción : 24/01/2008

http://excelgali.mejorforo.net

Volver arriba Ir abajo

Re: Menú Excel Personalizado [aporte]

Mensaje por P@li el Vie Nov 14, 2008 1:24 pm

Gracias Gali!!!
Por la edición y el comentario!!

Saludos,
P@li

P@li
Admin

Masculino Cantidad de envíos : 243
Edad : 33
Ciudad - Pais : Buenos Aires, Argentina
Version de Excel : Microsoft Excel 2002 (10.2614.2625)
Fecha de inscripción : 03/03/2008

Volver arriba Ir abajo

Re: Menú Excel Personalizado [aporte]

Mensaje por Hugo R.González B. el Sáb Nov 22, 2008 11:45 am

Hola P@li:

Felicitaciones por el menu, aunque no aporto mayor cosa por mis nulos conocimientos en excel, veo con admiración como hacen para ver fáciles las cosas.

Trataré de entenderlo y más adelante pues comentare al respecto en medida de mi entendimiento.

Saludos también al profe. Mis respetos a ambos..
avatar
Hugo R.González B.

Masculino Cantidad de envíos : 16
Edad : 59
Ciudad - Pais : Guatemala - Chinautla
Version de Excel : Excel 2003
Fecha de inscripción : 14/04/2008

http://peritocontador.wordpress.com

Volver arriba Ir abajo

Re: Menú Excel Personalizado [aporte]

Mensaje por GalileoGali el Sáb Nov 22, 2008 1:12 pm

Que tal hugo, como anda todo por eses tierras guatemaltecas?
Hasta pronto!!!

_________________
GalileoGali
M.A.P. 2010-2013
Microsoft Active Professional
avatar
GalileoGali
Admin

Masculino Cantidad de envíos : 1962
Edad : 61
Ciudad - Pais : QUIROGA, Argentina
Version de Excel : 2000-2003-2007-2010
Fecha de inscripción : 24/01/2008

http://excelgali.mejorforo.net

Volver arriba Ir abajo

Re: Menú Excel Personalizado [aporte]

Mensaje por Hugo R.González B. el Sáb Nov 22, 2008 1:45 pm

Hola Profe:

Siempre tan oportuno en las respuestas.

Pues te comento que por este lado, estamos sufriendo de varias heladas que pronostican los laboratorios de metereología; y que según dicen, pues sera una temporada fría como la que nunca hemos pasado; se pronostican las mas bajas.

Aparte que estamos a la espectativa a que este 3/12/08 se abra el 6o. acuario mas grande del mundo con mas de 38 especies marinas y primero en americalatina.
Puedes ver mas información aqui:
[Tienes que estar registrado y conectado para ver este vínculo]

Respecto a la politica pues cada día vamos de mal en peor a parte que la violencia esta imparable.

Espero que por tu país todo se encuentre bien.

Saludos
avatar
Hugo R.González B.

Masculino Cantidad de envíos : 16
Edad : 59
Ciudad - Pais : Guatemala - Chinautla
Version de Excel : Excel 2003
Fecha de inscripción : 14/04/2008

http://peritocontador.wordpress.com

Volver arriba Ir abajo

Re: Menú Excel Personalizado [aporte]

Mensaje por P@li el Jue Dic 04, 2008 6:25 pm

Hola Hugo,

Muchas gracias por el comentario, y si llegaras a no entender, por favor te pido que realices el comentario, y así enriquecemos este espacio que se alimenta de preguntas y soluciones.

Hago extensivo el pedido a todos los foristas.

Saludos.

P@li
Admin

Masculino Cantidad de envíos : 243
Edad : 33
Ciudad - Pais : Buenos Aires, Argentina
Version de Excel : Microsoft Excel 2002 (10.2614.2625)
Fecha de inscripción : 03/03/2008

Volver arriba Ir abajo

Re: Menú Excel Personalizado [aporte]

Mensaje por tapiarodrigo el Miér Ago 26, 2009 1:38 pm

Gracias

tapiarodrigo

Masculino Cantidad de envíos : 3
Edad : 45
Ciudad - Pais : Santiago, Chile
Version de Excel : 2003-2007
Fecha de inscripción : 24/08/2009

Volver arriba Ir abajo

Re: Menú Excel Personalizado [aporte]

Mensaje por yeli el Miér Sep 01, 2010 2:21 pm

hola pablo.. como andas, espero que bien =)
podrias subir el archivo a otro servidor o enviarmelo por correo, xq no puedo bajarlo. je
gracias =)

yeli

Femenino Cantidad de envíos : 12
Edad : 30
Ciudad - Pais : argentina
Version de Excel : 2007
Fecha de inscripción : 04/07/2010

Volver arriba Ir abajo

Re: Menú Excel Personalizado [aporte]

Mensaje por GalileoGali el Miér Sep 01, 2010 7:36 pm

te dejo un nuevo link


_________________
GalileoGali
M.A.P. 2010-2013
Microsoft Active Professional
avatar
GalileoGali
Admin

Masculino Cantidad de envíos : 1962
Edad : 61
Ciudad - Pais : QUIROGA, Argentina
Version de Excel : 2000-2003-2007-2010
Fecha de inscripción : 24/01/2008

http://excelgali.mejorforo.net

Volver arriba Ir abajo

Re: Menú Excel Personalizado [aporte]

Mensaje por P@li el Miér Sep 01, 2010 8:36 pm

hola Gali, gracias por responder en mi ausencia! un abrazo!!!

P@li
Admin

Masculino Cantidad de envíos : 243
Edad : 33
Ciudad - Pais : Buenos Aires, Argentina
Version de Excel : Microsoft Excel 2002 (10.2614.2625)
Fecha de inscripción : 03/03/2008

Volver arriba Ir abajo

Re: Menú Excel Personalizado [aporte]

Mensaje por GalileoGali el Miér Sep 01, 2010 9:15 pm

Otro para vos...

_________________
GalileoGali
M.A.P. 2010-2013
Microsoft Active Professional
avatar
GalileoGali
Admin

Masculino Cantidad de envíos : 1962
Edad : 61
Ciudad - Pais : QUIROGA, Argentina
Version de Excel : 2000-2003-2007-2010
Fecha de inscripción : 24/01/2008

http://excelgali.mejorforo.net

Volver arriba Ir abajo

Re: Menú Excel Personalizado [aporte]

Mensaje por yeli el Jue Sep 02, 2010 1:32 am

hola gracias gali y pabli.. =)

ahora lo bajo, y despues comento..

suerte,

yeli

Femenino Cantidad de envíos : 12
Edad : 30
Ciudad - Pais : argentina
Version de Excel : 2007
Fecha de inscripción : 04/07/2010

Volver arriba Ir abajo

Link de descarga no me funciona

Mensaje por MONTESCO el Jue Mar 10, 2016 9:59 am

Buenos días, me gustaría tener el archivo de ejemplo, pero no lo he podido descargar, no se si el link este desactualizado. Muchas gracias.

MONTESCO

Masculino Cantidad de envíos : 1
Edad : 39
Ciudad - Pais : Bogota - Colombia
Version de Excel : 2007-2010-2013
Fecha de inscripción : 10/03/2016

Volver arriba Ir abajo

Re: Menú Excel Personalizado [aporte]

Mensaje por johanmoreno el Mar Mayo 03, 2016 11:41 am

Hola el link ya no funciona gracias [Tienes que estar registrado y conectado para ver este vínculo]

johanmoreno

Cantidad de envíos : 5
Fecha de inscripción : 29/04/2008

Volver arriba Ir abajo

Re: Menú Excel Personalizado [aporte]

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


 
Permisos de este foro:
No puedes responder a temas en este foro.