Retour incorrect des fonctions TAKE() et EXCLUDE() dans un contexte LET()

Faus42t 40 Points de réputation
2025-12-26T12:16:00.61+00:00

Les fonctions take() (prendre() en français) et exclude() (exclure() en français) se comporte différemment selon l'orgine du paramètre rows. S'il est défini dans le même let() leur fonctionnement est conforme, mais s'il est défini en utilisant une séquence dans un let imbriqué, là cela se dégrade.

Ci joint une formule mettant en exergue le disfonctionnement.
Les noms des fonctions sont en minuscule, parce que que sinon cette note est considéré comme non respectueuse de l'éthique µSoft (mot en majuscule insultant à priori: genre 'take' ou 'let' en majuscule… à priori parce que le message reprend tout le code éthique µsoft sans plus de précision). Et la saisie est purement et simplement effacée, sans aucune possibilité de la corriger (cela m'apprendra à ne pas sauvegarder un message avant de l'envoyer).
µsoft encore un petit effort d'apprentissage nécessaire pour que ton ia pilote nous facilite la vie et ne nous la complique pas.
Voici le formule (fonctions Excel en français) :

=let(
array; sequence(20);
rowsBas; 10;
arrTakBas; prendre(array;rowsBas);
arrExcBas; exclure(array;rowsBas);
rowsLet; let( nb; index(sequence(10);10); nb );
arrTakLet; prendre(array;rowsLet);
arrExcLet; exclure(array;rowsLet);

"rowsBas=" & rowsBas & " & rowsLet=" & rowsLet & "   =>   rowsBas=rowsLet is " & (rowsBas = rowsLet)   
& car(10)  
& "But take(…,rowsBas) => "    & joindre.texte("-";;arrTakBas)   
& "   vs   take(…,rowsLet) => "    & joindre.texte("-";;arrTakLet)  
& car(10)  

& "And exclude(…,rowsBas) => " & joindre.texte("-";;arrExcBas)
& " vs exclude(…,rowsLet) => " & joindre.texte("-";;arrExcLet)

)

Le résultat :

rowsBas=10 & rowsLet=10  =>   rowsBas=rowsLet is vrai  
But take(…,rowsBas)    => 1-2-3-4-5-6-7-8-9-10            vs   take(…,rowsLet)    => 1  
And exclude(…,rowsBas) => 11-12-13-14-15-16-17-18-19-20   vs   exclude(…,rowsLet) => 11

Et donc les deux fonctions se comportent différemment selon l'origine du paramètre rows dans let() de base, ou dans let() imbriqué avec l'utilisation d'une séquence.
Je pense qu'il s'agit d'un bug, mais le support me renvoi vers la communauté pour analyse, et j'espère transfert à Microsoft pour correction.
Merci d'avance

ps: J'ai une autre bug en réserve sur let().

Microsoft 365 et Office | Excel | Pour la maison | Windows
0 commentaires Aucun commentaire

Réponse acceptée par l’auteur de la question
Hecatonchire 53,950 Points de réputation Modérateur bénévole
2025-12-26T21:06:32.9966667+00:00

"comment l'as tu su?" => Je m'y suis trouvé confronté souvent.

Tu peux aussi le voir avec un outil comme "Excel Lab" (complément gratuit pour Excel de Microsoft)

(parfois il marche parfois il bloque mais c'est bien pratique pour les formules un peu complexes)

EXCEL_KdcAYnJTf9

Version allégée de ta formule. Remarquer les accolades du résultat.

**Pour **@LET(nb;INDEX(SEQUENCE(10);10);nb)

Le "@" est un code pour indiquer à Excel de ne pas renvoyer une table dynamique en résultat (une matrice).

Cela a été ajouté pour rendre certaines formules compatibles avec les Excel ancienne génération fonctionnant en mode IIE (Implicitly Intersecting Evaluation).

Si tu valide ta formule avec le @, Excel n'est pas content et te propose une correction (répondre Non) car il ne trouve pas logique que la formule soit en partie en mode IIE et en partie en mode AE (Array Evaluation).

Pour "ps: J'ai une autre bug en réserve sur let()" je suis intéressé mais c'est peut être le même cas que la formule précédente.

Cette réponse a-t-elle été utile ?

1 personne a trouvé cette réponse utile.

Réponse acceptée par l’auteur de la question
Hecatonchire 53,950 Points de réputation Modérateur bénévole
2025-12-26T13:37:14.9933333+00:00

Bonjour,

Je n'ai regardé que la fonction Prendre mais il n'y a pas vraiment de bug à ce niveau là dans ton exemple.

Il s'agit d'une petite subtilité. rowsBas n'est pas réellement égale à rowsLet contrairement à ce que semble suggérer ton test !

rowsBas est une valeur unique

rowsLet est une matrice d'une valeur

et ça change la donne !

Essaye avec cette définition de rowsLet

rowsLet;INDEX(LET(nb;INDEX(SEQUENCE(10);10);nb);1);

ou

rowsLet;@LET(nb;INDEX(SEQUENCE(10);10);nb);

Cette réponse a-t-elle été utile ?

1 personne a trouvé cette réponse utile.

1 réponse supplémentaire

  1. Faus42t 40 Points de réputation
    2026-01-02T13:02:29.6133333+00:00

    Mon second pb était sur let.
    Mais ton intervention sur celui-ci m'a appris à lire vraiment dans le détail dans son entièreté, le help µSoft.

    Et j'y ai appris que var1 ne pouvait être utilisé comme nom de variable, car potentiellement considéré comme une référence C1L1.

    Merci encore

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire

Votre réponse

Les réponses peuvent être marquées comme « Acceptées » par l’auteur de la question et « Recommandées » par les modérateurs, ce qui aide les utilisateurs à savoir que la réponse a résolu le problème de l’auteur.