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 CuantificaFDim oHoja As Object, oCelda As ObjectDim mTipoDato() As IntegerDim mNumDocum() As IntegerDim i As IntegerDim a As stringDim N As Integer'En otro caso se calcula N mediante script. Ahora lo establecemos directamente mediante N
N = 481ReDim 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 strNext'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 ThenmNumDocum(i) = oCelda.getValueElseIf mTipoDato(i) = 2 Thena = oCelda.getStringmNumDocum(i) = CInt(a)End IfNextEnd 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