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-10-07T04:57:43+00:00

    O código correto e funcional a ser adaptado seria:

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

    ****Mas realmente ele funcionaria apenas para um critério e sem copiar dados para outro lugar, com uma faixa de critérios não funciona. Ele funcionaria bem para o meu exemplo de 22/09. Acabei simplificando demais e deixei escapar este ponto.

    Vou recriar o código, para contemplar o cenário todo e postar aqui. Creio que o ideal, para ficar mais claro, será postar inclusive com os valores das células, pois só as referências a elas podem acabar aumentando ainda mais a confusão.

    Obrigado por conferir!


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

    Esta resposta foi útil?

    0 comentários Sem comentários
  2. Excluído

    Essa resposta foi excluída devido a uma violação de nosso Código de Conduta. A resposta foi denunciada manualmente ou identificada por meio da detecção automatizada antes da ação ser tomada. Consulte nosso Código de conduta para obter mais informações.


    Os comentários foram desabilitados. Saiba mais

  3. Anônima
    2010-10-06T23:43:54+00:00

    Prezado,

    Adptando sua resposta a um exemplo. Peço verificar, pois como disse não funciona.

    Range("A5:A11").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Replace(Range("E3:E4"), ",", "."), CopyToRange:=Range("I$1"), Unique:=True

    abs

    Esta resposta foi útil?

    0 comentários Sem comentários