Comprendre les formules de tableau compliquées

0

Je voulais supprimer toutes les lettres d'une cellule en ne laissant que des chiffres. Après quelques recherches sur Google, j'ai trouvé cette formule de tableau: =SUM(MID(0&A2,LARGE(INDEX(ISNUMBER(--MID(A2,ROW($1:$99),1))*ROW($1:$99),),ROW($1:$99))+1,1)*10^ROW($1:$99)/10)

Lorsque je clique sur évaluer, des centaines de déclarations vraies ou fausses sont extrêmement déroutantes. Quelqu'un peut-il décomposer et expliquer ce que chaque composant fait?

Wizlog
la source

Réponses:

1

Passons en revue ensemble le processus d'évaluation:

Dans mon exemple, j'ai la valeur abf5fb6dans la cellule A2, qui est évaluée à 56.

Première étape, remplacer A2par valeur à la celluleA2

Avant:

= SUM (MID (0 & A2 , GRAND (INDEX (ISNUMBER (- MID (A2, ROW), 1 $: 99 $), 1):)) * * ROW (1 USD: 99 $),), ROW (1 USD: 99 $)) + 1, 1) * 10 ^ ROW (1 $: 99 $) / 10)

Après:

= SUM (MID (0 & "abf5fb6") , LARGE (INDEX (- ISNUMBER (- MID (A2, ROW (1 $: 99 $), 1))) * ROW (1 $: 99 $),), ROW (1 $: 99 $)) + 1,1) * 10 ^ ROW (1 $: 99 $) / 10)

Remarquez comment le texte est maintenant entouré de guillemets. Cela signifie que c'est du texte, autrement appelé une chaîne .

Il est maintenant temps d’expliquer brièvement la MIDfonction. Cette fonction va simplement extraire du texte d'une chaîne. Le premier argument est le texte ou la chaîne par lequel nous allons commencer. Le deuxième argument est la position de départ de l'endroit où nous voulons extraire. Le troisième argument est le nombre de caractères que nous voulons extraire ou la longueur de notre résultat final. Par exemple, =MID("wizlog", 1, 3retournera wizpendant que =MID("wizlog", 2, 5)reviendraizlog

Ainsi, l'étape suivante concatène alors le 0&"abf5fb6", car, comme indiqué ci-dessus, le premier argument de la MIDfonction nécessite un texte (appelé encore une chaîne). Mais pour ajouter un nombre à une chaîne dans Excel, vous utilisez le &symbole.

Avant:

= SUM (MID ( 0 & "abf5fb6") , LARGE (INDEX (- ISNUMBER (- MID (A2, ROW (1 $: 99 $), 1))) * ROW (1 $: 99 $),), ROW (1 $: 99 $)) + 1,1) * 10 ^ ROW (1 $: 99 $) / 10)

Après:

= SUM (MID ( "0abf5fb6") , LARGE (INDEX (ISNUMBER (- MID (A2, ROW (1 USD: 99 $)), *)) * ROW (1 USD: 99 $),), ROW (1 USD: 99 $)) + 1 , 1) * 10 ^ ROW (1 $: 99 $) / 10)

Nous allons maintenant passer à la MIDfonction suivante pour remplacer l’autre A2par sa valeur, comme avant.

Après:

= SUM (MID ("0abf5fb6", GRAND (INDEX (- ISNUMBER (- MID ( "abf5fb6 , ROW (1 $: 99 $)), 1)) * ROW (1 USD: 99 $),), ROW (1 USD: de 99 $)) + 1,1) * 10 ^ ROW (1 $: 99 $) / 10)

Ensuite, nous traitons du deuxième argument de la deuxième MIDfonction ROW($1:$99),. Rappelez-vous, le deuxième argument de la MIDfonction nous donne simplement la position de départ. La ROWfonction, par contre, renvoie simplement la ligne qui lui est donnée. Ainsi, puisque nous lui passons la plage de 1-99, elle nous renvoie un tableau ou une liste de 1-99. Cela signifie que nous prévoyons d’utiliser la MIDfonction 99 fois, chaque fois en partant d’une position différente de 1 à 99.

Avant:

= SUM (MID ("0abf5fb6", GRAND (INDEX (- ISNUMBER (- MID ("abf5fb6")), rangée (1 $: 99 dollars) , 1)) * * le droit des femmes (1 dollar: 99 dollars;).) +1,1) * 10 ^ ROW (1 $: 99 $) / 10)

Après:

= SUM (MID ("0abf5fb6", GRAND (INDEX (ISNUMBER (- MID ("abf5fb6", 3); {1; 2; 3; ...; 99} , 1)).] 1).),), ROW (1 $: 99 $)) + 1,1) * 10 ^ ROW (1 $: 99 $) / 10)

(Pour gagner de la place, je n'ai pas tapé tous les numéros de 1 à 99, mais je suis sûr que vous avez compris.)

Maintenant que nous avons toutes les pièces de la deuxième MIDfonction, nous pouvons calculer cette partie.

Avant:

= SUM (MID ("0abf5fb6", GRAND (INDEX (ISNUMBER (- MID ("abf5fb6", 3); {1; 2; 3; ...; 99}, 1) ).] 1).),), ROW (1 $: 99 $)) + 1,1) * 10 ^ ROW (1 $: 99 $) / 10)

Après:

= SUM (MID ("0abf5fb6", GRAND (INDEX (ISNUMBER (- {"a". 3); "b"; "f"; "5"; "f"; "b"; "6"; ";" ";" "; ...;" "} ) * ROW (1 $: 99 $),), ROW (1 $: 99 $)) + 1,1) * 10 ^ ROW (1 $: 99 $) / 10)

Alors qu'est-ce qui vient de se passer ici? La MIDfonction ne fait que renvoyer une sous-chaîne de la chaîne donnée, en commençant à l’emplacement donné, pour le nombre de caractères spécifié. Nous lui avons donc donné la chaîne, lui avons donné abf5fb6un tableau de positions de départ, en spécifiant que nous voulons seulement extraire 1 caractère. Ainsi, la fonction nous renvoie un tableau de chaque caractère de notre chaîne, de 1 à 99. Comme notre chaîne de départ ne comptait que 7 caractères, les positions 8 à 99 sont simplement vides. C'est pourquoi nous avons toutes les sous-chaînes vides après, ( "";"";"";...;"";).

La fonction suivante à calculer est la ISNUMBERfonction, mais examinons d’abord une fonction étrange que nous faisons en premier. Remarquez comme il y a un double moins devant notre nouveau tableau. Alors qu'un signe moins unique inverse le résultat d'un résultat (si TRUEalors retour FALSEet visa-vera), un double moins signifie que la réponse sous forme de chaîne est forcée. Donc, généralement, les réponses de TRUEse transformer en un 1et a FALSEdeviennent une réponse 0, mais dans ce cas, nous convertissons chaque caractère de notre tableau en nombre. Donc entrer en --"a"résultera en #VALUE!entrant en --"5"résultera en 5.

Ainsi, lorsque nous exécutons la ISNUMBERfonction:

= SUM (MID ("0abf5fb6", GRAND (INDEX ( ISNUMBER (- {"a". 3); "b"; "f"; "5"; "f"; "b"; "6"; ";" ";" "; ...;" "} ) * ROW (1 $: 99 $),), ROW (1 $: 99 $)) + 1,1) * 10 ^ ROW (1 $: 99 $) / 10)

Ce que nous exécutons en coulisse est:

= SUM (MID ("0abf5fb6"), LARGE (INDEX ( ISNUMBER ({# VALEUR !; #VALUE !; #VALUE !; 5; #VALUE !; n °!!; 6 !; ...; #VALUE!} ) * ROW (1 $: 99 $),), ROW (1 $: 99 $)) + 1,1) * 10 ^ ROW (1 $: 99 $) / 10)

En conséquence, il tourne un tableau de TRUEou FALSEindiquant si la valeur était un nombre ou non. D'où nous obtenons:

= SUM (MID ("0abf5fb6", GRAND (INDEX ( {FALSE; FAUX; FAUX; VRAI; FAUX; FAUX; FAUX; FAUX; FAUX; FAUX; FAUX; FAUX; FAUX; ...; FAUX} ) * ROW ($ 1: 99 $)), ROW (1 $: 99 $)) + 1,1) * 10 ^ ROW (1 $: 99 $) / 10)

Je n'ai plus de temps. Je suis au travail et je ne suis pas censé le faire. C'est ce que j'avais avant de devoir faire quelque chose de productif aujourd'hui. J'espère que je vais reprendre là où je me suis arrêté plus tard.

amallard
la source
C'est incroyablement complet et très bien écrit. Merci beaucoup, je suis impatient de voir le reste de la réponse! J'ai déjà tellement appris
wizlog
1

entrez la description de l'image ici

Nous pouvons "dérouler" cette formule

=SUM(
   MID(
     0&A2,
     LARGE(
       INDEX(
         ISNUMBER(
           --
           MID(
               A2,
               ROW($1:$99),
               1
           )
         )*ROW($1:$99)
         ,
       ),
       ROW($1:$99)
     )+1,
     1
   )*10^ROW($1:$99)/10
 )

et suivi de toutes les transformations de l'opérande (s).

Tout d'abord, l'expression ROW($1:$99) représente un tableau de nombres naturels croissants {1,2,...,99}. Il est souvent utilisé comme un bloc pratique pour construire une formule matricielle.

Ensuite, A2voici une adresse de la cellule en entrée, qui contient une chaîne de texte avec des nombres mélangés, par exemple R824TX01rQ768.

Donc, la construction

MID(
  A2,
  ROW($1:$99),
  1
)

signifie: créer un tableau de tous les symboles (chaînes de longueur 1, selon le troisième paramètre du paramètre MID(...,1)) à partir de l'entrée A2<1>.

Les éléments dont l'index est supérieur à la longueur de la chaîne A2sont des chaînes vides.

Ce tableau de symboles porte alors le préfixe double moins --, qui transformera un symbole numérique en un nombre correspondant et d’autres symboles en une valeur d’erreur #VALUE!<2>.

Ensuite, une fonction ISNUMBER()agit sur ce tableau de nombres / caractères mélangés et donne un tableau de true/falsevaleurs booléennes <3>,

qui est multiplié élément par un familier ROW($1:$99). Lorsqu'une true/falsevaleur est multipliée par le nombre, trueest interprété comme 1, et falseque 0, donc le résultat est un tableau numérique, qui pour chaque position de caractère A2 contient soit 0, si le symbole est pas un chiffre, ou l'indice, si le caractère est le chiffre <4>.

Une fonction

INDEX(<the array>,)

ou, élargi,

=INDEX(ISNUMBER(--MID(A2,ROW($1:$99),1))*ROW($1:$99),)

prend ce tableau numérique et un second argument vide, qui aboutit essentiellement au même tableau <5>.

Expression

LARGE(INDEX(ISNUMBER(--MID(A2,ROW($1:$99),1))*ROW($1:$99),),ROW($1:$99))

trie notre opérande de tableau obtenu INDEX(...)dans l'ordre décroissant <6>

Expression

MID(0&A2,LARGE(INDEX(ISNUMBER(--MID(A2,ROW($1:$99),1))*ROW($1:$99),),ROW($1:$99))+1,1)

premier préfixe la chaîne A2avec 0 et extrait les symboles dans l’ordre trié, en commençant par le dernier chiffre trouvé <7>.

Et chaque chiffre du tableau obtenu est multiplié par 10^ROW($1:$99)/10<8>.

MID(0&A2,LARGE(INDEX(ISNUMBER(--MID(A2,ROW($1:$99),1))*ROW($1:$99),),ROW($1:$99))+1,1)*10^ROW($1:$99)/10

<9>

Finalement,

=SUM(MID(0&A2,LARGE(INDEX(ISNUMBER(--MID(A2,ROW($1:$99),1))*ROW($1:$99),),ROW($1:$99))+1,1)*10^ROW($1:$99)/10) 

additionne tous les nombres du tableau, ce qui donne le nombre désiré <10>.

Pas sûr, pourquoi la construction répétée de INDEX(<array>,)est utilisée, il semble que la formule fonctionne aussi sans elle:

=SUM(MID(0&A2,LARGE(ISNUMBER(--MID(A2,ROW($1:$99),1))*ROW($1:$99),ROW($1:$99))+1,1)*10^ROW($1:$99)/10)

<11>

Peut-être des problèmes de compatibilité?

g.kov
la source
Tout d’abord, merci d’avoir écrit une réponse aussi longue. J'ai hâte de le lire dans son intégralité. Cependant, dans l'une de vos premières lignes, vous écrivez <1>: que signifie "<>"?
Wizlog
@wizlog: Les chiffres similaires <1>signifient simplement une référence à la colonne correspondante dans la capture d'écran ci-jointe, qui affiche le résultat de l'étape décrite.
g.kov
Cette formule est folle. Cependant, peut-il être légèrement amélioré? Je pense que les chaînes sont limitées à 256 caractères, alors peut-être $1:$99devrait être $1:$256? Est-ce que cela va atteindre une limite de valeur?
Yorik
1
@Yorik: En fait, les chaînes de texte peuvent être beaucoup plus longues que 256, consultez Excel-spécifications-and-limits . La limite réelle pour ce type de formule serait le nombre de chiffres dans le texte saisi, en raison des limites de précision numérique.
g.kov