Notifications
Clear all

Calcular total de horas considerando atividades simultâneas

12 Posts
3 Usuários
0 Reactions
2,025 Visualizações
(@jorudess)
Posts: 0
New Member
Topic starter
 

Boa noite,

Primeiro quero parabenizar o trabalho de vocês (monstros do excel) aqui no fórum pela rapidez e eficiência na resolução dos problemas apresentados por nós, meros mortais.

Essa semana o Patropi me ajudou com uma fórmula que estava consumindo meus neurônios e tenho certeza que algum de vocês vai me ajudar dessa vez também.

Tenho uma planilha com o controle de determinadas atividades: data, hora de início, hora de término e duração total da atividade. No entanto, algumas dessas atividades acontecem em simultâneo, por exemplo:

Atividade 1 - Data: 13/03 - Inicio: 12h00 - Término: 13h00 - Duração total: 1h00
Atividade 2 - Data: 13/03 - Início: 15h00 - Término: 16h00 - Duração total: 1h00
Atividade 3 - Data: 13/03 - Início: 15h10 - Término: 16h10 - Duração total: 1h00
________________________________________________________TOTAL: 3h00

Porém, como algumas atividades aconteceram em simultâneo, o somatório correto seria: 2h10 (1h da atividade 1 + 1h10 das atividades 2 e 3).

Segue em anexo, uma planilha de exemplo para vocês analisarem. Deixei um exemplo da forma atual, que está incorreta, e embaixo, fiz um exemplo manual do resultado correto que eu preciso.

Aguardo um retorno.

 
Postado : 13/03/2015 4:20 pm
(@jorudess)
Posts: 0
New Member
Topic starter
 

Alguém me dá uma luz de como montar essa fórmula?

Obrigado.

 
Postado : 14/03/2015 4:39 pm
(@issamu)
Posts: 0
New Member
 

Olá Jerudess!
Sua pergunta é bastante desafiadora e vou tentar pensar numa solução quando tiver tempo disponível. No momento estou viajando de férias com quase nenhum tempo para acessar o fórum.

Eu pensei numa solução que ainda não é ideal, pois a fórmula matricial que faz o cálculo que você quer, mas a fórmula tem que ser incrementada a cada nova atividade, então se tiverem muitas atividades no dia, fica muito longa...

Só para você ter idéia, com 3 atividades do modelo, a fórmula matricial (CRTL+SHIFT+ENTER) ficou:

=SOMA(--(((((LIN(1:1440)*"00:01")>=B7)*((LIN(1:1440)*"00:01")<C7))+(((LIN(1:1440)*"00:01")>=B8)*((LIN(1:1440)*"00:01")<C8))+(((LIN(1:1440)*"00:01")>=B9)*((LIN(1:1440)*"00:01")<C9)))>0))

Em negrito é a parte da fórmula que é repetida para cada atividade.

Assim que tiver uma resposta melhor volto a postar.

Abraços!

 
Postado : 16/03/2015 8:36 am
(@jorudess)
Posts: 0
New Member
Topic starter
 

Issamu,

Obrigado pela atenção.

Eu não sabia que o meu problema era tão desafiador... ^^'

Eu não entendi nada da fórmula que você montou, está num nível muito avançado pra mim, mas pelo teste que eu fiz funcionou, porém, eu tenho algumas dúvidas:

1 - Como você mesmo disse, em caso de muitas atividades no dia esta fórmula não é ideal. No momento eu estou com uma média de 11 atividades por dia, mas no futuro, terei uma média de pelo menos 30 atividades por dia, a maioria delas em simultâneo.

2 - Baixei o anexo que você enviou e notei que sua fórmula não faz referência nenhuma com as datas, e isso é imprescindível para mim, porque terei pelo menos 30 lançamentos por dia, e se a fórmula considerar apenas os horários, o resultado não será correto.

No mais, eu agradeço pela sua atenção e esforço e aguardo o seu retorno.

 
Postado : 16/03/2015 1:20 pm
(@jorudess)
Posts: 0
New Member
Topic starter
 

Alguém mais tem uma dica de como solucionar meu problema?

 
Postado : 21/03/2015 10:12 am
(@issamu)
Posts: 0
New Member
 

Olá Jerudess!!
Como eu disse, essa sua questão é bastante desafiadora para realizar somente com as funções nativas do Excel. Por isso, vou propor uma solução criando uma nova função personalizada (UDF) através do VBA.

Abra o VBA (ALT+F11) e adicione um novo módulo no seu projeto e copie o código abaixo:

Function CalcularHoras(ByVal rgSel1 As Range, rgsel2 As Range)
'rgsel2 só foi adicionado para permitir a atualização automática da fórmula, essa variável não está sendo utilizada no código.
    
    Dim i As Double
    Dim x As Long
    Dim rgCell As Range
   
    
    For i = TimeValue("00:00") To TimeValue("23:59") Step TimeValue("00:01")
                
                For Each rgCell In rgSel1
                    
                    If i >= TimeSerial(Hour(rgCell.Value), Minute(rgCell.Value), 0) And _
                        i <= TimeSerial(Hour(rgCell.Offset(0, 1).Range("A1").Value), Minute(rgCell.Offset(0, 1).Range("A1").Value), 0) Then
                        x = x + 1
                        GoTo N
                    End If
                    
                Next rgCell
        
N:
    Next i
    
    CalcularHoras = TimeSerial(Int((x - 1) / 60), XLMod(x - 1, 60), 0) - TimeValue("00:01")
    
End Function

Function XLMod(a, b)
    ' This replicates the Excel MOD function
    XLMod = a - b * Int(a / b)
End Function

Feche o vba e volte para sua planilha. A função que você vai utilizar será "=CalcularHoras(intervalo de Hora Inicio; Intervalo de Hora Final)"

Formate a célula com formato de horas para ter o resultado desejado.

Não desenvolvi a função com a variável de dia, embora seja possível, portanto os intervalos na fórmula devem ser equivalentes a de um dia só. E outra coisa, os horário inicial e final devem estar no mesmo dia. Notei que no seu arquivo você tem atividades que tem o horário final terminando no dia seguinte ao marcado, neste caso não vai funcionar corretamente, pois a função esta analisando todos os minutos de um só dia.

Se não te atender, tem que ir aperfeiçoando a UDF até chegar a solução ideal.

 
Postado : 23/03/2015 8:34 am
(@jorudess)
Posts: 0
New Member
Topic starter
 

Valeu Issamu,

Vou testar aqui!

 
Postado : 23/03/2015 8:38 pm
(@edcronos)
Posts: 1006
Noble Member
 

não sou de visitar a seção de formulas " se bem que preciso pq já esqueci quase tudo"

está meio dificil par mim entender o pedido
mas caso a udf do issamu não atender ou ser for necessário ser por formula

pode se tentar uma coluna auxiliar com valores de ajuste
mas os valores tem que estar ordenados
seria uma coluna com algo assim

=SE(E(B7=B8;HORA(C7)=HORA(C8));D8-D7+E7;SE(E(B7=B6;HORA(C7)=HORA(C6));0;B7))
mas eu não entendi muito bem , não consegui ajustar a formula

 
Postado : 23/03/2015 9:41 pm
(@edcronos)
Posts: 1006
Noble Member
 

eu dei uma olhada melhor para entender

e pelo visto é bem complicado mesmo, mais ainda pq calculo com horas eu não si fazer

tem o fato de ter varias tarefas simultâneas a outra começou antes da primeira terminar "seria mais como tarefas consecutivas " se é que eu entendi
para isso se usaria mais uma coluna auxiliar para contar as tarefa consecutivas
com algo como
=SE(E(B23=B22;OU(HORA(C23)=HORA(C22);C23<D22));H22+1;0)
que verifica se as datas são iguais "com a linha de cima" e se a hora inicial é igual (OU) se a hora inicial é menor que a hora final da tarefa de cima
se negativo é 0 se positivo soma 1 na sequencia de tarefas
mas tem que ser ajustada para evitar erros com espaços entre tarefas

na outra coluna
=SE(E(H23>0;H24=0);MÁXIMO(INDIRETO("d"&LIN()-H23&":d"&LIN()))-MÍNIMO(INDIRETO("c"&LIN()-H23&":c"&LIN()));SE(E(H23=0;H24=0);E23;0))
como tem tarefa que começa em um dia e termina o outro tem que ser ajustado " não sei trabalhar muito com formulas"
ou então colocar a data junto com a hora
tipo 23 horas é maior que 00 horas do esmo dia
mas com (12/03/2015 23:32:01) (13/03/2015 00:32:01) a conta seria correta
vc tbm pode fazer isso em coluna auxiliar ou na de horas mesmo e usar a formação condicional para apresentar apenas as horas

mas para tudo funcionar vai precisar de farios ajustes na sua tabela

se pode perguntar em que isso é melhor que a primeira opção do issamu
a dele usa formula matricial e tem que ter incremento da formula a cada campo
nessa opção de colunas auxiliares se ajustadas as formulas vai ser sempre a mesma formula

mas para tudo se tem um porem
a tabela tem que estar da maneira correta ou as formulas tem que ser ajustadas por quem entende mais

segue um intento falido mas que pode dar alguma ideia do funcionamento

 
Postado : 24/03/2015 8:00 am
(@issamu)
Posts: 0
New Member
 

É Edcronos, como eu comentei na primeira postagem, este não é um problema simples.
Na minha opinião, o desenvolvimento de uma UDF é a melhor saída para este problema. Qualquer outra saída ou exigirá cálculos complexos de forma matricial ou muitas colunas de apoio como você citou, além de exigir uma adequação da tabela original.
A ideia da minha UDF é pegar todos os 1440 minutos existentes no dia e ir analisando se está dentro do range de hora inicial e final do dia, se sim ir alimentando a variável "x" para no final da analise saber quantos minutos foram de fato desprendidos no dia. Existem as ressalva que comentei, mas no momento é o melhor caminho que encontrei.
Infelizmente no ambiente de rede que estou no momento não consigo gerar arquivos xlsm para mostrar o exemplo prático da UDF, mas o código está na postagem anterior.
Abraços.

 
Postado : 24/03/2015 8:15 am
(@edcronos)
Posts: 1006
Noble Member
 

eu eu não tinha entendido direito "ainda não sei se entendi" ,e tbm prefiro vba
mas como estou enferrujado com formulas estou tentando fazer
eu não gosto de usar formulas matriciais pq podem deixar a planilha bem lenta
as colunas podem ficar ocultas

mas o primeiro passo é ajeitar as horas de inicio e termino adicionando as datas
eu adicionei 2 colunas para a correção
creio que vai ser nescessario até mesmo para usa udf ou vai ter que fazer a verificação dentro da função

ainda estou tentado aprender calculos com horas para acertar a formula

agora que lembrei que esqueci de compactar o arquivo que postei no anterior

 
Postado : 24/03/2015 8:45 am
(@edcronos)
Posts: 1006
Noble Member
 

é pelo visto tem mais fatores complicantes do que eu tinha visto
e acho que mesmo por vba vai ter complicações para ter uma resposta acertada para todos os fatores

o primeiro passo é juntar data e hora em colunas auxiliares para facilitar a verificação

bem os calculos estão divergentes ainda, mas está proximo "eu acho", mas provavelmente é pq ainda fiquei com duvidas sobre a questão

mais alguns ajustes e muitas duvidas ainda

 
Postado : 24/03/2015 10:19 am