sábado, 13 de julio de 2024

Procedimientos. Datos

Mostrar hojas mediante macros

Además de [ocultar las hojas], también podemos mostrarlas cuando resulte conveniente. Para ello disponemos de la opción del menú Hoja | Mostar hoja y de una alternativa basada en el código macro. Se trata esta vez de un código algo más complejo que el que genera Grabar macro cuando capturamos la secuencia de ocultar hoja, pero precisamente por eso es también más maleable para ser aprovechado desde OOo Basic.


La macro que genera la funcionalidad Grabar macro presenta esta sintaxis:

Sub MstH1Macro

dim document   as object
dim dispatcher as object

document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "aTableName"
args1(0).Value = "Hoja2"
dispatcher.executeDispatch(document, ".uno:Show", "", 0, args1())

End Sub

Además  de lo que tú ya conoces por ser parte invariable del código macro, el que resulta determinante de esta funcionalidad está comprendido entre las líneas 5 a 8. 

Fíjate que args1(0).Name trabaja con el nombre de la tabla ("aTableName"), por lo que args1(0).Value requiere un dato alfanumérico que se ajuste al nombre de una hoja realmente existente en estado "Oculto" (en este caso "Hoja2") (1). 

La instrucción concreta que muestra la hoja es ".uno:Show" y es el segundo parámetro de la función o método  dispatcher.executeDispatch().

Conocido esto resulta muy sencillo transformar la macro en una subrutina: es suficiente con dotarla de un parámetro string que permita recibir el nombre de la hoja desde el script desde el cual es llamada la subrutina. Vemos un ejemplo:

Sub MstH1 ' Script

MostarHoja("Hoja2")

End Sub


Sub MostarHoja(nH As String) ' Subrutina

dim document   as object

dim dispatcher as object

document   = ThisComponent.CurrentController.Frame

dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

dim args1(0) as new com.sun.star.beans.PropertyValue

args1(0).Name = "aTableName"

args1(0).Value = nH

dispatcher.executeDispatch(document, ".uno:Show", "", 0, args1())

End Sub

El script es muy simple y económico en términos de líneas de código, lo que nos permite multiplicarlo las veces que resulte necesario en nuestro algoritmo.

Y la subrutina sólo varía respecto a la macro en que hemos sustituido el string que concreta la hoja a mostrar por la variable-parámetro que definimos en su declaración (MostarHoja(nH As String))

La única condición que debemos respetar para que este conjunto script-subrutina funciones correctamente es que desde el script entreguemos un string y no un valor numérico cuando llamemos a la subrutina.

Documento. Este [libro Calc] contiene el código explicado en la entrada. Te sugiero que crees nuevos script que hagan uso de la subrutina para mostrar las hojas ocultas (hay nueve)


NOTAS

(1) Si la hoja no existe o ya está visible la macro no genera error.