Olá, Paulo. Como vai?
Excelente contribuição! A sua solução usando o método Cells.Replace no VBA é simplesmente fantástica e mostra um entendimento muito maduro sobre o desenvolvimento de automações.
Você tocou em um ponto fundamental na carreira de qualquer profissional de dados: "cada caso é um caso e devemos estar abertos a achar soluções para cada trabalho". Em programação e automação com Macros, muitas vezes o caminho mais elegante e performático não é construir um laço de repetição (For/Next) para varrer milhares de linhas uma por uma, mas sim aproveitar os recursos nativos altamente otimizados do próprio Excel — que é exatamente o que o Cells.Replace faz por trás dos panos.
Para enriquecer o seu post no fórum e trazer uma análise técnica sobre as vantagens dessa sua abordagem para a comunidade, preparei um paralelo sobre performance e uma dica de segurança para o seu código.
O Casamento Perfeito: Performance vs. Simplicidade
Para entender por que a sua solução é tão boa para esse cenário, vale a pena comparar a anatomia da sua Macro com a estrutura tradicional que a maioria dos estudantes costuma usar (varrer a planilha com um loop):
- A Abordagem Tradicional (Loop Linha por Linha): O código precisa ler a linha 1, testar se tem
#, apagar, descer para a linha 2, testar, apagar... Se a planilha tiver 50.000 linhas, a Macro fará 50.000 operações de leitura e escrita, o que pode fazer o Excel travar ou congelar a tela por alguns segundos. - A Sua Abordagem (
Cells.Replace): Você disparou o motor interno do Excel de uma vez só sobre toda a área de células (Cells). O Excel processa isso na memória de baixo nível, resolvendo o problema de forma praticamente instantânea, independentemente do tamanho da base de dados.
Uma Dica de Ouro para Blindar sua Macro: Restringir o Alcance
Como você bem pontuou, essa Macro funciona incrivelmente bem para este caso específico. Contudo, usando o objeto genérico Cells, o VBA vai aplicar a substituição na planilha inteira.
Se por acaso houvesse alguma outra coluna contendo uma tag, um código de produto legítimo ou uma string de sistema que usasse a cerquilha (ex: Produto_#102), o código apagaria esse caractere por engano.
Para deixar a sua solução ainda mais profissional e segura para planilhas corporativas complexas, uma boa prática é restringir a ação do Replace apenas para a coluna ou seleção específica onde estão os dados "sujos". Veja como faríamos isso limitando a ação, por exemplo, à coluna A:
Sub RemoverCerOtimizado()
' Aplica a substituição exclusivamente na Coluna A, protegendo o resto da planilha
Columns("A:A").Replace What:="#", Replacement:="", LookAt:=xlPart, SearchOrder:= _
xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False, _
FormulaVersion:=xlReplaceFormula2
End Sub
E para o exemplo que você citou no final do post, bastaria mapear a coluna dos produtos e trocar o What:="#" por What:="$".
Parabéns pelo pensamento fora da caixa e por compartilhar uma solução tão limpa, rápida e eficiente com os seus colegas!
Espero que possa ter lhe ajudado!