Noções básicas sobre fórmulas de matriz complicada

0

Eu queria remover todas as letras de uma célula, deixando apenas números. Depois de pesquisar no Google, achei essa fórmula de matriz: =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)

Quando eu clico em avaliar, ele faz centenas de declarações verdadeiro / falso que são extremamente confusas. Alguém pode quebrar isso e explicar o que cada componente faz?

    
por wizlog 25.07.2017 / 22:03

2 respostas

1

Vamos percorrer o processo Avaliar juntos:

No meu exemplo, tenho o valor abf5fb6 na célula A2 , que é avaliado como 56 .

Primeiro passo, substitua A2 pelo valor em cell A2

Antes:

=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)

Depois:

=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)

Observe como o texto agora está dentro de um par de aspas. Isso significa que é texto, também conhecido como string .

Agora é um bom momento para explicar brevemente a função MID . Esta função simplesmente extrairá algum texto de uma string. O primeiro argumento é o texto, ou string, com o qual começaremos. O segundo argumento é a posição inicial de onde queremos começar a extrair. O terceiro argumento é o número de caracteres que queremos extrair ou o tamanho do nosso resultado final. Por exemplo, =MID("wizlog", 1, 3 retornará wiz , enquanto =MID("wizlog", 2, 5) retornará izlog

Assim, o próximo passo concatena o 0&"abf5fb6" , porque como mencionado acima, o primeiro argumento na função MID requer texto (novamente, chamado de string). Mas, para adicionar um número a uma string no Excel, use o símbolo & .

Antes:

=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)

Depois:

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

Agora, vamos pular para a próxima função MID para substituir o outro A2 por seu valor novamente, assim como antes.

Depois:

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

Em seguida, estamos lidando com o segundo argumento na segunda função MID , ROW($1:$99) . Lembre-se, o segundo argumento na função MID nos fornece a posição inicial. A função ROW , por outro lado, simplesmente retorna a linha que é dada, então, uma vez que passamos o intervalo de 1 a 99, ela retornará para nós uma matriz, ou uma lista, de 1 a 99. Isso significa que planejamos usar a função MID 99 vezes, cada vez iniciando em uma posição diferente de 1 a 99.

Antes:

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

Depois:

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

(Para economizar espaço, eu não digitei todos os números de 1 a 99, mas tenho certeza que você entendeu.)

Agora que temos todas as peças para a segunda função MID , podemos calcular essa parte.

Antes:

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

Depois:

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

Então, o que aconteceu aqui? Bem, a função MID apenas retorna uma substring da string dada, começando no local dado, para o número especificado de caracteres. Então, nós demos a ela a string, abf5fb6 , atribuímos uma matriz de posições iniciais, especificando que só queremos extrair 1 caractere. Assim, a função retorna para nós uma matriz de cada caractere em nossa string, de 1-99. Como a string inicial tinha apenas 7 caracteres, as posições 8-99 estão vazias, e por isso temos todas as subseqüências vazias depois, ( "";"";"";...;""; ).

A próxima função a ser calculada é a função ISNUMBER , mas primeiro vamos examinar um recurso estranho que fazemos primeiro. Observe como há um duplo negativo na frente de nossa nova matriz. Enquanto um único sinal de menos inverterá o resultado de um resultado (se TRUE retornar FALSE e visa-vera), mas um duplo menos significa forçar a resposta da string em um número. Normalmente, isso resultará nas respostas de TRUE para transformar em 1 e FALSE para se transformar em 0 , mas, nesse caso, estamos convertendo cada caractere em nossa matriz em um número. Assim, entrar em --"a" resultará em #VALUE! , enquanto a entrada em --"5" resultará em 5 .

Assim, quando executamos a função ISNUMBER :

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

O que estamos realmente executando nos bastidores é:

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

Como resultado, ele transforma uma matriz de TRUE ou FALSE indicando se o valor era um número ou não. Daí nós temos:

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

Acabou o tempo Bem, eu estou no trabalho fazendo o que eu não deveria estar fazendo, e isso foi tanto quanto eu cheguei antes de eu realmente fazer algo produtivo hoje. Espero retomar de onde parei mais tarde.

    
por 26.07.2017 / 19:15
1

Podemos"desenrolar" esta fórmula

=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
 )

e siga todas as transformações do (s) operando (s).

Primeiro de tudo, a expressão ROW($1:$99) representa uma matriz de números naturais crescentes %código%. É frequentemente usado como um conveniente bloco para construir uma fórmula de matriz.

Em seguida, {1,2,...,99} aqui é um endereço da célula de entrada, que contém uma string de texto com números mistos, por exemplo, A2 .

Então, construção

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

significa: criar uma matriz de todos os símbolos (strings de comprimento R824TX01rQ768 , de acordo com o terceiro parâmetro no 1 )  da entrada MID(...,1) < 1 >.

Os elementos cujo índice é maior que o comprimento da string em A2 são strings vazias.

Esta matriz de símbolos é então prefixada com double menos A2 , que irá transformar um símbolo numérico em um número correspondente e outros símbolos no valor de erro -- < 2 >.

Em seguida, uma função #VALUE! opera nessa matriz de caracteres / números mistos e resultar em uma matriz de valores ISNUMBER() booleanos < 3 >,

que é multiplicado por elementos por um familiar true/false . Quando um valor ROW($1:$99) é multiplicado pelo número, true/false é interpretado como true e 1 como false , Assim, o resultado é um array numérico, que para cada posição de caractere em 0 contém A2 , se o símbolo não for um dígito, ou o índice, se o caractere for um dígito < 4 >.

Função

INDEX(<the array>,)

ou expandido,

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

usa esse array numérico e um segundo argumento vazio que basicamente resulta no mesmo array < 5 >.

Expressão

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

classifica nosso operando de matriz obtido de 0 em ordem decrescente < 6 >

Expressão

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

prefixam primeiro a string em INDEX(...) com A2 e extrai os símbolos na ordem classificada, começando com o último dígito encontrado < 7 >.

E cada dígito na matriz obtida é multiplicado por 0 < 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 >

Finalmente,

=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) 

soma todos os números na matriz, o que resulta num número desejado < 10 >.

Não tenho certeza, porque a construção repetida de 10^ROW($1:$99)/10 é usada, parece que a fórmula funciona sem ela:

=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 >

Talvez alguns problemas de compatibilidade?

    
por 26.07.2017 / 22:50