Macros

    From The Document Foundation Wiki
    < Macros‎ | Calc


    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