Notifications
Clear all

Confrontar células em VBA

21 Posts
3 Usuários
0 Reactions
2,826 Visualizações
(@rtesteves)
Posts: 11
Active Member
Topic starter
 

Bom dia pessoal,

Como vocês fariam em VBA, por exemplo:

Tenho duas abas (Dados e Transf) na aba Dados eu já tenho informações nas colunas A1 (NF), B1 (Tipo), C1 (Nome) e informações nestas respectivas colunas. E na aba Transf eu tenho os "mesmos conteúdos de informações" é aí que eu queria um código para verificar as informações que estão na aba Transf com a Dados. A aba Dados será alimentada diariamente com novas informações mas eu quero verificar através da aba Transf que SE as informações que eu tenho na aba Transf for diferentes da aba Dados ela irá acrescentar no final em novas linhas senão ela não copia nada ou copia parcialmente o que não é repetido. a coluna chave seria a A(NF) que não pode ser igual e só irá copiar alguns tipos específicos, ex: 60, 120, 141 constantes na coluna B. Eu queria que fizesse tudo de uma só vez, se tiver 20 linhas na aba Transf ele já verificaria tudo e copiasse se estivesse dentro do critério.

Segue em anexo o arquivo modelo.

Aguardo ajuda.
Obrigado.

 
Postado : 11/12/2013 9:22 am
(@gtsalikis)
Posts: 2373
Noble Member
 

Bom dia pessoal,

Como vocês fariam em VBA, [...]

Como eu faria?

Primeiro, usaria um filtro diretamente na "aba" transferência, sem copiar nada.

Caso fosse realmente necessário, eu simplesmente limparia as informações em "dados" e copiaria todas de novo, em vez de ficar comparando.

 
Postado : 11/12/2013 10:09 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!!

Se você usar um gravador de macro ou a pesquisa do fórum, encontrará a solução!

Public Sub AleVBA_9890()
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim ws3 As Worksheet
Dim rng1 As Range
Dim rng2 As Range
Dim rng3 As Range

Set ws1 = Worksheets("Transf")
Set ws2 = Worksheets("Plan3")
Set ws3 = Worksheets("Dados")

Set rng1 = ws1.Range(ws1.Range("A1"), ws1.Range("C" & Rows.Count).End(xlUp))
ThisWorkbook.Names.Add Name:="myData", RefersTo:=rng1

Set rng2 = ws2.Range(ws2.Range("A1"), ws2.Range("C" & Rows.Count).End(xlUp))
ThisWorkbook.Names.Add Name:="myCriteria", RefersTo:=rng2

Set rng3 = ws3.Range(ws3.Range("A2"), ws3.Range("C" & Rows.Count).End(xlUp))

'rng3.ClearContents

ws1.Range("A2:C500").AdvancedFilter Action:=xlFilterCopy, _
      CriteriaRange:=ws2.Range("myCriteria"), _
      CopyToRange:=ws3.Range("A2"), _
      Unique:=False

End Sub

Att

 
Postado : 11/12/2013 10:31 am
(@rtesteves)
Posts: 11
Active Member
Topic starter
 

Alexandre, é isso aí, eu precisaria apenas ao invés de copiar informação da coluna A copiar a linha toda ( das colunas A, B e C). Pode me ajudar? Aqui só copiou o conteúdo da coluna A.

 
Postado : 11/12/2013 10:50 am
(@rtesteves)
Posts: 11
Active Member
Topic starter
 

Bom dia pessoal,

Como vocês fariam em VBA, [...]

Como eu faria?

Primeiro, usaria um filtro diretamente na "aba" transferência, sem copiar nada.

Caso fosse realmente necessário, eu simplesmente limparia as informações em "dados" e copiaria todas de novo, em vez de ficar comparando.

Obrigado pelo retorno gtsalikis, eu coloquei desta forma com pouca informação porém a planilha que preciso fazer terá neste momento mais de 18mil linhas. Então de forma automática ajudaria muito.

 
Postado : 11/12/2013 10:52 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!!

Testou o anexo que eu te mandei?????

Att

 
Postado : 11/12/2013 10:53 am
(@rtesteves)
Posts: 11
Active Member
Topic starter
 

Não achei anexo aqui no tópico (além do meu) mas peguei o teu código e ele só copiou a coluna A, as colunas B e C não foram transportadas para a guia Dados.

Obrigado.

 
Postado : 11/12/2013 10:58 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!!

Teste direito, limpe os dados da guia Dados.

Att

 
Postado : 11/12/2013 11:01 am
(@rtesteves)
Posts: 11
Active Member
Topic starter
 

Boa tarde !!

Quando eu limpo tudo da guia Dados ele copia, agora quando eu deixo algumas linhas preenchidas ele copia apenas a coluna A, e a guia Dados será continuamente preenchida, estou copiando o seu código em Modulo e fazendo este rotina com um botão comum (caixa de texto). Estou fazendo algo de errado?

 
Postado : 11/12/2013 11:11 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!!!

da forma como eu fiz está pegado tudo da guia "Transf " veja

ws1.Range("A2:C500")

Como você quer que os dados sejam copiados?

Sempre acrescentado um em baixo do outro da guia dados???

Att

 
Postado : 11/12/2013 11:18 am
(@rtesteves)
Posts: 11
Active Member
Topic starter
 

Isso mesmo, copiando todas as informações da linha correspondente um abaixo do outro na guia Dados. Outro erro que ocorreu é quando na guia Transf na célula A2 o valor é diferente da guia Dados A2 ele gera este erro em anexo.

Obrigado!

 
Postado : 11/12/2013 11:26 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!!

Veja se é isso...
http://www.sendspace.com/file/miys8v

Att

 
Postado : 11/12/2013 11:54 am
(@rtesteves)
Posts: 11
Active Member
Topic starter
 

Alexandre !!! Que show de bola!! É exatamente isso. Eu entendi que o código ele verifica inclusive todas as células se todas são iguais não copia! Só para aprimorar este código teria como em cada execução demonstrar na tela uma mensagem de quantas linhas foram copiadas com sucesso?

Agradeço sua atenção e parabéns pelo conhecimento.

Abs.

 
Postado : 11/12/2013 1:17 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!!

Eu não sei se entendi....
Caso queira contar a origem

MsgBox "Foram copiadas " & Sheets("Transf").Range("A1").End(xlDown).Row & " Linhas"

Mude a guia caso queira contar apenas o reulstado.
###########

Sub Filter_Coluna()

Dim rCrit As Range
Dim aCrit
'With Sheets("Dados")
'.Range("A2:D50000").ClearContents
'End With
Application.ScreenUpdating = 0
With Sheets("Plan3")
  Set rCrit = .Range("A2", .Range("A" & .Rows.Count).End(xlUp))
  aCrit = Split(Join(Application.Transpose(rCrit), Chr(1)), Chr(1))
End With
With Sheets("Transf")
  .Range("$B$1:$B$50000").AutoFilter Field:=1, Criteria1:=aCrit, Operator:=xlFilterValues
  .Activate
  .Range(.Cells(2, "A"), .Range("C" & Rows.Count).End(xlUp)).Copy Destination:=Sheets("Dados").Range("A" & Rows.Count).End(xlUp).Offset(1)
  '.Range(.Cells(2, "A"), .Cells(10000, "C")).Copy Destination:=Sheets("Dados").Range("A" & Rows.Count).End(xlUp).Offset(1)
  .ShowAllData
  End With
  Call Duplic_AleVBA_9890
  Application.ScreenUpdating = 1
  MsgBox "Foram copiadas " & Sheets("Transf").Range("A1").End(xlDown).Row & " Linhas"
End Sub

Obs:Por favor, click na mãozinha

Att

 
Postado : 11/12/2013 1:35 pm
(@rtesteves)
Posts: 11
Active Member
Topic starter
 

Eu queria contar as copias para o destino, ex: "Foram copiadas XX de linhas para a plan Dados!"

Outro detalhe, desculpe minha ignorância mas se eu precisar aumentar mais colunas para confrontar(D, E, F....) como faço?

 
Postado : 11/12/2013 2:02 pm
Página 1 / 2