Notifications
Clear all

Macro para atualizar informações de banco de dados

33 Posts
3 Usuários
0 Reactions
5,063 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
(@mmessias)
Posts: 44
Trusted Member
Topic starter
 

Boa Tarde!

Mandrix,

Muito obrigada pelo retorno, no entanto, a solução que você propês eu já havia testado, o problema é que planilha original já possui muitas fórmulas, então, em um dado momento, o excel parava de funcionar pois ficava muito pesado.

 
Postado : 06/05/2013 10:36 am
(@mmessias)
Posts: 44
Trusted Member
Topic starter
 

Boa Tarde!

FF,

A solução que você propôs é ótima, e acredito que é a que vai resolver a minha VIDA!

No entanto, gostaria de entender algumas coisinhas:

- Fiz um teste na planilha aqui, e além de possuir funcionários novos (possui na Base Atual, mas não na anterior), e funcionários com alteração de dados (copiar dados da Base Atual para Base Anterior), também existem funcionários desligados, que estarão na Base Anterior, mas não na Base Atual.
Notei que ao excluir uma linha com um funcionário qualquer da base atual, quando eu executo a macro, ela deixa uma linha em branco e copia o cabeçalho novamente. Tentei alterar por aqui, mas o nível de programação que você utilizou está além dos meus entendimentos rs..

- Também tentei entender qual a área a ser copiada, mas não consegui novamente. Na planilha original, a area com os dados para copia, em ambas as bases, é compreendido entre A5 e P1048576, (informei 10000 pq acredito ser uma quantidade de células que não será ultrapassada), a partir da Q em diante, são células com fórmulas e não poderão ser alteradas.

- Quando passei a macro para a planilha original, deu um erro de rotina "9 Subscrito fora do intervalo", o que eu fiz de errado?

Respondendo às suas dúvidas:

A coluna de ID sempre terá ID's preenchidos e a posição não é importante, desde que as informações estejam vinculadas ao ID correto.

Peço desculpas por não tê-la compactado, ainda sou leiga nestes assuntos de foruns. Farei isto com os próximos anexos.

Muito obrigada pela ajuda! Acredito que agora a conclusão da planilha está mais próxima.

Estou a disposição em caso de demais informações.

Att.

MMessias

 
Postado : 06/05/2013 11:27 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

- Fiz um teste na planilha aqui, e além de possuir funcionários novos (possui na Base Atual, mas não na anterior), e funcionários com alteração de dados (copiar dados da Base Atual para Base Anterior), também existem funcionários desligados, que estarão na Base Anterior, mas não na Base Atual.

Tudo bem, os funcionários da base antiga que não existirem na base nova serão mantidos. O código não faz nada com eles.

Notei que ao excluir uma linha com um funcionário qualquer da base atual, quando eu executo a macro, ela deixa uma linha em branco e copia o cabeçalho novamente. Tentei alterar por aqui, mas o nível de programação que você utilizou está além dos meus entendimentos rs..

Interessante isso, queria fazer esse teste por aqui, só preciso saber mesmo é como você excluiu este funcionário. Não pode simplesmente deletar o conteúdo, deve-se excluir a linha toda de forma a nunca ter linhas com ID em branco.

- Também tentei entender qual a área a ser copiada, mas não consegui novamente. Na planilha original, a area com os dados para copia, em ambas as bases, é compreendido entre A5 e P1048576, (informei 10000 pq acredito ser uma quantidade de células que não será ultrapassada), a partir da Q em diante, são células com fórmulas e não poderão ser alteradas.

Não é necessário mudar os referenciais de número de linhas, nem fixar em 1 milhão nem em 10mil, o motivo é que a macro sempre verifica qual é a última linha preenchida e trabalha a partir deste resultado. É como se a macro fosse na linha 1 milhão do Excel e desse um Ctrl+Seta pra cima. E daí ela me devolve o número dessa linha e eu trabalho com esse número, gravado numa variável.

- Quando passei a macro para a planilha original, deu um erro de rotina "9 Subscrito fora do intervalo", o que eu fiz de errado?

Provavelmente o nome da planilha no seu modelo não é o mesmo nome da planilha no seu arquivo original, e então a macro não encontrou a planilha. Para corrigir isso, se é que esse foi o erro, basta ler o código e trocar o nome das planilhas onde você os encontrar.

Muito obrigada pela ajuda! Acredito que agora a conclusão da planilha está mais próxima.

Não tenho dúvidas de que essa semana resolveremos seu problema :)

Vamos nos falando...

 
Postado : 06/05/2013 1:22 pm
(@mmessias)
Posts: 44
Trusted Member
Topic starter
 

Bom dia!

FF,

Tudo bem? Espero que sim.

Quanto à sua pergunta, eu exclui a linha inteira para simular uma base de dados atual que não informe os funcionários que foram desligados.

Corrigi o nome das planilhas e parou de dar o erro que lhe falei ontem, mas começo a dar este erro o qual lhe envio em print.

O erro foi " Erro de compilação: O tipo definido pelo usuário não foi definido"

Muito obrigada pela sua atenção.

Att.

 
Postado : 07/05/2013 7:04 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Na janela do VBE, vá em referencias e habilite a opção "Microsoft Scripting Runtime", qq coisa retorne.

[]s

 
Postado : 07/05/2013 7:10 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Puts verdade, se vc colocou o código em outro arquivo, vc precisará incluir a referência.
Siga os passos indicados pelo colega Mauro, e vamo que vamo !!

valeu Mauro,

 
Postado : 07/05/2013 7:22 am
(@mmessias)
Posts: 44
Trusted Member
Topic starter
 

Boa Tarde Amigos!

Fiz o que pediram e testei, agora está dando erro em outra linha (conforme anexo)

Verifiquei nas referências da sua planilha com a minha, e a minha tem um item ticado a mais do que a sua, o "Microsoft Forms 2.0 Object Library", o qual eu não consigo "desticar", não sei se isso implica em alguma coisa.

Como a planilha que foi enviada pelo FF funciona bem, tentei montar a minha planilha em cima dela, no entanto, ela não me deixa salvar em nenhuma hipótese...e quando salva, salva minimamente sem recuperação das alterações.

Fiz os testes da exlusão das linhas na Base Atual da sua planilha, e ao rodar a macro, ele deixa uma linha em branco na base anterior e duplica o cabeçalho.

Mais uma vez agradeço a ajuda e atenção de todos.

Att.

 
Postado : 07/05/2013 12:20 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

O erro é por não ter encontrado o modulo "chamado" Tools.
Se copiou os codigos para outra planilha, deve copiar tb o modulo tools e mante-lo como mesmo nome ou alterar a referencia para o modulo que se encontra a rotina "PegarUsedRange"

 
Postado : 07/05/2013 1:06 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa Tarde!

Mandrix,

Muito obrigada pelo retorno, no entanto, a solução que você propês eu já havia testado, o problema é que planilha original já possui muitas fórmulas, então, em um dado momento, o excel parava de funcionar pois ficava muito pesado.

MMessias,

Não tá fazendo muito sentido pra mim... Coloquei fórmulas no meu exemplo pra 10 mil linhas e rodou rapidinho. Esse processo que vc quer via VBA vai ser bastante lento (creio) porque as comparações deverão ser linha a linha em cada uma das bases. Imagine os IF´s ou For/Next para checagem individual de alterações e inclusões para cada item.

Sugiro postar sua planilha completa para avaliarmos o que é melhor para o seu caso. Pode ser também problema na produtividade (design para processamento) de suas fórmulas.

Se quiser ir à diante avise.

Abs,

 
Postado : 07/05/2013 8:48 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

MM,
O Reinaldo acertou novamente. Se você for mover o código para outro XLSM, você precisará criar a referência para o Microsoft Scripting Runtime, e tem que mover todos os módulos de código.

Outra alternativa seria mover ou copiar todo conteúdo do seu arquivo para o meu.

Eu peço desculpas por não ter avisado. A empolgação de entregar o resultado as vezes me impede de detalhar o que fazer... é uma limitação minha, admito, rs

bom ainda estou curioso para saber pq não está funcionando, ou sobre esta linha que vc mencionou...
tenho uma sugestao:
troque todos os valores por numeros randomicos do excel,
troque todos os nomes por palavras que indicam, sei la, frutas ou nomes de carros
troque as datas por datas completamente aleatórias,

aí seu arquivo perde a confidencialidade e poderemos trabalhar diretamente neles, pois há fórmulas na base atual, mas no caso do que eu fiz, as fórmulas (se houver) da base anterior serão perdidas.... utilizar o seu arquivo mesmo que com dados ficticios poderá ser melhor do que ficarmos criando modelos.

Uma vez que vc pegue o arquivo com macro pronta aqui, bastará você copiar os dados do original e colar nos devidos locais...

p.s.: se quiser conversar pelo telefone, leia meu email que enviei no seu endereço do cadastro, daí resolveremos isso muito rápido....

Boa noite MM, boa noite pessoal,

Reinaldo, obrigado por ajudar a MM a compreender e resolver as dificuldades... Estou vendo que você é bom nisso, faz jus ao título de Expert ! :) Parabéns!

 
Postado : 07/05/2013 9:23 pm
(@mmessias)
Posts: 44
Trusted Member
Topic starter
 

Boa Tarde!

Mandrix,

É pq além das tuas fórmulas, tinham as minhas. Além de outras fórmulas e macros e outras planilhas da mesma pasta, então optei por resolver por macro, cujos amigos do forum deram uma dica muito boa que consome pouco processamento. Muito obrigada pela sua atenção neste caso.

Reinaldo,

Obrigada pela dica, é que na verdade, não entendo muito de vba (pra não dizer nada), então não sabia nem como alterar o nome do modulo e nem que haviam mais do que um rs...mas fucei aqui e consegui descobrir, muito obrigada!

FF,

Consegui fazer o código rodar na minha planilha!!
O mais difícil deu certo, agora, faltam apenas duas coisinhas para finalizá-la:

A primeira é aquela situação da exclusão das linhas, estou mandando a planilha em anexo com alguns dados para você fazer o teste.
Só recapitulando, as bases atuais podem vir com menor número de funcionários por motivo de desligamento, neste caso, ao clicar em atualizar, a macro se comporta da maneira que lhe falei.
Na planilha que estou enviando, vá na base atual, exclua uma ou algumas linhas e depois clique em atualizar.

A segunda, é que gostaria de inserir uma MsgBox de decisão para alertar o usuário. Pois antes de atualizar os dados, o usuário precisa fazer algumas comparações. Então se a resposta for sim a macro roda, se não, aborta.

Tentei fazer aqui mas deu mto errado...rs

Mais uma vez, muitíssimo obrigada pela atenção e cordialidade.

Att.

MMessias

 
Postado : 08/05/2013 12:40 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Oi MM...

Desculpa a demora mais uma vez...

Aqui está, corrigi um conceito que apliquei errado no código. Agora espero que tenha dado certo...

Testa e me conta,

bjo

F.F.

 
Postado : 09/05/2013 7:36 pm
(@mmessias)
Posts: 44
Trusted Member
Topic starter
 

Boa Tarde FF,

Tudo bem?

Fiz os testes na planilha e identifiquei a seguinte situação:

Ela é perfeita quando se trata de acrescentar novos funcionários, mas está se comportando de maneira diferente quando são retirados os funcionários da base atual.

Por exemplo:

Base Anterior
1
2
3
4
5

Base Atual
1
2
3

Depois de clicar em atualizar ela fica assim:

Base Anterior
4
5
1
2
3

Base Atual
1
2
3

No caso, ela precisaria atualizar a Base Anterior com os dados da atual, então deveria ficar assim:

Antes de atualizar

Base Anterior
1
2
3
4
5

Base Atual
1
2
3

Depois de atualizar:

Base Anterior
1
2
3

Base Atual
1
2
3

Mais uma vez obrigada pela atenção.
Att,

 
Postado : 10/05/2013 10:35 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

HUUMMMMMMMM então em algum lugar nos perdemos nas explicações...

Em nenhum momento até agora você tinha falado para excluir os funcionários da base anterior, que não existissem mais na base atual.
Se for assim, fica até mais fácil, posso detonar todo o conteúdo da Anterior, sem dó, e trazer os conteúdo da Atual.
Daí não há necessidade de varrer as duas, e compará-las...

Confirma ?

 
Postado : 10/05/2013 12:28 pm
(@mmessias)
Posts: 44
Trusted Member
Topic starter
 

Boa tarde!

FF,

Desculpe a demora para responder, não tive acesso à internet neste final de semana.

Dei uma lida no que você postou e me fez pensar, pois neste caso seria algo bem mais simples...

Quando criei este tópico, tinha intenção de ter o controle de funcionários desligados na planilha anterior, daí a eu faria uma coluna de Status com um proc que me retornaria se o funcionário foi desligado ou não. A última macro que você enviou me serviria perfeitamente.

No entanto, verifiquei que a rotatividade é muito grande, então logo a base de dados ficaria cheia de funcionários desligados e o excel ficaria pesado.

A solução que você propôs me atenderia.
Mais uma vez obrigada.
Att.

 
Postado : 13/05/2013 12:52 pm
Página 2 / 3