Notifications
Clear all

Macro com Filtro avançado e com CopyToRange variável

7 Posts
4 Usuários
0 Reactions
1,320 Visualizações
(@heleniks)
Posts: 4
New Member
Topic starter
 

Ola galera, recentemente descobri o VBA e estou tentando realizar uma "automatização" em uma planilha utilizando principalmente o filtro avançado em uma macro.

Tenho uma serie de dados que preciso copia-los da plan1 para a plan2 de acordo com um critério e em seguida exclui-los da planilha original (plan1) - até ai eu dei um jeito rs.
Porém eu precisaria que esta inserção de dados fosse recorrente e não sobrepusesse os dados já anteriormente copiados ( assim mantendo o registro). segue a macro que estou trabalhando:

Sheets("Planilha2").Activate
    ActiveSheet.Range("B2:B3").Select

    Sheets("Planilha1").Range("B2:L1000").AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=ActiveCell.Range("A1:A2"),[/color] [color=#FF0000]CopyToRange:=ActiveCell.Offset(3, _
        0).Range("A1")[/color][color=#0000BF], Unique:=False
        
    Sheets("Planilha1").Activate
    ActiveSheet.Range("H2").Select
    ActiveSheet.Range("B2:L1000").AutoFilter Field:=7, Criteria1:="concluida"
    ActiveCell.Offset(1, -6).Range("A1:L1000").Select
    Selection.EntireRow.Delete
    ActiveSheet.Range("B2:L1000").AutoFilter Field:=7
    ActiveCell.Offset(-2, -1).Range("A1").Select

End Sub

Minha duvida se refere a parte do "CopyToRange" da ação AdvancedFilter, que acredito que esta parte seja a responsável pela inserção dos dados copiados.
Gostaria de saber se é possível o "CopyToRange" da função se tornar variável de acordo com as linhas preenchidas anteriormente, tentei substituir a parte

ActiveCell.Offset(3, _
        0).Range("A1")

por

Range("B1000") .select
selection.end(xlUp).select
activecell.offset(1,0).select

Até mesmo criando uma variável e substituindo o valor mas não obtive exito (sou iniciante meeeesmo). Se alguém puder me dar uma luz kkk. Agradeço desde já. :D
PS:Segue em anexo uma planilha exemplo que estou trabalhando (me perdoem se estiver confusa).

 
Postado : 30/10/2016 6:11 pm
brunoxro
(@brunoxro)
Posts: 698
Honorable Member
 

Boa noite Heleniks,

Estou com uma dúvida. Qual o critério de filtragem? Ou você quer filtrar manualmente usando o comando 'Filtro' e depois ativar a macro para copiar o que estiver na tela da planilha 1?

att,

 
Postado : 30/10/2016 6:37 pm
(@heleniks)
Posts: 4
New Member
Topic starter
 

Então o critério é linhas que possuírem a informação que contem na célula "B2:B3" que foi ativa previamente antes do código ser exibido

eu usei primeiramente a função do Excel de filtro avançado para fazer a filtragem e colagem da plan1 para a plan2 e gravei em macro

Sheets("Planilha2").Activate
ActiveSheet.Range("B2:B3").Select 

Sheets("Planilha1").Range("B2:L1000").AdvancedFilter Action:=xlFilterCopy, _
[color=#0000FF]CriteriaRange:=ActiveCell[/color].Range("A1:A2"), CopyToRange:=ActiveCell.Offset(3, _
0).Range("A1"), Unique:=False

depois combinei com a gravação em macro da filtragem da plan1 e excluir as células filtradas na própria plan1.

Sheets("Planilha1").Activate
ActiveSheet.Range("H2").Select
ActiveSheet.Range("B2:L1000").[color=#FF0000]AutoFilter[/color] Field:=7, Criteria1:="concluida"
ActiveCell.Offset(1, -6).Range("A1:L1000").Select
Selection.EntireRow.Delete
ActiveSheet.Range("B2:L1000").AutoFilter Field:=7
ActiveCell.Offset(-2, -1).Range("A1").Select

esta tudo automatizado. inclusive a filtragem com o auto filtro.
não sei se eu te respondi adequadamente.

 
Postado : 30/10/2016 7:46 pm
(@mprudencio)
Posts: 2749
Famed Member
 

Disponibiliza o arquivo com alguns dados que fica facil alguem ajudar, inclusive mostre o resultado esperado.

Marcelo Prudencio
Microsoft Excel Brasil no Facebook

"Começar já é a metade do caminho."
Autor Desconhecido

Simplifica que simples fica.
Nicole Tomazella.

"O Simples é Sempre Melhor Que o Complicado"
Jorge Paulo Lemann.

 
Postado : 30/10/2016 7:52 pm
(@heleniks)
Posts: 4
New Member
Topic starter
 

Coloquei algumas instruções na planilha em anexo, vejam se estar mais claro. Se a macro não estiver habilitada é só criar uma idêntica a esta:

Sub Copiaeexclui()

  Sheets("Planilha2").Activate
    ActiveSheet.Range("B2:B3").Select

    Sheets("Planilha1").Range("B2:L1000").AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=ActiveCell.Range("A1:A2"), CopyToRange:=ActiveCell.Offset(3, _
        0).Range("A1"), Unique:=False
        
    Sheets("Planilha1").Activate
    ActiveSheet.Range("H2").Select
    ActiveSheet.Range("B2:L1000").AutoFilter Field:=7, Criteria1:="concluida"
    ActiveCell.Offset(1, -6).Range("A1:L1000").Select
    Selection.EntireRow.Delete
    ActiveSheet.Range("B2:L1000").AutoFilter Field:=7
    ActiveCell.Offset(-2, -1).Range("A1").Select
End Sub
 
Postado : 30/10/2016 8:54 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Heleniks, se entendi corretamente, você irá filtrar sempre pelo Criterio "concluida", se for isto, não precisa definir o criterio no Range, pode ser direto na rotina, desta forma me baseando pelo que eu disse, utilize a rotina abaixo.

Você pode apagar o Criterio que esta na Planilha2 em "B2:B3", esta rotina irá selecionar a Planilha1, realizar o Filtro, copiar para a Planilha2 o resultado e em seguida Deletar da Planilha1, e toda vez que executar, se atendido o Criterio as filtragens serão copiadas sempre após a última linha preenchida na Planilha2.

Faça os testes e veja se seria isto.

Sub Filtrando_STATUS_concluida()

    Dim LR As Long

    'Seleciona a Aba
    Sheets("Planilha1").Select
    
    'Aplica o Filtro pelo Critério "concluida"
    Selection.AutoFilter Field:=7, Criteria1:="concluida"
    
    'Conta as Linhas Visiveis
    LR = Range("B" & Rows.Count).End(xlUp).Row
    
    'Copia para a aba "Planilha2" somente as celulas filtradas
    Range("B3:L" & LR).SpecialCells(xlCellTypeVisible).Copy Destination:= _
                    Sheets("Planilha2").Range("B" & Rows.Count).End(xlUp).Offset(1, 0)
    
    'Deabilita mensagem de alerta
    Application.DisplayAlerts = False
    
    'Deleta as Linhas Filtradas visiveis
    Range("B3:L" & LR).SpecialCells(xlCellTypeVisible).Delete
    
    'Refaz o Filtro
    ActiveSheet.Range("B2:L1000").AutoFilter Field:=7
        
    'Restaura mensagem de Alerta
    Application.DisplayAlerts = True

End Sub

Qualquer duvida retorne.

[]s

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 31/10/2016 12:32 pm
(@heleniks)
Posts: 4
New Member
Topic starter
 

P.E.R.F.E.I.T.O!!!!!!

Nossa, muito obrigada!!!! Que bom que você conseguiu intender essa explicação toda torta minha rsrsrs.
Você acabou tendo que refazer toda a macro esquisita que eu havia feito kkk. Mas isso foi ótimo que assim aprendi outros códigos =D.
Não tenho como expressar minha gratidão Mauro! Problema completamente resolvido!! <3

 
Postado : 31/10/2016 9:11 pm