![]() |
Al situarnos en la plantilla se desactiva el botón. |
Parte del trabajo ya lo tenemos hecho del artículo anterior, pero nos faltan algunos "detalles". Si alguien empieza por esta parte en lugar de por el artículo anterior, le recomiendo que lo deje y que primero realice los pasos anteriores. No voy a repetir todo lo que ya hemos visto y quizás os sintáis un poco perdidos. Para seguir este artículo podéis utilizar el documento finalizado del artículo anterior o bien descargarlo en el siguiente enlace.
Entonces, nuestro objetivo es hacer algo para que cuando se cambie de una hoja a otra del documento, el botón se active o se desactive según le toque. Antes de ponernos con el trabajo os voy a intentar explicar a grandes rasgos que vamos a tener que hacer para conseguir lo que quiero, así no vais tan a ciegas con lo que os voy explicando. Como ya os comenté el control de la Ribbon desde VBA es un poco complicado y lo que vamos a ver hoy lo confirma mucho más. Ya os dije que no hay una orden tipo "botonEliminar.Enabled = False", de nuevo vamos a tener que usar la función "getEnabled" y algún que otro "truco" más. Abrimos el documento en el Custom UI Editor y os sigo comentado.
![]() |
Código XML artículo anterior. |
<button id="botonEliminarFactura" label="Eliminar" getEnabled="ModuloRibbon.ActivarDesactivarBotonEliminar" onAction="ModuloFacturas.EliminarFactura"/>
En el código del artículo anterior, en "getEnabled", indicamos que Excel debía llamar a un procedimiento de VBA para decidir que estado debía tener el botón, activado o desactivado. El procedimiento estaba situado en un módulo llamado "ModuloRibbon" y se llamaba "ActivarDesactivarBotonEliminar". Este procedimiento es llamado cuando se crea el botón en la Ribbon, al cargar la personalización que estamos creando, Excel se da cuenta que para mostrar este botón debe llamar a ese procedimiento y así se decidirá si está activado o no. En el artículo anterior nos aprovechamos de esto para que al abrir el documento en Excel el botón de eliminar facturas esté en el estado correcto. Como al abrir el documento se carga la personalización, Excel llama a ese procedimiento para ver como tiene que quedar el botón.
![]() |
Procedimiento VBA para activar y desactivar el botón. |
¿Que es lo que vamos hacer ahora? Bueno pues básicamente, vamos a obligar a cargar de nuevo el botón cuando cambiemos de una hoja a otra y al hacer esto, se volverá a llamar a ese procedimiento para decidir que estado debe tener el botón. Recordad que en el procedimiento "ActivarDesactivarBotonEliminar" se controlaba en que hoja del documento estábamos y en función de eso se decidía si se activaba o no el botón. Bueno pues al volver a cargar de nuevo el botón en la Ribbon, esa comprobación se volverá a realizar y se activará o desactivará el botón según la hoja en la que estemos en ese momento. Vamos a conseguir que el botón se cree de nuevo en la Ribbon.
En realidad es mucho más retorcido lo que vamos hacer, porque seguro que más de uno estará pensando... ¿Y como le vamos a decir que cargue de nuevo el botón? Bueno pues es que en realidad no le vamos a decir que cargue el botón, le vamos a decir que lo invalidamos... Y al hacerlo, Excel lo vuelve a cargar porque ya no es válido. Es decir yo no puedo cargar de nuevo un control, pero si puedo indicar que ya no es válido para que Excel se encargue de cargarlo de nuevo y así provocaremos que se llame otra vez al procedimiento que hemos indicado en "getEnabled". Este es el proceso que hemos seguido hasta ahora y el que vamos a seguir:
En realidad es mucho más retorcido lo que vamos hacer, porque seguro que más de uno estará pensando... ¿Y como le vamos a decir que cargue de nuevo el botón? Bueno pues es que en realidad no le vamos a decir que cargue el botón, le vamos a decir que lo invalidamos... Y al hacerlo, Excel lo vuelve a cargar porque ya no es válido. Es decir yo no puedo cargar de nuevo un control, pero si puedo indicar que ya no es válido para que Excel se encargue de cargarlo de nuevo y así provocaremos que se llame otra vez al procedimiento que hemos indicado en "getEnabled". Este es el proceso que hemos seguido hasta ahora y el que vamos a seguir:
- Abrimos el documento en Excel y se carga la Ribbon personalizada.
- Al cargar la Ribbon personalizada debe crear el botón para eliminar facturas y ahí se da cuenta que para establecer el estado del botón, se llama desde "getEnabled" a una macro que hemos creado con VBA.
- Se ejecuta esa macro y se activa o se desactiva el botón dependiendo de la hoja en la que aparecemos situados al abrir el documento.
- A partir de aquí empieza lo nuevo. Cuando cambiemos de una hoja a otra mientras trabajamos en el documento, usaremos el evento SheetActivate para invalidar el botón de eliminar facturas. Ese evento salta cuando se activa una hoja, al cambiar de una hoja a otra se activa en la que nos situamos.
- Al invalidar el botón, Excel lo intentará crear otra vez y de nuevo llegará a la misma conclusión. Para establecer el estado del botón hay que llamar a la macro que apunta "getEnabled" y así en función de la hoja en la que estamos en ese momento se activará o se desactivará el botón.
Esta es la idea, ya os había dicho que no es fácil y que el acceso a la Ribbon no es directo, hay que dar unas "pocas vueltas". Bueno, vamos a empezar con el trabajo de codificación. En este paso vais a tener que hacer un pequeño acto de fe, ya que el código que vamos a escribir no va tener una representación visual en la Ribbon. Tenemos que hacer una modificación a la primera línea, la línea en la que indicábamos el espacio de nombres que queríamos usar en este documento. Al final de la línea debemos añadir lo siguiente:
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="ModuloRibbon.AlCargarRibbon">
¿Por qué hacemos esto? Bueno pues porque en el interior de ese procedimiento o macro, que se ejecuta justo en el momento en el que se cargue la personalización, vamos a tener acceso a la Ribbon, a la Cinta de Opciones… Y eso nos va permitir hacer algo que después nos facilitará el acceso continuo a la Ribbon, para poder hacer con ella lo que necesitemos en cualquier momento. En este caso concreto activar o desactivar el botón a nuestro gusto. Ya se que suena muy raro pero tenéis que hacer unos pocos actos de fe en este artículo.
Ya está, esto es todo lo que teníamos que hacer en el Custom UI Editor, como muy bien os imaginaréis, ahora el siguiente paso es ir a Excel y desarrollar la macro que acabamos de indicar en “onLoad”.
Ya está, esto es todo lo que teníamos que hacer en el Custom UI Editor, como muy bien os imaginaréis, ahora el siguiente paso es ir a Excel y desarrollar la macro que acabamos de indicar en “onLoad”.