FAQ Excel

FAQ ExcelConsultez toutes les FAQ
Nombre d'auteurs : 46, nombre de questions : 845, dernière mise à jour : 30 mars 2022
Sommaire→Les fonctions personnelles- Comment écrit-on une fonction de feuille de calcul ?
- Comment définir une donnée par défaut pour un argument de procédure type Optional ?
- Comment identifier la cellule qui a appelé la fonction ?
- Est-il possible d'ajouter une description pour une fonction personnalisée et de la placer dans une catégorie particulière ?
- Comment passer un nombre d'arguments variable dans une fonction ?
- Ou trouver des informations générales sur la création des fonctions complémentaires ?
- Comment lister par macro les catégories de fonctions Excel 2007 ?
- Pourquoi ma fonction personnelle renvoie une erreur 28, 'Espace pile insuffisant' ?
- Comment empêcher l'affichage d'une fonction dans la boîte de dialogue 'Insérer une fonction' mais permettre son utilisation dans tous les modules et dans la feuille de calcul ?
Il s'agit d'une fonction normale.Par exemple
Function InvChaine(Cellule As Range) As Variant
Dim MaChaine As String, cmpt As Long
If Len(Cellule.Value) = 0 Then
InvChaine = CVErr(xlErrValue)
Else
MaChaine = CStr(Cellule.Value)
For cmpt = Len(MaChaine) To 1 Step -1
InvChaine = InvChaine & Mid(MaChaine, cmpt, 1)
Next cmpt
End If
End Function
Si dans votre feuille vous écrivez la formule =invchaine(E2),
la cellule contiendra la chaine retournée, ou #VALEUR.
C'est possible en utilisant la syntaxe :
Optional [NomVariable] As [TypeVariable] = [Donnée par défaut]
Sub Test()
'Renvoie tous les arguments spécifiés
MsgBox MaProcedure(5, "fifi")
'Renvoie 5 et "mimi" car l'argument Optional (strPrenom) n'est pas précisé
MsgBox MaProcedure(5)
End Sub
Function MaProcedure(lngValeur As Long, Optional strPrenom As String = "mimi")
MaProcedure = lngValeur & vbCrLf & strPrenom
End FunctionUtilisez la propriété Application.Caller dans votre fonction personnelle. Celle-ci renvoie un objet Range correspondant à la cellule qui contient la formule d'appel.
Ce premier exemple renvoie les coordonnées de la cellule qui a déclenché la fonction :
Cible = Application.Caller.AddressVous pouvez ainsi identifier l'adresse de la cellule dans laquelle vous avez saisi une fonction personnelle :
Function AdresseCellule()
AdresseCellule = Application.Caller.Address
End FunctionEt la formule suivante renverra la référence de la cellule :
=AdresseCellule()
La fonction suivante identifie le nom de la feuille qui contient la formule. Elle peut aussi servir à afficher le nom de la feuille active dans une cellule :
Function FeuilleActive() As String
Application.Volatile
FeuilleActive = Application.Caller.Worksheet.Name
End FunctionEt vous insérez dans une cellule :
=FeuilleActive()
A partir d'Excel 2003, une nouvelle propriété est disponible : ThisCell.
Cette propriété renvoie la cellule à partir de laquelle la fonction définie par l'utilisateur
est appelée en tant qu'objet Range.
Function AdresseCellule()
AdresseCellule = Application.ThisCell.Address
End FunctionRemarque :
Lorsque la référence est une plage de cellules (cas d'une formule matricielle), ThisCell renvoie la première
cellule en haut et à gauche dans le tableau alors que Caller renvoie le tableau complet.
Dans l'éditeur de macros :
Utilisez le raccourci clavier F2 pour afficher l'explorateur d'objets.
Sélectionnez "VBAproject" dans le menu déroulant.
Votre fonction apparait dans la fenêtre de droite.
Faites un clic droit.
Sélectionnez l'option "Propriétés".
Saisissez la description pour la fonction.
Cliquez sur le bouton OK pour valider.
Une autre solution, en passant pas la boîte de dialogue des macros :
Menu Outils
Macro
Macros
Dans le champ "Nom de la macro", saisissez le nom complet de la fonction.
Le bouton " Options" est alors accessible pour ajouter la description.
Cliquez sur le bouton OK pour valider.
Cette action peut aussi être réalisée par macro :
Cet exemple ajoute une description et place la fonction dans la catégorie 5 (Recherche et matrices).
La macro n'a besoin d'être lancée qu'une seule fois. Les paramètres seront ensuite définitivement enregistrés dans l'application.
Application.MacroOptions Macro:="NomFonction", _
Description:="La description pour ma fonction personnalisée.", Category:=5Liste des catégories Excel 2007 :
1 Finances
2 Date Heure
3 Math Trigo
4 Statistiques
5 Recherche Matrices
6 Base de données
7 Texte
8 Logique
9 Information
10 Commandes
11 Personnalisation
12 Contrôle de macros
13 DDE/Externe
14 Personnalisées
15 Ingénierie
16 Cube
Utilisez ParamArray.
Les tableaux de paramètres permettent de passer un tableau d'arguments à une procédure.
Le nombre d'éléments indiqué peut être variable.
ParamArray:
* Doit obligatoirement être déclaré en type Variant.
* Ne peut pas coexister avec des arguments Optional.
* Doit être placé en dernière position dans la liste des arguments.
* Les arguments ne sont pas facultatifs.
* Chaque argument peut être d'un type de données différent.
* Le nombre d'arguments n'est pas limité.
* L'indice inférieur du tableau est toujours 0.
Lorsque l'appel de procédure est effectué, chaque argument fourni dans l'appel devient un élément indexé du tableau.
Un exemple qui supprime une série de caractères dans une chaîne :
Option Explicit
Sub Test()
Dim strChaine As String
strChaine = "m!im::i;"
'La procédure va supprimer les caractères ; : !
'dans la variable "Chaine"
strChaine = SupprimeCaracteres(strChaine, ";", ":", "!")
MsgBox strChaine
End Sub
Function SupprimeCaracteres(LeTexte As String, ParamArray A_Supprimer1())
Dim i As Integer
'Boucle sur les éléments du tableau
For i = 0 To UBound(A_Supprimer1())
'Supprime les caractères spécifiés
LeTexte = Replace(LeTexte, A_Supprimer1(i), "")
Next i
SupprimeCaracteres = LeTexte
End FunctionSi vous utilisez ParamArray dans une fonction, ajoutez le chiffre 1 en fin de nom du paramètre. Ainsi l'assistant de fonctions Excel incrémentera automatiquement chaque nouvel élément indiqué par l'utilisateur.
Ce tutoriel présente la création et l'utilisation des fonctions complémentaires dans Excel :
Adapté pour Excel 2007, d'une procédure initiale de Laurent Longre ( http://www.xcell.excelabo.net/).
Sub ListeCategories()
Dim NomCat As String
Dim i As Integer
'Adapté pour Excel 2007, d'une procédure initiale de Laurent Longre.
Do
i = i + 1
Application.ExecuteExcel4Macro "DEFINE.NAME(""Cible" & i & """,0,2,,," & i & ")"
NomCat = Names("Cible" & i).Category
Debug.Print i & ": " & NomCat
Application.ExecuteExcel4Macro "DELETE.NAME(""Cible" & i & """)"
Loop Until NomCat = "User Defined" And i > 14
End SubSi la fonction contient une boucle récursive (fonction qui s'appelle elle même), veillez à prévoir une condition de sortie dans la procédure, sinon l'exécution se termine par une erreur 28.
Une sortie de la fonction peut être déclenchée :
* Lorsqu'une condition est vérifiée.
* Quand un nombre d'itérations maximum est atteint.
L'instructions de sortie est :
* Exit Function
Cette instruction permet de quitter immédiatement la procédure Function.
L'exécution se poursuit par l'instruction suivant celle qui a appelé l'instruction Function.
Insérez l'instruction "Option Private Module" en tête du module standard qui va contenir votre fonction :
Option Private Module
Function MaFonction()As Double
MaFonction = 10.782
End FunctionLa fonction est alors utilisable dans tous les modules et depuis les feuilles de calcul du classeur qui la contient mais n'apparait pas dans la boîte de dialogue 'Insérer une fonction'.




