Macros

From The Document Foundation Wiki
< Macros‎ | Calc
Jump to: navigation, search

Comment lister les fonctions disponibles dans le tableur ?

On souhaite récupérer dans un tableau la liste des fonctions du tableur, y compris celles de la catégorie Add-In.

Nous utilisons pour cela le service FunctionDescriptions[1] qui renvoie cette collection. Les éléments retournés sont des structures dont les propriétés sont collectées dans le service FunctionDescription[2].

Ces propriétés sont :

Id Identifiant unique
Category Catégorie[3]
Name Nom localisé (en français pour nous)
Description Description localisée
Arguments liste localisée des arguments de la fonction

La procédure crée la liste des fonctions dans la première feuille du classeur, colonnes A à D.

  • Nom
  • Catégorie
  • Arguments
  • Description

La liste des arguments d'une fonction est une structure FunctionArgument[4].

Seule nous intéresse ici la propriété Name de cette structure, contenant le ou les arguments. Les fonctions n'ont pas toutes un argument : PI, VRAI, ALEA, etc. n'en utilisent pas par exemple. La procédure teste cela par la fonction ISEMPTY. Si la propriété n'est pas vide (il y a des arguments), une boucle sur ces derniers alimente une variable tableau provisoire qui sera ensuite "jointe" via l'instruction JOIN. Cette astuce permet d'insérer le séparateur ";" entre chaque argument.

La catégorie[3] nécessite également un traitement particulier car la propriété retournée par le service est de type long. Il s'agit de constantes FunctionCategory[5]. La traduction en chaîne de caractères est assurée par la fonction PysLibCateg.

Code de la macro :

sub PysListerFonctions

dim oFD as object, oFeuille as object, oUneF as object
dim oUnArg as new com.sun.star.sheet.FunctionArgument
dim i as long, j as long
dim sProv() as string

oFD = CreateUnoService("com.sun.star.sheet.FunctionDescriptions")

thiscomponent.lockcontrollers

oFeuille = thiscomponent.sheets.getByIndex(0)

oFeuille.getCellByPosition(0, 0).string = "Nom"
oFeuille.getCellByPosition(1, 0).string = "Catégorie"
oFeuille.getCellByPosition(2, 0).string = "Argument(s)"
oFeuille.getCellByPosition(3, 0).string = "Description"
oFeuille.getCellRangeByName("A1:D1").cellstyle= "Heading"

for i = 0 to oFD.getCount() - 1
        oUneF = oFD.getByIndex(i)
        oFeuille.getCellByPosition(0, i + 1).string = oUneF(2).value
        oFeuille.getCellByPosition(1, i + 1).string = PysLibCateg(oUneF(1).value)
        if not(isempty(oUneF(4).value)) then     
                redim sProv(ubound(oUneF(4).value))
                for j = 0 to ubound(oUneF(4).value)
                        sProv(j) = oUneF(4).value(j).name
                next j
                oFeuille.getCellByPosition(2, i + 1).string = join(sProv(), ";")
        end if
        oFeuille.getCellByPosition(3, i + 1).string = oUneF(3).value
next i

thiscomponent.unlockcontrollers

msgbox "Terminé", 64, "Liste des fonctions"

end sub

function PysLibCateg(lNumCat as long) as string
dim sLibCat as string

sLibCat = "N/D"

select case lNumCat
        case com.sun.star.sheet.FunctionCategory.DATABASE
                sLibCat = "Base de données"
        case com.sun.star.sheet.FunctionCategory.DATETIME
                sLibCat = "Date&Heure"
        case com.sun.star.sheet.FunctionCategory.FINANCIAL
                sLibCat = "Finances"
        case com.sun.star.sheet.FunctionCategory.INFORMATION
                sLibCat = "Information"
        case com.sun.star.sheet.FunctionCategory.LOGICAL
                sLibCat = "Logique"
        case com.sun.star.sheet.FunctionCategory.MATHEMATICAL
                sLibCat = "Mathématique"
        case com.sun.star.sheet.FunctionCategory.MATRIX
                sLibCat = "Matrice"
        case com.sun.star.sheet.FunctionCategory.STATISTICAL
                sLibCat = "Statistique"
        case com.sun.star.sheet.FunctionCategory.SPREADSHEET
                sLibCat = "Classeur"
        case com.sun.star.sheet.FunctionCategory.TEXT
                sLibCat = "Texte"
        case com.sun.star.sheet.FunctionCategory.ADDIN
                sLibCat = "Add-in"
end select

PysLibCateg = sLibCat

end function


Télécharger le classeur exemple


Notes :

  1. Voir la documentation de l'API
  2. Voir la documentation de l'API
  3. 3.0 3.1 Il s'agit de la catégorie utilisée dans l'Assistant Fonctions ou la Liste des fonctions (menu Insertion ▸ Liste des fonctions) pour regrouper les fonctions par type
  4. Voir la documentation de l'API
  5. Voir la documentation de l'API