
Gostaria de saber se existe uma função do Excel, ou uma fórmula, que possa ser usada para classificar dígitos dentro de uma célula.
Por exemplo, se o valor de A1 for 6193254807
e B1 tiver nossa fórmula com parâmetros definidos para classificação crescente, então B1 deverá ser igual 0123456789
(zero à esquerda incluído). É claro que, se os parâmetros fossem definidos de forma que fosse classificado em ordem decrescente, B1 deveria ser igual a 9876543210
.
Existe uma maneira de fazer isso, sem entrar no VBScript, nas macros ou em algo igualmente exótico?
Responder1
Isso é possível com uma fórmula de matriz. Supondo que o número original esteja emA1, insira qualquer um dos ff. em uma célula em branco e confirme com Ctrl+ Shift+ Enter:
Ascendente:
=REPT(0,LEN(A1)-LEN(SUBSTITUTE(A1,0,"")))&
SUM(POWER(10,ROW(INDIRECT("1:"&LEN(SUBSTITUTE(A1,0,""))))-1)*
LARGE(INT(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1)),
ROW(INDIRECT("1:"&LEN(SUBSTITUTE(A1,0,""))))))
Descendente:
=SUM(POWER(10,ROW(INDIRECT("1:"&LEN(SUBSTITUTE(A1,0,""))))-1)*
SMALL(INT(MID(SUBSTITUTE(A1,0,""),ROW(INDIRECT("1:"&LEN(SUBSTITUTE(A1,0,"")))),1)),
ROW(INDIRECT("1:"&LEN(SUBSTITUTE(A1,0,""))))))
&REPT(0,LEN(A1)-LEN(SUBSTITUTE(A1,0,"")))
Exemplo:
Cada fórmula leva ono maior ou menor número na célula e multiplica-o por uma potência de 10 de acordo com sua "classificação" (também conhecido como atribuir-lhe um novo valor posicional), que são então somados para produzir o número "reorganizado". Por exemplo, se nosso número original for, 231
as etapas gerais de cálculo para a primeira fórmula seriam as seguintes:
=sum(1*power(10,2), 2*power(10,1), 3*power(10,0))
=sum(100,20,3)
=123
O REPT()
segmento da fórmula cuida de quaisquer zeros à esquerda ou à direita.
O resultado estará em formato de texto. Achei que seria uma boa ideia, já que há um limite de quantos dígitos você pode inserir em uma célula (recomendo leresta pergunta do superusuário).
Caso queira fazer alguns cálculos com o resultado, basta inserir 0+
no início da fórmula para transformar o resultado em um número.