IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Excel Discussion :

EXCEL : LAMBDA, la fonction qui permet de créer des fonctions


Sujet :

Excel

  1. #1
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut EXCEL : LAMBDA, la fonction qui permet de créer des fonctions
    Salut.


    Exclusivité Excel 365


    La fonction LAMBDA, on en parle depuis longtemps.

    Elle est apparue dans les versions Insider d'Office, mais elle est maintenant disponible, en tout cas sur ma version (Microsoft 365 apps for Entreprise) =>

    Cette fonction permet de mémoriser une formule en lui donnant un alias, et de passer des arguments à cette formule et donc, de la transformer en fonction. On avait déjà LET qui permet d'utiliser des variables au sein d'une formule, que Lambda vient compléter pour donner encore plus de puissance à vos formules Excel. Sa syntaxe est simple:
    Code excel : Sélectionner tout - Visualiser dans une fenêtre à part
    =LAMBDA(Par1;Par2;...;ParN;Formule utilisant les arguments)

    On pouvait déjà, par le passé:
    • créer des fonctions personnalisées en VBA, mais il faut savoir programmer, d'une part, et d'autre part cela transforme le fichier en xlam, amenant un risque de sécurité;
    • créer des formules nommées, mais cela imposait une conception de classeur puisque les formules nommées sont liées à des cellules.


    Dans un prochain billet, j'illustrerai ces deux méthodes.


    La fonction LAMBDA permet d'oublier le VBA, si la formule est exprimable en Excel, et découple la formule de la cellule dans laquelle elle est utilisée.


    Elle permet de créer une fonction dans Excel que l'on utilise comme une fonction native. Prenons comme exemple le calcul du volume d'un cylindre dont on connaît le diamètre et la hauteur. Ok, on peut le faire par formule: = (A2/2)^2*PI()*B2, avec A2 pour le diamètre et B2 pour la hauteur. Et comme on peut le faire par formule, on peut utiliser LAMBDA. Il pourra alors être intéressant d'avoir une fonction toute faite: =VolumeCylindre(A2,B2).


    Nom : 2022-02-26_194252.png
Affichages : 1081294
Taille : 2,7 Ko

    Sympa, non? Et bien, LAMBDA permet de réaliser cela, et facilement, en plus.

    On crée une fonction en trois temps:
    1. On écrit la formule;
    2. On teste La fonction LAMBDA sur la feuille;
    3. On enregistre cette fonction LAMBDA dans le gestionnaire de noms et on lui donne le nom souhaité.



    1ère étape

    Nom : 2022-02-26_194940.png
Affichages : 13216
Taille : 3,8 Ko


    2ième étape

    On inclut la formule dans la fonction LAMBDA en:
    1. spécifiant d'abord les arguments (Diamètre et hauteur);
    2. remplaçant les références de cellule par les arguments, et l'on note que l'infobulle d'aide à la saisie propose les arguments définis en début de fonction;
    3. passant les arguments, entre parenthèses, après la parenthèse de la fonction Lambda (comme on le ferait pour n'importe quelle fonction native d'Excel.


    Nom : 2022-02-26_200748.png
Affichages : 13299
Taille : 47,3 Ko


    3ième étape

    1. On copie la formule sans les arguments utilisés pour la tester;
    2. On crée une fonction nommée dans le gestionnaire de noms;
    3. En référence, on colle la formule utilisant LAMBDA.


    Nom : 2022-02-26_201618.png
Affichages : 13273
Taille : 138,4 Ko

    A cette étape, on peut également ajouter une légende qui apparaitra en infobulle lors de la sélection de la fonction. A noter que, actuellement, cette description n'est pas reprise dans l'assistant Fonctions.

    Nom : 2022-02-27_150745.png
Affichages : 13212
Taille : 115,8 Ko



    Utilisation

    On utilise la fonction comme une fonction native d'Excel.

    Nom : 2022-02-26_202113.png
Affichages : 13101
Taille : 24,2 Ko


    La fonction est utilisable partout dans le classeur. Vous devrez la recréer dans chaque classeur dans lequel vous souhaitez l'utiliser. Un OneNote vous permettra de sauvergarder le code de la fonction dans votre bibliothèque de codes.

    Bien sûr, j'ai détaillé les étapes ici pour la prise en main de cette nouvelle fonction, mais vous pouvez évidemment saisir directement la fonction Lambda sans passer par l'étape 1, et rédiger la formule à l'intérieur de la fonction Lambda... Il est tout à fait possible de saisir la formule directement dans le gestionnaire de nom en l'encapsulant dans la fonction LAMBDA ou, pour la tester, la saisir dans une cellule, là aussi encapsulée dans LAMBDA. Toutefois, pour les formules un peu complexes, l'étape 1 peut être intéressante.



    Et pour vous, cette fonction est disponible?

    N'hésitez pas à la tester et à commenter ici vos impressions sur l'utilité de cette fonction.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  2. #2
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut Exemples d'utilisation
    Au delà de de la théorie sur la fonction, LAMBDA permet de simplifier la vie de l'utilisateur Excel, en mémorisant des formules dans des fonctions "clé sur porte". Quelques exemples parmi d'autres.


    Calcul du trimestre

    Il est parfois intéressant de retrouver le trimestre auquel appartient une date. Excel propose d'ailleurs cela dans les tableaux croisés dynamiques, ou la date est automatiquement éclatée en Année/Trimestre/Mois/Jour. Mais Excel ne propose pas (encore) de fonction TRIMESTRE. LAMBDA permet de pallier ce manque.

    Calculer le trimestre d'une date s'effectue avec la formule =ENT((MOIS(MaDate)-1)/3)+1. Il serait dès lors intéressant d'avoir la fonction TRIMESTRE, qui permettrait de faire abstraction de la formule:

    Nom : 2022-02-27_074343.png
Affichages : 8357
Taille : 73,9 Ko



    "Faire" du RECHERCHEX sans le savoir (1)

    Pour simplifier la recherche de valeurs dans une liste, on peut camoufler le RECHERCHEX derrière une fonction LAMBDA. Avec le tableau suivant nommé t_Contacts, on peut proposer à l'utilisateur une fonction pour retrouver rapidement le prénom d'un contact sur base de son matricule:

    Nom : 2022-02-27_075322.png
Affichages : 8332
Taille : 79,7 Ko




    "Faire" du RECHERCHEX sans le savoir (2)

    En utilisant INDIRECT, on peut généraliser la fonction pour retrouver la valeur de n'importe quelle colonne avec une fonction qui serait par exemple =CONTACT_CHAMP(Matricule; Champ).

    Nom : 2022-02-27_080149.png
Affichages : 8401
Taille : 86,4 Ko




    A vous, maintenant, de trouver d'autres utilisation de cette fonction qui permet aux utilisateurs de vos classeurs de faire abstraction des fonctions natives pour utiliser les fonctions "orientées classeur" que vous mettrez à leur disposition.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 420
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 420
    Points : 16 264
    Points
    16 264
    Par défaut
    Bonjour

    Dispo aussi sur 365 famille

    Merci pour ces exemples
    Chris
    PowerQuery existe depuis plus de 13 ans, est totalement intégré à Excel 2016 &+. Utilisez-le !

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

  4. #4
    Membre émérite
    Homme Profil pro
    ingénieur
    Inscrit en
    Mars 2015
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 1 058
    Points : 2 525
    Points
    2 525
    Par défaut
    Merci Pierre
    En parallèle à LAMBDA, il y a également une nouvelle série de fonctions "MAKEARRAY" sur 365 Famille (je n'ai pas la dernière version au bureau)
    - MAKEARRAY
    - SCAN
    - MAP
    - BYCOL
    - BYROW
    - REDUCE
    Ces fonctions ne sont pas traduites en français, les noms d'origine ont été conservés.

    Cela semble intéressant, à voir à l'usage. J'ai déjà beaucoup de collègues perdus avec les fonctions matricielles, l'utilisation des références A1#, ... J'ai peur que les utilisateurs "lambdas" soient un peu dépassés par ces formules.
    Les formations sont importantes mais pour que chacun s'approprie les nouveautés il faut pratiquer et là bien souvent on repart sur les bases connues et non sur ces nouveaux concepts.

    Stéphane

  5. #5
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    @Stéphane


    Je suis en train d'écrire un tuto sur LAMBDA, LET et les fonctions liées à LAMBDA que tu cites ici. Je nourrirai le tuto avec des exemples que j'espère pertinents


    @Chris

    Merci sur l'info relative à la disponibilité. Cela signifie que Lambda et ses dérivées sont disponibles sur les versions 365 normales (hors Insider)
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  6. #6
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Suite à cette discussion, petite création de fonction perso avec LAMBDA et LET pour permettre une saisie rapide d'un "temps". L'idée est de saisir une valeur horaire sans les séparateurs et la virgule pour les parties de secondes:
    1243564 => 12:43:56,4

    On crée une lambda que l'on enregistre dans le gestionnaire de noms et on lui donne un nom valide qui sera celui de la fonction utilisable en Excel. Dans l'exemple, j'ai nommé la lambda ConversionSaisie. La fonction ici illustre que LET peut utiliser les arguments de LAMBDA et que les variables de LET peuvent utiliser les variables qui ont été déclarées avant elles (H utilise T qui utilise V...)

    Code Excel : Sélectionner tout - Visualiser dans une fenêtre à part
    =LAMBDA(v;LET(t;TEXTE(v;"0000000");h;GAUCHE(t;2);m;STXT(t;3;2);s;STXT(t;5;2);n;DROITE(t;1);SI(ET(m>="00";m<="59";s>="00";s<="59");h/24+m/1440+s/86400+n/864000;#VALEUR!)))

    Nom : 2022-03-17_144500.png
Affichages : 8144
Taille : 6,8 Ko


    Il y a moyen de vraiment bien s'amuser
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  7. #7
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut REDUCE et LAMBDA
    On continue avec les fonctions REDUCE et LAMBDA.

    J'ai montré une utilisation de LAMBDA qui consiste à enregistrer une formule Excel en l'incluant dans LAMBDA => =LAMBDA([Arg1], [Arg2],..., [Arg127],Formule) dans le gestionnaire de noms puis en l'utilisant comme une fonction native à laquelle on passe les arguments requis.

    Mais comme l'a précisé Stéphane, on peut utiliser LAMBDA en combinaison avec d'autres fonctions, et notamment REDUCE qui fonctionne en boucle pour ramener le résultat final dans une cellule.

    Explications


    Soit à devoir supprimer les chiffres contenus dans une cellule pour ne garder que les lettres.

    Nom : 2022-03-18_205235.png
Affichages : 8245
Taille : 131,6 Ko

    En découpant le process, on peut comprendre que l'on va devoir remplacer 1 par "" dans la chaine initiale pour créer la chaine 1, puis 2 par "" dans la chaine 1 pour créer la chaine 2, ..., puis 0 par "" dans la chaine 9 pour créer la chaine finale.

    Nom : 2022-03-18_205703.png
Affichages : 8187
Taille : 109,7 Ko


    REDUCE, associée avec LAMBDA, va permettre cela, en partant d'une valeur initiale et en bouclant sur toutes les valeurs d'un tableau pour appliquer le LAMBDA.

    Syntaxe: REDUCE(ValeurInitiale; Matrice; Lambda(Arg1, Arg2, Formule)) dans laquelle Arg1 = ValeurInitiale et Arg2 = Matrice.

    Important: Il faut comprendre ici que Matrice peut être un tableau structuré (souvent une colonne de ce tableau), mais aussi une matrice constante.

    On remarque avec cette syntaxe que le Lambda reçoit ValeurInitiale et Tableau comme arguments 1 et 2. REDUCE va partir de la valeur initiale puis boucler autant de fois qu'il y a de valeurs dans le tableau pour appliquer le LAMBDA à chaque boucle et repartir du résultat intermédiaire obtenu pour la boucle suivante. Le résultat renvoyé par REDUCE est donc la valeur transformée après toutes les boucles.

    C'est donc bien le processus illustré ci-dessus, qui boucle 10 fois pour remplacer à chaque passage la valeur x de la matrice par du vide.

    Nom : 2022-03-18_211750.png
Affichages : 8189
Taille : 105,9 Ko


    Autre exemple

    Dans un texte contenant des caractères "HTML", remplacer les caractères HTML par leur équivalent ASCII...

    Nom : 2022-03-18_212100.png
Affichages : 8209
Taille : 110,0 Ko

    Le principe est identique, à savoir parcourir un texte en bouclant sur les caractères à remplacer, sauf que dans ce cas-ci, les caractères ne sont pas remplacés par "" mais par un caractère différent à chaque fois. Autrement dit, on va passer une table de correspondance qui permettra d'effectuer les remplacements par boucle. Le problème est que l'on ne peut passer qu'une matrice alors que l'on a besoin de deux, les caractères HTML et les caractères de remplacement. Ici, C1 contient un espace.

    Nom : 2022-03-18_224044.png
Affichages : 8181
Taille : 107,3 Ko

    Ce problème n'existe pas si l'on accepte l'idée que l'on va rechercher les valeurs d'une matrice dans une colonne d'un tableau structuré pour récupérer les valeurs correspondantes dans une autre colonne du même valeur structuré.

    Nom : 2022-03-18_224523.png
Affichages : 8177
Taille : 124,7 Ko

    On voit donc ici qu'au départ de ValeurInitiale (A1), on va rechercher chaque caractère d'une matrice (la colonne HTML du tableau) dans la colonne HTML du tableau pour le remplacer par le caractère de la colonne Ascii du tableau. On retrouve donc ici les deux variables nécessaires à REDUCE... Du coup, on peut boucler en une seule formule.

    Nom : 2022-03-18_224954.png
Affichages : 8208
Taille : 92,6 Ko
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #8
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut MAP et LAMBDA
    Après Lambda pour créer des fonctions personnalisées, nous avons vu que nous pouvions créer des formules "qui bouclent", un peu comme des matricielles, avec REDUCE et LAMBDA.

    Ici, nous allons approcher MAP et LAMBDA pour permettre de récupérer des données sous conditions dans des plages dynamiques, voire de les sommer pour récupérer le total.


    SOMME.SI.ENS permet de sommer des valeurs en fonction de plusieurs critères dont le nombre varie de 1 à 127. Mais ces critères doivent tous être validés pour que la ligne du tableau soit prise en compte: Critère1 ET Critère2 ET Critère3... Il n'est pas possible avec SOMME.SI.ENS de tester Critère1 OU Critère2, ni Critère1 OU ((Critère2 ET Critère3) ou (Critère3 ET Critère4))... Jusque maintenant, on devait se tourner vers SOMMEPROD ou une formule matricielle, validée avec MAJ+CTRL+ENTER. La version 365 apporte une solution qui, avant l'apparition de MAP et LAMBDA, permettait de simplifier un peu la formule, mais qui obligeait de passer par la case "arithmétique booléenne".


    Le problème est qu'il faut savoir jongler avec l'arithmétique booléenne qui nous permet de transformer VRAI et FAUX en 1 et 0, permettant d'établir des tables de vérité complexes, mais délicates à écrire en Excel. En effet, ET et OU ne peuvent pas être utilisées dans une matricielle puisque leur utilité est de renvoyer UNE valeur booléenne, VRAI ou FAUX, pour une matrice qu'elle reçoivent en argument. Malgré la matricielle, ET et OU renvoient donc UNE valeur et non pas une matrice de valeurs.



    MAP et LAMBDA permettent de "retomber sur nos pattes" en proposant aux formulistes une approche plus conforme à leur utilisation habituelle de ET et OU.

    Syntaxe: MAP(Matrice1; [Matrice2]; [Matrice3; ...; [Matrice127];LAMBDA(Arg1; [Arg2]; [Arg3]; ...; [Arg127];Formule)) dans laquelle il y a correspondance entre les MatriceN et les ArgN: Arg1 = Matrice1, Matrice2 = Arg2, ... On veillera donc à avoir autant de Arg dans le LAMBDA que de Matrice dans le MAP.


    Exemple:

    Soit à sommer les montants lorsque l'employé est Alain Térieur OU que le département est celui des achats...

    Nom : 2022-03-19_180808.png
Affichages : 8173
Taille : 119,6 Ko



    On pourra bien sûr toujours s'en sortir avec des colonnes supplémentaires, mais je n'aime pas, car les tableaux sont alors assez vite ingérables. On peut y aller avec beaucoup de colonnes ou peu de colonnes. Examinons plus en détails la deuxième image qui rassemble différentes colonnes intermédiaires, car c'est sur le modèle de cette formule conditionnelle que nous travaillerons avec MAP et LAMBDA

    Nom : 2022-03-19_181239.png
Affichages : 8158
Taille : 322,3 Ko



    Dans le cas présent, on pourrait s'en sortir avec une série de 3 SOMME.SI.ENS, car les conditions s'y prêtent, mais d'autres cas de figure rendront cette solution impossible à mettre en place

    Nom : 2022-03-19_181548.png
Affichages : 8173
Taille : 213,2 Ko



    On pourrait utiliser SOMMEPROD ou une SOMME matricielle, mais au prix d'une arithmétique booléenne qui paraît parfois ésotérique au formuliste puisque ET et OU sont exclus des matricielles.

    Nom : 2022-03-19_181721.png
Affichages : 8181
Taille : 182,5 Ko



    Avec Excel 365, on peut également utiliser FILTRE qui filtre un tableau ou une colonne d'un tableau sur bases de conditions. Là aussi, savoir manipuler l'algèbre booléenne est indispensable dès lors que l'on sort d'une simple condition a ET b.

    Nom : 2022-03-19_181904.png
Affichages : 8146
Taille : 374,5 Ko




    C'est ici que MAP et LAMBDA vont nous aider.

    L'idée consiste à passer chaque colonne du tableau nécessaire au calcul à MAP, qui va utiliser un LAMBDA en boucle sur chaque ligne des tableaux, en considérant qu'à chaque boucle, on travaille sur une ligne particulière. On peut alors sans problèmes utiliser ET et OU comme dans une formule Excel "normale" pour créer un vecteur de résultat sous forme d'une plage dynamique. Une simple SOMME sur cette plage permettra de récupérer le montant des lignes qui correspondent aux conditions exprimées.

    MAP va recevoir les colonnes du tableau nécessaire à l'évaluation des conditions ainsi que la colonne reprenant les montants. LAMBDA va recevoir ces colonnes en arguments et il suffira d'exprimer la formule en utilisant les arguments "comme si on la rédigeait pour une ligne de données"... Du coup, on peut utiliser les fonctions ET et OU comme dans la seconde illustration de la solution avec colonnes supplémentaires.

    Nom : 2022-03-19_182201.png
Affichages : 8157
Taille : 91,5 Ko

    MAP construit donc une plage dynamique, et on peut alors l'englober dans une simple fonction SOMME.

    Nom : 2022-03-19_182309.png
Affichages : 8177
Taille : 141,4 Ko


    LAMBDA, associée à MAP, permet donc l'expression des conditions avec ET, OU, OUX et évite de devoir jongler avec l'algèbre booléenne.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut SCAN et LAMBDA
    Avec REDUCE et LAMBDA, nous avons vu que nous pouvions créer une formule qui boucle et qui se sert à chaque boucle du résultat intermédiaire résultant des boucles précédentes. Pour rappel, sa structure est =REDUCE(ValeurInitiale; Tableau; LAMBDA(Arg1; Arg2; Formule)) où Arg1 et Arg2 correspondent respectivement à ValeurInitiale et Tableau.

    SCAN possède la même syntaxe que REDUCE ( SCAN(ValeurInitiale; Tableau; LAMBDA(Arg1; Arg2; Formule)), mais renvoie le tableau des résultats intermédiaires alors que REDUCE renvoie la dernière valeur de ce tableau. Donc, si vous avez compris REDUCE, vous allez comprendre SCAN...

    Reprenons l'exemple vu avec REDUCE pour supprimer les chiffres présents dans une chaîne de caractères:


    Nom : 2022-03-18_205703.png
Affichages : 8134
Taille : 109,7 Ko

    On voit bien qu'à chaque "passe", on s'est servi du résultat de la passe précédente: A2 supprime 1 de A1, A3 supprime 2 de A2,.... En 10 passes, on a supprimé les 10 caractères numériques et REDUCE affiche l'unique résultat final.

    Scan va procéder comme REDUCE en créant la plage dynamique des résultats intermédiaires. (Astuce: Ici, pour ne pas saisir la matrice constante, j'ai utilisé Ligne(A1:A10...))


    Nom : 2022-03-25_134335.png
Affichages : 8117
Taille : 150,5 Ko


    Rien de bien compliqué, donc.


    Cas pratique


    Soit à trouver le plus grand nombre de cellules vides consécutives d'une plage... On peut bien sûr passer par une colonne intermédiaire qui "remet le compteur à zéro" dès qu'une cellule n'est pas vide, et qui incrémente le résultat précédent si la cellule est vide... Il suffit alors de prendre le max de la plage des résultats et on obtient notre donnée. Dans l'exemple ci-dessous, la plage A7:A11 est la plus grande plage vide de A2:A14 et contient 5 cellules vides. On comprend, avec la formule illustrée =SI(ESTVIDE(A2);D1+1;0) que l'on incrémente le résultat précédent sauf si la cellule n'est pas vide, auquel cas ce résultat partiel devient 0, et on recommence à compter. C'est bien ainsi que l'on arrive à 5...

    Nom : 2022-03-25_135020.png
Affichages : 8104
Taille : 78,1 Ko


    Mais... Attendez... Compteur, incrément? Mais alors, SCAN et LAMBDA, bien sûr!!

    A chaque boucle de LAMBDA, la valeur de Arg1 de LAMBDA est modifiée par la boucle et sert de nouvelle valeur initiale pour la boucle suivante. SCAN crée donc la plage dynamique des résultats intermédiaires, et il suffit d'en calculer le maximum avec MAX...

    Nom : 2022-03-25_135957.png
Affichages : 8126
Taille : 98,6 Ko



    Voici donc un nouvel exemple d'utilisation de ces fonctions attachées à LAMBDA.

    Bon travail et bon weekend
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2015
    Messages : 24
    Points : 35
    Points
    35
    Par défaut Je ne comprends pas, LAMBDA n'est pas disponible dans ma version d'Excel sur Microsoft 365 Apps for enterprise
    Bonjour,

    Je ne trouve pas trace de LAMBDA et des autres fonctions que vous citez dans ma version d'Excel (Build 16.0.14931).

    J'ai tenté une mise à jour mais rien n'y fait.

    Avez-vous des idées ? Voici ma version du produit.
    Merci


    Nom : monexcel.png
Affichages : 911
Taille : 24,7 Ko

  11. #11
    Membre émérite
    Homme Profil pro
    ingénieur
    Inscrit en
    Mars 2015
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 1 058
    Points : 2 525
    Points
    2 525
    Par défaut
    Bonjour

    Pierre Fauconnier a présenté l'année dernière les potentialités de la fonction LAMBDA.
    Il a montré comment l'utiliser seule via le gestionnaire de nom, ou comment la combiner avec les nouvelles fonctions comme SCAN, MAP, REDUCE, MAKEARRAY

    Via le gestionnaire de nom, cette fonction est également très intéressante car elle peut être utiliser de manière récursive.

    Je voudrais illustrer toutes ces possibilités avec le calcul d'une image bien connue d'une fractale "ensemble de Mandelbrot" sous Excel avec seulement une formule nommée, une fonction en A1 et une mise en forme conditionnelle.

    Nom : 2023_01_23 Excel Mandelbrot.JPG
Affichages : 7601
Taille : 36,1 Ko

    Quelques explications simplifiées, j'espère que les spécialistes ne m'en tiendront pas rigueur

    Chaque point du plan (coordonnées x, y) correspond à un nombre complexe z = x+yi. On créé une suite zn+1 = zn²+z0. Si la distance à l'origine du point zn (la norme) reste faible (norme <2 soit x²+y²<4) le point appartient à l'ensemble.
    Le principe pour "dessiner" l'image, est de calculer à quelle itération de la suite la norme de zn dépasse le seuil, avec une limite de nombre d'itérations (précision de calcul).
    En partant du point z0=x0+iy0, la partie réelle est xn+1=xn²-yn²+x0 et la partie imaginaire yn+1 = 2xn*yn+y0

    Au final, on a 7 paramètres
    - un point de départ avec 2 coordonnées x0 et y0
    - un calcul d'itération xn et yn
    - un index d'itération j avec un nombre max j_max
    - un seuil pour sortir si la norme dépasse 2 (donc x²+y²>4)

    Je défini une fonction nommée "Mandelbrot"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    =LAMBDA(
    	x0;
    	x;
    	y0;
    	y;
    	j;
    	j_max;
    	seuil;
    	SI(
    		OU(
    			(x*x+y*y)>seuil;
    			j>j_max);
    		i;
    		Mandelbrot(
    			x0;
    			x*x-y*y+x0;
    			y0;
    			2*x*y+y0;
    			j+1;
    			j_max;
    			seuil
    		)
    	)
    )
    Cette fonction commence par les 7 paramètres, puis une fonction SI permet la sortie du calcul : si la norme dépasse le seuil ou si on dépasse le nombre d'itérations, on renvoie l'index de la dernière itération. Sinon on rappelle la fonction Mandelbrot de manière récursive avec les nouveaux paramètres :
    4 paramètres sont fixes : x0, y0, j_max et le seuil
    3 sont modifiées : x = x²-y²+x0 ; y = 2*x*y+y0 et j = j+1

    Ensuite on va utiliser cette fonction dans un MAKEARRAY
    après quelques tatonnements, j'ai déterminé la partie du plan et la défitition du rendu :
    260 lignes en partant de y_max = 1,3 et un pas négatif de -0,01 soit un y_min = -1,3
    260 colonnes en partant de x_min = -2,05 et un pas de 0,01 soit un x_max = 0,55

    La fonction MAKEARRAY, commencera donc par MAKEARRAY(260;260;LAMBDA(y;x;
    les y en ligne, les x en colonne vont prendre les valeurs de 1 à 260 dans toutes les 260 lignes/colonnes.

    exemple de MAKEARRAY
    Nom : 2023_01_23 exemple MAKEARRAY.JPG
Affichages : 7598
Taille : 85,9 Ko

    Dans notre cas, les coordonnées du point seront déterminées par
    absice = -2,05+x*0,01
    ordonnée = 1,3-y*0,01

    Il ne reste plus qu'à appliquer la fonction Mandelbrot avec 0 pour débuter l'itération, 40 itérations max et un seuil de 4
    Mandelbrot(-2,05+x*0,01;-2,05+x*0,01;1,3-y*0,01;1,3-y*0,01;0;40;4).

    en cellule A1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    =MAKEARRAY(
    	260;
    	260;
    	LAMBDA(
    		y;
    		x;
    		Mandelbrot(
    			-2,05+x*0,01;
    			-2,05+x*0,01;
    			1,3-y*0,01;
    			1,3-y*0,01;
    			0;
    			40;
    			4
    		)
    	)
    )
    La formule va être calculée pour les plus de 67000 cellules et elle renvoie le nombre d'itérations avant la sortie (soit norme >2, soit 40 itérations atteintes). Plus de 800 000 itérations en tout. Quelques secondes de calcul sur mon PC

    Je termine avec une mise en forme conditionnelle sur la plage A1# à 3 couleurs (mais malheureusement, l'adresse n'est pas dynamique suivant le MAKEARRAY) et j'ajuste la hauteur des lignes et la largeur des colonnes

    Au final on obtient cette image avec seulement :
    - une formule nommée (utilisant LAMBDA, SI, OU),
    - une formule en A1 (utilisant MAKEARRAY, LAMBDA)
    - une mise en forme conditionnelle.

    Cela démontre la puissance de la formule LAMBDA récursive.

    2023_01_23 Mandelbrot.xlsx

    Je vais préparer un fichier pour adapter cet exemple afin de générer des ensembles de Julia (la fonction sera la même, il y a quelques paramètres à modifier)

    Stéphane

  12. #12
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Wouah

    Bravo Stéphane!
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  13. #13
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 773
    Points : 28 634
    Points
    28 634
    Billets dans le blog
    53
    Par défaut
    Magnifique Stéphane
    Je n'ai pas encore approfondi les possibilités de LAMBDA, LET, SCAN, MAKEARRAY, ...
    Merci pour la décomposition et les explications
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  14. #14
    Membre émérite
    Homme Profil pro
    ingénieur
    Inscrit en
    Mars 2015
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 1 058
    Points : 2 525
    Points
    2 525
    Par défaut
    Merci de vos retours

    comme promis j'ai légèrement modifié le fichier pour afficher les ensembles de Julia.
    La formule est maintenant zn+1=zn²+c avec c un nombre imaginaire
    J'ai ajouté des paramètres pour gérer les coordonnées + le pas + le seuil + cette constante c.

    Toujours une fonction nommée, une formule MAKEARRAY + une mise en forme conditionnelle

    Mes sources pour les calculs
    http://sdz.tdct.org/sdz/dessiner-la-...andelbrot.html

    Et l'article de Chandoo https://chandoo.org/wp/the-excel-mandelbrot/ qui traite le sujet avec des tables et des complexes.
    cet article récent m'a rappelé mes premiers programmes en C++ ou turbo pascal dans les années 90. le temps de tracé était vraiment long !


    dans cette vidéo j'ai utilisé c = 0.43 + (0 --> 0.6) i.
    durée initiale 1'40" réduite à un peu plus de 10"

    Nom : Julia accéléré.gif
Affichages : 7561
Taille : 1,57 Mo

    Et le fichier
    2023_01_23 Julia.xlsx

    Stéphane

  15. #15
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 773
    Points : 28 634
    Points
    28 634
    Billets dans le blog
    53
    Par défaut
    Bonjour Stéphane, c'est du grand art
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Directeur R&D Pharmaceutique
    Inscrit en
    Décembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur R&D Pharmaceutique
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2017
    Messages : 5
    Points : 7
    Points
    7
    Par défaut EVALUATE
    autrefois on avait la fonction EVALUATE, qui a été supprimée, à mon avis à cause des risques si import de feuille malveillante, il y avait un biais pour restaurer cette fonctionnalité.
    je ne connaissais pas cette nouvelle fonction lambda (du coup je vais être obligé de réécrire beaucoup de code car j'utilisais la variable nommée "lambda" pour des applications scientifiques et j'ai remarqué que Excel peut buguer si on utilise un nom de variable utilisé comme nom de fonction)
    et je vais la tester de ce pas, merci le forum
    PS je suis impressionné par la programmation sur Mandelbrot !!!! bravo
    d'ailleurs je vais m'attaquer au jeu de la vie

  17. #17
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Salut

    Citation Envoyé par jakboregar Voir le message
    autrefois on avait la fonction EVALUATE, qui a été supprimée...
    Je ne me souviens pas de la fonction EVALUATE en Excel (peut-être une fonction XL4?). Par contre, elle existe toujours en VBA. Est-ce de cela dont tu parles?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/04/2022, 00h33
  2. Réponses: 1
    Dernier message: 30/06/2018, 12h31
  3. [XL-2013] Créer une fonction qui permet de compter des données complexe.
    Par RabiK33 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/04/2016, 11h58
  4. Créer un wizard qui permet de créer une visual class
    Par nicolas33400 dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 08/08/2010, 16h53
  5. Appli qui permet de créer un exécutable
    Par chaours dans le forum Delphi
    Réponses: 4
    Dernier message: 03/11/2006, 15h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo