excel-formula - usar - ultima letra excel




Excel: último caractere/string corresponde em uma string (7)

Existe uma maneira eficiente de identificar a última correspondência de caractere / string em uma string usando as funções base? Ou seja, não é o último caractere / string da string, mas a posição da última ocorrência de um caractere / string em uma string. Search e find dois trabalhos da esquerda para a direita, de modo que não consiga pensar em como aplicá-los sem um longo algoritmo recursivo. E esta solução agora parece obsoleta.


Apenas surgiu esta solução, sem necessidade de VBA;

Encontre a última ocorrência de "_" no meu exemplo;

=IFERROR(FIND(CHAR(1);SUBSTITUTE(A1;"_";CHAR(1);LEN(A1)-LEN(SUBSTITUTE(A1;"_";"")));0)

Explicado de dentro para fora;

SUBSTITUTE(A1;"_";"") => replace "_" by spaces
LEN( *above* ) => count the chars
LEN(A1)- *above*  => indicates amount of chars replaced (= occurrences of "_")
SUBSTITUTE(A1;"_";CHAR(1); *above* ) => replace the Nth occurence of "_" by CHAR(1) (Nth = amount of chars replaced = the last one)
FIND(CHAR(1); *above* ) => Find the CHAR(1), being the last (replaced) occurance of "_" in our case
IFERROR( *above* ;"0") => in case no chars were found, return "0"

Espero que isso tenha sido útil.


Considerando uma parte de um Comentário feito pelo @SSilk meu objetivo final foi realmente fazer com que tudo estivesse certo da última ocorrência. Uma abordagem alternativa com uma fórmula muito simples é copiar uma coluna (digamos A ) de cadeias e na cópia ( diga ColumnB) aplique Find e Replace. Por exemplo, tomando o exemplo: Drive:\Folder\SubFolder\Filename.ext

Isso retorna o que resta (aqui Filename.ext ) após a última instância de qualquer caractere escolhido (here \ ), que às vezes é o objetivo de qualquer maneira e facilita encontrar a posição do último caractere com uma fórmula curta como:

=FIND(B1,A1)-1

Eu acho que entendi o que você quer dizer. Vamos dizer, por exemplo, você quer o mais \ à direita na seguinte seqüência (que é armazenada na célula A1):

Unidade: \ Folder \ SubFolder \ Filename.ext

Para obter a posição do último \, você usaria esta fórmula:

=FIND("@",SUBSTITUTE(A1,"\","@",(LEN(A1)-LEN(SUBSTITUTE(A1,"\","")))/LEN("\")))

Isso nos diz que o mais certo \ está no personagem 24. Ele faz isso procurando por "@" e substituindo o último "\" por um "@". Determina o último usando

(len(string)-len(substitute(string, substring, "")))\len(substring)

Neste cenário, a substring é simplesmente "\" que tem um comprimento de 1, então você poderia deixar a divisão no final e usar:

=FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))

Agora podemos usar isso para obter o caminho da pasta:

=LEFT(A1,FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\","")))))

Aqui está o caminho da pasta sem o trailing \

=LEFT(A1,FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))-1)

E para obter apenas o nome do arquivo:

=MID(A1,FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))+1,LEN(A1))

No entanto, aqui está uma versão alternativa de obter tudo à direita da última instância de um caractere específico. Então, usando o mesmo exemplo, isso também retornaria o nome do arquivo:

=TRIM(RIGHT(SUBSTITUTE(A1,"\",REPT(" ",LEN(A1))),LEN(A1)))

Muito tarde para a festa, mas uma solução simples é usar o VBA para criar uma função personalizada.

Adicione a função ao VBA no WorkBook, Planilha ou em um Módulo VBA

Function LastSegment(S, C)
    LastSegment = Right(S, Len(S) - InStrRev(S, C))
End Function

Então a fórmula da célula

=lastsegment(B1,"/")

em uma célula e a string a ser pesquisada na célula B1 irá preencher a célula com o texto arrastando o último "/" da célula B1. Sem limite de comprimento, sem fórmulas obscuras. A única desvantagem que posso pensar é a necessidade de uma pasta de trabalho habilitada para macro.

Qualquer função VBA do usuário pode ser chamada dessa maneira para retornar um valor a uma fórmula de célula, incluindo como um parâmetro para uma função interna do Excel.

Se você vai usar a função pesadamente, você vai querer verificar o caso quando o caractere não está na string, então a string está em branco, etc.


Que tal criar uma função personalizada e usar isso na sua fórmula? O VBA tem uma função InStrRev , o InStrRev , que faz exatamente o que você está procurando.

Coloque isso em um novo módulo:

Function RSearch(str As String, find As String)
    RSearch = InStrRev(str, find)
End Function

E sua função ficará assim (assumindo que a string original está em B1):

=LEFT(B1,RSearch(B1,"\"))

Uma maneira simples de fazer isso no VBA é:

YourText = "c:\excel\text.txt"
xString = Mid(YourText, 2 + Len(YourText) - InStr(StrReverse(YourText), "\" ))

tigeravatar e Jean-François Corbett sugeriram usar essa fórmula para gerar a string correta da última ocorrência do caractere "\"

=TRIM(RIGHT(SUBSTITUTE(A1,"\",REPT(" ",LEN(A1))),LEN(A1)))

Se o caractere usado como separador for espaço, "", a fórmula deverá ser alterada para:

=SUBSTITUTE(RIGHT(SUBSTITUTE(A1," ",REPT("{",LEN(A1))),LEN(A1))),"{","")

Não é necessário mencionar que o caractere "{" pode ser substituído por qualquer caractere que não "normalmente" ocorra no texto para ser processado.





excel-formula