Logo Hardware.com.br
ncezarcf
ncezarcf Membro Junior Registrado
76 Mensagens 12 Curtidas

[Resolvido] Macro para executar filtro. Filtrar processo por dígito.

#1 Por ncezarcf 27/04/2024 - 20:27
Olá, pessoal. 

Eu trabalho na Justiça. Lá, nós, servidores, somos responsáveis por determinados processos conforme os dígitos de cada um.
 
Os processos têm o seguinte formato: 0011541-80.2023.4.05.8202. Assim, o dígito corresponde ao número que fica antes do hífen (ou tracinho) que consta no processo. No processo citado, o dígito é 1, que é anterior ao tracinho (-).
 
Se tiver um ou mais zeros antes do tracinho, o dígito será o número imediatamente anterior ao zero ou à sequência de zeros, pois desconsideramos o(s) zero(s) antes do hífen. Por exemplo, no processo 0011850-75.2023.4.05.8202, o dígito é 5; no processo 0011900-02.2023.4.05.8202, é 9, e assim por diante.
 
Atualmente, fazemos essa filtragem de forma manual, usando o recurso de Filtro do Excel, no menu Dados. Para entender melhor essa operação, deixo um breve vídeo explicando como faço essa filtragem, que serve como complemento dessa postagem. 
 
A propósito, os meus dígitos são 4, 5 e 6. Mas, se vier um ou mais zeros antes do tracinho (-), eu teria que fazer essa filtragem por 40, 50, 60 etc. Ou seja, seriam 12 formas de fazer essa filtragem (muito desgastante isso!).
 
Portanto, essa operação de filtragem manual é bem demorada e cansativa, principalmente porque trabalhamos com um grande número de processos.
 
Por essa razão, gostaria de automatizar essa filtragem de processos. Para isso, estou tentando criar um projeto, cujo arquivo segue em anexo, para facilitar nosso trabalho de separação de processos dos servidores por dígitos.
 
Como será possível observar no arquivo que estou enviando, pretendo dispor a relação de processos em intervalo de dados, e não com o recurso tabela. Acho que, nesse caso, é mais prático trabalhar com intervalo de dados.
 
Na planilha citada, eu tenho 3 colunas (C, D e E), cujos dados serão importados do arquivo original baixado diretamente do nosso sistema processual.
 
Na coluna F, pretendo colocar um evento change, para computar o tempo de espera do processo, considerando a data atual e a data de entrada da ação. Mas, no momento, minha prioridade é conseguir uma automação para filtrar os processos por dígitos.
 
A relação de processos se inicia na célula C12, com os dados correspondentes aos respectivos processos distribuídos nas colunas D e E. Enfim, para maiores detalhes do projeto, deixo a planilha em anexo, e convido, mais uma vez, os colegas para ver o vídeo, que explica claramente o procedimento que é feito hoje.  
 
Portanto, gostaria de uma macro para fazer o filtro de processos pelos dígitos 4, 5 e 6, seguidos ou não de zero(s), bem como outros dígitos alternativos, também considerando os zeros, pertencentes a outros servidores.

Ficaria muito grato pela ajuda. 
 

Anexos

ncezarcf
ncezarcf Membro Junior Registrado
76 Mensagens 12 Curtidas
#3 Por ncezarcf
28/04/2024 - 18:06
Olá, Mauriciodez. Tudo bem?!

Confesso que não entendi bem a pergunta. Mas, pretendo sim executar na máquina. No caso, no meu notebook.

É bem verdade que, por padrão, o Windows bloqueia macros, visto carregarem potenciais riscos aos programas instalados no computador.

Mas, normalmente, consigo trabalhar tranquilamente com planilhas com macros, mas sempre tomando os cuidados possíveis.

A propósito, não pretendo manusear a planilha (com automações) na nuvem, pois, realmente, no ambiente online, as macros não funcionam mesmo.

Não sei se consegui responder a sua dúvida.
Sudunha
Sudunha Tô em todas Registrado
2.1K Mensagens 70 Curtidas
#4 Por Sudunha
28/04/2024 - 18:09
Não é necessário fazer macro, você pode fazer a fórmula abaixo:
=DIREITA(ESQUERDA(SUBSTITUIR(A2;0;"");LOCALIZAR("-";SUBSTITUIR(A2;0;""))-1);1)

Apenas precisa substituir a informação de A2 pela coluna e linha que estiver trabalhando, arrasta a fórmula para baixo e ele vai te trazer o primeiro número diferente de zero que está antes do símbolo "-"


Faça essa fórmula no seu banco de dados, e faça uma tabela dinâmica, você vai conseguir filtrar de forma rápida e fácil, sem se colocar no risco de uma macro parar de funcionar. Quando atualizar o banco de dados, apenas clique em atualizar a tabela dinâmica e pronto.
Notebook ACER Aspire F5-573G-50KS
Intel Core i5-7200U 2.5GHz - 3.1GHz
HD 1TB + 250GB SSD
16GB RAM DDR4
NVIDIA GeForce 940MX 2GB
GuimeM
GuimeM Super Participante Registrado
146 Mensagens 110 Curtidas
#5 Por GuimeM
29/04/2024 - 11:26
Segue uma opção manual para o Filtro. Utiliza a coluna B como auxiliar.
1. coloque em E2:I2 os dígitos que deseja filtrar, em qualquer ordem e quantidade, exemplos: E2=8, F2=4 e I2=6
2. coloque na coluna B, a partir de B12 e até a última linha da tabela a fórmula abaixo, no seu exemplo B12:B733, em seguida aplique o Filtro na coluna B e nos critérios desmarque o zero.


=CONT.SE(E$2:I$2;DIREITA(SUBSTITUIR(EXT.TEXTO(C12;4;4);0;"&quot)+0)

A fórmula está distorcida pelo fórum, no lugar de &quot coloque aspas duplas (").

============================================================


Segue uma solução por macro.

Sub FiltraPorDígitos()
  Application.ScreenUpdating = False
  On Error Resume Next
  ActiveSheet.ShowAllData
  On Error GoTo 0
  [B:B] = ""
  Range("B12:B" & Cells(Rows.Count, 3).End(3).Row).Formula = _
    "=COUNTIF(E$2:I$2,RIGHT(SUBSTITUTE(MID(C12,4,4),0,"""&quot)+0)"
  [B11:F11].AutoFilter 1, ">0"
  [B:B] = ""
End Sub


No código acima também, no lugar de &quot coloque aspas duplas (").
ncezarcf
ncezarcf Membro Junior Registrado
76 Mensagens 12 Curtidas
#6 Por ncezarcf
29/04/2024 - 13:29
Olá, pessoal. Obrigado pelas postagens e sugestões.

Analisei todas as ideias propostas.

Então, vejamos. Sudunha, a fórmula funcionou perfeitamente! Usar tabela dinâmica e segmentação de dados foi uma ideia genial! 

Mas, como pretendo compartilhar esse projeto com os colegas, creio que eles terão dificuldades com o recurso da tabela dinâmica e da segmentação, ao fazer alguma configuração e, principalmente, no momento de atualizar a tabela dinâmica.

Além do mais, confesso que gostaria que a execução da filtragem dos dígitos dos processos fosse realizada por meio de macro. Acredito que seria mais prático e célere.

Além do que, pretendo utilizar uma outra macro para filtrar o processo por antiguidade, isto é, que apresente os processos com mais tempo de espera na Justiça.

Assim, eu espero que a macro de filtrar processo por dígito e esta última trabalhem sincronizadas. Ou seja, eu filtro por antiguidade e depois separo meus dígitos e vice-versa, cujos resultados possivelmente não sejam possíveis alcançar (ou ao menos de forma prática) usando fórmula do Excel.

Mas, prometo guardar essa fórmula, Sudunha.

Pois bem, em relação as sugestões de GuimeM (uma opção manual e uma por macro), para ser sincero, não consegui aplicar a fórmula na planilha.

De todo modo, a utilização de fórmula do Excel não me parece a melhor opção, como bem destacado acima.

Quanto à macro, achei a ideia mais interessante, visto a automação ser a solução que mais me atrai.

Contudo, GuimeM, a macro apresentou um erro, no momento de executar, conforme imagem em anexo.

Apenas destacando que a relação de processos será disposta na coluna C e se inicia a partir da célula C12. Talvez seja por isso e por causa do &quot, já mencionado, que a macro está acusando erro.

A propósito, também não entendi este intervalo na macro, E$2:I$2, visto que a relação de processos é disposta na coluna C, a partir da célula C12, e as demais colunas, cujos dados são importados do sistema processual, são D e E.
E a coluna F é uma coluna extra inserida para contar o tempo de espera do processo na Justiça. 
Portanto, GuimeM, fiquei com essas dúvidas acerca da macro que você sugeriu. 
Ademais, seria interessante que a macro contemplasse todas as possibilidades de pesquisa por dígitos e desconsiderasse um ou mais zero antes do tracinho (-) e que o citado tracinho já viesse incluído na própria macro, para dispensar sua digitação. Enfim, esses e outros detalhes sobre a macro em questão estão descritos no início deste tópico.  

Para entender melhor como desejo que a macro de filtrar processos por dígito funcione, peço, por favor, que veja o vídeo, que também está em anexo na primeira postagem. É bem breve e detalhe claramente a operação de filtragem esperada.

Pessoal, mais uma vez, agradeço de mais as sugestões de vocês.

Fico no aguardo

Anexos

GuimeM
GuimeM Super Participante Registrado
146 Mensagens 110 Curtidas
#7 Por GuimeM
29/04/2024 - 15:45
"Pois bem, em relação as sugestões de GuimeM (uma opção manual e uma por macro), para ser sincero, não consegui aplicar a fórmula na planilha."
Você seguiu as instruções que coloquei no post #5?
Qual foi a sua dificuldade? O que exatamente você fez? Qual foi o resultado obtido?
"Não consegui" >>> essa resposta não ajuda a entender a sua dificuldade.



Contudo, GuimeM, a macro apresentou um erro, no momento de executar, conforme imagem em anexo.
Conforme mostra a imagem, o erro óbvio ocorre porque você não fez a substituição que comentei no post #5. 
Para lhe facilitar, veja abaixo a cópia do comentário que fiz.
No código acima também, no lugar de &quot coloque aspas duplas (")



A propósito, também não entendi este intervalo na macro, E$2:I$2 ...
O intervalo E2:I2 tem 5 células, coloque nelas os dígitos que você deseja usar como critérios para o Filtro, isso vale tanto para a solução manual quanto para a solução por macro. Você pode utilizar de um a cinco dígitos como critérios para filtrar.
Exemplo: no seu primeiro post você comentou sobre filtrar utilizando os dígitos 4, 5 e 6. Nesse caso coloque os dígitos 4, 5 e 6 naquele intervalo, um dígito em cada célula, em qualquer ordem, e em seguida execute a macro ou aplique a opção de filtrar manual.
ncezarcf
ncezarcf Membro Junior Registrado
76 Mensagens 12 Curtidas
#8 Por ncezarcf
29/04/2024 - 18:32
GuimeM, achei melhor mostrar minhas dúvidas por meio de dois vídeos. Um tratando da fórmula do Excel; e o outro, da macro.

Acho que é melhor por vídeo do que está escrevendo, pois posso não ser muito claro nas minhas informações.

São vídeos breves e detalham bem minhas dúvidas.

Mais uma vez, agradeço pela ajuda.

Anexos

ncezarcf
ncezarcf Membro Junior Registrado
76 Mensagens 12 Curtidas
#10 Por ncezarcf
30/04/2024 - 09:41
[justify]
Desculpe, mas não vou assistir vídeos.

[/justify]
[justify][/justify]
Tranquilo, GuimeM. Entendo perfeitamente.

Então, vou tentar explicar minhas dúvidas/necessidades, focando principalmente na macro, que, a meu ver, é a solução mais prática e mais célere.

Primeiramente, segue a fórmula que você recomendou no post #5, já com a substituição de &quot pelas aspas duplas (""):
=CONT.SE(E$2:I$2;DIREITA(SUBSTITUIR(EXT.TEXTO(C12;4;4);0;"")+0))

Procurei seguir suas orientações nos posts #5 e #7 e montei a fórmula acima na planilha, inserindo-a na coluna B, e replicando nas células a partir de B12, e incluído, em seguida, os dígitos escolhidos no intervalo E$2:I$2, como recomendado.

Feito isso, percebi que a fórmula retornou como suposto resultado 0 (zero) e 1 (um) nas citadas células, conforme arquivo em anexo.

Aparentemente, o número 1 corresponde aos dígitos inseridos no intervalo E$2:I$2.

Contudo, gostaria que a fórmula e, principalmente, a macro executassem a operação semelhante ao recurso Filtro, no menu Dados, seguindo a rotina abaixo:

  • ativar Filtro, no intervalo de dados > clicar na seta apontada para baixo no cabeçalho do intervalo de dados > selecionar Filtros de Texto > escolher “Contém” > clicar em “Ou” e selecionar novamente “Contém”, na janela > digitar o dígito com tracinho (que consta no processo) seguido ou não de zero, conforme o caso, como, por ex, “40-“, “600-“ etc.


Lembrando que nós, servidores, em nossa divisão de processos, desconsideramos o(s) zero(s) que vem antes do tracinho, que consta no processo. Portanto, ser vier um ou mais zeros, consideramos como dígito o número anterior ao(s) zero(s). Por exemplo, no processo 0011850-75.2023.4.05.8202, o dígito é 5; no processo 0011900-02.2023.4.05.8202, é 9, e assim por diante.

Portanto, confesso que não ficou muito claro o funcionamento da fórmula em questão. E, ademais, caso a resposta da fórmula seja baseada nos caracteres 0 e 1, o resultado que eu esperava era a apresentação de uma lista de processos filtradas conforme o dígito escolhido, como ocorre na operação executada no recurso Filtro, no menu Dados, cuja rotina foi descrita acima.

Pois bem, pelo que entendi, a execução da macro é semelhante ao funcionamento da fórmula, inclusive ambos usam o mesmo intervalo (E$2:I$2) para buscar os dígitos inseridos.

De todo modo, como pretendo usar a macro para filtrar os processos por dígitos, por entender que é a melhor opção, vou descrever como desejaria que o código funcionasse. Assim, gostaria que:

  • a execução da macro trouxesse uma lista de processo, filtrada segundo o dígito escolhido, do mesmo modo que o resultado obtido pelo recurso Filtro, no menu Dados, acima mencionado;
  • o tracinho constante da macro já viesse incluso no código da macro, a fim de evitar digitá-lo;
  • a macro considerasse apenas o número que viesse antes do tracinho. Se, por outro lado, houver um ou mais zeros antes do tracinho, o dígito será o número imediatamente anterior ao zero ou à sequência de zeros, pois desconsideramos o(s) zero(s) antes do hífen (-).
  • se, possível, que a macro executasse a filtragem dos processos aplicando simultaneamente todos os dígitos escolhidos, a fim de evitar filtrar um dígito por vez.


A propósito, GuimeM, registro, mais uma vez, que a macro que você sugeriu, no post #5, apresentou um erro, conforme imagem em anexo. Como não tenho um bom conhecimento sobre macros, não sei identificar/retificar o problema reportado.

Espero que as informações tenham sido claras e ajudem.

Desde já, agradeço pela ajuda.
[justify][/justify]

Anexos

GuimeM
GuimeM Super Participante Registrado
146 Mensagens 110 Curtidas
#11 Por GuimeM
30/04/2024 - 12:49
1. fórmulas - estão corretos os resultados das fórmulas empregadas na opção manual, basta agora você aplicar Dados | Filtro conforme eu descrevi antes, que você obterá o resultado desejado.

2. macro - substitua a linha conforme abaixo. Já removi dela o maldito &quot.
"=COUNTIF(E$2:I$2,RIGHT(SUBSTITUTE(MID(C12,4,4),0,""""))+0)"
Em seguida execute a macro que você obterá o resultado desejado.

Obs. esqueça o bendito tracinho, os zeros, o 40-, o 600-, etc, etc, etc, ... que você já repetiu trocentas vezes. Tudo isso já foi entendido desde o início e já está considerado nas duas soluções que passei, e as duas soluções utilizam Dados | Filtro, conforme você pediu.
ncezarcf
ncezarcf Membro Junior Registrado
76 Mensagens 12 Curtidas
#12 Por ncezarcf
01/05/2024 - 16:50
1. fórmulas - estão corretos os resultados das fórmulas empregadas na opção manual, basta agora você aplicar Dados | Filtro conforme eu descrevi antes, que você obterá o resultado desejado.


Que bom que estava correta! A propósito, gostei muito dessa fórmula. É bem prática a forma de filtrar, já que basta desmarcar o "0", nos critérios. Ideia genial também!

Obs. esqueça o bendito tracinho, os zeros, o 40-, o 600-, etc, etc, etc, ...


Ok. Que bom que foi entendido! rindo_ate_agora.png

Em seguida execute a macro que você obterá o resultado desejado.


GuimeM, a respeito da macro acima, ela está filtrando os processos, conforme os dígitos inseridos no intervalo E$2:I$2, à semelhança do recurso Dados/Filtro, como realmente solicitado.
 
Contudo, seguem algumas observações sobre a execução da macro:
 
  • ao executar a macro, ela está deletando o cabeçalho em B11 (e as demais células a partir de B12 também ficam limpas); e
  • ao limpar o filtro na coluna B, o filtro, realmente, é desfeito; porém aparece, nessa coluna, algumas células com o número “0” (o que acontece quando não há correspondências com os valores em E$2:I$2). Detalhe: apenas nessas células com o caractere “0” é que aparece a fórmula que você me sugeriu no post#5.


Pois bem, feitas essas observações, gostaria que a macro:

  • não deletasse o cabeçalho em B11; e
  • ao limpar o filtro na coluna B, que aparasse os caracteres “0” e “1”, inclusive a fórmula acima citada, pois, dessa maneira, posso eventualmente tentar tratar essas respostas (“0” e “1”) com uma fórmula SE, ou mesmo utilizar esses resultados como alternativa para aplicar o filtro manual na coluna B, o que parece ser uma boa opção ter uma segunda forma para filtrar.


GuimeM, além dessas solicitações, gostaria também, se possível, de uma sugestão funcional, prática e estética para inserir (ou escolher os dígitos desejados), a fim de retirar os valores do intervalo E$2:I$2. É que não me parece muito interessante eles ficarem visíveis na frente do projeto.

Talvez haja alguma solução viável em: menu Desenvolvedor > Inserir > Controles de formulário, que permita selecionar mais de um valor. Enfim, não sei bem qual seria a melhor ideia para exibir esses dígitos de outra forma mais apresentável.  

Sobre isso, creio que a macro deverá sofrer alguma alteração para buscar os dígitos escolhidos em uma possível guia auxiliar.

Acredito que, fazendo esses ajustes, a macro de filtro de dígitos atenderá satisfatoriamente nossas expectativas.

A propósito, segue um novo arquivo em anexo, para possível análise das observações acima.

Estamos quase chegando lá! 

Obrigado pela ajuda, GuimeM.

Anexos

GuimeM
GuimeM Super Participante Registrado
146 Mensagens 110 Curtidas
#13 Por GuimeM
02/05/2024 - 07:43
ncezarcf disse:


Sub FiltraPorDígitosV2()
  Application.ScreenUpdating = False
  On Error Resume Next
  ActiveSheet.ShowAllData
  On Error GoTo 0
  Range("B12:B" & Cells(Rows.Count, 3).End(3).Row).Formula = _
    "=COUNTIF(E$2:I$2,RIGHT(SUBSTITUTE(MID(C12,4,4),0,""""))+0)"
  [B11:F11].AutoFilter 1, ">0"
End Sub



Caso lhe seja útil, segue um código para desaplicar o Filtro, assim todos os registros serão reexibidos e as setinhas permanecerão em B11:F11.
Sub RemoveFiltroColB()
 [B11:F11].AutoFilter 1
End Sub


dica - coloque acima da linha 11 os botões para executar os códigos assim eles não serão ocultados ao aplicar o Filtro.
ncezarcf
ncezarcf Membro Junior Registrado
76 Mensagens 12 Curtidas
#14 Por ncezarcf
02/05/2024 - 23:18
Olá, GuimeM.

Utilize a versão abaixo no lugar da anterior, ela atende às duas demandas acima.


A macro funcionou perfeitamente. Até o momento não constatei nenhuma inconsistência na execução do código. Ficou excelente! boa.gif

Caso lhe seja útil, segue um código para desaplicar o Filtro, assim todos os registros serão reexibidos e as setinhas permanecerão em B11:F11.


Será útil sim, como, de fato, está sendo. Inclusive seria uma de minhas solicitações. Deixou muito prática a opção desaplicar o Filtro. Ficou ótimo!

dica - coloque acima da linha 11 os botões para executar os códigos assim eles não serão ocultados ao aplicar o Filtro.


Sim, sim! Já havia configurado os botões para mantê-los sempre visíveis e sem alterar a forma.

Ok, elabore a nova forma e os novos recursos que você deseja utilizar para escolher os dígitos, coloque-os em um arquivo com as necessárias instruções de uso e anexe aqui no fórum, assim faremos os ajustes no código.


Sobre uma nova forma e novos recursos para escolher os dígitos, na verdade, espera algumas sugestões. Não tenho muita coisa em mente.

De todo modo, andei analisando as opções de ferramentas em Controles de formulário (no menu Desenvolvedor > Inserir). Após fazer alguns testes, dentre alas, a Caixa de seleção me pareceu mais adequada. Aliás, isso foi o mais próximo que eu cheguei do que eu realmente gostaria!

Assim, coloquei 9 (nove) dessas caixas, que correspondem exatamente à quantidade de dígitos utilizados atualmente. 

Usei uma função SE, a partir de H4, na tabela auxiliar (na guia Dígitos), para retornar os respectivos dígitos, em F4 em diante. Mas, não está dando certo! A intenção era justamente substituir E$2:I$2 pelo intervalo H$4:H$12, onde ficariam os dígitos escolhidos.

É que a fórmula SE não está funcionando corretamente. Parece que ela é incompatível com as ferramentas de Controles de formulário.

Na planilha em anexo, apresento essa função e exponho algumas notas explicativas.

Você teria outra ideia melhor, considerando exibir esses dígitos de uma forma mais apresentável e prática? fiquei_vermelho.png

De qualquer forma, GuimeM, acho que não é interessante incluir novas linhas de código na macro, apenas para conseguir inserir os dígitos desejados. A macro está ótima e bem objetiva da forma que se encontra!

Assim, à semelhança da tentativa de usar Caixa de seleção, como relatei acima, podemos continuar insistindo em algum recurso parecido que capture os dígitos selecionados em um intervalo, tal como é desde o início, que, a meu ver, é a melhor opção, por ser uma solução simples e eficiente. Além disso, a macro original não seria descaracterizada com alterações consideráveis em sua estrutura. Bastaria mudar o intervalo na macro e pronto!

Estou enviando um novo arquivo com um esboço da forma como desejaria escolher os dígitos. Obviamente, pode ser melhorada ou substituída por outra ainda mais interessante.

Obrigado, GuimeM.

Anexos

GuimeM
GuimeM Super Participante Registrado
146 Mensagens 110 Curtidas
#15 Por GuimeM
03/05/2024 - 16:45
ncezarcf disse:


Sub FiltraPorDígitosV3()
  On Error Resume Next
  ActiveSheet.ShowAllData
  On Error GoTo 0
  Range("B12:B" & Cells(Rows.Count, 3).End(3).Row).Formula = _
  "=COUNTIF(Dígitos!H$4:H$12,RIGHT(SUBSTITUTE(MID(C12,4,4),0,"""&quot)+0)"
  [B11:F11].AutoFilter 1, ">0"
End Sub


nota - alguém da admin do fórum editou  a minha postagem e colocou tags Código no código que postei, com isso, o código fica contaminado com a introdução de &quot, e irá provocar erro na execução, que eu já adverti em postagem neste tópico.
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal