FAQ Excel
FAQ ExcelConsultez toutes les FAQ
Nombre d'auteurs : 46, nombre de questions : 845, dernière mise à jour : 30 mars 2022
- 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
Function
Utilisez 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.Address
Vous pouvez ainsi identifier l'adresse de la cellule dans laquelle vous avez saisi une fonction personnelle :
Function
AdresseCellule
(
)
AdresseCellule =
Application.Caller.Address
End
Function
Et 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
Function
Et 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
Function
Remarque :
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:=
5
Liste 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
Function
Si 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
Sub
Si 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
Function
La 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'.