domingo, 29 de junio de 2025

Datos. OOo Basic

Obtención de los valores


Anteriormente, [en una entrada reciente] comentamos que, por diversas razones, podíamos encontrarnos con datos aparentemente numéricos que no lo son, lo que da lugar a errores de cálculo que pueden llegar a ser difíciles de detectar. Dijimos entonces que, para evitarlo, contábamos con funciones Calc, como VALOR(), que convierten un dato textual a numérico, siempre el dato original sea compatible.


En ese momento aparcamos al opción OOo Basic en aras de la rapidez en la solución al procedimiento, pero ahora, centrándonos en el interés por la automatización de los procesos, debemos retomar esa opción. También en este caso, la fórmula script es más compleja que el uso de Calc y sus funciones, que éstas no nos permiten logar la automatización que es ahora el objetivo a alcanzar.

Sub CuantificaF

Dim oHoja As Object, oCelda As Object
Dim mTipoDato() As Integer
Dim mNumDocum() As Integer
Dim i As Integer
Dim a As string
Dim N As Integer

'En otro caso se calcula N mediante script. Ahora lo establecemos directamente mediante N
N = 481
ReDim mTipoDato(N)
ReDim mNumDocum(N)

'Capturamos el tipo de dato Fx (1 int vs. 2 str)------------------------------------------

oHoja = ThisComponent.getSheets().getByName("Listado")

For i = 0 To UBound(mTipoDato())
oCelda = oHoja.getCellRangeByName("D" & i+2)
mTipoDato(i) = oCelda.getType '1 int vs. 2 str
Next

'Trasladamos los valores Fx a la matriz mNumDocum() al tipo de dato ------------------

For i = 0 To UBound(mTipoDato())
oCelda = oHoja.getCellRangeByName("D" & i+2)
If mTipoDato(i) = 1 Then
mNumDocum(i) = oCelda.getValue
ElseIf mTipoDato(i) = 2 Then
a = oCelda.getString
mNumDocum(i) = CInt(a)
End If
Next

End Sub

No es esta la única forma de plantear el script y podemos simplificarlo significativamente desarrollando los dos subprocesos (los dos bucles) en uno sólo, pero he preferido plantearlo de este modo para facilitar la comprensión de lo que pretendemos lograr.

Otra posible opción en incluir en el script (o en llamada a función) el cálculo (automatización) del valor N, pero, como explico en comentario, opto por obviar  esa parte del proceso de automatización mediante la fórmula de dar valor directamente a la variable N (N = 481), redimensionando las matrices de acuerdo con ese valor (v.g. ReDim mTipoDato(N)).

Pero lo realmente interesante y definitorio del script se produce a continuación y se desarrolla en el marco de un bucle For (For i = 0 To UBound(mTipoDato())), previo acceso a la hoja (oHoja = ThisComponent.getSheets().getByName("Listado")) e incluyendo el acceso a las celdas en las que se ubican los valores de la variable (oCelda = oHoja.getCellRangeByName("D" & i+2)).

Al contrario de lo que solemos hacer, vamos a obtener primeramente no el dato contenido en la celda, sino información sobre el tipo de dato que contiene. Para ello, [como ya sabemos], debemos emplear la función getType(), que ahora asociamos a los elementos de la matriz (Dim mTipoDato() As Integer) destinada a ese objetivo (mTipoDato(i) = oCelda.getType). De este modo mTipoDato() pasa a contener información sobre el tipo de dato (si str 2, si int 1) que contienen las celdas donde hemos almacenado los valores individuales de nuestra variable.

Aunque, como dije antes, podríamos simplificar el script, he preferido diferenciar el proceso anterior del siguiente, a fin de facilitar la comprensión de la lógica del procedimiento: ahora, mediante un nuevo bucle y tomando como referencia (y condición) el valor 1 vs. 2 que contiene la matriz mTipoDato(), asignamos a los elementos de la matriz mNumDocum() el contenido de cada celda. Si ese contenido es numérico (If mTipoDato(i) = 1 Then), lo hacemos directamente (mNumDocum(i) = oCelda.getValue), pero si es texto (ElseIf mTipoDato(i) = 2 Then), entonces capturamos el dato sobre una variable str (Dim a As string) mediante la función getString() (a = oCelda.getString), como paso previo para, previa conversión, trasladar ese valor (ahora ya int) a la matriz receptora (mNumDocum(i) = CInt(a)).

No hay comentarios:

Publicar un comentario

Comenta esta entrada