Notifications
Clear all

Actualizar Folhas Excel Baseando-se em Folha Principal

10 Posts
4 Usuários
0 Reactions
1,824 Visualizações
(@tvareta)
Posts: 4
New Member
Topic starter
 

Boas pessoal,

Tenho um ficheiro excel onde registo os meus clientes. Tenho várias folhas que correspondem ao estado dos clientes (Em Contacto, Clientes, Possiveis Clientes, Não Enviar Informação, Etc...), mas todas as folhas tem as mesmas colunas. A forma como altero o estado é Cortar/Colar entre as folhas, para mim é mais fácil assim. Por exemplo: recebo um contacto está na folha "Em Contacto" se se tornar cliente Corto/Colo na folha "Clientes".

A minha dificuldade é actualizar o campo de há quantos meses não fazem encomenda, ou seja, eu tenho um ralatorio que recebo com o número de cliente e há quantos meses não faz encomenda, tipo:

Nº Cliente - Meses Sem Encomenda
2241 - 1
1452 - 5
1478 - 0
1458 - 10

Como o número de cliente só está em uma linha de todas as folhas que tenho no ficheiro excel, queria saber se era possivel fazer o seguinte:

- Importar o relatório para uma folha nova e ter um botão de actualizar, o sistema ia procurar o número de cliente em todas as folhas do meu ficheiro e actualizava a coluna "MSE".

 
Postado : 18/11/2013 9:31 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 


tvareta, bem-vindo ao Planilhando!

É possível sim.

Particularmente, entendo que o melhor seja através de programação (VBA), mas também deve ser possível através de fórmulas/vínculo.

Neste caso, especificamente, entendo que o ideal seja disponibilizar um modelo, com dados fictícios, para facilitar o entendimento dos colaboradores do fórum.

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 18/11/2013 10:00 am
(@tvareta)
Posts: 4
New Member
Topic starter
 


tvareta, bem-vindo ao Planilhando!

É possível sim.

Particularmente, entendo que o melhor seja através de programação (VBA), mas também deve ser possível através de fórmulas/vínculo.

Neste caso, especificamente, entendo que o ideal seja disponibilizar um modelo, com dados fictícios, para facilitar o entendimento dos colaboradores do fórum.

Bom dia Edson, obrigado pela resposta.
Junto envio um ficheiro exemplo para que possa ser mais fácil:

 
Postado : 19/11/2013 6:22 am
RMaia
(@rmaia)
Posts: 13
Active Member
 

Olá,

veja se eu entendi bem:

1 - Cada cliente possui um identificador único (Nº Cliente)
2 - Você recebe a lista de quantidade Meses Sem Encomendas por cliente;

O que precisa é apenas atualizar as demais planilhas com a quantidade de MSE ?

Se for, é bem mais simples. Você poderia utilizar formulas de Busca e Referencia.

Ex SOMASE:
=SOMASE('Folha a Actualizar'!$A$2:$A$1000;B2;'Folha a Actualizar'!$B$2:$B$1000)

Veja o anexo se está de acordo.

Rogério Maia
www.RMaiaSolucoes.com.br

 
Postado : 19/11/2013 6:55 am
(@gtsalikis)
Posts: 2373
Noble Member
 

Veja se era isso o que deseja.

E, lembre-se, da próxima vez, compacte os ficheiros.
Tire um tempinho e leia as regras do fórum

Lembre-se de AGRADECER aos que te ajudaram, e de marcar o tópico como [Resolvido]
Gente que cuida de gente.

Gilmar

 
Postado : 19/11/2013 7:11 am
RMaia
(@rmaia)
Posts: 13
Active Member
 

Falhei nessa de compactar também. Vou ler as regras...

Rogério Maia
www.RMaiaSolucoes.com.br

 
Postado : 19/11/2013 7:59 am
(@tvareta)
Posts: 4
New Member
Topic starter
 

Veja se era isso o que deseja.

E, lembre-se, da próxima vez, compacte os ficheiros.
Tire um tempinho e leia as regras do fórum

Olá gtsalikis, vejo que no botão vai chamar a macro:

Sub actualizar()
'codigo por gtsalikis em 19/11/2013 via planilhando
Dim ws As Worksheet, i, j, MSE As Integer, cliente As String
i = 2
Do Until IsEmpty(Sheets("Folha a Actualizar").Cells(i, 1)) = True
cliente = Sheets("Folha a Actualizar").Cells(i, 1).Value
MSE = Sheets("Folha a Actualizar").Cells(i, 2).Value
For Each ws In ActiveWorkbook.Worksheets
j = 2
Do Until IsEmpty(Sheets(ws.Name).Cells(j, 2)) = True
If Sheets(ws.Name).Cells(j, 2).Value = cliente Then Sheets(ws.Name).Cells(j, 1).Value = MSE
j = j + 1
Loop
Next
i = i + 1
Loop
End Sub

Será que podia explicar o que faz cada linha de código? Gostava imenso de perceber para depois poder aplicar em outros projectos e não estar só a copiar/colar código sem preceber as coisas.

 
Postado : 19/11/2013 9:44 am
(@gtsalikis)
Posts: 2373
Noble Member
 

Respondi com comentários no próprio código.

Creio que seja um tanto complexo entender dessa forma, até porque são 3 loops. Uma dica que pode ajudar é vc executar o código linha por linha e ver o que acontece, assim: entre no editor, entre na sub e pressione F8 para executar uma linha, passe o mouse sobre a linah executada e vc vai ver os valores sendo atualizados.

Sub actualizar()
'codigo por gtsalikis em 19/11/2013 via planilhando
Dim ws As Worksheet, i, j, MSE As Integer, cliente As String ' define as variáveis : ws é a planilha (comumente chamada de "aba"), i, j, MSE são números inteiros, por isso integer, cliente é texto, por isso string
i = 2 'define que o valor de i é 2, pois vai ser usado para a segunda linha da planilha
Do Until IsEmpty(Sheets("Folha a Actualizar").Cells(i, 1)) = True ' "Do" é o comando para fazer um loop, corre cada linha da coluna 1 da planilha "folha a atualizar" até que encontre uma linha vazia - note que Cells(i, 1) identifica a linha i, que no caso é 2, e a coluna 1, ou seja, A)
cliente = Sheets("Folha a Actualizar").Cells(i, 1).Value ' define o valor da variável cliente com o que encontrar na celula linha i, coluna 1
MSE = Sheets("Folha a Actualizar").Cells(i, 2).Value ' define o valor da variável MSE com o que encontrar na celula linha i, coluna 2
For Each ws In ActiveWorkbook.Worksheets inicia um outro loop, dentro do primeiro, correndo cada planilha, e executa o seguinte:
j = 2 'define que o valor de j será 2 (segunda linha da planilha)
Do Until IsEmpty(Sheets(ws.Name).Cells(j, 2)) = True ' idem o caso acima, mas agora, uso o comando "ws.Name", que pega o nome da planilha na qual está trabalhando, esse nome vai mudar quando recomeçar o loop com outra planilha
If Sheets(ws.Name).Cells(j, 2).Value = cliente Then Sheets(ws.Name).Cells(j, 1).Value = MSE ' se o valor da célula linha j, coluna 2 for igual ao que já tem atribuído no valor cliente, vai colocar na mesma linha (identificada por j), só que na coluna 1, o valor que ele possui em MSE
j = j + 1 'aumenta o valor de j em mais 1, o que vai fazer com que execute o loop na linha de baixo da planilha
Loop ' recomeça a partir de "Do until...", executando os mesmos procedimentos, mas agora o valor de j é maior, então corre a linha de baixo
Next ' quando acabar o loop "do until", recomela o loop "for each...", ou seja, passa para a próxima planilha e faz tudo de novo"
i = i + 1 ' aumenta o valor de i
Loop ' quando terminar de correr todas as planilhas, vai recomeçar o primeiro loop, descendo uma linha da planilha que tem os dados a serem buscados nas demais planilhas.
End Sub

Lembre-se de AGRADECER aos que te ajudaram, e de marcar o tópico como [Resolvido]
Gente que cuida de gente.

Gilmar

 
Postado : 25/11/2013 7:13 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Um adendo, como esclarecimento:
diferente do que muitos creem, a declaração de varias Variáveis em uma unica linha requer a "especificação" de cada uma das variáveis individualmente, caso contrario assumira o valor padrão que é Variant.
Ou seja declarar : Dim i, j, MSE As Integer, sómente MSE será Integer, i e j serão Variant.
Isso na pratica em projetos pequenos não afeta o desempenho da rotina.

do Help VBA Excel

' Múltiplas declarações em uma única linha. AnotherVar é do tipo Variant porque o seu tipo está omitido.
Dim AnotherVar, Choise As Boolean, BirthDate As Date

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 25/11/2013 7:44 am
(@tvareta)
Posts: 4
New Member
Topic starter
 

Obrigado a todos os que intreviram neste tópico! RMaia a sua solução também funciona no entanto o que pretendia era mais parecido com o gtsalikis indicou, um especial agradecimento aos dois!

 
Postado : 28/11/2013 4:40 am