Notifications
Clear all

Rotina Ultimos Aumentos

15 Posts
3 Usuários
0 Reactions
2,396 Visualizações
(@miguexcel)
Posts: 167
Estimable Member
Topic starter
 

Oi pessoal,

Preciso muito de vossa ajuda e conhecimentos para solucionar um problema/desafio que estou enfrentando.

Em meu trabalho tenho um relatório que sai de sistema parecido com o que coloquei no anexo. Eu retiro este relatório do sistema todos os meses (o relatório tem cerca de 150.000 linhas) e tenho de verificar os últimos aumentos de meus funcionários. Então, no final, eu preciso dizer qual o salário actual (linha com a data 31.12.9999) e quando foi o ultimo aumento e qual o percentual. No entanto, tem também uma coluna de motivos que deve se ter em conta, pois os aumentos por tabela ou por alteração de horário não são considerados aumento.

No anexo eu coloquei:
- um exemplo de meu relatório, mas só com 2 funcionários
- uma folha com os motivos e quais devem ser considerados
- uma folha com o resultado final esperado

Dava muito jeito criar uma rotina em VBA "poderosa" e robusta que considere todas estas variaveis para trabalhar esta informação. Assim minimizo meu erro e torno o processo mais rápido, escusando de ver um a um todos os meses. Alguém me pode ajudar?

Espero ter sido claro no meu problema
Obrigado a todos

 
Postado : 27/06/2017 5:40 pm
(@osvaldomp)
Posts: 857
Prominent Member
 

Dúvidas:

1. todos os nomes da lista da planilha "RelatórioExemplo" terão ou "Promoção" ou "Alteração por Reconhecimento" na coluna 'G' ? Podem aparecer os dois motivos para um mesmo nome ? Se sim, qual será considerado ?
2. para o nome "Pedro" da lista da planilha "RelatórioExemplo" há repetição de "Promoção" na coluna 'G', nesse caso qual a data a ser considerada, a da linha 12 ou a da linha 14 ? explique o critério da escolha; o motivo "Alteração por Reconhecimento" também poderá se repetir para um mesmo nome ?
3. em 'D3' da planilha "ResultadoFinalEsperado" está EUR, não deveria estar uma data ali ?
4. como é calculado o "Percentual ultimo Aumento", coluna 'E' da planilha "ResultadoFinalEsperado" ?

Osvaldo

 
Postado : 27/06/2017 8:03 pm
(@miguexcel)
Posts: 167
Estimable Member
Topic starter
 

Ola Osvaldomp

Muito obrigado por seu comentario.

1- a estrutura do relatorio é sempre igual e exatamente tal como enviei. O motivo aparece sempre na linha G. Por norma, cada linha de registo tem um motivo pelo que poderao existir 2 ou mais registos para o mesmo emprego.
2- todos os dados que saem do relatorio sao carregados em sistema pela area administrativa. No caso do Pedro, pode ter sido promovido 2 vezes em datas diferentes. Todos os motivos se poderao repetir para um mesmo nome, pois depende das datas em que acontece.
3- tem razao. Deveria estar uma data. Foi erro meu.
4- o percentual nao é nada mais do que a variação entre o novo salario e o anterior. Sendo que este exercicio so deve ser feito para a alteracao maos recente.

O relatorio sai sempre igual e ordenado por empregado e data de registos. Assim, a logical da roti na devera ser a seguinte:
Para cada empregado deve-se verificar para cada linha se ha alteracao do salario em relacao à linha seguinte. Se houver alteracao, tem que se validar o motivo. Se o motivo for um dos que é considerada, entao faz a variacao entre um salario e outro, se nao continua as vwrificacoes nas linha

Obrigado

 
Postado : 28/06/2017 2:05 am
(@osvaldomp)
Posts: 857
Prominent Member
 

Infelizmente os seus comentários não contribuíram para esclarecer qualquer das dúvidas que coloquei.

Sugiro que você leia atentamente cada dúvida e a responda com objetividade, fornecendo exemplos para facilitar o entendimento.

Entendo que muitas das expressões que você utilizou nos seus comentários são óbvias para você, que está familiarizado com o Relatório, mas para quem não conhece o Relatório ... Exemplos:

o percentual nao é nada mais do que a variação entre o novo salario e o anterior.
Você precisa informar em que célula está o novo salário e em que célula está o anterior. Demonstre como foram calculados os percentuais do exemplo que você postou, indique os endereços das células que foram consideradas nos cálculos.

Outro:
Sendo que este exercicio so deve ser feito para a alteracao maos recente.
Informe critérios, coluna, células, pois "alteração mais recente" não ajuda. Demonstre com exemplos.

Outro:
tem razao. Deveria estar uma data
Qual data ? Porque tal data ?

Ainda, não se preocupe com a lógica a ser adotada no código, pois ela poderá não coincidir com a lógica que você está imaginando, e o que importa é o resultado.
Se não esclarecer todas as dúvidas eu não consigo te ajudar.

Osvaldo

 
Postado : 28/06/2017 6:24 am
leandroxtr
(@leandroxtr)
Posts: 447
Reputable Member
 

Realmente está bem difícil de entender. rs

Abri a planilha e fiquei olhando pra ela, tentando deduzir o que ele quer, pois não entendi o que quis dizer em alguns momentos.

Outra coisa estranha é que a planilha parece que é lida debaixo pra cima, de acordo com cada funcionário. Isso 'pode' dificultar bem na elaboração dos códigos. kk

Ta difícil rs

Se te ajudou, não se esqueça de dar um like na resposta e marcar o tópico como finalizado.

Abraços!
Leandro Cordeiro

 
Postado : 28/06/2017 6:41 am
(@miguexcel)
Posts: 167
Estimable Member
Topic starter
 

Olá,

Muito obrigado pela vossa disponibilidade e tempo dedicado ao meu problema. ME deculpem se não fui claro. Voltei a anexar a planilha corrigida e tentarei esclarecer melhor a situação:

Antes de mais, o relatório deve ser lido de cima para baixo, pois a informação está ordenada por nº empregado e depois por data de inicio.
Respostas às restantes dúvidas:

1 - Sempre que existe uma alteração num empregado, é criada uma linha de cadastro no sistema com a data de inicio, data de fim, novo salário e motivo da alteração. É por isso que vêem os empregados repetidos no "relatórioExemplo", pois quando tiro o relatório de sistema vem todo o histórico de cadastro do empregado. Portanto, todos os nomes da lista da planilha terão um motivo cadastrado na coluna G. Podem aparecer os dois motivos para um mesmo nome mas nunca com a mesma data de inicio. Serão sempre linhas de registo diferentes. Entende?

2 - Para o nome "Pedro" há repetição de promoção na coluna G e nesse caso tem que sempre ser considerada a linha com a data mais recente. Neste caso a linha 12. E sim, o motivo "alteração por reconhecimento" também poderá se repetir tal como se repetiu o motivo "promoção". Importa referir que entre o motivo "Promoção" e/ou "Alteração por Reconhecimento" não existe diferenciação, porque ambos são para ser considerados conforme diz na planilha "Motivos". Na existência destes dois motivos para o mesmo nome, o critério de escolha deverá ser sempre a data de ínicio, ou seja, o mais recente.

3 - Em D3 existia um erro que já corrigi. Deveria estar uma data que deverá ser a da promoção.

4. como é calculado o "Percentual ultimo Aumento", coluna 'E' da planilha "ResultadoFinalEsperado" ?
No caso do Antonio, o calculo do percentual foi calculado da seguinte forma, tendo como referência a planilha "RelatórioExemplo": C4/C5-1
"C4" = linha que reflecte o último aumento a considerar, pois se trata de uma promoção.
"C5" = linha imediatamente a seguir, pois reflecte o salario anterior à promoção.

Me desculpem novamente se não consegui transmitir da melhor forma, mas isto se torna um pouco complexo. Espero que compreendam e mais uma vez muito obrigado.

 
Postado : 28/06/2017 2:42 pm
(@osvaldomp)
Posts: 857
Prominent Member
 

Experimente o código abaixo.
Faça o teste inicialmente no segundo arquivo que você disponibilizou.
Ao rodar o código a planilha "RelatórioExemplo" deverá ser a planilha ativa.

Sub ÚltimosAumentos()
 Dim k As Long, LR As Long, m As Long, x As Long, y As Long, v As Long
  If Sheets("ResultadoFinalEsperado").[A2] <> "" Then
   Sheets("ResultadoFinalEsperado").Range("A2:E" & Sheets("ResultadoFinalEsperado").Cells(Rows.Count, 1).End(3).Row).Value = ""
  End If
   For k = 2 To Cells(Rows.Count, 1).End(3).Row
    m = Application.CountIf([A:A], Cells(k, 1))
    If Application.CountIf(Cells(k, 7).Resize(m - 1), "Promoção") > 0 Then _
     x = Application.Match("Promoção", Cells(k, 7).Resize(m - 1), 0)
    If Application.CountIf(Cells(k, 7).Resize(m - 1), "Alteração por Reconhecimento") > 0 Then _
     y = Application.Match("Alteração por Reconhecimento", Cells(k, 7).Resize(m - 1), 0)
     If (x + y) > 0 Then
      If x = 0 Then
       v = y + k - 14
      ElseIf y = 0 Then
       v = x + k - 1
      Else
       v = WorksheetFunction.Min(x, y) + k - 1
      End If
      With Sheets("ResultadoFinalEsperado")
       LR = .Cells(.Rows.Count, 1).End(3).Row
       .Cells(LR + 1, 1).Resize(, 3).Value = Cells(k, 1).Resize(, 3).Value
       .Cells(LR + 1, 4) = Cells(v, 5)
       .Cells(LR + 1, 5) = (Cells(v, 3) / Cells(v + 1, 3) - 1)
       k = k + m - 1
      End With
     End If
    x = 0: y = 0
   Next k
End Sub

Osvaldo

 
Postado : 28/06/2017 7:56 pm
(@miguexcel)
Posts: 167
Estimable Member
Topic starter
 

Olá Osvaldo

Que bom que entendeu meu problema. NEm sei como lhe agradecer por sua ajuda.

queria lhe dar feedback e pedir alguns ajustes. Quando insiro mais empregados no relatórioExemplo, parece que o código faz a leitura de baixo para cima, quando deveria ser de cima para baixo. Veja o exemplo que coloco em anexo.

Problemas que detectei e/ou desenvolvimentos:

1) será possível explicar no código VBA cada passo? Não sou muito entendido no assunto e há coisas que não estou entendendo como por exemplo: v = y + k - 14
Seria uma grande ajuda se pudesse acrescentar comentários.
2) Como referi, existe uma tabela de motivos na planilha 'Motivos'. Neste momento, apenas considero 2 motivos mas gostaria de tornar o código dinâmico, ou seja, ir à tabela dos motivos, mudar a parametrização e/ou acrescentar motivos e automaticamente o código fazer o calculo de acordo com novas indicações. (veja também notas que coloquei no arquivo

Muito Obrigado por sua preciosa ajuda

 
Postado : 29/06/2017 3:30 pm
(@miguexcel)
Posts: 167
Estimable Member
Topic starter
 

Osvaldo,

Gostaria ainda de acrescentar uma nota. Vejo pelo seu código que um dos primeiros critérios de verificação é o motivo. Ou seja, voucê se para determinado empregado existe aquele motivo. No entanto, o primeiro critério de verificação deverá ser:

1º onde existe variação de valor do salário
2º Existindo essa variação, então verifica se o motivo corresponde a um dos que é considerado.
3º Se corresponder, então coloca a data e o percentual de variação. Se não corresponder, procura outra variação de valor... e assim sucessivamente

Exemplo do Antonio de acordo com esta sequencia:
1) nas linhas 2 e 3 (coluna C), verifica-se uma variação
2) A variação corresponde a Alteração por Tabela (conforme indica na linha 2), por isso não cumpre o critério.
3) nas linhas 3 e 4 (coluna C), verifica-se uma variação
4) A variação corresponde a Alteração por Tabela (conforme indica na linha 3), por isso não cumpre o critério.
5) nas linhas 4 e 5 (coluna C), verifica-se uma variação
6) A variação corresponde a Promoção (conforme indica na linha 4), por isso cumpre o critério. Neste caso, a data do último aumento salarial foi em 01.01.2014 (conforme indica a celula 'E4') e deverá ser calculado o percentual = C4/C5-1

Nota: por exemplo, se na linha 2 e 3 (coluna C) (Passo 1) não se verificasse uma variação, não há necessidade de verificar o motivo (Passo 2), passando logo para as verificação nas linhas 3 e 4 (coluna C) (Passo 3)

Uma vez encontrado o ultimo aumento, pode passar para o próximo empregado.

Muito Obrigado

 
Postado : 29/06/2017 3:43 pm
(@osvaldomp)
Posts: 857
Prominent Member
 

O erro que houve no terceiro nome foi justamente devido a essa linha v = y + k - 14, honestamente não sei como esse 4 foi parar aí.
Remova o 4, deve ficar assim ~~~> v = y + k - 1 e faça os testes com mais funcionários até a lista completa, com base nos parâmetros que foram acertados até agora.

Osvaldo

 
Postado : 29/06/2017 8:31 pm
(@miguexcel)
Posts: 167
Estimable Member
Topic starter
 

Osvaldo,

Muito Obrigado pela sua resposta. Corrigindo, parece funcionar. Mas tenho de ver bem se fica correto com todos os funcionários.

Teve a oportunidade de ver a totalidade dos meus dois ultimos posts? Havia algumas questões para as quais necessito de ajuda. Não sou bem entendido nesta matéria.

Obrigado.

 
Postado : 30/06/2017 3:49 pm
(@miguexcel)
Posts: 167
Estimable Member
Topic starter
 

Olá pessoal, alguem consegue me ajudar neste seguimento?

Obrigado

 
Postado : 03/07/2017 2:27 pm
(@osvaldomp)
Posts: 857
Prominent Member
 

... parece funcionar. Mas tenho de ver bem se fica correto com todos os funcionários.

E ... :?: :?: :?: :?: :?:

Osvaldo

 
Postado : 03/07/2017 2:43 pm
(@miguexcel)
Posts: 167
Estimable Member
Topic starter
 

Osvaldo, está correndo bem o código quando aplico todos os funcionários.

No entanto, os critérios de verificação têm que ser alterados conforme referi nos meus últimos posts (através de exemplo).

Acontece que a informação é registada em sistema por outras pessoas que não controlo. E acontece que por vezes registam erradamente a informação. O importante aqui é verificar as variações do valor do salário. Por vezes acontece estar registado um motivo (ex: promoção) e não ter variação no salário. Da forma como está montado o código, não vou perceber quando foi a ultima alteração porque o primeiro critério de verificação está sendo o motivo. Veja a alteração que fiz no ficheiro que envio (a azul, na folha "relatórioExemplo")

Exemplo para o António: Existe uma promoção a 01.01.2014, mas sem aumento salarial. O ultimo aumento salarial que existiu e que deve ser considerado foi a 01.08.2010.

Muito Obrigado por sua ajuda.

 
Postado : 03/07/2017 5:03 pm
(@miguexcel)
Posts: 167
Estimable Member
Topic starter
 

E aí Osvaldo? Conseguiu dar uma olhada?

Mais uma vez agradeço o tempo que dedicou ao assunto

Cumprimentos

 
Postado : 06/07/2017 7:06 am