Documentos de Académico
Documentos de Profesional
Documentos de Cultura
CAPÍTULO 191
Índice de contenido
PERSONALIZAR LA CINTA DE OPCIONES .................................................................................2
INTRODUCCIÓN...........................................................................................................................2
CREANDO LA ESTRUCTURA DE NUESTRA BD.....................................................................3
LA CINTA DE OPCIONES. IDEAS GENERALES.......................................................................4
CÓDIGO XML...........................................................................................................................5
NUESTRA TABLA USysRibbons..............................................................................................5
LOS NOMBRES DE LA CINTA DE OPCIONES.....................................................................6
PLANIFICANDO NUESTRA CINTA DE OPCIONES.................................................................6
EL CÓDIGO XML INICIAL......................................................................................................7
PROGRAMACIÓN DE NUESTRA CINTA COMÚN..............................................................9
¿CÓMO ACTIVAR NUESTRA CINTA COMÚN?.............................................................12
PROGRAMACIÓN DE NUESTRA CINTA DE FORMULARIO..........................................13
¿CÓMO ACTIVAR NUESTRA CINTA DE FORMULARIO?...........................................14
PROGRAMANDO NUESTROS BOTONES CON VBA............................................................15
PREPARATIVOS PREVIOS....................................................................................................15
AHORA SÍ, A POR EL CÓDIGO VBA...................................................................................15
UNAS ÚLTIMAS LÍNEAS SOBRE LA CINTA DE OPCIONES...............................................17
PARA FINALIZAR EL CAPÍTULO.............................................................................................18
1
Visítame en http://bit.ly/NckAccess
PERSONALIZAR LA CINTA DE OPCIONES
INTRODUCCIÓN
Este capítulo será de aplicación para usuarios de Access
2007 y 2010. Microsoft, a partir de Access 2007, ha
cambiado el sistema de menús que era típico de Access
2003, y lo ha sustituido por la llamada “cinta de opciones”.
Así como la configuración de menús era extremadamente versátil en Access 2003, en sus
siguientes versiones este tema se ha vuelto un poco más complejo.
Más cosas: para poder programar una cinta de opciones personalizada vamos a requerir de
unos mínimos conocimientos de XML (¡no os asustéis: son realmente mínimos! ). Lo que
haremos (entre otras cosas) en general, en este capítulo, será:
i.- Aprovechar las funciones de los botones de los que ya dispone Access
ii.- Crearnos nuestros propios botones para que realicen las acciones que nosotros queramos
(y ahí es donde entra en juego nuestra programación en VBA).
Al final del capítulo os indicaré algunos enlaces que he considerado interesantes para que
podáis profundizar en diferentes aspectos del ribbon de Access.
Visto el esquema genérico del capítulo creo que la metodología más efectiva es seguir un
ejemplo y aprovecharlo para ir explicando las características de cada paso.
Por eso, si os parece bien, vamos a crearnos una BD muy simple (para no hacer este capítulo
interminable) desde cero. Esta BD nos servirá para gestionar las entradas/salidas en préstamo
de libros de una biblioteca.
2
Visítame en http://bit.ly/NckAccess
CREANDO LA ESTRUCTURA DE NUESTRA BD2
Crearemos una tabla, a la que llamaremos TPrestamos, con
la siguiente estructura:
Ahora nos creamos un formulario que nos hará de menú, y que llamaremos FMenu.
…
Private Sub cmdCerrar_Click()
DoCmd.Close acForm, Me.Name
DoCmd.OpenForm "FMenu"
End Sub
…
2 La estructura de nuestra BD será mínima y no óptima, pues el objetivo del capítulo no es aprender a estructurar una BD. Por ello,
no toméis esta referencia como lo que debería ser una “BD bien estructurada” (porque no lo es).
3
Visítame en http://bit.ly/NckAccess
El código del botón cerrar (cmdCerrar) será:
…
Private Sub cmdCerrar_Click()
DoCmd.Close acForm, Me.Name
End Sub
…
…
Private Sub cmdAbreFPrestamos_Click()
DoCmd.Close acForm, Me.Name
DoCmd.OpenForm "FPrestamos", , , , acFormAdd
End Sub
…
…
Private Sub cboDevolucion_AfterUpdate()
DoCmd.OpenForm "FPrestamos", , , "[Titulo]='" & Me.cboDevolucion.Value & "'" _
& " AND [Devolucion]=FALSE"
DoCmd.Close acForm, Me.Name
End Sub
…
Y, en principio, eso es todo. Veamos cómo podemos construirnos nuestra cinta de opciones
personalizada para nuestra aplicación.
4
Visítame en http://bit.ly/NckAccess
CÓDIGO XML
Para programar nuestra cinta de opciones deberemos
hacerlo utilizando código XML. Y para ello vamos a necesitar
un editor de XML. Aunque eso puede hacerse en cualquier
editor de textos (el mismo bloc de notas nos serviría) yo os
recomiento otros editores un poco más “especializados” en
xml. Por ejemplo, el que utilizo yo es el “notepad++”, que
podréis encontrar en la web portableapps (efectivamente,
como habéis intuido, es un programa portable, por lo que
no requiere instalación en nuestro disco duro).
De todas maneras insisto en que hay otros programas “por esos mundos de Dios” que os
pueden servir igualmente bien.
La tabla USysRibbons es detectada por Access como una tabla de sistema, aunque no de
Access (las tablas de sistema de Access llevan el prefijo MSys), sino de usuario. ¿Cómo
podemos verlas? Pues de la siguiente manera:
¿Y por qué no construirnos nuestra tabla USysRibbons ahora? Pues creamos una tabla nueva, a
la cual, lógicamente, llamaremos USysRibbons, con la siguiente estructura:
5
Visítame en http://bit.ly/NckAccess
LOS NOMBRES DE LA CINTA DE OPCIONES
Veremos que existe una especie de jerarquía para llamar a
los diferentes elementos de una cinta de opciones.
Básicamente, nos encontraremos con:
Y ahora es cuando aparece la gran pregunta: ¿cómo se llaman los nombres de las cintas, de
los grupos y de los controles estándar? Es decir, a la cinta de opciones que ya existe, ¿qué
nombres les ha puesto Microsoft?
Para ver todos estos nombres podéis bajaros estos documentos, con los nombres
exclusivamente para Access3:
Si queréis ver los nombres para todas las aplicaciones de Office podéis visitar los siguientes
enlances:
• Vamos a crearnos una cinta de opciones común para todos los formularios
• Vamos a crear una cinta específica para el formulario FPrestamos
• Vamos a crear una cinta específica para el formulario FHistorial
3 Los archivos de este ejemplo y que os propongo para su descarga han sido bajados por mí en junio 2012. Es decir, que,
teóricamente (si Microsoft no nos engaña) están actualizados a esa fecha.
6
Visítame en http://bit.ly/NckAccess
EL CÓDIGO XML INICIAL
Nuestro código va a tener siempre unos elementos
comunes, que van a ser:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
A continuación debemos operar con el atributo startFromScratch, que puede adoptar los
valores “true” o “false” (nótense las comillas, pues hay que utilizarlas). Si utilizamos “false”
estaremos indicando que estamos modificando la barra de herramientas estándar; si usamos
“true” es que creamos una desde cero.
<ribbon startFromScratch="false">
Aprovecho para haceros notar un detalle: cuando escribimos en XML utilizamos la notación
“camello”: es decir, las pablabras se escriben juntas, empezando por minúscula, pero la
primera letra de cada palabra entera (a partir de la segunda) se comienza en mayúscula. Así,
la letra “U” de la palabra “customUI”, por ejemplo, se escribe en mayúscula, dando la
sensación de que es la joroba de un camello. Si son más palabras, como por ejemplo
“startFromScratch”, ya vemos claramente (espero) cómo funciona esta sistemática.
<customUI...>
<ribbon startFromScratch="false">
<tabs>
<(elementos del tab y valores)>
<group (elementos del group y valores)>
<button (elementos del button y valores)/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
Si nos fijamos en el esquema anterior, los interdentados nos muestran el nivel jerárquico. Es
importantísimo cerrar siempre los elementos por orden inverso a su creación. Es decir, que sí
es correcto escribir:
<amo>
<esclavo>
</esclavo>
4 No puedo aquí explicar cómo funciona el lenguaje XML, lamentablemente. Por ello sólo indicaré las características que necesitemos
para nuestro ribbon.
7
Visítame en http://bit.ly/NckAccess
</amo>
<amo>
<esclavo>
</amo>
</esclavo>
<amo/>
Veréis que he puesto (elementos del tab y valores). A continuación os indico en una tabla lo
más común de estos “elementos y valores” para operar con la cinta:
8
Visítame en http://bit.ly/NckAccess
• No se pueden ni añadir ni eliminar elementos de la cinta
estándar de Access. Lo máximo que podemos hacer es
llamar a algún elemento de esa cinta predeterminada y
situarlo como no visible.
• El subelemento imageMso también puede hacer una llamada a una imagen que
hayamos diseñado nosotros mismos para el botón.
Pronto vamos a ver un elemento más (el nuestro), que llamaremos <Mis opciones>.
9
Visítame en http://bit.ly/NckAccess
Abrimos la tabla USysRibbons y escribimos, en el primer registro, lo siguiente:
…
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="false">
<tabs>
<tab idMso="TabHomeAccess"
visible="false">
</tab>
<tab id="cintaComun"
label="Mis Opciones"
visible="true">
<group id="cintaComunGrupoAccess"
label="Opciones generales Access">
<control idMso="Copy"
label="Copiar datos"
enabled="true"/>
<control idMso="Paste"
label="Pegar datos"
enabled="true"/>
</group>
<group id="cintaComunGrupoMio"
label="Mis opciones personalizadas">
<button id="btnAbreFPrestamos"
imageMso = "FileServerTransferDatabase"
label="Prestar libro"
size="large"
enabled="true"
onAction="subAbreFPrestamos"/>
<button id="btnAbreHistorial"
imageMso = "DataRefreshAll"
label = "Ver historial"
size="large"
enabled = "true"
onAction="subAbreFHistorial"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
…
Analicemos el código:
…
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="false">
<tabs>
…
…
<tab idMso="TabHomeAccess"
visible="false">
</tab>
…
10
Visítame en http://bit.ly/NckAccess
Como vemos, aquí debemos saber que la cinta “Inicio” se
llama “TabHomeAccess” (y para eso podemos recurrir al
fichero para el cual os apuntaba los enlaces más arriba).
…
<tab idMso=”NombreDeLaTab”
visible = “true”>
<group idMso=”NombreDelGrupoAOcultar”
visible = “false”>
</group>
</tab>
…
Y lo mismo si, más allá del grupo, queremos llegar a un control en concreto.
…
<tab id="cintaComun"
label="Mis Opciones"
visible="true">
…
• A partir de ahí creamos los grupos. Como veis yo he creado dos grupos diferentes, para
que veais cómo manejar los controles de Access y los botones personalizados. Así:
…
<group id="cintaComunGrupoAccess"
label="Opciones generales Access">
<control idMso="Copy"
label="Copiar datos"
enabled="true"/>
<control idMso="Paste"
label="Pegar datos"
enabled="true"/>
</group>
…
…
<group id="cintaComunGrupoMio"
label="Mis opciones personalizadas">
<button id="btnAbreFPrestamos"
imageMso = "FileServerTransferDatabase"
label="Prestar libro"
size="large"
enabled="true"
onAction="subAbreFPrestamos"/>
11
Visítame en http://bit.ly/NckAccess
<button id="btnAbreHistorial"
imageMso = "DataRefreshAll"
label = "Ver historial"
size="large"
enabled = "true"
onAction="subAbreFHistorial"/>
</group>
…
La mecánica es muy parecida al manejo de los controles de Access, sólo que utilizando botones
(control versus button). A los botones les he asignado una imagen (la que me ha gustado
más), recurriendo para ello al nombre que me mostraba el propio Access (tal y como os
explicaba más arriba con el tema buscar los nombres en las opciones de Access). Los
mostraremos como botones grandes (en contraposición a los controles) para que
podáis ver el efecto en la aplicación.
• Para acabar completamos el código con todas las etiquetas necesarias de cierre
…
</tab>
</tabs>
</ribbon>
</customUI>
…
El proceso es el siguiente:
1.- Ya tenemos nuestro código en la tabla USysRibbons, pero Access aún no sabe que hemos
creado una cinta personalizada. ¿Qué hacemos?
2.- Una vez reiniciado ahora Access sí ya sabe que existe una cinta de opciones nueva. Vamos
a configurarla:
12
Visítame en http://bit.ly/NckAccess
3.- Ahora Access ya sabe que tiene que mostrar nuestra cinta de opciones, pero aún no ha
“refrescado” esa información. Pues...
Nota: si hay algún error de código XML no aparecerá nuestra cinta. Si os pasa eso “no
queda otra” que repasar bien el código de la cinta hasta dar con el error. El “rollo” está en que
para cada modificación tendremos que salir de Access y volver a entrar para ver si lo hemos
corregido correctamente.
13
Visítame en http://bit.ly/NckAccess
Siendo el código XML
…
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="false">
<tabs>
<tab id="cintaFPrestamos"
label="Menú Préstamos"
visible="true">
<group id="toqueteoRegistros"
label="Trabajo con registros">
<control idMso="GoToNewRecord"
label="Nuevo préstamo"
enabled="true"/>
<control idMso="RecordsDeleteRecord"
label="Borrar entrada"
enabled="true"/>
</group>
<group id="operoConFormulario"
label="Opciones de formulario">
<button id="btnCierraFPrestamos"
imageMso = "CloseDocument"
label="Volver a Menú"
size="large"
enabled="true"
onAction="subCierraFPrestamos"/>
<button id="btnAbreHistorial"
imageMso = "DataRefreshAll"
label = "Ver historial"
size="large"
enabled = "true"
onAction="subAbreFHistorialFiltrado"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
…
Os dejo el análisis del código para vosotros, aunque no deberíais tener problemas para
entenderlo. Sólo hay que recordar que debemos programar dos funciones:
subCierraFPrestamos y subAbreFHistorialFiltrado.
14
Visítame en http://bit.ly/NckAccess
Y eso debería ser todo. Si situamos FPrestamos en vista Formulario nos debería aparecer
nuestra cinta. Al cerrar FPrestamos esa cinta debería desaparecer.
Añadir que podemos hacer lo mismo con un informe; es decir, programar una cinta
personalizada para un informe: sólo deberíamos ligarle la cinta correspondiente.
PREPARATIVOS PREVIOS
Debemos preparar nuestra BD para que nuestro código VBA pueda interactuar con la cinta de
opciones. Ello implica realizar un paso previos a la programación.
Ese paso consiste en registrar una referencia, dado que nuestro código debe reconocer algunos
códigos que llaman a la cinta de opciones. Para conseguir esto abrimos el VBE (ALT+F11) y
nos vamos a Menú → Herramientas → Referencias..., y buscamos y marcamos el check de la
librería “Microsoft Office 12.0 Object Library” (la versión 14.0 para Access 2010).
Preparativo listo.
Vamos a crear pues una serie de procedimientos, pero debemos tener en cuenta que en todos
los procedimientos que programemos vamos a tener que seguir la siguiente estructura:
15
Visítame en http://bit.ly/NckAccess
De esta manera enlazamos la cinta con el código que escribiremos.
• subAbreFPrestamos
• subAbreFHistorial
• subCierraFPrestamos
• subAbreFHistorialFiltrado
Lo que vamos a hacer es crearnos un módulo estándar, que llamaremos mdlRibbons. Para la
primera función programaremos lo siguiente:
…
Public Sub subAbreFPrestamos(ByVal control As IRibbonControl)
On Error GoTo sol_err
'Comprobamos que FPrestamos no está ya cargado
If CurrentProject.AllForms("FPrestamos").IsLoaded Then
'Si está cargado avisamos y salimos
MsgBox "El formulario ya está abierto", vbExclamation, "FORMULARIO ABIERTO"
Else
'Si no está cargado cerramos FMenu y lo abrimos para añadir un registro nuevo
DoCmd.Close acForm, "FMenu"
DoCmd.OpenForm "FPrestamos", , , , acFormAdd
End If
Salida:
Exit Sub
sol_err:
MsgBox "Se ha producido el error " & Err.Number _
& " - " & Err.Description
Resume Salida
End Sub
…
Como veis el código no tiene mayor complicación, salvo por la particularidad que
comprobamos, antes de realizar la acción, si FPrestamos está cargado o no, y actuamos en
consecuencia.
…
Public Sub subAbreFHistorial(ByVal control As IRibbonControl)
On Error GoTo sol_err
'Comprobamos que FPrestamos no está ya cargado
If CurrentProject.AllForms("FHistorial").IsLoaded Then
'Si está cargado avisamos y salimos
MsgBox "El formulario ya está abierto", vbExclamation, "FORMULARIO ABIERTO"
Else
'Si no está cargado cerramos FMenu y lo abrimos para añadir un registro nuevo
DoCmd.OpenForm "FHistorial", , , , acFormReadOnly
End If
Salida:
16
Visítame en http://bit.ly/NckAccess
Exit Sub
sol_err:
MsgBox "Se ha producido el error " & Err.Number _
& " - " & Err.Description
Resume Salida
End Sub
…
…
Public Sub subCierraFPrestamos(ByVal control As IRibbonControl)
DoCmd.Close acForm, "FPrestamos"
DoCmd.OpenForm "FMenu"
End Sub
…
Y finalmente, el código de subAbreFHistorialFiltrado sería:
…
Public Sub subAbreFHistorialFiltrado(ByVal control As IRibbonControl)
Dim vLector As String
vLector = Nz(Forms!FPrestamos.Lector.Value, "")
If vLector = "" Then
MsgBox "Debe indicar el nombre de un lector para filtrar su historial"
Else
DoCmd.OpenForm "FHistorial", , , "[Lector]='" & vLector & "'", acFormReadOnly
End If
End Sub
…
Sólo me queda añadir que, aunque yo no lo he hecho más que en los códigos de la cinta
común (porque los códigos programados son muy simples), es buena costumbre añadir un
control de errores en los códigos (sobre todo si la cinta de opcines es común y no está ligada a
ningún formulario). Si los usuarios “manazas” ya dan problemas con un objeto “normal” de
Access, si le añadimos un menú las consecuencias pueden ser insospechadas... je, je...
http://office.microsoft.com/es-es/access-help/personalizar-la-cinta-de-opciones-
HA010211415.aspx (cómo crear un ribbon)
http://76areal.wordpress.com/2011/05/10/menus-y-botones-para-access-2007-y-2010/
(ofrece varias opciones adicionales de cómo configurar el menú de las aquí explicadas)
http://geeks.ms/blogs/access/archive/2008/04/06/access-2007-cambiar-de-banda-de-
opciones-ribbon-usando-vba.aspx (con cosas curiosas sobre el ribbon que pueden sernos útiles
para nuestra aplicación)
17
Visítame en http://bit.ly/NckAccess
http://geeks.ms/blogs/access/archive/2009/01/14/el-uso-de-las-cintas-de-opciones-ribbon-y-
xml-lenguaje-de-marcado-extensible-ribbonandxml-01.aspx (para ocultar iconos del menú del
botón de Office)
Un saludo, y...
¡suerte!
18
Visítame en http://bit.ly/NckAccess