jueves, 18 de julio de 2024

Procedimientos. Datos.

Calc. Crear hojas (b).

Además de lo [ya visto] sobre el tema, todavía quedan algunas cuestiones por explicar en lo que a la creación de hojas se refiere. En esta entrada retomaremos algunas cuestiones y trataremos sobre otras que son de interés para la automatización del manejo de hojas mediante OOo Basic.


Como dice Mauricio Baeza (1), para crear o insertar una hoja utilizamos el método InsertNewByName(Nombre,Posición). Los dos parámetros nos permiten dar nombre a la hoja y posicionarla respecto al conjunto existen. Un script de ejemplo (2):

Sub InsertarUnaHoja
Dim oHojas As Object
oHojas = ThisComponent.getSheets()
oHojas.insertNewByName("Hoja2", 1)
End Sub

El problema de este modo de crear una nueva hoja es que es un procedimiento único, debido a que no pueden existir más de una hoja con el mismo nombre. El parámetro posición no supone esa limitación, pero modifica la posición de las hojas creadas si se sitúa por delante de ellas.

Para crear un número de hojas sin incurrir en la limitación anterior, deberemos manejar el parámetro Nombre como un string resultante de una concatenación de cadenas, siendo la segunda de ellas un valor numérico incremental convertido a string mediante la función CStr(). Por ejemplo:

Sub InsertarVariasHojas
Dim oHojas As Object
Dim i As Integer
oHojas = ThisComponent.getSheets()
For i = 0 To 3
oHojas.insertNewByName("Hoja" & CStr(i),i)
Next
End Sub

Creamos tantas hojas como deseemos mediante un bucle For, utilizando la variable Integer i como índice que aplicamos tanto en el parámetro Nombre ("Hoja" & CStr(i)), como al parámetro Posicion. De este modo no se repite el mismo nombre de la hoja, evitando así el error de sistema.

Finalmente podemos insertar una hoja al final del conjunto existente de forma automática, esto es: dando por supuesto que desconocemos el número de hojas que contiene el libro Calc.

Sub InsertarHojaFinal

Dim oHojas As Object
Dim oHoja As Object
Dim sNombre As String

sNombre = Trim(InputBox("Nombre de la nueva hoja"))

If sNombre <> "" Then
oHojas = ThisComponent.getSheets()
If Not oHojas.hasByName(sNombre) Then
oHojas.insertNewByName( sNombre, oHojas.getCount() )
End If
oHoja = ThisComponent.getSheets.getByName(sNombre)
ThisComponent.getCurrentController.setActiveSheet(oHoja)
End If

End Sub

En este caso pedimos al usuario el nombre la hoja mediante InputBox (sNombre = Trim(InputBox("Nombre de la nueva hoja"))) y comprobamos que el usuario introduzca un nombre  mediante un condicional If (If sNombre <> "" Then). También comprobamos mediante condicional que el nombre de la hoja no se repite  (If Not oHojas.hasByName(sNombre) Then). El posicionamiento (al final) se consigue mediante el método getCount() que devuelve el número de hojas del libro. Finalmente nos posicionamos en ella (oHoja = ThisComponent.getSheets.getByName(sNombre)) y la convertimos en la hoja activa (ThisComponent.getCurrentController.setActiveSheet(oHoja))

NOTAS

(1) Mauricio Baeza Servin (2007). Aprendiendo LibreOffice Basic. Documento modificado en septiembre de 2014.

(2) Este procedimiento [ya se explicó aquí], pero conviene insistir en él para la mejor comprensión de lo que sigue.