Beruflich Dokumente
Kultur Dokumente
CAPÍTULO 111
Índice de contenido
INTRO 11: UN POCO SOBRE LAS COMMANDBARS..................................................................2
UNA BREVÍSIMA SEGUNDA INTRODUCCIÓN............................................................................2
OPERATIVA EN ABSTRACTO..........................................................................................................2
OPERATIVA MÁS ESPECÍFICA, PERO AÚN EN ABSTRACTO..............................................3
ELEMENTOS QUE VAMOS A NECESITAR....................................................................................3
CREANDO POCO A POCO NUESTRA COMMANDBAR..............................................................4
BOTÓN DE COMANDO................................................................................................................4
DROPDOWN..................................................................................................................................5
COMBOBOX..................................................................................................................................7
MENÚ EMERGENTE..................................................................................................................10
LO QUE FALTA PARA QUE “EL INVENTO FUNCIONE”...........................................................12
SI QUEREMOS QUE NUESTRA COMMANDBAR SE CARGUE AL INICIO.......................12
SI QUEREMOS QUE NUESTRA COMMANDBAR SE CARGUE CON UN BOTÓN............12
PARA FINALIZAR ESTE CAPÍTULO.............................................................................................12
1
Visítame en http://neckkito.siliconproject.com.ar
INTRO 11: UN POCO SOBRE LAS
COMMANDBARS
Aunque alguien pueda pensar: ¿y qué tiene esto que ver
con el ribbon? me he decidido a escribir este capítulo
porque le veo cierta similitud al tema. El ribbon nos permite
construirnos un conjunto de menús con opciones varias
para realizar acciones que queremos; las commandbars nos
permiten hacer algo similar, (con sus más y sus menos)
sólo que a través de código VBA.
Y dado que, como comentábamos en el capítulo anterior, hemos aprendido algo de las
commandbars para poder construir nuestros menús contextuales, me he dicho a mí mismo:
¿por qué no explicar también la construcción de un complemento (ya veréis más adelante
porque digo esto)?
Así que, camina caminarás, aquí tenéis un par de pinceladas de cómo manejar las
commandbars.
No voy a entrar “hasta en el último detalle” en este capítulo. Simplemente, lo que intentaré es
explicaros algunas cosas básicas de cómo construirnos estos diferentes elementos para que
“se os abra el apetito”. Si consideráis que pueden ser útiles para vosotros al menos ya tendréis
una base para poder buscar información en otras fuentes y que, como mínimo (espero), podáis
entender “mejor” las diferentes explicaciones o ejemplos que encontréis “por el mundo de
Matrix”
OPERATIVA EN ABSTRACTO
La operativa, genérica y en abstracto, sería la siguiente:
• Creamos una macro “Autoexec” que nos cargue las commandbars que hemos definido
en ese módulo que os comentaba.
Como nota a lo anterior comentaros que no debemos confundir la mecánica del ribbon con XML
con la mecánica de las commandbars con VBA. ¿Qué significa esto? Pues que, como sabréis (si
habéis seguido el curso entero hasta aquí), con el ribbon necesitábamos reiniciar la aplicación
cada vez que modificábamos el código XML. Con las commandbars eso no es necesario.
Por ejemplo, yo os he expuesto que utilizaríamos una macro “Autoexec” para cargar nuestras
commandbars, dado que lo “lógico” (o no) es que nuestra barra de comandos esté disponible
para el usuario (que no tiene ni idea sobre Access) desde el momento en que se inicia la
2
Visítame en http://neckkito.siliconproject.com.ar
aplicación.
• Creamos, a continuación, uno o varios objetos que representarán los diferentes tipos de
controles que queremos que tenga nuestra commandbar
• Añadimos, a cada objeto creado en el punto anterior, los diferentes comandos que
necesitemos y sus características, respetando lógicamente la tipología que hemos
asignado al objeto.
Recordad que debemos tener registrada la referencia “Microsoft Office x.y Object Library”
3
Visítame en http://neckkito.siliconproject.com.ar
CREANDO POCO A POCO NUESTRA
COMMANDBAR
Vamos a ir creando poco a poco nuestra commandbar.
Empezaremos por la introducción de un botón de comando
y la iremos ampliando.
Ello significa que cada vez nuestra función irá creciendo “un
poquito” en cada uno de los subepígrafes que veremos a
continuación.
BOTÓN DE COMANDO
Vamos a crearnos un módulo estándar que llamaremos mdlCommandBars. Para empezar
veamos el código que vamos a necesitar, y que escribiremos en dicho módulo:
…
Public Function miBarraDeComandos()
'Declaramos las variables
'Primero, un objeto commandbar
Dim laCommandBar As CommandBar
'Segundo, un objeto botón de commandbar
Dim miComBarBoton As CommandBarButton
'Recorremos la colección de commandbars de la aplicación
'hasta encontrar la nuestra.
'Cuando la encontramos la eliminamos
'Esto es por si ya estuviera cargada. La cargaremos más adelante.
For Each laCommandBar In Application.CommandBars
If laCommandBar.Name = "Controles Neckkito" Then
laCommandBar.Delete
End If
Next laCommandBar
'Ahora sí, creamos nuestra commandbar
Set laCommandBar = Application.CommandBars.Add("Controles Neckkito")
'En los controles de nuestra commandbar...
With laCommandBar.Controls
'Creamos y añadimos nuestro botón
Set miComBarBoton = .Add(msoControlButton)
'Configuramos sus propiedades
With miComBarBoton
.Caption = "Cerrar formulario"
.FaceId = 11268
.Style = msoButtonIconAndCaption
.TooltipText = "Con esto cerramos el formulario activo"
.OnAction = "subCierraForm"
End With
End With
'Hacemos visible la commandbar
laCommandBar.Visible = True
End Function
…
Si os fijáis lo que hacemos es, con un bloque With... End With, configurar “de una tacada” las
propiedades de nuestro botón. En esas propiedades podéis ver que encontramos la propiedad
OnAction, y que a dicha propiedad le he asignado el nombre de un procedimiento.
También fijaos que NO he programado esta barra de comandos como elemento temporal. Eso
significa que una vez se cargue ya se “queda fija” en nuestra base de datos.
4
Visítame en http://neckkito.siliconproject.com.ar
¿Qué pasaría si queremos que “desaparezca”? Pues,
evidentemente, lo primero que deberíamos hacer es
eliminar su carga en la macro Autoexec, y, después,
definirla como temporal (y ejecutar al menos una vez el
código para que Access “lea” que la barra es sólo temporal).
Para ello deberíamos modificar la línea de código:
por
Pues bien, sólo nos quedaría programar lo que pasaría al pulsar el botón. Y este es el
procedimiento que he escrito a continuación de la anterior función:
…
Public Sub subCierraForm()
Dim nombreForm As String
nombreForm = Screen.ActiveForm.Name
If nombreForm = "FMenu" Then
'No hago nada
Else
'Cierro el form activo
DoCmd.Close acForm, nombreForm
End If
End Sub
…
DROPDOWN
La estructura de este nuevo elemento sería, en abstracto:
• Creo su instancia
Nuestro código quedaría modificado así (os marco en negrita las nuevas líneas añadidas):
…
Public Function miBarraDeComandos()
'Declaramos las variables
'Primero, un objeto commandbar
Dim laCommandBar As CommandBar
'Segundo, un objeto botón de commandbar
Dim miComBarBoton As CommandBarButton
5
Visítame en http://neckkito.siliconproject.com.ar
'Tercero, un objeto dropdown/combobox
Dim miComBarCbo As CommandBarComboBox de commandbar
'Recorremos la colección de commandbars de la aplicación
'hasta encontrar la nuestra.
'Cuando la encontramos la eliminamos
'Esto es por si ya estuviera cargada. La cargaremos más adelante.
For Each laCommandBar In Application.CommandBars
If laCommandBar.Name = "Controles Neckkito" Then
laCommandBar.Delete
End If
Next laCommandBar
'Ahora sí, creamos nuestra commandbar
Set laCommandBar = Application.CommandBars.Add("Controles
Neckkito")
'En los controles de nuestra commandbar...
With laCommandBar.Controls
'Creamos y añadimos nuestro botón
Set miComBarBoton = .Add(msoControlButton)
'Configuramos sus propiedades
With miComBarBoton
.Caption = "Cerrar formulario"
.FaceId = 11268
.Style = msoButtonIconAndCaption
.TooltipText = "Con esto cerramos el formulario activo"
.OnAction = "subCierraForm"
End With
'Creamos y añadimos nuestro dropdown
Set miComBarCbo = .Add(msoControlComboBox)
With miComBarCbo
.AddItem "VIP"
.AddItem "No VIP"
.AddItem "Todos"
.Style = msoComboLabel
.Caption = "VIP?"
.TooltipText = "Seleccione el tipo de socio a filtrar"
.OnAction = "subCboDDVip"
End With
End With
'Hacemos visible la commandbar
laCommandBar.Visible = True
End Function
…
Como vemos, añadimos una instancia del objeto dropdown utilizando la constante
“msoControlCombobox”, y le configuramos algunas de las propiedades propias (valga la
“rebuznancia”) de ese control
Como también podréis apreciar, hemos determinado que al seleccionar un valor se nos ejecute
el procedimiento “subCboDDVip” a través de la propiedad OnAction. Os indico a continuación
cómo podría ser el código para realizar el filtrado de datos:
…
Public Sub subCboDDVip()
'Declaramos las variables
Dim tipoSocio As String
Dim miFiltro As String
Dim hayFiltro As Boolean
6
Visítame en http://neckkito.siliconproject.com.ar
'Inicializamos hayFiltro suponiendo que se va a filtrar
hayFiltro = True
'Cogemos el valor que se haya seleccionado en el dropdown
tipoSocio = CommandBars("Controles Neckkito").Controls(2).Text
'Comprobamos que el formulario activo sea FSocios
If Screen.ActiveForm.Name = "FSocios" Then
'Examinamos los casos posibles
Select Case tipoSocio
Case "VIP"
miFiltro = "[VIP]=True"
Case "No VIP"
miFiltro = "[VIP]=False"
Case "Todos"
'Significa que no hay filtro
hayFiltro = False
End Select
'Si no hay filtro quitamos el filtro del form (por si lo hubiera)
If hayFiltro = False Then
Screen.ActiveForm.FilterOn = False
Else
'Si lo hay lo construimos y lo aplicamos
With Screen.ActiveForm
.Filter = miFiltro
.FilterOn = True
End With
End If
End If
End Sub
…
Fijaos que para poder coger el valor que se haya seleccionado utilizo la línea:
Esa línea es “una especie de” ruta: de la commandbar “Controles Neckkito”, de su control
identificado como 2, cógeme el texto seleccionado.
Ese número 2 aparece porque ese es el orden que hemos establecido en el código de la
función: 1-Botón de comando; 2-Dropdown
COMBOBOX
Al igual que comentábamos en capítulos anteriores cuando, a través de XML, creábamos un
dropdown y un combobox, ambos controles son “como hermanos”. Es por ello que las
diferencias son mínimas.
Veamos qué modificaciones debemos realizar en nuestro código para añadir un combobox en
nuestro menú.
• Declaro un objeto commandBar.Control (en este caso hay un pequeño matiz que
explicaré un poco más adelante)
• Creo su instancia
Nuestro código quedaría modificado así (os marco en negrita las nuevas líneas añadidas):
7
Visítame en http://neckkito.siliconproject.com.ar
…
Public Function miBarraDeComandos()
'Declaramos las variables
'Primero, un objeto commandbar
Dim laCommandBar As CommandBar
'Segundo, un objeto botón de commandbar
Dim miComBarBoton As CommandBarButton
'Tercero, un objeto dropdown/combobox de commandbar
Dim miComBarCbo As CommandBarComboBox
'Recorremos la colección de commandbars de la aplicación
'hasta encontrar la nuestra.
'Cuando la encontramos la eliminamos
'Esto es por si ya estuviera cargada. La cargaremos más adelante.
For Each laCommandBar In Application.CommandBars
If laCommandBar.Name = "Controles Neckkito" Then
laCommandBar.Delete
End If
Next laCommandBar
'Ahora sí, creamos nuestra commandbar
Set laCommandBar = Application.CommandBars.Add("Controles Neckkito")
'En los controles de nuestra commandbar...
With laCommandBar.Controls
'Creamos y añadimos nuestro botón
Set miComBarBoton = .Add(msoControlButton)
'Configuramos sus propiedades
With miComBarBoton
.Caption = "Cerrar formulario"
.FaceId = 11268
.Style = msoButtonIconAndCaption
.TooltipText = "Con esto cerramos el formulario activo"
.OnAction = "subCierraForm"
End With
'Creamos y añadimos nuestro dropdown
Set miComBarCbo = .Add(msoControlComboBox)
With miComBarCbo
.AddItem "VIP"
.AddItem "No VIP"
.AddItem "Todos"
.Style = msoComboLabel
.Caption = "VIP?"
.TooltipText = "Seleccione el tipo de socio a filtrar"
.OnAction = "subCboDDVip"
End With
'Creamos y añadimos nuestro combobox
Set miComBarCbo = .Add(msoControlComboBox)
'Configuramos sus propiedades
With miComBarCbo
.AddItem "0-5"
.AddItem "0-10"
.AddItem "0-20"
.AddItem "Todos"
.Text = "Antigüedad:"
.Caption = "cboAntigüedad"
.Style = msoComboNormal
.TooltipText = "Seleccione la antigüedad a filtrar"
.OnAction = "subCboAntiguo"
End With
End With
'Hacemos visible la commandbar
laCommandBar.Visible = True
End Function
…
8
Visítame en http://neckkito.siliconproject.com.ar
que también había marcado en negrita en el epígrafe de explicación del dropdown.
El resultado sería:
…
Public Sub subCboAntiguo()
'Declaramos las variables
Dim antigElegida As String
Dim miFiltro As String
Dim fechaFiltro As Date
Dim hayFiltro As Boolean
'Inicializamos hayFiltro suponiendo que se va a filtrar
hayFiltro = True
'Cogemos el valor que se haya seleccionado en el combo
antigElegida = CommandBars("Controles Neckkito").Controls(3).Text
'Comprobamos que el formulario activo sea FSocios
If Screen.ActiveForm.Name = "FSocios" Then
'Examinamos los casos posibles
Select Case antigElegida
Case "0-5"
fechaFiltro = Date - (365 * 5)
Case "0-10"
fechaFiltro = Date - (365 * 10)
Case "0-20"
fechaFiltro = Date - (365 * 20)
Case "Todos"
'Significa que no hay filtro
hayFiltro = False
End Select
'Si no hay filtro quitamos el filtro del form (por si lo hubiera)
If hayFiltro = False Then
Screen.ActiveForm.FilterOn = False
Else
'Si lo hay lo construimos y lo aplicamos
miFiltro = "[FechAlta]>=#" & Format(fechaFiltro, "mm/dd/yy") & "#"
With Screen.ActiveForm
.Filter = miFiltro
.FilterOn = True
End With
End If
End If
End Sub
…
9
Visítame en http://neckkito.siliconproject.com.ar
MENÚ EMERGENTE
Decir que he llamado a este epígrafe “Menú Emergente”
simplemente porque traduzco literalmente el tipo de menú
del inglés, que es “Popup”.
• Creo su instancia
• Creo los objetos commandBar.Control que necesite para ir confeccionando el menú, con
la sistemática de crear sus instancias y definir sus propiedades.
Veamos cómo ha cambiado nuestro código (os marco en negrita los cambios):
…
Public Function miBarraDeComandos()
'Declaramos las variables
'Primero, un objeto commandbar
Dim laCommandBar As CommandBar
'Segundo, un objeto botón de commandbar
Dim miComBarBoton As CommandBarButton
'Tercero, un objeto dropdown/combobox de commandbar
Dim miComBarCbo As CommandBarComboBox
'Cuarto, un objeto menú emergente de commandbar
Dim miComBarPopUp As CommandBarPopup
'Recorremos la colección de commandbars de la aplicación
'hasta encontrar la nuestra.
'Cuando la encontramos la eliminamos
'Esto es por si ya estuviera cargada. La cargaremos más adelante.
For Each laCommandBar In Application.CommandBars
If laCommandBar.Name = "Controles Neckkito" Then
laCommandBar.Delete
End If
Next laCommandBar
'Ahora sí, creamos nuestra commandbar
Set laCommandBar = Application.CommandBars.Add("Controles Neckkito")
'En los controles de nuestra commandbar...
With laCommandBar.Controls
'Creamos y añadimos nuestro botón
Set miComBarBoton = .Add(msoControlButton)
'Configuramos sus propiedades
With miComBarBoton
.Caption = "Cerrar formulario"
.FaceId = 11268
.Style = msoButtonIconAndCaption
.TooltipText = "Con esto cerramos el formulario activo"
.OnAction = "subCierraForm"
End With
'Creamos y añadimos nuestro dropdown
10
Visítame en http://neckkito.siliconproject.com.ar
Set miComBarCbo = .Add(msoControlComboBox)
With miComBarCbo
.AddItem "VIP"
.AddItem "No VIP"
.AddItem "Todos"
.Style = msoComboLabel
.Caption = "VIP?"
.TooltipText = "Seleccione el tipo de socio a filtrar"
.OnAction = "subCboDDVip"
End With
'Creamos y añadimos nuestro combobox
Set miComBarCbo = .Add(msoControlComboBox)
'Configuramos sus propiedades
With miComBarCbo
.AddItem "0-5"
.AddItem "0-10"
.AddItem "0-20"
.AddItem "Todos"
.Text = "Antigüedad:"
.Caption = "cboAntigüedad"
.Style = msoComboNormal
.TooltipText = "Seleccione la antigüedad a filtrar"
.OnAction = "subCboAntiguo"
End With
'Creamos y añadimos nuestro menú emergente
Set miComBarPopUp = .Add(msoControlPopup)
'Configuramos sus propiedades
With miComBarPopUp
.Caption = "Informes:"
'Creamos un primer botón para obtener el informe global
Set miComBarBoton = .Controls.Add(msoControlButton)
'Configuramos las propiedades de este primer botón
With miComBarBoton
.Caption = "Global"
.FaceId = 12366
.Style = msoButtonIconAndCaption
.OnAction = "subAbreRSocios"
End With
'Creamos un segundo botón para obtener el informe filtrado
Set miComBarBoton = .Controls.Add(msoControlButton)
'Configuramos las propiedades de este primer botón
With miComBarBoton
.Caption = "Filtrado"
.FaceId = 12364
.Style = msoButtonIconAndCaption
.OnAction = "subAbreRSociosFiltrado"
End With
End With
End With
'Hacemos visible la commandbar
laCommandBar.Visible = True
End Function
…
Como podréis observar he creado un menú emergente de dos botones. Nada impide crear un
menú emergente con combos, dropdowns, botones... Lógicamente no necesito declararlos
porque ya los tengo declarados en la parte inicial de declaraciones. Si no sí tendría que
acordarme de declararlos.
11
Visítame en http://neckkito.siliconproject.com.ar
Los códigos para abrir los informes es muy sencillo. Os los dejo indicados aquí, sin más
comentarios:
…
Public Sub subAbreRSocios()
On Error Resume Next
'Comprobamos que se está operando sobre FSocios
If Screen.ActiveForm.Name = "FSocios" Then
'Abrimos el informe en vista previa
DoCmd.OpenReport "RSocios", acViewPreview
End If
End Sub
Fácil, fácil...
12
Visítame en http://neckkito.siliconproject.com.ar
personalizada a través de código. Hay otras propiedades de las commandbars y sus controles
que no hemos visto aquí y que, si os interesa, os animo a examinar por vosotros mismos.
¡suerte!
13
Visítame en http://neckkito.siliconproject.com.ar