Notifications
Clear all

Macro para atualizar informações de banco de dados

33 Posts
3 Usuários
0 Reactions
5,058 Visualizações
(@mmessias)
Posts: 44
Trusted Member
Topic starter
 

Boa Tarde!
Gente,
Tenho uma planilha que possui 2 bancos de dados: "Base de Dados Anterior" e "Base Atual"
Como o próprio nome sugere, preciso atualizar os dados da Base Anterior, a partir da base atual.

Neste caso, precisaria que a macro confrontasse as duas bases de dados a partir do ID do funcionário, informado em ambas na Coluna A.
Caso o ID exista em ambas, é necessário copiar a linha inteira de B à P na Base Atual, e colar na Base Anterior.

Caso só exista na base atual, precisaria que a macro inserisse os dados na próxima linha vazia da base anterior.
Os dados da tabela se iniciam em A4 já contando o cabeçalho.

Desde já agradeço.

Atenciosamente.

Mariana Messias

 
Postado : 16/04/2013 3:03 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Mariana, se esta operação for para ser executada uma unica vez, porque não junta os dois bancos de dados e depois utilizando a filtragem para realizar o que precisa.

[]s

 
Postado : 16/04/2013 4:21 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa noite!!

Ainda sim, caso a dica do Mauro não resolva seu problema, use a pesquisa do fórum, somente então poste seu arquivo modelo compactado!!

Att

 
Postado : 16/04/2013 5:04 pm
(@mmessias)
Posts: 44
Trusted Member
Topic starter
 

Mauro,
Quanto à sua idéia, eu já trabalhava assim anteriormente, mas se tornou um processo muito demorado pois são mais de 5 mil células com necessidade de alteração semanal. Compará-las manualmente custa muito tempo, além de ser alta a incidência de falhas, mas ainda assim, obrigada pela sugestão.

Alexandre,
Dei uma pesquisada no forum, e realmente existem tópicos similares, cheguei a utilizar as soluções dos outros casos, mas não obtive sucesso no que se refere à transpor os dados para atualizar a planilha com base em um banco de dados atual.
Não posso fornecer a planilha, é claro, por possuir dados confidenciais, pensando nisso, estou tentando fazer uma fictícia nos mesmos moldes, mas temo demorar muito a fazê-la,pois só possuo acesso ao excel e internet em meu ambiente de trabalho, o que dificulta. Em todo caso ja comecei rsrs

Muito obrigada pela atenção e sugestões.

Att,

 
Postado : 16/04/2013 6:04 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa noite!!

Vai vendo as postagem que tem relação ou são próximas desse assunto enquanto você prepara a sua planilha modelo, estaremos aguardando.

Att

 
Postado : 16/04/2013 6:14 pm
(@mmessias)
Posts: 44
Trusted Member
Topic starter
 

Muito obrigada pela ajuda!

 
Postado : 16/04/2013 6:41 pm
(@mmessias)
Posts: 44
Trusted Member
Topic starter
 

Boa noite!
Consegui um note emprestado e fiz rapidinho mais ou menos um modelo.
Coloquei explicações na própria planilha para facilitar.
Desde já peço desculpas pelo amadorismo e agradeço pela ajuda.

Att.

 
Postado : 16/04/2013 8:11 pm
(@mmessias)
Posts: 44
Trusted Member
Topic starter
 

Boa Tarde!

Amigos,

Consegui pensar em uma "solução" para a minha planilha, mas ficou muito pesado, o processamento ficou muito lento e por vezes trava a planilha.

Ficou assim:

Sub Enviar_BD()

' MACRO POR MMESSIAS 16/04/2013

Sheets("Base Atual").Select
Range("a5:p10000").Select
Selection.Copy

Sheets("Base Anterior").Select
Range("a5").Select
ActiveCell.Offset(1, 0).Range("a1").Select

Do While Selection.Value <> ""

ActiveCell.Offset(1, 0).Range("a1").Select

Loop

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

ActiveSheet.Range("$a$5:$p$10000").RemoveDuplicates Columns:=1, Header:=xlNo

Range("$a$5:$p$10000").Select

With Selection
.Interior.ColorIndex = 2
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
End With

Range("R5:af10000").Select
Selection.Copy
Range("B5:p10000").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

Range("A1").Select

MsgBox " Dados Importados com Sucesso!!"

End Sub

Há algum outro jeito que consuma menos o processamento? Pois são mais de 5 mil células preenchidas..

Estou encaminhando uma planilha compacta para que seja mais fácil de visualizar o que eu fiz.

Desde já agradeço.

Att.

 
Postado : 17/04/2013 11:41 am
(@hugomoreda)
Posts: 34
Trusted Member
 

Mariana, essa macro te atende para atualizar as infos na planilha 1.

Peço ajuda dos amigos do fórum, para introduzir o critério de que:

Caso não exista o valor da coluna 1 da sheet(2) na coluna 1 da sheet(1) então insere a linha com todos os valores da sheet(2) na última linha da sheet(1)

Sub teste()
Dim ultimalinhaws1, ultimalinhaws2 As Integer
Dim pasta1, pasta2 As Worksheet

Sheets(1).Select
Set pasta1 = Application.Worksheets(1)

ultimalinhaws1 = Cells(Rows.Count, 1).End(xlUp).Row

Sheets(2).Select
Set pasta2 = Application.Worksheets(2)
ultimalinhaws2 = Cells(Rows.Count, 1).End(xlUp).Row

pasta2.Select
Range("A4").Select

For i = 1 To ultimalinhaws2
For j = 1 To ultimalinhaws1

If pasta2.Cells(i, 1).Value = pasta1.Cells(j, 1).Value Then
pasta1.Cells(j, 2).Value = pasta2.Cells(i, 2).Value
pasta1.Cells(j, 3).Value = pasta2.Cells(i, 3).Value
pasta1.Cells(j, 4).Value = pasta2.Cells(i, 4).Value
pasta1.Cells(j, 5).Value = pasta2.Cells(i, 5).Value
pasta1.Cells(j, 6).Value = pasta2.Cells(i, 6).Value
pasta1.Cells(j, 7).Value = pasta2.Cells(i, 7).Value
pasta1.Cells(j, 8).Value = pasta2.Cells(i, 8).Value
pasta1.Cells(j, 9).Value = pasta2.Cells(i, 9).Value
pasta1.Cells(j, 10).Value = pasta2.Cells(i, 10).Value
pasta1.Cells(j, 11).Value = pasta2.Cells(i, 11).Value
pasta1.Cells(j, 12).Value = pasta2.Cells(i, 12).Value
pasta1.Cells(j, 13).Value = pasta2.Cells(i, 13).Value
pasta1.Cells(j, 14).Value = pasta2.Cells(i, 14).Value
pasta1.Cells(j, 15).Value = pasta2.Cells(i, 15).Value
pasta1.Cells(j, 16).Value = pasta2.Cells(i, 16).Value

End If

Next j
Next i

End Sub

 
Postado : 17/04/2013 1:35 pm
(@mmessias)
Posts: 44
Trusted Member
Topic starter
 

Bom dia Hugo!

Primeiramente peço desculpas pela demora, mas estava sem acesso ao pc estes dias.

Fiz um teste com a macro que vc passou e ela funcionou perfeitamente, consome pouco processamento. É ótima! Muito obrigada mesmo!

Agora só falta encontrar uma maneira de exportar os dados da Plan2 que não estiverem na Plan1 para a própria Plan1.

Tentando encontrar um maneira paleativa, eu fiz do seguinte modo:

Sub ImportAtualiza()

Texto = "Esta ação não pode ser desfeita! Deseja Continuar? "
Título = "Confirmação"
CxDialog = MsgBox(Texto, vbYesNo + vbQuestion, Título)
If CxDialog = vbYes Then

Sheets("Base Atual").Select
Range("a5:p10000").Select
Selection.Copy

Sheets("Base Anterior").Select
Range("a5").Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

Range("$a$5:$p$10000").Select

With Selection
.Interior.ColorIndex = 2
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter

End With

ActiveSheet.Range("$a$5:$p$10000").RemoveDuplicates Columns:=1, Header:=xlNo

Dim ultimalinhaws1, ultimalinhaws2 As Integer
Dim pasta1, pasta2 As Worksheet

Sheets(1).Select
Set pasta1 = Application.Worksheets(1)

ultimalinhaws1 = Cells(Rows.Count, 1).End(xlUp).Row

Sheets(2).Select
Set pasta2 = Application.Worksheets(2)
ultimalinhaws2 = Cells(Rows.Count, 1).End(xlUp).Row

pasta2.Select
Range("A4").Select

For i = 1 To ultimalinhaws2
For j = 1 To ultimalinhaws1

If pasta2.Cells(i, 1).Value = pasta1.Cells(j, 1).Value Then
pasta1.Cells(j, 2).Value = pasta2.Cells(i, 2).Value
pasta1.Cells(j, 3).Value = pasta2.Cells(i, 3).Value
pasta1.Cells(j, 4).Value = pasta2.Cells(i, 4).Value
pasta1.Cells(j, 5).Value = pasta2.Cells(i, 5).Value
pasta1.Cells(j, 6).Value = pasta2.Cells(i, 6).Value
pasta1.Cells(j, 7).Value = pasta2.Cells(i, 7).Value
pasta1.Cells(j, 8).Value = pasta2.Cells(i, 8).Value
pasta1.Cells(j, 9).Value = pasta2.Cells(i, 9).Value
pasta1.Cells(j, 10).Value = pasta2.Cells(i, 10).Value
pasta1.Cells(j, 11).Value = pasta2.Cells(i, 11).Value
pasta1.Cells(j, 12).Value = pasta2.Cells(i, 12).Value
pasta1.Cells(j, 13).Value = pasta2.Cells(i, 13).Value
pasta1.Cells(j, 14).Value = pasta2.Cells(i, 14).Value
pasta1.Cells(j, 15).Value = pasta2.Cells(i, 15).Value
pasta1.Cells(j, 16).Value = pasta2.Cells(i, 16).Value

End If

Next j
Next i

End If

MsgBox " Dados Importados com Sucesso!!"

Range("A1").Select

End Sub

Apesar de funcionar em uma planilha pequena, não funciona direito na planilha com muitos dados. Depois de executada, o excel fica carregando a planilha infinitamente, como se a macro nunca terminasse.

Alguém ai possui alguma sugestão?

Muito obrigada pela atenção.

 
Postado : 20/04/2013 1:30 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Estou confuso,
primeiro voce diz "ela funcionou perfeitamente, consome pouco processamento".Depois "não funciona direito na planilha com muitos dados".
Uma rotina funciona ou não funciona. No inicio é selecionado uma range até 10000. Não são muitos registros.
O que me chama atenção:
é copiado o conteudo da planilha chamada "Base Atual" para a planilha "Base Anterior" e formatado esse conteudo.e "eliminado duplicados"
Ate aqui tudo bem, depois na rotina é nomeada a Sheet(1) como pasta1 e sheet(2) como pasta2 -
Aqui precisa cuidado, pois o index (1) e (2) das sheets depedem de sua ordem.
Então se mudadas de posição, podem alterar o resultado da rotina.
O ideal e sempre se referir ao nome da planilha (Base...) e não sua ordem.
No final diz que :
deveria verificar (não sei porque já que não foram acrescentados novos registros) se faltam registros ,
mas a rotina vê se são iguais "If pasta2.Cells(i, 1).Value = pasta1.Cells(j, 1).Value Then" e repete um a um o que foi feito inicialmente. Ou seja pega os valores da pasta2 e sobrepoe os valores da pasta1.
O copy/paste inicial já fez isso ou não??

 
Postado : 21/04/2013 7:12 am
(@mmessias)
Posts: 44
Trusted Member
Topic starter
 

Boa Tarde Reinaldo!

Peço desculpas se não passei as informações de forma clara.

Na verdade, o que eu preciso agora, é de uma macro que copie a linha da planilha 1 para a planilha 2 caso o ID (coluna A) da planilha 2 não exista na Planilha 1.

As macros que fiz funcionam para planilhas pequenas, para a planilha em que eu realmente quero rodar a macro, não é ideal, pois ela trava em função de possuir muitos dados.

O Hugomoreda me ajudou com o maior problema que era atualizar os dados da Plan1 com os dados da Plan2. Agora só falta este problema que é o de atualizar a planilha.

Desde já agradeço.

Atenciosamente.

 
Postado : 22/04/2013 9:36 am
(@mmessias)
Posts: 44
Trusted Member
Topic starter
 

Boa Tarde!

Amigos,

Alguém possui alguma sugestão por gentileza?

Desde já agradeço.

Att.

 
Postado : 02/05/2013 9:42 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

MMessias,

Sugiro que vc siga na seguinte linha: faça a apuração com fórmulas (como vc esboçou no seu exemplo) e depois cole o resultado como valores.

No anexo demonstro como fazer a comparação entre as bases e os comandos:

1 - atualização dos dados que sofreram modificação
2 - inclusão de novos dados
3 - manutenção dos dados que não foram alvo de modificação/inclusão

Clique em atualizar e observe que as fórmulas para as 10 mil linhas permanecem na base para que a conciliação esteja permanentemente monitorada.

Tem que testar bastante para ver se escapou algo. Acredito que não...

Com relação à performance, aqui no meu rodou tranquilo. Me avise qualquer galho.

Abs,

 
Postado : 05/05/2013 6:51 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Bom dia MM,
Vou fazer uma observação. A lógica que você propõe pode não ser a mais adequada. Digo isso porque, por exemplo, se a pessoa já existir na Base Anterior, ela deve ter seus dados atualizados, caso contrário, deve ter seus dados inseridos. Ok, funciona, mas quero propor algo que será mais rápido.

A solução que desenvolvi e está anexada verificará a existência dos IDs da base atual na coluna de IDs da base anterior. Caso exista, todos estes são eliminados da base anterior. Em seguida, todo conteúdo da base atual será copiado e colado para a base anterior. Posso fazer assim, ou a posição original de cada pessoa é importante por algum motivo? Se não for problema, esta solução está desenvolvida no módulo FF1. Caso você precisa que seja feito como você havia sugerido, então deixei o módulo FF2 pronto, mas não desenvolvido. E poderei terminar mais tarde.

Não pode haver registros sem ID, ok? Ou seja, todas as linhas da coluna A em ambas as planilhas sempre estarão preenchidas, espero que seja isso mesmo.

Dito isso, favor então baixar este modelo. Como utilizei conceitos de matrizes e dicionários (o máximo no quesito desempenho em VBA), você nem vai ter tempo de piscar, e a macro já terá rodado.

Qquer coisa, é só gritar.

p.s.: como moderador preciso alertá-la, sempre que subir arquivo para o forum, compacte-o. O seu anexo, mesmo sendo pequeno (normalmente todos são) não está compactado.

FF

 
Postado : 06/05/2013 4:39 am
Página 1 / 3