[UDF] DATASLA: Calculando SLA (Service Level Agreement)

Nos diversos fóruns que participo, há um tipo de questão muito frequente e, muitas vezes, difícil de responder, que o cálculo de SLA.

SLA é a sigla de Service Level Agreement, que significa “Acordo de Nível de Serviço – ANS”, na tradução para o português. Usualmente, o termo é utilizado para definir o prazo de atendimento de um determinado processo, chamado, relatório, ocorrência, etc.

slaQuando digo que estes tipos de questões são difíceis de se responder é porque geralmente elas nunca são iguais entre si. Cada companhia define o prazo de SLA de maneira diferente. As variáveis que podem afetar o prazo SLA são inicio e fim de expediente, horário de almoço, e se os considera ou não, e feriados. Em alguns casos, a resposta via funções nativas do Excel ficam um tanto quanto complexas.

Pensando nesta dificuldade e na recorrência deste tipo de questão, resolvi criar uma UDF que consiga atender a maioria das questões de SLA. Batizei a UDF como DATASLA e o código está abaixo:


Function DATASLA(dDataInicial As Date, _
    dHoraInicial As Date, _
    sTempoResposta As Variant, _
    Optional rFeriados As Range) As Date
    
    'Declaração de variáveis
    Dim dTempoResposta As Date
    Dim dREPOSTA As Date
    Dim bAlmoço As Boolean
    Dim dHora_Entrada As Date
    Dim dHora_Saída As Date
    Dim dHora_Ini_Almoço
    Dim dHora_Fim_Almoço
        
    Dim Entrada_Seg As Date, Ini_Almoço_Seg As Date, fim_Almoço_Seg As Date, Saída_Seg As Date
    Dim Entrada_Ter As Date, Ini_Almoço_Ter As Date, fim_Almoço_Ter As Date, Saída_Ter As Date
    Dim Entrada_Qua As Date, Ini_Almoço_Qua As Date, fim_Almoço_Qua As Date, Saída_Qua As Date
    Dim Entrada_Qui As Date, Ini_Almoço_Qui As Date, fim_Almoço_Qui As Date, Saída_Qui As Date
    Dim Entrada_Sex As Date, Ini_Almoço_Sex As Date, fim_Almoço_Sex As Date, Saída_Sex As Date
    Dim Entrada_Sab As Date, Ini_Almoço_Sab As Date, fim_Almoço_Sab As Date, Saída_Sab As Date
    Dim Entrada_Dom As Date, Ini_Almoço_Dom As Date, fim_Almoço_Dom As Date, Saída_Dom As Date
    
    Dim Expediente_Seg As Boolean, Almoço_Na_Seg As Boolean
    Dim Expediente_Ter As Boolean, Almoço_Na_Ter As Boolean
    Dim Expediente_Qua As Boolean, Almoço_Na_Qua As Boolean
    Dim Expediente_Qui As Boolean, Almoço_Na_Qui As Boolean
    Dim Expediente_Sex As Boolean, Almoço_Na_Sex As Boolean
    Dim Expediente_Sab As Boolean, Almoço_No_Sab As Boolean
    Dim Expediente_Dom As Boolean, Almoço_No_Dom As Boolean
    
    'Converter o Tempo de resposta para número formato numérico
    dTempoResposta = CDbl(CDate(sTempoResposta))
    
    'Definidir dias que haverão expedientes: True -> Tem expediente, False -> Não tem Expediente
    Expediente_Seg = True:  Almoço_Na_Seg = True
    Expediente_Ter = True:  Almoço_Na_Ter = True
    Expediente_Qua = True:  Almoço_Na_Qua = True
    Expediente_Qui = True:  Almoço_Na_Qui = True
    Expediente_Sex = True:  Almoço_Na_Sex = True
    Expediente_Sab = False: Almoço_No_Sab = True
    Expediente_Dom = False: Almoço_No_Dom = True
    
    'Definir Horários Expediente
    Entrada_Seg = "9:00": Saída_Seg = "18:00"
    Entrada_Ter = "9:00": Saída_Ter = "18:00"
    Entrada_Qua = "9:00": Saída_Qua = "18:00"
    Entrada_Qui = "9:00": Saída_Qui = "18:00"
    Entrada_Sex = "9:00": Saída_Sex = "18:00"
    Entrada_Sab = "9:00": Saída_Sab = "18:00"
    Entrada_Dom = "9:00": Saída_Dom = "18:00"
     
    'Definir inicio e fim do almoço
    Ini_Almoço_Seg = "12:00": fim_Almoço_Seg = "13:00"
    Ini_Almoço_Ter = "12:00": fim_Almoço_Ter = "13:00"
    Ini_Almoço_Qua = "12:00": fim_Almoço_Qua = "13:00"
    Ini_Almoço_Qui = "12:00": fim_Almoço_Qui = "13:00"
    Ini_Almoço_Sex = "12:00": fim_Almoço_Sex = "13:00"
    Ini_Almoço_Sab = "12:00": fim_Almoço_Sab = "13:00"
    Ini_Almoço_Dom = "12:00": fim_Almoço_Dom = "13:00"
              
    Do Until dTempoResposta = "00:00"
        
        'Validar Feriado. Se for feriado pula o dia.
        If Not (rFeriados Is Nothing) Then
            If WorksheetFunction.CountIf(rFeriados, VBA.Int(dDataInicial))  0 Then
            dHoraInicial = 0
                GoTo PróximoDia
            End If
        End If
        
              'Valida dia da semana e define os horários de entrada, saída e almoço nas variaveis de controle
                Select Case WorksheetFunction.Weekday(dDataInicial, 2)
                    Case 1 'Seg-feira
                        If Expediente_Seg Then
                            dHora_Entrada = Entrada_Seg: dHora_Saída = Saída_Seg
                            dHora_Ini_Almoço = Ini_Almoço_Seg: dHora_Fim_Almoço = fim_Almoço_Seg
                            bAlmoço = Almoço_Na_Seg
                        Else
                            GoTo PróximoDia
                        End If
                    Case 2 'Ter-Feira
                        If Expediente_Ter Then
                            dHora_Entrada = Entrada_Ter: dHora_Saída = Saída_Ter
                            dHora_Ini_Almoço = Ini_Almoço_Ter: dHora_Fim_Almoço = fim_Almoço_Ter
                            bAlmoço = Almoço_Na_Ter
                        Else
                            GoTo PróximoDia
                        End If
                    Case 3 'Qua-feira
                        If Expediente_Qua Then
                            dHora_Entrada = Entrada_Qua: dHora_Saída = Saída_Qua
                            dHora_Ini_Almoço = Ini_Almoço_Qua: dHora_Fim_Almoço = fim_Almoço_Qua
                            bAlmoço = Almoço_Na_Qua
                        Else
                            GoTo PróximoDia
                        End If
                    Case 4 'Qui-feira
                        If Expediente_Qui Then
                            dHora_Entrada = Entrada_Qui: dHora_Saída = Saída_Qui
                            dHora_Ini_Almoço = Ini_Almoço_Qui: dHora_Fim_Almoço = fim_Almoço_Qui
                            bAlmoço = Almoço_Na_Qui
                        Else
                            GoTo PróximoDia
                        End If
                    Case 5 'Sex-feira
                        If Expediente_Sex Then
                            dHora_Entrada = Entrada_Sex: dHora_Saída = Saída_Sex
                            dHora_Ini_Almoço = Ini_Almoço_Sex: dHora_Fim_Almoço = fim_Almoço_Sex
                            bAlmoço = Almoço_Na_Sex
                        Else
                            GoTo PróximoDia
                        End If
                    Case 6 'Sab
                        If Expediente_Sab Then
                            dHora_Entrada = Entrada_Sab: dHora_Saída = Saída_Sab
                            dHora_Ini_Almoço = Ini_Almoço_Sab: dHora_Fim_Almoço = fim_Almoço_Sab
                            bAlmoço = Almoço_No_Sab
                        Else
                            GoTo PróximoDia
                        End If
                    Case 7 'Dom
                        If Expediente_Dom Then
                            dHora_Entrada = Entrada_Dom: dHora_Saída = Saída_Dom
                            dHora_Ini_Almoço = Ini_Almoço_Dom: dHora_Fim_Almoço = fim_Almoço_Dom
                            bAlmoço = Almoço_No_Dom
                        Else
                            GoTo PróximoDia
                        End If
                End Select
                    
                        'Validar dHoraInicial para dentro do expediente do dia
                        If dHoraInicial > dHora_Saída Then 'Caso hora inicial esteja após termino do expediente
                            dHoraInicial = dHora_Saída
                        ElseIf dHoraInicial  dHora_Ini_Almoço And dHoraInicial < dHora_Fim_Almoço Then 'Caso, no horario de almoço
                            dHoraInicial = dHora_Fim_Almoço
                        End If
                        
                        ' INICIO DO CALCULO DO SLA DESCONTANDO O TEMPO ATÉ ZERAR dTempoResposta
                        If bAlmoço Then 'SE HORARIO ALMOÇO = TRUE
                            If dHoraInicial  dDataInicial + dHora_Ini_Almoço Then 'SE não zerou o dTempoResposta
                                    dTempoResposta = dTempoResposta - (dHora_Ini_Almoço - dHoraInicial) 'Desconta tempo da manhã
                                    dHoraInicial = dHora_Fim_Almoço 'Definir novamente horário inicial
                                    dDataInicial = dDataInicial - 1 'Reduzir um dia para rodar novamente o laço e cair no mesmo dia
                                Else 'Terminou o chamado no dia
                                    dREPOSTA = dDataInicial + dHoraInicial + dTempoResposta 'Define o tempo SLA
                                    dTempoResposta = CDate("00:00") 'Zera tempo resposta para sair do laço
                                End If
                            Else 'Inicia contagem após o almoço
                                If dDataInicial + dHoraInicial + dTempoResposta > dDataInicial + dHora_Saída Then 'Checa se ultrapassa o dia atual
                                    dTempoResposta = dTempoResposta - (dHora_Saída - dHoraInicial) 'Desconta o tempo do dia
                                    dHoraInicial = 0 'Zera a hora inicial para ser definida novamente para o inicio do expediente ao voltar o laço
                                Else 'Terminou o chamado no dia
                                    dREPOSTA = dDataInicial + dHoraInicial + dTempoResposta 'Define o tempo SLA
                                    dTempoResposta = CDate("00:00") 'Zera tempo resposta para sair do laço
                                End If
                            End If

                        Else 'SE HORARIO ALMOÇO = FALSE
                        
                            If dHoraInicial  dDataInicial + dHora_Saída Then 'Checa se o tempo avança para dia seguinte
                                    dTempoResposta = dTempoResposta - (dHora_Saída - dHoraInicial) 'Desconta o tempo do dia
                                    dHoraInicial = 0 'Zera a hora inicial para ser definida novamente para o inicio do expediente ao voltar o laço
                                Else 'Terminou o chamado no dia
                                    dREPOSTA = dDataInicial + dHoraInicial + dTempoResposta 'Define o tempo SLA
                                    dTempoResposta = CDate("00:00") 'Zera tempo resposta para sair do laço
                                End If
                            End If
                            
                        End If
      
                
PróximoDia:
                dDataInicial = dDataInicial + 1 'Adicionar um dia para rodar novamente o laço
    Loop 'Retornar o laço para o dia seguinte
    
    DATASLA = dREPOSTA
                
End Function

Para criar uma UDF, leia a explicação contida no artigo Valores do Vetor.

Após copiar o código num novo módulo, será necessário personalizar o código conforme a sua necessidade. Veja a imagem abaixo:

sla2


SINTAXE DA UDF

DATASLA(Data_Início; Tempo_Início; Tempo_SLA;[Intervalo_Feriados])

Data_Início (Obrigatório): É a data em que se inicia o prazo SLA. Pode ser inserida como data (“dd/mm/aa”) entre aspas duplas ou pode ser referência de uma célula contendo a data, ou uma fórmula que resulte em data.

Tempo_Inicio (Obrigatório): É o horário em que se inicia o prazo SLA. Pode ser inserida como tempo (“hh:mm”) entre aspas duplas ou pode ser referência de uma célula contendo a horas, ou uma fórmula que resulte em horas.

Tempo_SLA (Obrigatório): É o prazo do SLA. Pode ser inserida como tempo (“hh:mm”) entre aspas duplas ou pode ser referência de uma célula contendo a horas, ou uma fórmula que resulte em horas.

Intervalo_Feriados (Opcional): Intervalo contendo datas que serão desconsideradas no cálculo do SLA.


Busquei simplificar ao máximo os argumentos desta função para facilitar a aplicação dela. Vamos ver alguns exemplos na prática, considerando a personalização que está feita no código disponível acima, que é basicamente considerar expediente de segunda a sexta feira das 9:00 as 18:00 com uma hora de almoço das 12:00 as 13:00.

sla3
Observe que como existe uma hora de almoço das 12:00 as 13:00 o SLA está desconsiderando o almoço no resultado final no segundo chamado.
sla4
Veja que desta vez inclui o 4º argumento opcional com o intervalo de feriado, e neste caso o dia 26/05/2016 foi desconsiderado no cálculo do SLA.
sla5
Quando o horário de abertura fora do horário do expediente, o cálculo SLA é iniciado somente no próximo horário disponível de expediente.
sla6
Dia 23/12/2016 é uma sexta feira, e como o tempo SLA extrapola o expediente da sexta-feira, o cálculo desconsiderou o final de semana, resultando na segunda-feira.

Como podem observar, essa UDF é bastante flexível e pode ser personalizada nos mais variados cenários possíveis de horários a serem ou não considerados.

Espero este artigo ajude você!

Clique na imagem abaixo para baixar o arquivo com os modelos deste artigo!

sla8

19 comentários em “[UDF] DATASLA: Calculando SLA (Service Level Agreement)

  1. Olá Rafael, bom dia, tudo bem?

    Em primeiro lugar parabéns pelo seu artigo! Ajudou bastante!

    Veja se consegue me ajudar numa coisa:

    Como eu faço se o meu SLA (3o parâmetro da função) for superior a 23:59 ??

    Porque existe na função DATASLA o comando ( dTempoResposta = CDbl(CDate(sTempoResposta)) ) que não consegue fazer a conversão, por exemplo, quando for “48:00″)

    Consegue me ajudar nisso?

    A forma como estou usando a função é essa:

    =DATASLA(N2;2;SE(E2=”1-URGENTE”;”24:00″;SE(E2=”2-ALTA”;”48:00″;SE(E2=”3-MÉDIA”;”150:00″;SE(E2=”4-BAIXA”;”225:00″;0))));AC$2:AC$13)

    Repare que no 3o parâmetro eu coloco uma condicional em função do conteúdo de uma célula para se definir a quantidade de horas para o SLA.

    Obrigado pela ajuda!

    Curtir

  2. Rafael, me ajuda neste caso aqui?

    Alterei o código para um SLA de 16 horas, sem horário de almoço de seg a sex, das 9:00hrs as 16:00hrs.
    Sempre que coloco um horário inicial após as 16hrs (16:01 por ex) e quando a data calcula o fds,sempre dá erro. Poderia verificar, se há alguma alteração há ser feita?

    Option Explicit

    Function DATASLA(dDataInicial As Date, _
    dHoraInicial As Date, _
    sTempoResposta As Variant, _
    Optional rFeriados As Range) As Date

    ‘Declaração de variáveis
    Dim dTempoResposta As Date
    Dim dREPOSTA As Date
    Dim bAlmoço As Boolean
    Dim dHora_Entrada As Date
    Dim dHora_Saída As Date
    Dim dHora_Ini_Almoço
    Dim dHora_Fim_Almoço

    Dim Entrada_Seg As Date, Ini_Almoço_Seg As Date, fim_Almoço_Seg As Date, Saída_Seg As Date
    Dim Entrada_Ter As Date, Ini_Almoço_Ter As Date, fim_Almoço_Ter As Date, Saída_Ter As Date
    Dim Entrada_Qua As Date, Ini_Almoço_Qua As Date, fim_Almoço_Qua As Date, Saída_Qua As Date
    Dim Entrada_Qui As Date, Ini_Almoço_Qui As Date, fim_Almoço_Qui As Date, Saída_Qui As Date
    Dim Entrada_Sex As Date, Ini_Almoço_Sex As Date, fim_Almoço_Sex As Date, Saída_Sex As Date
    Dim Entrada_Sab As Date, Ini_Almoço_Sab As Date, fim_Almoço_Sab As Date, Saída_Sab As Date
    Dim Entrada_Dom As Date, Ini_Almoço_Dom As Date, fim_Almoço_Dom As Date, Saída_Dom As Date

    Dim Expediente_Seg As Boolean, Almoço_Na_Seg As Boolean
    Dim Expediente_Ter As Boolean, Almoço_Na_Ter As Boolean
    Dim Expediente_Qua As Boolean, Almoço_Na_Qua As Boolean
    Dim Expediente_Qui As Boolean, Almoço_Na_Qui As Boolean
    Dim Expediente_Sex As Boolean, Almoço_Na_Sex As Boolean
    Dim Expediente_Sab As Boolean, Almoço_No_Sab As Boolean
    Dim Expediente_Dom As Boolean, Almoço_No_Dom As Boolean

    ‘Converter o Tempo de resposta para número formato numérico
    dTempoResposta = CDbl(CDate(sTempoResposta))

    ‘Definidir dias que haverão expedientes: True -> Tem expediente, False -> Não tem Expediente
    Expediente_Seg = True: Almoço_Na_Seg = False
    Expediente_Ter = True: Almoço_Na_Ter = False
    Expediente_Qua = True: Almoço_Na_Qua = False
    Expediente_Qui = True: Almoço_Na_Qui = False
    Expediente_Sex = True: Almoço_Na_Sex = False
    Expediente_Sab = False: Almoço_No_Sab = False
    Expediente_Dom = False: Almoço_No_Dom = False

    ‘Definir Horários Expediente
    Entrada_Seg = “9:00”: Saída_Seg = “16:00”
    Entrada_Ter = “9:00”: Saída_Ter = “16:00”
    Entrada_Qua = “9:00”: Saída_Qua = “16:00”
    Entrada_Qui = “9:00”: Saída_Qui = “16:00”
    Entrada_Sex = “9:00”: Saída_Sex = “16:00”
    Entrada_Sab = “9:00”: Saída_Sab = “16:00”
    Entrada_Dom = “9:00”: Saída_Dom = “16:00”

    ‘Definir inicio e fim do almoço
    Ini_Almoço_Seg = “12:00”: fim_Almoço_Seg = “13:00”
    Ini_Almoço_Ter = “12:00”: fim_Almoço_Ter = “13:00”
    Ini_Almoço_Qua = “12:00”: fim_Almoço_Qua = “13:00”
    Ini_Almoço_Qui = “12:00”: fim_Almoço_Qui = “13:00”
    Ini_Almoço_Sex = “12:00”: fim_Almoço_Sex = “13:00”
    Ini_Almoço_Sab = “12:00”: fim_Almoço_Sab = “13:00”
    Ini_Almoço_Dom = “12:00”: fim_Almoço_Dom = “13:00”

    Do Until dTempoResposta = “00:00”

    ‘Validar Feriado. Se for feriado pula o dia.
    If Not (rFeriados Is Nothing) Then
    If WorksheetFunction.CountIf(rFeriados, VBA.Int(dDataInicial)) 0 Then
    dHoraInicial = 0
    GoTo PróximoDia
    End If
    End If

    ‘Valida dia da semana e define os horários de entrada, saída e almoço nas variaveis de controle
    Select Case WorksheetFunction.Weekday(dDataInicial, 2)
    Case 1 ‘Seg-feira
    If Expediente_Seg Then
    dHora_Entrada = Entrada_Seg: dHora_Saída = Saída_Seg
    dHora_Ini_Almoço = Ini_Almoço_Seg: dHora_Fim_Almoço = fim_Almoço_Seg
    bAlmoço = Almoço_Na_Seg
    Else
    GoTo PróximoDia
    End If
    Case 2 ‘Ter-Feira
    If Expediente_Ter Then
    dHora_Entrada = Entrada_Ter: dHora_Saída = Saída_Ter
    dHora_Ini_Almoço = Ini_Almoço_Ter: dHora_Fim_Almoço = fim_Almoço_Ter
    bAlmoço = Almoço_Na_Ter
    Else
    GoTo PróximoDia
    End If
    Case 3 ‘Qua-feira
    If Expediente_Qua Then
    dHora_Entrada = Entrada_Qua: dHora_Saída = Saída_Qua
    dHora_Ini_Almoço = Ini_Almoço_Qua: dHora_Fim_Almoço = fim_Almoço_Qua
    bAlmoço = Almoço_Na_Qua
    Else
    GoTo PróximoDia
    End If
    Case 4 ‘Qui-feira
    If Expediente_Qui Then
    dHora_Entrada = Entrada_Qui: dHora_Saída = Saída_Qui
    dHora_Ini_Almoço = Ini_Almoço_Qui: dHora_Fim_Almoço = fim_Almoço_Qui
    bAlmoço = Almoço_Na_Qui
    Else
    GoTo PróximoDia
    End If
    Case 5 ‘Sex-feira
    If Expediente_Sex Then
    dHora_Entrada = Entrada_Sex: dHora_Saída = Saída_Sex
    dHora_Ini_Almoço = Ini_Almoço_Sex: dHora_Fim_Almoço = fim_Almoço_Sex
    bAlmoço = Almoço_Na_Sex
    Else
    GoTo PróximoDia
    End If
    Case 6 ‘Sab
    If Expediente_Sab Then
    dHora_Entrada = Entrada_Sab: dHora_Saída = Saída_Sab
    dHora_Ini_Almoço = Ini_Almoço_Sab: dHora_Fim_Almoço = fim_Almoço_Sab
    bAlmoço = Almoço_No_Sab
    Else
    GoTo PróximoDia
    End If
    Case 7 ‘Dom
    If Expediente_Dom Then
    dHora_Entrada = Entrada_Dom: dHora_Saída = Saída_Dom
    dHora_Ini_Almoço = Ini_Almoço_Dom: dHora_Fim_Almoço = fim_Almoço_Dom
    bAlmoço = Almoço_No_Dom
    Else
    GoTo PróximoDia
    End If
    End Select

    ‘Validar dHoraInicial para dentro do expediente do dia
    If dHoraInicial > dHora_Saída Then ‘Caso hora inicial esteja após termino do expediente
    dHoraInicial = dHora_Saída
    ElseIf dHoraInicial dHora_Ini_Almoço And dHoraInicial < dHora_Fim_Almoço Then 'Caso, no horario de almoço
    dHoraInicial = dHora_Fim_Almoço
    End If

    'INICIO DO CALCULO DO SLA DESCONTANDO O TEMPO ATÉ ZERAR dTempoResposta
    If bAlmoço Then 'SE HORARIO ALMOÇO = TRUE
    If dHoraInicial dDataInicial + dHora_Ini_Almoço Then ‘SE não zerou o dTempoResposta
    dTempoResposta = dTempoResposta – (dHora_Ini_Almoço – dHoraInicial) ‘Desconta tempo da manhã
    dHoraInicial = dHora_Fim_Almoço ‘Definir novamente horário inicial
    dDataInicial = dDataInicial – 1 ‘Reduzir um dia para rodar novamente o laço e cair no mesmo dia
    Else ‘Terminou o chamado no dia
    dREPOSTA = dDataInicial + dHoraInicial + dTempoResposta ‘Define o tempo SLA
    dTempoResposta = CDate(“00:00”) ‘Zera tempo resposta para sair do laço
    End If
    Else ‘Inicia contagem após o almoço
    If dDataInicial + dHoraInicial + dTempoResposta > dDataInicial + dHora_Saída Then ‘Checa se ultrapassa o dia atual
    dTempoResposta = dTempoResposta – (dHora_Saída – dHoraInicial) ‘Desconta o tempo do dia
    dHoraInicial = 0 ‘Zera a hora inicial para ser definida novamente para o inicio do expediente ao voltar o laço
    Else ‘Terminou o chamado no dia
    dREPOSTA = dDataInicial + dHoraInicial + dTempoResposta ‘Define o tempo SLA
    dTempoResposta = CDate(“00:00”) ‘Zera tempo resposta para sair do laço
    End If
    End If

    Else ‘SE HORARIO ALMOÇO = FALSE

    If dHoraInicial dDataInicial + dHora_Saída Then ‘Checa se o tempo avança para dia seguinte
    dTempoResposta = dTempoResposta – (dHora_Saída – dHoraInicial) ‘Desconta o tempo do dia
    dHoraInicial = 0 ‘Zera a hora inicial para ser definida novamente para o inicio do expediente ao voltar o laço
    Else ‘Terminou o chamado no dia
    dREPOSTA = dDataInicial + dHoraInicial + dTempoResposta ‘Define o tempo SLA
    dTempoResposta = CDate(“00:00”) ‘Zera tempo resposta para sair do laço
    End If
    End If

    End If

    PróximoDia:
    dDataInicial = dDataInicial + 1 ‘Adicionar um dia para rodar novamente o laço
    Loop ‘Retornar o laço para o dia seguinte

    DATASLA = dREPOSTA

    End Function

    Curtir

    1. Olá André! Realmente este cenário está gerando um erro devido a falta de um sinal de “=” no meu código, uma falha que passou desapercebida.

      Para tornar o código funcional neste cenário procure lá no final do código, altere conforme abaixo:

      Errado:
      If dHoraInicial < dHora_Saída Then 'Checa se hora de início está dentro do expediente

      Correto:
      If dHoraInicial <= dHora_Saída Then 'Checa se hora de início está dentro do expediente

      Abraços!

      Curtir

      1. Rafael, obrigado pela prontidão na resposta, mas o erro persiste.

        Resumindo o cenário que preciso:

        -SLA de 16 horas
        -Sem horário de almoço
        -Período de segunda a sexta
        -Expediente 9:00hrs as 16:00hrs.

        Esse SLA é de uma abertura de chamado, porém o SLA é contado apenas no período de 09 às 16:00hrs, com o máximo de 16horas.

        As aberturas dos chamados são feitas de 8 ás 18.

        Então preciso que mesmo que a abertura seja feita as 8:00, conte a partir das 9:00. E quando for aberto após as 16, seja contado apenas no próximo dia.

        Grato.

        Curtir

      2. Olá Marivsouza! Obrigado por acessar o meu blog. Realmente quando voltei o código, algumas linhas de código ficaram dentro de linhas comentadas, gerando este erro. Eu ajustei isso, mas se tiver dificuldades baixe o arquivo de exemplo e extraia a UDF de lá. Grande abraço.

        Curtir

      3. Obrigada, Rafael. Eu baixe o arquivo de exemplo e extraia a UDF de lá. Uma duvida: eu não consigo compartilhar para uso com outros usuários uma planilha com UDF, consigo?

        Curtir

  3. Olá Rafael, bom dia, tudo bem?

    Em primeiro lugar parabéns pelo seu artigo! Ajudou bastante!

    Veja se consegue me ajudar numa coisa:

    Como eu faço se o meu SLA (3o parâmetro da função) for superior a 23:59 ??

    Porque existe na função DATASLA o comando ( dTempoResposta = CDbl(CDate(sTempoResposta)) ) que não consegue fazer a conversão, por exemplo, quando for “48:00″)

    Consegue me ajudar nisso?

    A forma como estou usando a função é essa:

    =DATASLA(N2;2;SE(E2=”1-URGENTE”;”24:00″;SE(E2=”2-ALTA”;”48:00″;SE(E2=”3-MÉDIA”;”150:00″;SE(E2=”4-BAIXA”;”225:00″;0))));AC$2:AC$13)

    Repare que no 3o parâmetro eu coloco uma condicional em função do conteúdo de uma célula para se definir a quantidade de horas para o SLA.

    Obrigado pela ajuda!

    Curtir

    1. Olá Marcos! A questão não é que o VBA não converte o valor, a conversão é feita contanto que seja passado um valor, e não um texto como você está fazendo. No seu caso há duas alternativas, ou vc informa o tempo no formato inteiro ou utilize a função valor:

      =DATASLA(N2;2;SE(E2=”1-URGENTE”;1;SE(E2=”2-ALTA”;2;SE(E2=”3-MÉDIA”;6,25;SE(E2=”4-BAIXA”;9,375;0))));AC$2:AC$13)
      Note que 1 = 24:00, 2 = 48:00, 3 = 72:00, 6,25 = 150:00, ….

      ou

      =DATASLA(N2;2;SE(E2=”1-URGENTE”;VALOR(“24:00″);SE(E2=”2-ALTA”;VALOR(“48:00″);SE(E2=”3-MÉDIA”;VALOR(“150:00″);SE(E2=”4-BAIXA”;VALOR(“225:00”);0))));AC$2:AC$13)

      Tente ai e qualquer dificuldade volte a perguntar!

      Abraços!

      Curtir

  4. Olá rafaelissamu,

    Esta função está muito boa, mas estou procurando algo um pouco diferente (mas relacionado).
    Neste caso você diz qual o inicio, qual o tempo SLA e a função devolve qual o resultado.
    Estou procurando uma forma de dizer qual o inico, qual o final e a função dizer-me quanto tempo demorou tendo em atenção os horários de expediente (de segunda a sexta 08:00-20:00, sábado 08:00-13:00, domingo fechado) e sem almoço.

    Exemplo:
    Inicio Final
    2018-02-04 01:18 2018-02-06 14:40

    No exemplo eu sei que dia 04 domingo (00:00), dia 05 segunda (12:00) e dia 06 terça (06:40). No total deverá dar 18:40.

    Tem alguma coisa que me ajude a conseguir este resultado?

    Abraço

    Curtir

  5. Boa noite!

    Pesquisando na net sobre como resolver esse problema de SLA, vi seu site e seu trabalho. Esta me ajudando muito.

    Uma duvida que tenho, tem como eu ao inves de colocar dentro do codigo o dias e horarios trabalhados, fazer com que ele busque essa informacao no Excel? Pois tenho varios clientes e cada cliente tenho um prazo SLA.

    Obrigado pela ajuda!

    Curtir

    1. Olá Rodrigo, obrigado por acessar meu blog. Para que a função busque essas informações em células do Excel seria necessário incluir as declarações de variáveis como argumento da função, e sabendo a posição de cada argumento você poderia montar uma fórmula para cada empresa. Não é uma adaptação difícil de ser feita, mas tem que possuir um pouco de conhecimento técnico da linguagem VBA.

      Curtir

      1. Então preciso pesquisar sobre VBA… pois faz muito tempo que mexi… e já não lembro quase nada.

        Obrigado pelo retorno!

        Curtir

  6. Rafael, boa noite!

    Sua tabela esta me ajudando muito, porem agora me pediram mais um campo para ser colocado na planilha.

    Querem que na tabela informe quanto tempo demorou da abertura do chamado ate o termino. Contando apenas as horas uteis. Como faco isso? Poderia me ajudar. Desde ja agradeco.

    Curtir

  7. Boa noite! Fiz um teste com sua tabela e me ajuda muito, porem quando o chamado e aberto no sabado, o calculo das horas nao esta batendo… poderia me ajudar pfv?

    Curtir

  8. Rafael.. estou com uma duvida aqui. Nessa UDF se eu colocar como Sabado = False e a data e colocada no sabado.. ela comeca a contar a hora no proximo dia util apenas no horario que foi inserido no sabado… e nao no inicio do dia util. Como resolver isso? Obrigado!

    Curtir

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Gravatar
Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s