martes, 22 de agosto de 2023

Procedimientos. Datos.

Calc. Crear una hoja (a).

Trabajando en Calc con frecuencia necesitamos crear nuevas hojas para ampliar las opciones de trabajo con nuestro documento-libro. Para ello no necesitamos más que hacer clic en el signo + que se localiza en el pie del libro, antes de las pestañas de las hojas disponibles. Pero hay ocasiones en las que esto es insuficiente. es aquí donde interesa crear hojas mediante OOo Basic.



Efectivamente, la mayoría de las veces, cuando necesitamos crear una nueva hoja para ampliar las disponibles, utilizar el procedimiento que implemente Calc es la mejor solución: accesible, simple y segura...


... disponible al pie del libro, después del navegador y antes de la primera hoja visible, o desde el menú Hoja, aquí con varias opciones.


Estos procedimientos suelen ser suficientes la mayoría de las veces y no hay motivo para complicar las cosas introduciendo opciones que resultan más complejas y no más funcionales, como es el caso de añadir nueva hoja mediante un script OOo Basic... sólo que, a veces, esa es la opción más recomendable...

Un ejemplo de ello es cuando nuestra nueva hoja va a repetirse un número elevado de veces y no es plan de estar creando; pongamos por ejemplo... 200 hojas manualmente. Otro ejemplo es cuando queremos que se cree una nueva hoja con un contenido básico predefinido; por ejemplo, un formato de "ficha" a modo de formulario.

En ambos casos, disponer de un script que automatice el o los procesos (la combinación de los dos anteriores sería un tercer ejemplo) puede considerarse una opción interesante. Este script sería su formulación básica:

Sub InsertarNuevaHoja

Dim oHojas As Object

oHojas = ThisComponent.getSheets()
oHojas.insertNewByName("Hoja creada", 2)

End Sub

  • La función o método insertNewByName() cuenta con dos parámetros: nombre de la nueva hoja y posición-índice. 
  • En este caso, el primer parámetro se implementa directamente ("Hoja creada"), pero podríamos hacerlo de forma interactiva. Para ello deberemos crear una variable y asociarla a un InputBox para que sea el usuario quien introduzca el nombre que desee. Esto reformula el script inicial como sigue (1):

Sub InsertarNuevaHoja

Dim oHojas As Object

Dim sNombreHoja As String

sNombreHoja = InputBox("Nombre de la nueva hoja")

oHojas = ThisComponent.getSheets()

oHojas.insertNewByName(sNombreHoja, 2)

End Sub

Observa que ahora la variable sNombreHoja  se posiciona como primer parámetro en la función insertNewByName()

  • Siguiendo con la descripción del primer script, el segundo parámetro, el referido a la posición en función del índice, se resuelve mediante un valor numérico, que puede ser desde 0 hasta el valor que deseemos. 
  • El valor 0 es admisible al iniciar con ese valor el conteo interno del número de hoja disponibles en un libro Calc (2)
  • También podemos permitir al usuario que posiciona la nueva hoja donde desee, aunque posiblemente esta opción sea poco interesante. Más puede serlo utilizar la función getCount() que posiciona la nueva hoja al final del listado de las actuales (3).
  • De hecho, podemos usar getCount() para saber el número de hojas de un libro Calc... (MsgBox oHojas.getCount()y utilizarlo como referencia para tomar decisiones sobre, por ejemplo, la creación o no de más hojas. Pero seguramente utilizaremos con las frecuencia la función getCount() como referencia para posicionar las nuevas hojas, lo que supone usarla como segundo parámetro de la función insertNewByName()
Sub InsertarNuevaHoja

Dim oHojas As Object
Dim sNombreHoja As String
sNombreHoja = InputBox("Nombre de la nueva hoja")

oHojas = ThisComponent.getSheets()
oHojas.insertNewByName(sNombreHoja, oHojas.getCount())
End Sub

Aunque las opciones son múltiples, me gustaría mostrar cómo automatizar la creación de un número de hojas decidido por el usuario haciendo uso de lo ya expuesto en los script anteriores. Para ello necesitamos únicamente utilizar una estructura de iteración (un For...Next, vamos)

Sub InsertarNuevaHoja

Dim oHojas As Object

Dim sNombreHoja As String, sNumHojas As String

Dim i As Integer

sNombreHoja = InputBox("Nombre identificativo de la hoja")

sNumHojas= InputBox("Número de hojas a crear")

oHojas = ThisComponent.getSheets()

For i=1 To CINt(sNumHojas)

oHojas.insertNewByName(sNombreHoja+i, oHojas.getCount())

Next

End Sub

En base a lo trabajado hasta este momento y lo que ya sabemos sobre el bucle For no creo que te resulte difícil entender este script y su funcionamiento. Si tienes alguna duda ya sabes dónde me puedes encontrar dispuesto a ayudarte a resolverla.

NOTAS

(1) Esta segunda versión del script evita además una limitación del funcionamiento del primero: sólo sirve para utilizarlo una vez, ya que no puede haber dos hojas con el mismo nombre.
(2) Aunque en la generación de nuevas hojas mediante las utilidades de Calc, éstas se enumeren sucesivamente como Hoja + numeral, y se inicie (primero hoja) como "Hoja1", en realidad, la matriz interna se inicia en la posición 0.
(3) La función getCount() devuelve el número total de hojas que contiene el libro Calc. Al utilizarlo como posición-índice, lo que hacemos es indicar el valor-índice que ocupa la última hoja creada. Nuestro script ubicará la nueva hoja tras la última que haya sido creada. De este modo ésta no se posicionará invariablemente en la posición numérica x, tal y como sucede en las formulaciones anteriores del script en relación con la posición 2 (como sabemos, en realidad la posición 3)

No hay comentarios:

Publicar un comentario

Comenta esta entrada