diumenge, 22 d’agost del 2010

Com invocar una funció de calc des d'una macro?

La idea central és invocar la funció a través del servei UNO com.sun.star.sheet.FunctionAccess. Cal passar dos arguments: el nom de la funció, en anglès, que volem executar; i un Array amb els paràmetres que demana la funció.


la llista de funcions en anglès la podem trobar a la wiki: http://wiki.services.openoffice.org/wiki/Documentation/How_Tos/Calc:_Functions_listed_by_category


En l'exemple invocarem la funció BDEXTREU (DGET en anglès) que permet trobar en un rang de cel·les aquella que verifica unes determinades condicions. Els paràmetres de BDEXTREU (DGET) també els trobem a la wiki:
http://wiki.services.openoffice.org/wiki/Documentation/How_Tos/Calc:_DGET_function

En una fulla de Calc posaré els següents valors en el rang B1:D22. Aquesta serà la taula de dades:





id nom valor
1 a aa
2 b bb
3 c cc
4 d dd
5 e ee
6 f ff
7 g gg
8 h hh
9 i ii
10 j jj
11 k kk
12 l ll
13 m mm
14 n nn
15 o oo
16 p pp
17 q qq
18 r rr
19 s ss
20 t tt
21 u uu


I en el rang B24:D25 hi poso les condicions de cerca. Els títols han de coincidir amb els de la taula de dades





id nom valor
8




Poso que em cerqui el valor ID=8


Aleshores, en una altre cel·la verifico que la funció troba el valor posant:


=BDEXTREU(B1:D22;C1;B24:D25)


Que ho llegeixo així, en el rang de dades B1:D22, obté el valor de la columna de títol C1, que verifica les condicions expressades al rang B24:D25.


Les condicions que hi ha a B24:D25 són (ID=8) i (NOM pot ser qualsevol valor) i (VALOR pot ser qualsevol valor).


La funció retorna "h" com era d'esperar.


Aquesta és una funció molt útil per a fer cerques en fulles. Com puc utilitzar-la en una macro? Primer de tot, creo un nou mòdul de macros  i hi afegeixo el següent codi:



function MacroBDExtreu as String


   Dim oFuncio As Object
   Dim oFull As Object
   Dim oRangTaula As Object
   Dim oColumnaSelect As Object
   Dim oColumnaCondicions as Object
   Dim sRetorn As String

   oFull = ThisComponent.Sheets.getByName("Full1")


   oRangTaula = oFull.getCellRangeByName("B1:D22")
   oColumnaSelect = oFull.getCellByPosition(2, 0)
   oColumnaCondicions = oFull.getCellRangeByName("B24:D25")


   oFuncio = createUnoService("com.sun.star.sheet.FunctionAccess") 
   
   ' Invoca la funció pel seu nom en anglès: BDEXTREU --> DGET
   sRetorn = oFuncio.callFunction("DGET", _
                                  Array(oRangTaula, _
                                        oColumnaSelect.String, _
                                        oColumnaCondicions)) 
   
   MsgBox(sRetorn)


   MacroBDExtreu = sRetorn
End Function


I invoquem la macro que ens mostra un missatge amb la dada trobada.

Cap comentari:

Publica un comentari a l'entrada