Passons en revue ensemble le processus d'évaluation:
Dans mon exemple, j'ai la valeur abf5fb6
dans la cellule A2
, qui est évaluée à 56
.
Première étape, remplacer A2
par 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 MID
fonction. 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, 3
retournera wiz
pendant 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 MID
fonction 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 MID
fonction suivante pour remplacer l’autre A2
par 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 MID
fonction ROW($1:$99)
,. Rappelez-vous, le deuxième argument de la MID
fonction nous donne simplement la position de départ. La ROW
fonction, 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 MID
fonction 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 MID
fonction, 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 MID
fonction 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é abf5fb6
un 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 ISNUMBER
fonction, 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 TRUE
alors retour FALSE
et 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 TRUE
se transformer en un 1
et a FALSE
deviennent 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 ISNUMBER
fonction:
= 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 TRUE
ou FALSE
indiquant 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.
Nous pouvons "dérouler" cette formule
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,
A2
voici une adresse de la cellule en entrée, qui contient une chaîne de texte avec des nombres mélangés, par exempleR824TX01rQ768
.Donc, la construction
signifie: créer un tableau de tous les symboles (chaînes de longueur
1
, selon le troisième paramètre du paramètreMID(...,1)
) à partir de l'entréeA2
<1>.Les éléments dont l'index est supérieur à la longueur de la chaîne
A2
sont 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 detrue/false
valeurs booléennes <3>,qui est multiplié élément par un familier
ROW($1:$99)
. Lorsqu'unetrue/false
valeur est multipliée par le nombre,true
est interprété comme1
, etfalse
que0
, donc le résultat est un tableau numérique, qui pour chaque position de caractèreA2
contient soit0
, si le symbole est pas un chiffre, ou l'indice, si le caractère est le chiffre <4>.Une fonction
ou, élargi,
prend ce tableau numérique et un second argument vide, qui aboutit essentiellement au même tableau <5>.
Expression
trie notre opérande de tableau obtenu
INDEX(...)
dans l'ordre décroissant <6>Expression
premier préfixe la chaîne
A2
avec0
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>.<9>
Finalement,
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:<11>
Peut-être des problèmes de compatibilité?
la source
<1>
: que signifie "<>"?<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.$1:$99
devrait être$1:$256
? Est-ce que cela va atteindre une limite de valeur?