Jump to content

Macros

From The Document Foundation Wiki


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