Fonction utilisateur personnalisée sans utiliser VBA

10

Est-il possible de créer une fonction utilisateur personnalisée dans Excel sans utiliser VBA?
Mon problème est que j'ai une longue chaîne de fonctions Excel standard enchaînées pour créer une fonction très longue. Cette fonction est utilisée dans 25 feuilles de calcul différentes de mon classeur. Si je dois y apporter des modifications, j'aimerais le faire en un seul endroit et faire en sorte que les modifications se propagent automatiquement sur toutes les feuilles.

Par exemple, un cas simple et trivial serait d'en ajouter un au résultat de SUM (), c'est-à-dire. SUM (mySeries) +1, et appelez-la une nouvelle fonction MYSUM ().

J'hésite à traduire la formule longue en VBA en raison des erreurs potentielles qui pourraient survenir et de la complexité supplémentaire.

DakotaD
la source
Belle question, mais je doute que vous trouviez une réponse. Je pense qu'un meilleur cours serait de demander de l'aide pour construire la fonction requise dans VBA.
EliadTech

Réponses:

11

Oui, c'est possible si vous utilisez des formules nommées Excel .

Par exemple, supposons que vous devez calculer la différence entre les sommes de deux colonnes consécutives ( A5: Axe - B5: Bx ) à différents endroits de votre classeur ( x est la dernière ligne de chaque colonne):

Vous définissez donc dans A11 un nom appelé diff (n'importe quel nom peut être utilisé) comme = Sum (A $ 5: A10) -Sum (B $ 5: B10) , en supposant que les données commencent dans la ligne 5 jusqu'à la ligne précédente. Il peut s'agir de n'importe quelle cellule, pas seulement A11 , mais la définition change de la même manière.

Malheureusement, Excel 2010 insère des préfixes absolus ( $ ) et des préfixes de feuille de calcul, vous devez donc effacer les préfixes, mais en gardant les points d'exclamation et en supprimant la plupart des caractères $ .

Lorsque vous déplacez les formules, la plupart des références sont relatives. Il calcule donc toujours la différence entre la colonne actuelle et les suivantes, en commençant par la ligne 5 jusqu'à la ligne avant la ligne totale.

Donc, si vous avez des données entre C5 et D100, vous mettez juste = Diff dans C101 et il calcule Sum (C5: C100) - Sum (D5: D100) .

De toute évidence, vous pouvez utiliser des noms locaux ou globaux dans les formules nommées, comme vous l'avez mentionné dans votre question.

Vous pouvez lire plus de détails dans les formules nommées .

Paulo Buchsbaum
la source
2

Je sais que vous avez dit non VBA, mais en procédant comme suit, vous ne devez PAS réellement réécrire vos formules, en savoir beaucoup sur VBA, ni conserver vos formules dans VBA. Vous pouvez l'écrire une fois et l'oublier.

Créez une fonction définie par l'utilisateur pour extraire la formule d'une cellule sous forme de chaîne:

Function GetFormula(Target As Range) As String
    GetFormula = Target.Formula
End Function

Créez-en un autre pour évaluer une chaîne comme une formule:

Function Eval(Ref As String)
    Application.Volatile
    Eval = Evaluate(Ref)
End Function

Si vous aviez votre formule principale dans la feuille sheet1! A1, vous la mettriez dans chaque cellule qui a besoin de l'utiliser:

=eval(getformula(sheet1!a1))
Madball73
la source
Quel est l'avantage d'utiliser cette méthode par rapport aux formules nommées Excel?
DakotaD
Cela définit en fait une fonction, tandis que "Formules nommées" définit simplement une référence à un résultat. Par exemple, si je veux créer une fonction qui vérifiera si une cellule est vide ou juste un espace, je voudrais l'appeler comme =IF(BlankOrWhitespace(A5),true,false). Pour les formules nommées, ce n'est pas possible car vous faites référence au contenu de la formule d'une cellule et ne définissez pas de nouvelle fonction
mtalexan
1
Il y a un autre problème qui découle de l'utilisation de VBA. Sécurité. Votre classeur serait considéré comme dangereux car VBA peut être utilisé abusivement. Votre classeur serait confondu avec un virus.
Akangka
@Akangkathe raison pour laquelle j'évite VBA. C'est tellement triste.
Pedro77
0

Ce fil est un peu vieux, mais je suis tombé dessus en cherchant autre chose et j'ai pensé partager un classeur que j'avais créé il y a quelque temps en essayant d'accomplir cette chose exacte: https://www.dropbox.com/s/gf5qrjj5q81tpke/ Title_Case_Named_Range_Function.xlsx? Dl = 1

En bref, vous POUVEZ créer un UDF sans VBA (en quelque sorte) en détournant l'une des formules intégrées d'Excel avec une sortie de chaîne de longueur 0 et en proposant une méthode pour interpréter les données insérées via la manipulation de chaîne de plage nommée, mais c'est au-delà inefficace de le faire. TU AS ÉTÉ PRÉVENU! :)

MÉTHODE:

  1. Dans l'exemple, j'ai utilisé à la fois = REPT ([référence de cellule ou du texte entre guillemets ici], 0) et = TEXT ([référence de cellule ou du texte entre guillemets ici], ";;;") comme point de départ à capable d'avoir une certaine forme d'entrée utilisateur dans une formule intégrée qui ne produirait aucun résultat de texte visible dans la cellule elle-même.

  2. Ensuite, j'ai créé une plage nommée qui serait l'équivalent de votre nom UDF ( TCase est l'exemple principal de la feuille, mais il y a également plusieurs autres variantes). Cette plage nommée fait référence à une multitude d'autres noms masqués dans le classeur pour extraire le FormulaText de la cellule dans laquelle il est utilisé, puis lui applique une logique pour produire une sortie finale sous forme de chaîne. Il convient de noter que cette méthode ne peut renvoyer que des résultats textuels et non des nombres (bien qu'elle puisse renvoyer un nombre sous forme de texte à convertir dans une cellule distincte).

  3. À lui seul, = TCase génère une erreur car il n'y a pas de référence de cellule / chaîne à interpréter (dans la feuille d'exemple, le message d'erreur n'est qu'un rappel du format à suivre). Mais, la combinaison de TCase avec la formule Excel de chaîne de longueur 0 attendue lui permet de lire l'entrée de la formule sous forme de chaîne et de lui appliquer votre logique. Au final, la formule / sortie ressemblerait à quelque chose comme ci-dessous. Notez que j'ai inséré la chaîne de texte directement dans la formule ci-dessous, mais vous verrez dans la feuille d'exemple qu'elle peut également interpréter une référence de cellule unique.

    FORMULE:
    =TCase&REPT("i want to convert this mIxEd sTRing into A TITLE cAsE string!!!",0)

    PRODUCTION:

    I Want to Convert This Mixed String Into a Title Case String!!!

En fin de compte, je ne recommanderais pas de suivre cette méthode pour autre chose qu'une curiosité morbide pour voir dans quelles limites Excel peut être poussé. VBA est une solution UDF beaucoup plus simple et élégante, mais je me suis au moins amusé à relever le défi.

REMARQUE: si vous souhaitez voir comment cela fonctionne un peu plus facilement dans le fichier d'exemple, utilisez la formule Évaluer la formule du ruban Formules et entrez / sortez de la formule dans l'une des cellules où j'ai inséré un exemple. J'ai caché toutes les plages nommées sous-jacentes pour tout nettoyer après avoir terminé, afin qu'elles n'apparaissent pas dans le gestionnaire de noms, sauf si vous les affichez toutes.

Église
la source