jueves, marzo 26, 2020

Duración de procesos - versión mejorada

Dándole una releída al post sobre duración de procesos con Power Query, que publiqué hace dos días, detecté lo que no llamaría error pero sí debilidad del modelo. Ese modelo calcula el tiempo que se requerirá para completar un proceso en múltiplos de media hora. Ese parámetro está "hard coded".

Podemos mejorar el modelo dando la posibilidad de definir el grado de precisión del cálculo, por ejemplo 15 minutos o una hora.

Para hacerlo vamos a definir el parámetro precision en una celda, crearemos un nombre definido que se refiera a esa celda y crearemos a continuación una consulta al rango (la celda) de manera que podamos usarla como variable en los cálculos del Power Query.



Creamos esta variable usando la técnica que ya mencioné, realizando drill down en la única fila de la consulta.

Investigando el código del modelo del post anterior vemos donde hay que reemplazar el valor "hard coded" por la variable que acabamos de crear:

El primer lugar es en el cálculo de la consulta periodos. En lugar de 7*48, donde 7 son los días de la semana y 48 la cantidad de "medias horas" que hay en cada día (dado que usamos una precisión fija de media hora)


usamos este código


donde la constante 10080 representa el número de minutos por semana (7 x 24 x 60).

De esta manera podemos establecer la precisión del cálculo en función de lapsos de minutos (15, 20, 30, etc.).

Señalemos que la precisión del cálculo será significativa solamente para tareas que demanden gran cantidad de horas para su realización.

Por ejemplo, esta tarea que requiere 300 horas, calculando con una precisión de media hora, se completaría el 24/04/2020 09:30



Si hacemos el cálculo con una precisión de 15 minutos, la tarea se completaría el 24/04/2020 14:45


Otra mejora que podemos introducir es crear una evento de manera que cuando cambiemos el valor de la celda precision el modelo se actualice sin necesidad de tener que apretar el botón Actualizar todo. 
Para eso vamos a crear un evento Worksheet_Change (hay varios posts en el blog sobre el tema; por ejemplo éste).

El evento Worksheet_Change lo creamos en el módulo Vba de la hoja (en nuestro caso la hoja Reporte); este el código

 Private Sub Worksheet_Change(ByVal Target As Range)  
   If Union(Target, [precision]).Address = [precision].Address _  
     Then ThisWorkbook.RefreshAll  
 End Sub  

El archivo se puede descargar aquí.

No hay comentarios.:

Publicar un comentario

Nota: sólo los miembros de este blog pueden publicar comentarios.