Calc. Uso de funciones dentro de los script.
Sub PruebaFuncionCalc1a
Dim oHoja As ObjectDim dResulta As DoubleoHoja = ThisComponent.CurrentController.ActiveSheetoHoja.getCellRangeByName("B12").Formula = "=SUM(A1:A12)"dResulta = oHoja.getCellRangeByName("B12").ValueMsgBox dResulta
End Sub
Tras declarar dos variables (oHoja y dResulta) y acceder al objeto Hoja (oHoja = ThisComponent.CurrentController.ActiveSheet), implementamos la fórmula (=SUM(A1:A12)) en la celda B12. Para ello añadimos al identificador de la celda el identificador Formula (oHoja.getCellRangeByName("B12").Formula = "=SUM(A1:A12)")
Una vez que la fórmula actúa y entrega su resultado en la celda establecida, accedemos a dicho resultado asignándolo a la variable dResulta (dResulta = oHoja.getCellRangeByName("B12").Value) (5). En este caso, lo que hacemos con el valor obtenido es mostrarlo mediante MsgBox (MsgBox dResulta), pero podríamos utilizarlo de cualquier otra forma, dependiendo del algoritmo de nuestro script.
Sub PruebaFuncionCalc2
Dim oHoja As ObjectDim dSuma As DoubleoHoja = ThisComponent.getSheets().getByName("Hoja1")dSuma = FuncionCalc( "SUM", Array(oHoja.getCellRangeByName("A1:A12")) )MsgBox dSuma
End Sub
Tras declarar las dos variables necesarias (oHoja y dSuma) y acceder al objeto Hoja (oHoja = ThisComponent.getSheets().getByName("Hoja1")) recurrimos a la función (FuncionCalc()), asignando el dato que devuelve ésta a la variable dSuma. Dado que se trata de una función, cuenta (en este caso) con dos parámetros, que son los que pasamos por valor en la formulación de la llamada a la función (FuncionCalc( "SUM", Array(oHoja.getCellRangeByName("A1:A12")) )):
- El primero es el nombre de la función Calc (en inglés) ("SUM")
- Y el segundo, mucho más complejo, es la matriz de datos formada por el contenido del conjunto de celdas A1:A12, esto es: los datos que requiere la función Calc (Array(oHoja.getCellRangeByName("A1:A12"))) (6)
Después utilizamos el resultado devuelto por la función para mostrarlo en pantalla mediante MsgBox (MsgBox dSuma) (7)
Veamos a continuación el código de la función FuncionCalc():
Function FuncionCalc( Nombre As String, Datos() )
Dim oSFA As Object
oSFA = createUnoService( "com.sun.star.sheet.FunctionAccess" )
FuncionCalc = oSFA.callFunction( Nombre, Datos() )
End Function
Observa que la función tiene dos parámetros, uno de tipo texto y otro una matriz (Nombre As String, Datos()): son los mismos a los que damos valor desde el script (( "SUM", Array(oHoja.getCellRangeByName("A1:A12")))).
Además, la función cuenta con una variable de tipo objeto (oSFA) a la que se asigna el objeto UnoService de acceso a las funciones de Calc FunctionAccess. (createUnoService( "com.sun.star.sheet.FunctionAccess")) Esta asignación se basa en la estructura típica de acceso a las funciones nucleares de la suite LibreOffice, que, como sabes, está escrita en parte en Java, esto es: en un lenguaje orientado a objetos (POO)
Siguiendo la sintaxis de las funciones, asignamos al identificador de la actual el resultado de aplicar la función nombrada a la matriz de datos; como recordarás, ambos han sido pasados por valor desde el scriot (FuncionCalc = oSFA.callFunction(Nombre, Datos())). De este modo la función devuelve al script, el resultado de dicha función. (8)
Sub PruebaFuncionCalc1b
Dim oHoja As ObjectDim sResulta As DoubleoHoja = ThisComponent.CurrentController.ActiveSheetoHoja.getCellRangeByName("B15").Formula = "=SQRT(A15)"dResulta = oHoja.getCellRangeByName("B15").ValueMsgBox dResulta
End Sub
Como ves hay poco que añadir a lo visto en la explicación del script de base (PruebaFuncionCalc1a): únicamente sustituimos la expresión de la función anterior (SUM()) por la actual (SQRT()) (en inglés), con lo que no tienes mayor dificultad que recurrir al Asistente para funciones de Calc y traducir el nombre de la función al inglés. Los cambios de parámetros van incluidos en el procedimiento: para SUM() era necesaria una matriz de datos ("=SUM(A1:A12)") y para SQRT() únicamente una referencia a celda ("=SQRT(A15)")
El script PruebaFuncionCalc1c muestra la validez universal del procedimiento de sustitución que te acabo de explicar:
Sub PruebaFuncionCalc1c
Dim oHoja As ObjectDim sResulta As StringoHoja = ThisComponent.CurrentController.ActiveSheetoHoja.getCellRangeByName("B20").Formula = "=CONCATENATE(A20;A21;A22)"dResulta = oHoja.getCellRangeByName("B20").StringMsgBox dResulta
End Sub
De nuevo, es suficiente con escribir la sintaxis de la función Calc en la posición adecuada dentro del script para obtener el resultado deseado.
Pero aun hay más: podemos combinar varias funciones dentro de la misma expresión, del mismo modo que es posible construir una combinación de funciones Calc. El script PruebaFuncionCalc1d es una prueba de ello.
Sub PruebaFuncionCalc1d
Dim oHoja As ObjectDim dResulta As DoubleoHoja = ThisComponent.CurrentController.ActiveSheet
oHoja.getCellRangeByName("B13").Formula = "=SQRT(SUM(A1:A12))"
dResulta = oHoja.getCellRangeByName("B13").Value
MsgBox dResulta
End Sub
Aquí combinamos las funciones SQRT() y SUM() para obtener una función combinada en la que sobre la suma resultante de la matriz de datos A1:A12 solicitamos el cálculo de su raíz cuadrada ("=SQRT(SUM(A1:A12))"). El resultado se escribe en la celda B13. Como puedes comprobar, la sintaxis de la instrucción únicamente varía en la forma en que se llaman a ambas funciones, que es la misma que escribimos sobre la Línea de entrada de fórmulas de Calc.
Por tanto resulta evidente la ventaja de este modo de implementar funciones Calc en los script OOo Basic: es suficiente con escribir la fórmula según su sintaxis Calc, sustituyendo el nombre de la función por su equivalente en inglés. Es además importante establecer correctamente la referencia a los datos con los que trabajarán dichas funciones.
Documentos.
Pongo a tu disposición dos documento. El primero [FormulCalc.ods] es el documento Calc en el que puedes encontrar los ejemplos explicados en la entrada. El segundo [WIKI de OpenOffice] el enlace a la web donde encontrarás el listado de funciones Calc en inglés y en español.
No hay comentarios:
Publicar un comentario
Comenta esta entrada