Utilização de filtros avançados em macros (Excel).

Anônima
2010-07-27T16:19:19+00:00

Quando utilizo o filtro automático manual para pesquisar dados de uma planilha com range de outra planilha com números inteiros ou números com casas decimais e as informações são levandas para as células sem problemas, mais quando eu coloco o filtro dentro de uma macro a pesquisa só é realizada para números inteiros, para números decimais só é carregado o título das células. Alguém sabe disser porque? O comando utilizado é o .AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range("Critérios"), CopyToRange:=Range("$A$260:$O$260"), Unique:=True

Microsoft 365 e Office | Excel | Para uso doméstico | Windows

Pergunta bloqueada. Essa pergunta foi migrada da Comunidade de Suporte da Microsoft. É possível votar se é útil, mas não é possível adicionar comentários ou respostas ou seguir a pergunta.

0 comentários Sem comentários
Resposta aceita pelo autor da pergunta
Anônima
2010-10-07T13:05:09+00:00

Caro xlaz,

agora sim, tenho certeza de que dirás ser uma solução complexa, mas ela soluciona o problema, alterando na planilha as vírgulas por pontos, antes de criar o filtro e desta vez a macro está completa.

Sub Filtro()    For Each Celula In Range("C2:D3")        Celula.Value = Replace(Celula.Value, ",", ".")    Next    Range("A1:A11").AdvancedFilter Action:=xlFilterCopy, criteriarange:=Range("C2:D3"), copytorange:=Range("F1"), unique:=TrueEnd Sub

O que faltava na macro que adaptastes era realizar o loop pelo conteúdo das células e não temos como fazer isto dentro da criação do filtro.

Pessoalmente eu prefiro uma versão mais "mastigada" e portanto mais extensa, mas ambas funcionam.

Sub Filtro()    'Declarações de variáveis    Dim FxDados As String    Dim FxCrit As String    Dim FxResult As String    Dim Celula As Variant        'Atribuições de dados    FxDados = "A1:A11"    FxCrit = "C2:D3"    FxResult = "F:F"        'Limpeza de conteúdo    Range(FxResult).ClearContents        'Tratamento de dados    For Each Celula In Range(FxCrit)        Celula.Value = Replace(Celula.Value, ",", ".")    Next        'Criação do filtro    Range(FxDados).AdvancedFilter Action:=xlFilterCopy, criteriarange:=Range(FxCrit), copytorange:=Range(FxResult), unique:=TrueEnd Sub


Abraço, Carlos F. P. Rocha - Conheça http://www.carlosfprocha.com

Esta resposta foi útil?

2 pessoas acharam esta resposta útil.
0 comentários Sem comentários
Resposta aceita pelo autor da pergunta
Anônima
2010-09-20T21:37:37+00:00

falmeida74,

este problema que estás enfrentando deve-se ao fato de que no VBA o separador decimal é o ponto (sistema americano) e não a vírgula, como está configurado em seu computador. Isto é muito comum em linguagens de programação e pode facilmente ser contornado por uma adaptação em seu código.

Ajuste ele para:

.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Replace(Range("Critérios"), ",", "."), CopyToRange:=Range("$A$260:$O$260"), Unique:=True

Repare no que eu alterei. Apenas inseri o comando Replace, que fará a substituição da vírgula pelo ponto.

Ex.: Caso tenhas na célula C6 o valor "3,5", para que funcione ele teria de ser "3.5", então se usa o comando:

Dim x    x = Replace(Range("C6").Value, ",", ".")    Columns("A:A").AutoFilter    ActiveSheet.Range("$A$1:$A$11").AutoFilter Field:=1, Criteria1:=">" & x, _        Operator:=xlAnd


Abraço, Carlos F. P. Rocha - Conheça http://www.carlosfprocha.com

Esta resposta foi útil?

1 pessoa achou esta resposta útil.
0 comentários Sem comentários

12 respostas adicionais

Classificar por: Mais útil
  1. Anônima
    2010-09-22T13:53:00+00:00

    Ok, vamos do princípio:

    1. Não é verdade que funcionava na versão 2003 (não tenho a versão XP (2002) aqui para reproduzir), pois não funciona nela. Basta fazer um simples teste para comprovar isso.
    • Crie uma lista com os seguintes números na coluna A: 2; 3; 4; 5; 6; 3,5; 9 e 12.
    • Crie uma macro para realizar o filtro, com o seguinte código: ActiveSheet.Range("$A$1:$A$11").AutoFilter Field:=1, Criteria1:=">=3", Operator:=xlAnd
    • Execute a macro e verifique o resultado;
    • Agora altere "Criteria1:=">=3" para "Criteria1:=">=3,5" e notará que retornará um planilha sem nenhum dado;
    • Então altere para "Criteria1:=">=3.5" e obterá o filtro correto.
    1. A questão não é se alguns consideram a solução complexa e outros a consideram simples, mas sim que é uma solução e não a simples indicação de um bug que nunca existiu no VBA. O importante no forum é resolver o problema, não alegar um bug e deixá-lo sem solução;
    2. Por outro lado, se formos falar da rotina de gravação da macro, aí sim, podemos reclamar que há algo insatisfatório. Pois podemos alegar que gostaríamos que ela fizesse a alteração de forma automática, o que não ocorre. Mas, não podemos esquecer que trata-se de um valor informado pelo usuário, que portanto não é tratado pela rotina de criação da macro. Adicionalmente, cabe salientar que a rotina de gravação de macro é exatamente a mesma desde a versão 2003, portanto conduz ao mesmo resultado;
    3. Gravar macros é um procedimento fácil, mas personalizar elas requer conhecimento de linguagem de programação e em termos de linguagem de programação não existe localização, ou seja, sempre utilizamos o sistema americano. Daí que ler as referências de linguagens ajuda...

    Abraço, Carlos F. P. Rocha - Conheça http://www.carlosfprocha.com

    Esta resposta foi útil?

    0 comentários Sem comentários
  2. Anônima
    2010-09-21T18:25:27+00:00

    Solução complexa. O problema não é do sistema americano. Se fosse, ocorreria no excel 2002 e 2003. É bug mesmo que deve ser consertado. Basta gravar a macro com valores dos critérios com vírgula que o resultado'será correto. Mas, ao replicar a macro, aí sim, ocorfrerá o erro. E existem outros bugs em macros.

    abraços

    Esta resposta foi útil?

    0 comentários Sem comentários
  3. Anônima
    2010-09-17T19:16:37+00:00

    tive o mesmo problema e fiz consulta à Microsoft que disse ser problema do usuário e não do Excel. Entretanto, 'verifiquei que é um "bug"do VBA. Para solucionar, basta substituir nos valores dos critérios, a vírguma (,) por ponto (.). Já encaminhei comunicado à Microsoft para quem sabe eles coloquem um hotfix. Finalizando, esse problema não ocorre nas versões 2002 e 2003 do Excel, isto é pode usar valores do tipo >=34,57 nos critérios que funciona. A questão é o Excel 2007 e 2010. Espero ter ajudado! Qualquer dúvida, replica aqui no site.

    Esta resposta foi útil?

    0 comentários Sem comentários