Notifications
Clear all

como filtrar dados e exportar para novo ficheiro xls

11 Posts
2 Usuários
0 Reactions
1,585 Visualizações
(@dogdivine)
Posts: 0
New Member
Topic starter
 

Boa tarde galera do Excel ;)

Preciso de ajuda desde Portugal... :D

Andei pesquisando no forum mas não encontrei resposta talvez não tenha procurado bem, ou não exista mesmo resposta...

O meu problema é o seguinte, tenho um ficheiro 2000 e poucas linhas e pretendo filtrar os dados por uma coluna/campo e enviar o resultado para um novo ficheiro/planilha XLS.

Não sei se dá para fazer com uma macro com todo o filtro duma vez dividindo logo os resultados por 70 e tal ficheiros novos, ou se terá de ser feito o filtro 1 a 1, de qualquer forma já era uma grande ajuda.

Obrigado a todos, continuação de bom trabalho.

 
Postado : 09/01/2015 10:23 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde

Para facilitar, anexe um ficheiro de exemplo (arquivo compactado) com poucos dados, demonstrando o que desejas.

[]s

 
Postado : 09/01/2015 10:33 am
(@dogdivine)
Posts: 0
New Member
Topic starter
 

Obrigado Patropi.

envio uma pequena parte do ficheiro para teste,

https://drive.google.com/file/d/0B9YYmIQcUzxdZkZvUzBKYWVXYWc/view?usp=sharing

a ideia era arranjar uma macro ou outra forma, de fazer o filtro na coluna Fornecedor (H) e depois com os dados obtidos copiar/exportar para um novo ficheiro de forma automatica...

exemplo filtro por 2024438 (são 93 dados) e com a informação resultante copiar ou exportar automaticamente para um novo ficheiro com o nome de 2024438, filtro por 2024918 são 2 linhas copiar o resultado para

novo ficheiro e salvar com o nome 2024918, e assim sucessivamente por cada um dos dados da coluna H, obtendo no final tantos novos ficheiros quantos os existem na coluna H (já agrupado por fornecedor).

Alguma duvida é só dizer, obrigado mais uma vez.

 
Postado : 12/01/2015 6:08 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Bom dia!!

Veja se ajuda, caso necessário, tente adaptar!

Sub AleVBA_14081()
    Dim a, i As Long, dic As Object, ws As Worksheet, e
    Application.ScreenUpdating = False
    Set dic = CreateObject("Scripting.Dictionary")
    dic.CompareMode = 1
    With Sheets("Final").Cells(1).CurrentRegion
        a = .Value
        For i = 2 To UBound(a, 1)
            If Not dic.exists(a(i, 6)) Then Set dic(a(i, 6)) = .Rows(1)
            Set dic(a(i, 6)) = Union(dic(a(i, 6)), .Rows(i))
        Next
    End With
    Set ws = Sheets.Add
    For Each e In dic
        ws.Name = e
        ws.Cells.Clear
        dic(e).Copy ws.Cells(1)
        ws.Copy
        ActiveWorkbook.SaveAs ThisWorkbook.Path & "" & e & ".xlsx"
        ActiveWorkbook.Close False
    Next
    Application.DisplayAlerts = False
    ws.Delete
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub

Att

 
Postado : 12/01/2015 8:25 am
(@dogdivine)
Posts: 0
New Member
Topic starter
 

Obrigado Alexandrevba

Dá erro na linha ws.Name = e ...

a coluna a filtrar no ficheiro original é a j ... alterei para ws.Name = j mas continua a dar erro...
tenho mais folhas também no ficheiro original mas o nome da que tem os dados a filtrar é o mesmo "Final"

se der para verificar o problema agradeço.

obrigado abc

 
Postado : 12/01/2015 10:51 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!!

Infelizmente eu não ative problemas, você testou no mesmo arquivo que postou?

Caso não (ou se fez alguma alteração), há como postar o arquivo em que está usando o código?

Att

 
Postado : 12/01/2015 11:00 am
(@dogdivine)
Posts: 0
New Member
Topic starter
 

Realmente no ficheiro que mandei funciona :D

Posso mandar e-mail pra você com o ficheiro original?

obrigado

 
Postado : 12/01/2015 11:24 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!!

Ok, pode sim!

Eu espero poder ajudar.... :)

Att

 
Postado : 12/01/2015 11:29 am
(@dogdivine)
Posts: 0
New Member
Topic starter
 

ok

já enviei depois coloco o ficheiro alterado para ficar como teste para todos

Obrigado pela disponibilidade

 
Postado : 12/01/2015 11:57 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!!

Foi feito a adaptação, de acordo com seu arquivo.

Sub AleVBA_14081V2()
    Dim a, i As Long, dic As Object, ws As Worksheet, e
    Application.ScreenUpdating = False
    Set dic = CreateObject("Scripting.Dictionary")
    dic.CompareMode = 1
    With Sheets("Final").Cells(1).CurrentRegion
        a = .Value
        For i = 2 To UBound(a, 1)
            If Not dic.exists(a(i, 10)) Then Set dic(a(i, 10)) = .Rows(1)
            Set dic(a(i, 10)) = Union(dic(a(i, 10)), .Rows(i))
        Next
    End With
    Set ws = Sheets.Add
    For Each e In dic
        ws.Name = e
        ws.Cells.Clear
        dic(e).Copy ws.Cells(1)
        ws.Copy
        ActiveWorkbook.SaveAs ThisWorkbook.Path & "" & e & ".xlsx"
        ActiveWorkbook.Close False
    Next
    Application.DisplayAlerts = False
    ws.Delete
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub

Faça os testes.
Att

 
Postado : 12/01/2015 3:01 pm
(@dogdivine)
Posts: 0
New Member
Topic starter
 

Obrigado

já funciona. :D

Eu tinha alterado as linhas como você alterou,
For i = 2 To UBound(a, 1)
If Not dic.exists(a(i, 10)) Then Set dic(a(i, 10)) = .Rows(1)
Set dic(a(i, 10)) = Union(dic(a(i, 10)), .Rows(i))

o problema era que continuava a dar erro... mesmo esse comando acima dá Erro run time erro 1004,

mas o problema era o nome do fornecedor que excedia os 31 caracteres, depois de alterados alguns ficou a funcionar na perfeição.

Valeu, obrigado pela disponibilidade, poupou algumas horas de trabalho ;)

abraço

 
Postado : 13/01/2015 6:31 am