Hace ya tiempo atrás vimos la forma de agregar barras de herramientas mediante macros, en esta entrada.
El objetivo principal, al margen de aprender sobre el manejo de los distintos objetos que componen Excel, era el de imprimirle a nuestros proyectos profesionalismo, impresionando con la presentación de herramientas que, usualmente, los usuarios no están acostumbrados a ver en trabajos personales. Si usan macros... lo mas común es que el 95% de esas personas hayan presionado un boton o una autoforma para "dispararla".
Y un proyecto que tenga características especiales es distinto, dándonos mas prestigio como programadores, haciendo a la vez mas "cotizables" nuestros trabajos. ¿Que tal si ahora vemos la manera de que nuestras macros se activen mediante Menús (como Archivo, Edición, Datos, etc) creados desde cero por nosotros?
Empecemos.
La barra de menús... ¿tradicional? En parte sí, pero el 5to menú es bien nuestro, creado a partir de código VBA
[+/-] Ver el resto / OcultarPor mas que algunos amigos, compadres, camaradas, correligionarios, compañeros, contertulios y colegas me insistan en que esto agrega código "de mas" a nuestros proyectos.... es indudable que presentan un impacto visual importante. Nuestro proyecto es capaz de modificar la estructura del mismo Excel, dando muy buena impresión a los usuarios finales, a la par de brindarles una interfaz amigable y muy conocida.
Recordemos: para trabajar con los menús debemos actuar sobre el objeto Application, es decir, sobre Excel mismo. Cualquier modificación que hagamos sobre él se verá reflejada en todos los libros, por que Excel es contenedor de los libros... los libros contienen hojas.... las hojas contienen celdas, haciendo que debamos respetar esa jerarquía y (en la gran mayoría de los casos) tengamos de deshacer lo realizado. Ejemplo: creo un menú personalizado al abrir el libro y lo destruyo al irme. Así me aseguro que todo vuelva a ser igual al momento previo de la ejecución de mis macros.
Luego de la lección de vida del párrafo anterior, continuamos. Esa "jerarquía" explicada se aplica también a los Menús. Primero creo el objeto Menú, para luego agregarle Items y SubItems (estos últimos son opcionales). Cada Item/SubItem tiene sus propiedades, métodos y eventos: título, imagen, acción que realizarán (que macro le asignamos), Index, Id, Visible, etc, etc. Comenzaremos con las mas sencillas y comunes, para en otras entradas ir "complicando" las cosas.
El código que se muestra a continuación crea el menú de la primer imagen. Les parecerá extenso, pero si observan se encuentra dividido en "bloques", en los cuales se repiten practicamente las mismas acciones:
Public Sub MenuPersonalizado() 'definimos las variables. Primero el menú, luego 'los items que tendrá el mismo y por ultimo 'los subitems Dim MyMenu As CommandBarPopup Dim ItemMyMenu As CommandBarControl Dim SubItem As CommandBarButton 'si nuestro menú fué creado con anterioridad, lo borramos, 'con un procedimiento creado a esos efectos: MenuEraser 'XXXX doy vida al menú "principal" XXXX Set MyMenu = Application.CommandBars("Worksheet Menu Bar"). _ Controls.Add(Type:=msoControlPopup, Before:=5, Temporary:=True) 'le damos un nombre propio para identificarlo correctamente 'y saber de que se trata. El signo & antepuesto a una letra 'es para que dicho caracter aparezca subrayado y podamos ac 'ceder a él con Alt + la letra que sea: MyMenu.Caption = "Blog de E&xcel" 'XXXX aqui creamos los items y subitems XXXX Set ItemMyMenu = MyMenu.Controls.Add(Type:=msoControlPopup) With ItemMyMenu .Caption = "Mis consultas" End With Set SubItem = ItemMyMenu.Controls.Add(Type:=msoControlButton) With SubItem 'título, codigo de la imagen que tendrá y la acción 'que se ejecutará al hacer click sobre él .Caption = "&Access" .FaceId = 581 .OnAction = "ImportarAccess" End With Set SubItem = ItemMyMenu.Controls.Add(Type:=msoControlButton) With SubItem .Caption = "&Web" .FaceId = 610 .OnAction = "ImportarWeb" End With Set SubItem = ItemMyMenu.Controls.Add(Type:=msoControlButton) With SubItem .Caption = "T&exto / Csv" .FaceId = 7 .OnAction = "ImportarTXT" End With 'XXXX item XXXX Set ItemMyMenu = MyMenu.Controls.Add(Type:=msoControlPopup) With ItemMyMenu .Caption = "&Hojas" End With Set SubItem = ItemMyMenu.Controls.Add(Type:=msoControlButton) With SubItem .Caption = "&ProtegerTodo" .FaceId = 893 .OnAction = "Proteccion" End With Set SubItem = ItemMyMenu.Controls.Add(Type:=msoControlButton) With SubItem .Caption = "&DesprotegerTodo" .FaceId = 894 .OnAction = "Desproteccion" End With 'XXXX item XXXX Set ItemMyMenu = MyMenu.Controls.Add(Type:=msoControlButton) With ItemMyMenu .Caption = "&Ver &Blog" .FaceId = 682 .OnAction = "Visualizarblog" .BeginGroup = True End With 'XXXX item XXXX Set ItemMyMenu = MyMenu.Controls.Add(Type:=msoControlButton) With ItemMyMenu .Caption = "&Enviar x Mail" .FaceId = 777 '.OnAction = ver la entrada sobre mails y adaptarla a 'este menú. estoy vago y lleva tiempo. =) .BeginGroup = True End With 'XXXX item XXXX Set ItemMyMenu = MyMenu.Controls.Add(Type:=msoControlButton) With ItemMyMenu .Caption = "&CerrarTodo" .FaceId = 138 .OnAction = "CierreTotal" .BeginGroup = True End With End Sub
Observarán que cada item que acepta un "click" posee el método OnAction, que no es otra cosa que la acción que se llevará a cabo al clickear sobre el: ahí debemos poner el nombre de la macro a ejecutar.
Por ejemplo: estas líneas de código van para nuestros subitems "ProtegerTodo" y "DesprotegerTodo":
Public Sub Proteccion()
Dim H As Worksheet For Each H In ActiveWorkbook.Sheets H.Protect Password:="3xc3l" Next H Set H = Nothing End Sub Public Sub Desproteccion() Dim H As Worksheet For Each H In ActiveWorkbook.Sheets H.Unprotect Password:="3xc3l" Next H Set H = Nothing End Sub
Cada vez que hagamos click sobre uno u otro, se protegerán o desprotegerán todas las hojas del libro. Y así debemos programar cada uno de los Sub mencionados en OnAction, para cada objeto.
Ahora una de las cuestiones principales es colocar los procedimientos en un lugar apropiado: al abrir el libro se creará el menú y al cerrarlo lo eliminaremos:
dentro de los eventos Open & Before_Close incorporamos el código respectivo
En la imagen de arriba apreciarán el Sub MenuEraser, quien será el encargado de destruir el menú antes de cerrar el libro activo. Es una simple línea de código:
indicamos que actuaremos sobre el Menu Bar, eliminando (delete) el control "Blog de Excel"
Hemos visto una herramienta de lujo para incorporar a nuestros proyectos. Modularizando un poco este código (cosa que omití para que sea mas sencillo de comprender) podemos crear una "plantilla" que sirva para distintas ocasiones. Pero lo fundamental es saber sobre su existencia, para darle un toque especial al proyecto. Les dejo el link al archivo.
En mi próxima entrada veremos como agregar controles adicionales a esos menús.
Suerte.
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Etiquetas
Macros
Etiquetas:
Macros
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Comentarios
Publicar un comentario