Notifications
Clear all

Método Autofilter da Classe Range Falhou

7 Posts
1 Usuários
0 Reactions
6,856 Visualizações
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

----------------------------------------------------------------------------------------------------
O que estou tentando fazer:

Estou tentando importar dados da workbook "REGISTROS" para workbook "IMPORTAR_REGISTROS" baseado numa condição. Essa condição é a SAFRA.

----------------------------------------------------------------------------------------------------
Problema/Situação:

1º Na Workbook "IMPORTAR_REGISTROS" tem um botão "buscar" que quando clicado chama um form.
2º No form existem varias opcoes de safra (ano a ano ou todos).
3º quando escolho a opcao que desejo importar aparece esse erro.

Erro em tempo de execução '1004'
O método autofilter da classe range falhou.

O erro esta nesse trecho do código.

If safra <> "Todos" Then
  
    Selection.AutoFilter
    ActiveSheet.Range("$A$8:$AO$15").AutoFilter Field:=4, Criteria1:=safra
    Range("B5").Select
    
  Range(Selection, Selection.End(xlDown)).Select
  Range(Selection, Selection.End(xlToRight)).Select
  Selection.Copy

Segue o código completo:

Private Sub CommandButton1_Click()

  Dim safra As String
 
  safra = ComboBox1.Text
    
  Application.ScreenUpdating = False
  
  Windows("IMPORTAR_REGISTROS.xls").Activate
  Range("B8").Select
  Range("B8:AO65000").Select
  Selection.ClearContents
  Range("B8").Select
  
  Workbooks.Open Filename:= _
        ThisWorkbook.Path & "REGISTROS.xls"
       
  Windows("REGISTROS.xls").Activate
  Sheets("Vendas").Activate
  
  If safra <> "Todos" Then
  
    Selection.AutoFilter
    ActiveSheet.Range("$A$8:$AO$15").AutoFilter Field:=4, Criteria1:=safra
    Range("B5").Select
    
  Range(Selection, Selection.End(xlDown)).Select
  Range(Selection, Selection.End(xlToRight)).Select
  Selection.Copy
 
 Else
 
    Selection.AutoFilter
    Range("B8").Select
    Range(Selection, Selection.End(xlDown)).Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Copy

End If
 
  Windows("IMPORTAR_REGISTROS.xls").Activate
  Sheets("VENDAS").Activate
  Range("B8").Select
  ActiveSheet.Paste
  Application.CutCopyMode = False
  Range("B8").Select
 
  Windows("REGISTROS.xls").Activate
  ActiveWorkbook.Saved = True
  ActiveWorkbook.Close
    
  Me.Hide
  MsgBox ("Atualizado com sucesso!!!")
  
  safra = Empty

    Application.ScreenUpdating = True

End Sub

Private Sub CommandButton2_Click()

Me.Hide

End Sub

----------------------------------------------------------------------------------------------------
.

Segue Arquivos para análise: (Arquivos de exemplo na versão do excel 2007.)

[url]Link: http://fyels.com/NJz00p [/url]

.

 
Postado : 25/07/2011 1:02 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Kabele, esta questão já não foi resolvida nos tópicos abaixo ou é uma outra situação, pois seria o caso de somente acertar os ranges :

Ajuda para código em VBA
viewtopic.php?f=10&t=1962&p=7919#p7919

VBA - Importar informação usando CONDIÇÃO
http://www.tomasvasquez.com.br/forum/vi ... 1038#p5443

Ajuda para código em VBA(RESOLVIDO)
http://www.tomasvasquez.com.br/forum/vi ... 5491#p5491

[]s

 
Postado : 25/07/2011 3:54 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Coutinho, é uma outra situação semelhante. Acho que deve ser somente a range já que o problema é no autofilter. Porém não consegui. Tem algum detalhe que esta passando batido. Por isso solicitei a ajuda.

 
Postado : 25/07/2011 4:52 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Kabele, o range que está utilizando para a filttragem contem celulas Mescladas, e só podemos copiar e colar celulas mescladas com as mesmas características, e como apos o filtro a linha fica em uma só, não temos como copiar.

Depois, para aplicar o Filtro tem de Selecionar a celula antes:
Range("D5").Select
Selection.AutoFilter

Segundo, o Campo (Field:=4) está incorreto, o certo é Field:=3 que é o campo que contem a Data :
ActiveSheet.Range("$A$8:$AO$15").AutoFilter Field:=3, Criteria1:=safra

Criamos a Variavel :
Dim rngFiltrado As Range 'Define o Range Filtrado

e depois a instrução :
'Seleciona somente as celulas Filtradas
With ActiveSheet.AutoFilter.Range
Set rngFiltrado = .Offset(2, 0) _
.Resize(.Rows.Count - 2, 8)
.SpecialCells (xlCellTypeVisible)
End With

rngFiltrado.Interior.ColorIndex = 6 'Só para destacar, pode apagar
rngFiltrado.Copy

As implementações acima já estão na rotina no anexo, faça os testes e veja se seria isto.

[]s

 
Postado : 25/07/2011 7:43 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

.

Mauro, tudo isso que estou tentando fazer é para juntar as varias "SAFRAS" que estao espalhadas por diversas planilhas em separado desde 2005 (seis workbook diferente). Existe uma workbook para cada safra e resolvi centralizar todas elas numa só. O porem de tudo isso é que existe configurações diferente em cada workbook, colunas que existem numas nao existem nas outras, dados que existem em umas não existem em outras e etc. Estou tentando montar uma unica planilha sem formatação, formulas, etc... APENAS DADOS, NADA MAIS.

Eu estou pegando cada informaçao das varias planilhas e juntando elas numa unica planilha central e depois vou jogar tudo isso na planilha que uso diariamente.

---------------------------------------------------------------------------------------------------------

Fiz uma alteração no arquivo que te mandei, retirei as células mescladas dos cabeçalhos(títulos) das colunas:

" Mais importante do que fazer é entender o que se esta fazendo. "

Por isso te peço ajuda para as três situações abaixo:

1º) Porque ao clicar no botão "buscar" e selecionar a "safra" os dados importados são somente das primeiras colunas ( B,C,D,E,F,G,H,I ) e não os dados todos das outras colunas?

2º) Explicação para essa formula:
=DESLOC(Vendas!$A$6;1;0;CONT.VALORES(Vendas!$A$7:$AO$14);1)

3º) Coutinho, vc disse que por eu ter usado o "Selection" eu tenho que referenciar uma celula antes. Existe outro comando? Sempre que eu usar o "Selection" terei que referenciar uma celula antes?

If safra <> "Todos" Then
    'Como usou o Selection, temos de selecionar a celula antes
    Range("D5").Select
    Selection.AutoFilter
    'ActiveSheet.Range("$A$8:$AO$15").AutoFilter Field:=4, Criteria1:=safra
    ActiveSheet.Range("$A$7:$AO$15").AutoFilter Field:=3, Criteria1:=safra

---------------------------------------------------------------------------------------------------------

Segue novo arquivo:

http://fyels.com/8sz00p

.

 
Postado : 26/07/2011 9:18 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Kabele, este seu novo arquivo está com erro no link.

Quanto as questões :
1º) Porque ao clicar no botão "buscar" e selecionar a "safra" os dados importados são somente das primeiras colunas ( B,C,D,E,F,G,H,I ) e não os dados todos das outras colunas?
R: Em seu modelo original que anexou, se você adicionar, Range("D5").Select, ficando assim :
If safra <> "Todos" Then
Range("D5").Select
Selection.AutoFilter
ActiveSheet.Range("$A$8:$AO$15").AutoFilter Field:=3, Criteria1:=safra

Verá que ao ser executada o Filtro é formado corretamente, e depois temos :
Range("B5").Select

Range(Selection, Selection.End(xlDown)).Select
Range(Selection, Selection.End(xlToRight)).Select

onde você seleciona "B5", e as próximas instruções Selecionam as Colunas "B até I", então supuz que era este Range que queria, e pelo que postou agora, reparei que quer todas, só que a instrução, Range(selection, Selection....., Seleciona as Colunas que Contem Dados, parando na primeira celula Vazia que encontrar, ou seja "I5:I6" uma vez que nas Celulas "J5:J6" estão Vazias.

Agora se quer TODAS as Colunas (Coluna 2(B) até a 41(AO)), é só alterar na instrução na linha :
.Resize(.Rows.Count - 2, 8) para .Resize(.Rows.Count - 2, 40).

2º) Explicação para essa formula:
=DESLOC(Vendas!$A$6;1;0;CONT.VALORES(Vendas!$A$7:$AO$14);1)

R : Não sou muito bom em formulas, isto é mais com o Bernardo e o leonardojones, que são feras em formulas, mas me parece uma formula de intervalos dinâmicos :
DESLOC - Desloca quantidade especificada abaixo e a direita, no caso acima $A$6;1;0, retorna o Dado que está em A7 na mesma Coluna, se fosse $A$6;2;1, retorna a partir de A6 duas Celulas abaixo o Valor que está na Coluna B
CONT.VALORES :Conta a quantidade de Valores existentes no endereço definido.
De uma olhada no link abaixo, tem uma explicação bem detalhada do Adilson Soledade junto com um exemplo para baixar.
intervalos dinâmicos
http://usuariosdoexcel.wordpress.com/2011/04/17/

3º) Coutinho, vc disse que por eu ter usado o "Selection" eu tenho que referenciar uma celula antes. Existe outro comando? Sempre que eu usar o "Selection" terei que referenciar uma celula antes?
R : Sempre que usamos a Propriedade Selection, siginifica que uma celula está selecionada, no seu caso com o Filtro, poderiámos suprimir estas instrução deixando somente :
ActiveSheet.Range("$A$7:$AO$15").AutoFilter Field:=3, Criteria1:=safra
Desde que a linha de Cabeçalho já esteja formado com a opção Dados/Filtro.

Não sei se fui claro, tem coisas que é mais simples fazer do que explicar.
Vou sugerir mais uma dica para você entender melhor as ações da Rotina, faça o seguinte :
Abra o arquivo IMPORTAR_REGISTROS.xls, exiba a tela do VBA, acesse seu formulário e de dois clique no Botão "BUSCAR", agora siga a rotina PASSO a PASSO utilizando a Tecla F8, vá precionando a mesma e verá que será executada todas as linhas uma a uma cada vez que preciona F8, ficando bem mais simples de visualizar e entender o que cada instrução está realizando.

[]s

 
Postado : 26/07/2011 5:28 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Mauro Coutinho.

Fiz alguns testes preliminares após alterar a range conforme sua orientação e funcionou. Farei mais alguns testes e volto a postar o arquivo atualizado e funcional.

Obrigado pela pronta ajuda amigo.

 
Postado : 26/07/2011 7:01 pm