FOR NEXT... Copiando dados de outra Aba com Critério
Enviado: 13 Abr 2020 às 23:38
por FernandoAG
Boa noite pessoal!
Sou novo aqui, e gostaria da ajuda de vocês, se possível. Desde já, agradeço!
Tenho uma Arquivo com 02 Abas: Relatorio e Dados.
Preciso fazer com que a macro percorra um determinado RANGE da Aba Dados e quando ele encontrar o critério especificado (data na célula H2) ele copie algumas das células daquela linha para a planilha Relatorio, e assim sussessivamente, até copiar todas as referências.
Fiz a estrutura com For Next, mas não sei o que estou errado, ou até mesmo se essa Estrutura seria a adequada.
Segue o código:
Sub Pesquisa()
'Limpa o intervalo da planilha
Relatorio.Range("A5:H100").ClearContents
'Descobre a última linha digitada da Dados tendo como referência a Coluna B
ultimalinha = Dados.Cells(Rows.Count, "B").End(xlUp).Row
'Minha planilha inicia na linha 5
lin = 5
For i = 5 To ultimalinha
'Se os dados das células forem iguais Então
If Relatorio.Range("H2") = Dados.Cells(i, 14) Then
'Copie as dados das células
Relatorio.Cells(lin, 1) = Dados.Cells(lin, 1)
Relatorio.Cells(lin, 2) = Dados.Cells(lin, 2)
Relatorio.Cells(lin, 3) = Dados.Cells(lin, 3)
Relatorio.Cells(lin, 4) = Dados.Cells(lin, 4)
Relatorio.Cells(lin, 5) = Dados.Cells(lin, 5)
lin = lin + 1
End If
Next
End Sub
O problema é que ele não está localizando corretamente. Ele entende que possui duas datas que atendem o critério, mas ele copia sempre as 02 primeiras linhas e não as linhas que possuem as datas.
Poderiam me ajudar? Em anexo planilha exemplo!
Re: FOR NEXT... Copiando dados de outra Aba com Critério
Enviado: 14 Abr 2020 às 08:29
por babdallas
Código: Selecionar todosSub Pesquisa()
'Limpa o intervalo da planilha
Relatorio.Range("A5:H100").ClearContents
'Descobre a ?ltima linha digitada da Dados tendo como refer?ncia a Coluna B
ultimalinha = Dados.Cells(Rows.Count, "B").End(xlUp).Row
'Minha planilha inicia na linha 5
lin = 5
For i = 5 To ultimalinha
'Se os dados das c?lulas forem iguais Ent?o
If Relatorio.Range("H2").Value = Dados.Cells(i, 14).Value Then
'Copie as dados das c?lulas
Relatorio.Cells(lin, 1) = Dados.Cells(i, 1)
Relatorio.Cells(lin, 2) = Dados.Cells(i, 2)
Relatorio.Cells(lin, 3) = Dados.Cells(i, 3)
Relatorio.Cells(lin, 4) = Dados.Cells(i, 4)
Relatorio.Cells(lin, 5) = Dados.Cells(i, 5)
lin = lin + 1
End If
Next i
End Sub
Re: FOR NEXT... Copiando dados de outra Aba com Critério
Enviado: 14 Abr 2020 às 08:42
por osvaldomp
lin = 5 ~~~>
desnecessário
If Relatorio.Range("H2") = Dados.Cells(i, 14) Then ~~~>
mais adequado ~~~> If Dados.Cells(i, 14) = Relatorio.Range("H2") Then
Relatorio.Cells(lin, 1) = Dados.Cells(lin, 1) ~~~>
substitua lin por i ~~~> se a colagem não for como o desejado, então veja o código abaixo
lin = lin + 1 ~~~>
desnecessário
Código: Selecionar todosSub PesquisaV2()
'Limpa o intervalo da planilha
Relatorio.Range("A5:H100").ClearContents
'Descobre a última linha digitada da Dados tendo como referência a Coluna B
ultimalinha = Dados.Cells(Rows.Count, "B").End(xlUp).Row
'Minha planilha inicia na linha 5
For i = 5 To ultimalinha
'Se os dados das células forem iguais Então
If Dados.Cells(i, 14) = Relatorio.Range("H2") Then
'Copie as dados das células
Relatorio.Cells(Rows.Count, 1).End(3)(2).Resize(, 5).Value = Dados.Cells(i, 1).Resize(, 5).Value
End If
Next i
End Sub
dica - neste seu projeto uma opção interessante ao
For ... Next é o
Find ... FindNext
Re: FOR NEXT... Copiando dados de outra Aba com Critério
Enviado: 14 Abr 2020 às 10:45
por kalebe
Osvaldo, sei que a pergunta não é minha, mas o amigo poderia me explicar essa parte do código:
Relatorio.Cells(Rows.Count, 1).End(3)(2).Resize(, 5).Value = Dados.Cells(i, 1).Resize(, 5).Value
.End(3)(2).Resize(, 5).Value = essa parte não compreendi
Re: FOR NEXT... Copiando dados de outra Aba com Critério
Enviado: 14 Abr 2020 às 20:24
por osvaldomp
Olá, Kalebe.
O comando Cells(Rows.Count,1).End(3) (2) equivale a Cells(Rows.Count, 1).End(xlUp).Cells(2, 1).
explicando, veja estas equivalências:
1 ~~~> xlToLeft
2 ~~~> xlToRight
3 ~~~> xlUp
4 ~~~> xlDown
então End(3) ---> equivale a ~~~> End(xlUp)
As expressões acima retornam uma referência ao objeto "range", neste caso, o objeto é uma célula.
Por outro lado a expressão Cells(lin, col) se refere ao objeto "range" tomado como referência, assim Cells(1,1) se refere à célula A1, pois a referência ao objeto, que é a planilha, foi omitida, ela equivale a Sheets("NomePlan").Cells(1,1).
No entanto, se for declarado o objeto "range" de referência, então Cells(1,1) fará referência ao próprio objeto declarado.
Por exemplo, como citei antes que os parâmetros de Cells são linhas e colunas, então Range("D5").Cells(1, 1) se refere à própria célula D5, e equivale a Range("D5").Range("A1").
Já Range("D5").Cells(2, 1) se refere à célula D6, e Range("D5").Cells(0, 0) se refere a C4.
Voltando agora à expressão Range("D5").Cells(2, 1), é possível simplificar para Range("D5") (2, 1), e ainda pode ser mais reduzida para Range("D5") (2), ou seja, se o parâmetro col for omitido o VBA considerará como 1.
Então, voltando às origens, Cells(Rows.Count,1).End(3), esta expressão retorna o objeto célula correspondente à última célula com conteúdo na coluna A ~~~> Cells(Rows.Count,1).End(3), e ao acrescentar (2) retornará a célula imediatamente abaixo dela, como já visto acima, que corresponderá à primeira célula vazia abaixo dos dados, e que indicará a célula em que serão colados os novos dados.
Quanto ao comando Resize, os parâmetros são lin e col ~~~> Resize(lin, col). Esse comando "estica" a referência para baixo e ou para a direita, assim Range("D5") (2).Resize(1, 5) estica uma linha para baixo e 5 colunas para a direita, ou seja, se refere a D6:H6.
Diferentemente de Cells() e de Offset(), Resize() não aceita parãmetros negativos, ou seja, não aceita "esticar" para cima e nem para a esquerda.
Mais detalhes no editor de VBA, coloque o cursor sobre o comando e aperte F1.
seguem abaixo algumas sugestões para passar o tempo na quarentena; ou coloque uma MsgBox antes de cada comando e no lugar de Select coloque Address
Sheets("Planilha1").Cells(1, 1).Select 'A1
Cells(Rows.Count, 1).End(xlUp).Cells(2, 1).Select
Range("D5").Cells(1, 1).Select 'D5
Range("D5").Cells(2, 1).Select 'D6
Range("D5")(2, 1).Select 'D6
Range("D5")(2).Select 'D6
Range("D5")(0, 0).Select 'C4
Range("D5")(2, 1).Resize(-1, 5).Select 'D6:H6
Cells(Rows.Count, 1).End(3)(2, 1).Resize(, 5).Select
Range("D5").Range("A1").Select 'D5
Re: FOR NEXT... Copiando dados de outra Aba com Critério
Enviado: 15 Abr 2020 às 08:08
por kalebe
Obrigado Osvaldo pela explicação.