Excel UDF ne fonctionne pas : problèmes et solutions

  • Partage Ça
Michael Brown

Dans cet article, nous allons examiner les problèmes que vous pouvez rencontrer lorsque vous utilisez des fonctions personnalisées dans vos classeurs. J'essaierai de vous montrer ce qui les provoque et comment les résoudre facilement.

Voici de quoi nous allons parler :

    Plus tôt, nous avons parlé de ce qu'est une fonction personnalisée, de la façon de la créer et de l'utiliser. Si vous avez besoin de rafraîchir vos connaissances de base sur les UDF, faites une pause et consultez mon article précédent.

    Pourquoi Excel UDF ne recalcule-t-il pas ?

    Lorsque vous apportez des modifications à votre classeur, Excel ne recalcule pas toutes les formules qu'il contient, mais uniquement celles qui sont liées aux cellules modifiées.

    Mais cela concerne les fonctions Excel standard. Quant aux fonctions personnalisées, Excel ne peut pas valider le code VBA et identifier les autres cellules qui pourraient également affecter le résultat de la fonction personnalisée. Par conséquent, votre formule personnalisée peut ne pas changer lorsque vous apportez des modifications au classeur.

    Pour résoudre ce problème, il vous suffit d'utiliser la fonction Application.volatile Consultez le chapitre suivant pour apprendre les instructions étape par étape sur la façon de l'appliquer.

    Fonctions personnalisées volatiles et non volatiles

    Par défaut, les fonctions personnalisées d'Excel ne sont pas volatiles. Cela signifie que l'UDF est recalculée uniquement si la valeur de l'une des cellules auxquelles elle se réfère change. Mais si le format des cellules, le nom de la feuille de calcul, le nom du fichier changent, l'UDF ne sera pas modifiée.

    Passons des mots aux exemples. Par exemple, vous devez écrire le nom de votre classeur dans une cellule. Pour ce faire, vous créez une fonction personnalisée :

    Function WorkbookName() As String WorkbookName = ThisWorkbook.Name End Function

    Imaginez maintenant le cas suivant : vous avez écrit une formule personnalisée =Nom du livre de travail() dans la cellule et vous avez obtenu le nom du fichier. Plus tard, vous avez décidé de renommer le fichier et vous l'avez enregistré sous un autre nom. Mais vous regardez la valeur dans la cellule et vous voyez qu'elle n'a pas changé. Il y a toujours un ancien nom de fichier qui n'est plus correct.

    Comme cette fonction ne contient aucun argument, elle n'est pas recalculée (même si vous changez le nom du classeur, le fermez, puis le rouvrez).

    Remarque : pour recalculer toutes les fonctions de votre fichier, vous pouvez utiliser le raccourci Ctrl + Alt + F9.

    Existe-t-il un moyen plus simple ? Pour que la formule recalcule chaque fois que la feuille de calcul change, vous avez besoin d'une ligne de code supplémentaire. Collez le morceau de code suivant au début de votre fonction :

    Application.volatile

    Ainsi, votre code ressemblera à ceci :

    Function WorkbookName() As String Application.Volatile WorkbookName = ThisWorkbook.Name End Function

    Votre UDF est maintenant volatile, il sera donc recalculé automatiquement si une cellule de la feuille de calcul a été recalculée ou si un changement est intervenu dans le classeur. Dès que vous changez le nom du fichier, vous verrez cette mise à jour immédiatement.

    Remarque. Gardez à l'esprit que trop de fonctions volatiles peuvent ralentir votre Excel. En effet, il existe trop de fonctions personnalisées qui effectuent des calculs complexes et opèrent en permanence sur de grandes plages de données.

    Par conséquent, je recommande de n'utiliser la volatilité que lorsqu'elle est vraiment nécessaire.

    Pourquoi les fonctions personnalisées ne sont pas disponibles

    Lorsque vous saisissez les premières lettres du nom d'une fonction personnalisée, celle-ci apparaît dans la liste déroulante à côté de la cellule de saisie, tout comme les fonctions Excel standard.

    Cependant, cela ne se produit pas toujours. Quelles sont les erreurs qui peuvent provoquer cette situation ?

    Si vous avez Excel 2003-2007, l'UDF n'apparaît jamais dans la liste déroulante, où vous ne voyez que des fonctions standard.

    Mais même si vous utilisez une version plus récente d'Excel, il existe une autre erreur que vous pouvez commettre accidentellement.

    Vous voyez, la fonction personnalisée doit se trouver dans un module VBA standard appelé Modules. Lorsque vous ajoutez un nouveau module pour écrire le code de la fonction, un dossier Modules est automatiquement créé dans lequel tous les modules sont écrits.

    Mais il arrive parfois qu'un nouveau module ne soit pas créé. Sur la capture d'écran suivante, vous pouvez voir que le code de la fonction personnalisée est dans le module "Microsoft Excel Objects" avec ThisWorkbook.

    L'idée est que vous ne pouvez pas placer une fonction personnalisée dans la zone de code d'une feuille de calcul ou d'un classeur. Dans ce cas, la fonction ne fonctionnera pas. De plus, elle n'apparaîtra pas dans la liste déroulante des fonctions. Par conséquent, le code doit toujours se trouver dans le dossier Modules .

    Le texte d'aide des fonctions personnalisées d'Excel ne s'affiche pas

    Un autre problème peut se poser : l'info-bulle que vous voyez lorsque vous collez une fonction personnalisée. Si vous utilisez une fonction standard, vous verrez toujours une info-bulle pour la fonction et pour ses arguments. Mais qu'en est-il des UDF ?

    Si vous avez beaucoup de fonctions personnalisées, il vous sera extrêmement difficile de vous souvenir des calculs effectués par chacune d'entre elles. Il sera encore plus difficile de vous souvenir des arguments à utiliser. Je pense que ce sera une bonne idée d'avoir une description de vos fonctions personnalisées comme aide-mémoire.

    Pour cela, je suggère d'utiliser le Application.MacroOptions Il vous aidera à afficher la description non seulement de la fonction mais aussi de chacun de ses arguments dans la fenêtre de l'assistant de fonction. Vous voyez cette fenêtre lorsque vous cliquez sur le bouton Fx dans la barre de formule.

    Voyons comment ajouter une telle indication à vos UDF. Dans l'article précédent, nous avons examiné la fonction personnalisée GetMaxBetween. Elle trouve le nombre maximum dans la plage spécifiée et prend trois arguments : une plage de valeurs numériques, et une valeur maximum et minimum à rechercher.

    Maintenant, nous allons ajouter une description pour cette fonction personnalisée. Pour ce faire, créez et exécutez la commande Application.MacroOptions Pour le GetMaxBetween vous pouvez exécuter la commande suivante :

    Sub RegisterUDF () Dim strFuncName As String 'nom de la fonction que vous voulez enregistrer Dim strDescr As String ' description de la fonction elle-même Dim strArgs () As String 'description des arguments de la fonction ' Enregistre la fonction GetMaxBetween ReDim strArgs (1 To 3) 'Nombre d'arguments dans votre fonction strFuncName = "GetMaxBetween" strDescr = "Nombre maximum dans la plage spécifiée" strArgs (1) ="Plage de valeurs numériques" strArgs (2) = "Limite inférieure de l'intervalle" strArgs (3) = "Limite supérieure de l'intervalle" Application.MacroOptions Macro : = strFuncName, _ Description : = strDescr, _ ArgumentDescriptions : = strArgs, _ Category : = "My Custom Functions" End Sub

    ou

    Sub RegisterUDF () Application.MacroOptions Macro : = "GetMaxBetween" , _ Description : = "Nombre maximum dans la plage spécifiée" , _ Category : = "My Custom Functions" , _ ArgumentDescriptions : = Array (_ "Range of numeric values" , _ "Lower interval border" , _ "Upper interval border" ) End Sub

    Variable str FuncName est le nom de la fonction. strDescr - La description de la fonction. strArgs Les variables contiennent des indices pour chaque argument.

    Vous vous demandez peut-être quel est le quatrième argument d'Application.MacroOptions. Cet argument facultatif s'appelle Catégorie et indique la classe des fonctions Excel que notre personnalisation GetMaxBetween () Vous pouvez la nommer d'après l'une des catégories existantes : Math & ; Trig, Statistical, Logical, etc. Vous pouvez spécifier un nom pour la nouvelle catégorie dans laquelle vous placerez les fonctions que vous créez. Si vous n'utilisez pas l'argument Category, la fonction personnalisée sera automatiquement placée dans la catégorie "User Defined".

    Collez le code de la fonction dans la fenêtre du module :

    Cliquez ensuite sur le bouton "Run" (Exécuter). La commande effectuera tous les réglages nécessaires à l'utilisation de l'outil de gestion de l'information. Fx avec votre GetMaxBetween() fonction.

    Si vous essayez d'insérer une fonction dans une cellule à l'aide de la fonction Fonction d'insertion vous verrez qu'il y a votre GetMaxBetween se trouve dans la catégorie "Mes fonctions personnalisées" :

    Vous pouvez simplement commencer à taper le nom de la fonction dans la cellule et vous verrez votre fonction personnalisée dans la liste déroulante des fonctions à sélectionner.

    Ensuite, appelez le Assistant de fonction avec le bouton Fx.

    Conseil : vous pouvez également utiliser la combinaison de touches CRTL + A pour ouvrir l'assistant de fonction.

    Dans le Assistant de fonction vous verrez une description de votre fonction, ainsi qu'une indication pour le premier argument. Si vous placez votre curseur sur le deuxième ou le troisième argument, vous verrez également des indications pour ceux-ci.

    Si vous souhaitez modifier le texte de ces indications, modifiez les valeurs des paramètres suivants strDescr et strArgs dans les RegisterUDF () Ensuite, exécutez le RegisterUDF () de nouveau.

    Si vous voulez annuler tous les réglages effectués et effacer la description de la fonction, exécutez ce code :

    Sub UnregisterUDF () Application.MacroOptions Macro : = "GetMaxBetween" , _ Description : = Empty , ArgumentDescriptions : = Empty , Category : = Empty End Sub

    Il existe un autre moyen d'obtenir un indice lorsque vous entrez dans une fonction personnalisée. Saisissez le nom de la fonction, puis appuyez sur les touches Ctrl + Shift + A :

    =GetMaxBetween( + Ctrl + Shift + A

    Vous verrez une liste de tous les arguments de la fonction :

    Malheureusement, ici vous ne verrez pas la description de la fonction et de ses arguments. Mais si les noms des arguments sont assez informatifs, alors ils pourraient être utiles aussi. Tout de même, c'est mieux que rien :)

    Il faudra un peu plus de travail pour créer un intellisense pour les UDF qui fonctionnent comme des fonctions Excel standard. Malheureusement, Microsoft ne fournit aucune option. La seule solution disponible est actuellement une extension Excel-DNA IntelliSense. Vous pouvez trouver plus d'informations sur le site du développeur.

    Nous espérons que ces directives vous aideront à résoudre les problèmes lorsque votre fonction personnalisée ne fonctionne pas ou ne fonctionne pas comme vous le souhaiteriez. Si toutefois votre UDF ne fonctionne toujours pas, veuillez décrire précisément votre problème dans la section Commentaires. Nous essaierons de le comprendre et de trouver la solution pour vous ;)

    Michael Brown est un passionné de technologie passionné par la simplification de processus complexes à l'aide d'outils logiciels. Avec plus d'une décennie d'expérience dans l'industrie de la technologie, il a perfectionné ses compétences dans Microsoft Excel et Outlook, ainsi que dans Google Sheets et Docs. Le blog de Michael est dédié au partage de ses connaissances et de son expertise avec les autres, en fournissant des conseils et des tutoriels faciles à suivre pour améliorer la productivité et l'efficacité. Que vous soyez un professionnel chevronné ou un débutant, le blog de Michael offre des informations précieuses et des conseils pratiques pour tirer le meilleur parti de ces outils logiciels essentiels.