jueves, 11 de agosto de 2011

Tiempo de Respuesta

Descargar el fichero: TiempoRespuesta.xlsm

Una macro en Excel que calcula el tiempo de respuesta de un servicio técnico, excluyendo domingos y festivos. Se trata de una empresa que proporciona el servicio técnico a sus clientes. Se pretende controlar cuántas horas se tarda en proporcionar el servicio, desde que se toma nota del aviso hasta que queda finalmente solucionado por el técnico que acude hasta las instalaciones del cliente. Deseamos que en el cómputo de horas no se incluyan los domingos, ni las fiestas según un listado de festivos que incluimos en la hoja de cálculo.

La macro que implementamos se crea en forma de función, y es la siguiente.

Código:

Function TR(Inicio As Date, Fin As Date, Optional Festivos As Range) As Double
Dim i As Long
Dim domingo As Integer
Dim c As Variant
Dim F As Long
Dim Fiesta As Boolean
If Festivos Is Nothing Then
  'si en TR no se usa el tercer argumento optativo
  If Int(Inicio) = Int(Fin) Then
    'si es el mismo día
    TR = Fin - Inicio
  Else 'para más de un día
    TR = 1 + Int(Inicio) - Inicio 'lo del primer dia
    TR = TR + Fin - Int(Fin) 'lo del último día
    For i = Int(Inicio) + 1 To Int(Fin)
      'contamos los domingos
      If i Mod 7 = 1 Then domingo = domingo + 1
    Next i
    TR = TR + (Int(Fin) - Int(Inicio)) - domingo - 1
  End If
  'si Inicio o Fin son domingo entonces TR=0
  If Int(Inicio) Mod 7 = 1 Or Int(Fin) Mod 7 = 1 Then TR = 0
Else
  'si en TR se usa el tercer argumento optativo
  If Int(Inicio) = Int(Fin) Then
    'si es el mismo día
    TR = Fin - Inicio
  Else
    For i = Int(Inicio) + 1 To Int(Fin)
      'detecta si el día i es fiesta
      Fiesta = False
      For Each c In Festivos
        F = CDate(c)
        If i = F Then Fiesta = True: Exit For
      Next
      'si el día i es fiesta o es domingo se descuenta de TR
      If Fiesta Or i Mod 7 = 1 Then TR = TR - 1
    Next i
    TR = TR + Fin - Inicio
  End If
  'si Inicio o Fin son domingo entonces TR=0
  If Int(Inicio) Mod 7 = 1 Or Int(Fin) Mod 7 = 1 Then TR = 0
  'si Inicio es fiesta entonces TR=0
  Fiesta = False
      For Each c In Festivos
        F = CDate(c)
        If Int(Inicio) = F Then Fiesta = True: Exit For
      Next
      If Fiesta Then TR = 0
  'si Fin es fiesta entonces TR=0
  Fiesta = False
      For Each c In Festivos
        F = CDate(c)
        If Int(Fin) = F Then Fiesta = True: Exit For
      Next
      If Fiesta Then TR = 0
End If
End Function

Disponemos de una fórmula antigua que únicamente calculaba la diferencia entre la fecha y hora del aviso y la del momento de atención. La nueva fórmula elimina los domingos y las fiestas incluidas en cierto rango que se marca al introducir la fórmula TR.


4 comentarios:

  1. Adolfo, Buenos días,
    Mi opinión a continuación no pretende para nada desvirtuar el aporte que pueda ofrecer este u otros temas por usted expuestos y de los cuales soy avido lector.
    Es lo siguiente: Excel ofrece funciones para hacer el trabajo expuesto en "tiempos de respuesta", comparto esto por cuanto segun mi criterio, como política se debe recurrir a la funcionalidad que incorpora M.Excel antes de considerar la solución de cualquier situación con macros.
    Un saludo! Eventoclic@gmail.com

    ResponderEliminar
  2. Porque considerar el desarrollo de un trabajo con la funcionalidad de excel (formulación u otra) antes de considerar la solución con macros:
    - Porque ya esta hecho, probado y nos tardaremos menos tiempo.
    -Porque al transferir el archivo entre usuarios por temas de seguridad en algunos las macros suelen desactivarse.
    -Porque al ejecutar macros en otros equipos en algunos casos se producin errores por temas de configuración y otros (A menos que el codigo haya escrito con experiencia antierror).
    -Porque los macros si el usuario altera los archivos agregando columnas por ejemplo, si no se ha escrito anticipando esto, no devolverá los resultados esperados.
    -porque cuando se cambia de versión, la experiencia ha mostrado que en la nueva versión los macros ocasionalmente generan error de ejecución del código.
    Entre otros...
    Nuevamente reitero: Mi intención es aportar experiencia y de ningún modo opacar el gran trabajo que se realiza en este blog. eventoclic@gmail.com

    ResponderEliminar
  3. Hola Cardozos.

    Efectivamente, cuando es posible utilizar una fórmula de Excel, en general, es preferible a tener que programarla. A esta filosofía general se opone alguna excepción como por ejemplo, cuando debes integrar el cálculo en otro proceso (macro) mayor y no quieres que el resultado se calcule en la hoja.

    En relación a este caso concreto, no conozco ninguna función de Excel que calcule lo que calcula esta macro de "Tiempo de Respuesta". Existe alguna parecida, que elimina fiestas como por ejemplo:

    =DIAS.LAB(fecha inicio;fecha final;[vacaciones])

    Esta función tiene como argumento optativo 'vacaciones' donde se ha de indicar un rango de celdas en las que se anotan los días de fiesta. En este aspecto es igual que nuestra función programada =TR. Pero nuestra función quita domingos, fiestas, y lo que proporciona son horas y minutos.

    Un saludo.

    ResponderEliminar
    Respuestas
    1. Hola buen dia.

      Qusiera un poco mas de inforacion sobre esto que mencona, ya que es justamente lo que estoy buscando, ojala me pudiera ayudar.

      Saludos. Danielcl495@gmail.com/ Dcruz@estratec.com

      Eliminar