Cómputos de Instalaciones Eléctricas


Translate

Un Espejo de Microsoft Project en Microsoft Excel fusionando lo mejor de cada uno.

Este emprendimiento surgió como una necesidad de urgencia por buscar una respuesta a dos preguntas básicas, cortas pero pero difíciles de responder.

Cuando se termina el Proyecto?
Cual es la relación entre el avance físico y el tiempo transcurrido?

Y la pregunta que me hice yo a partir de las dos anteriores! Que tan seguro estoy de lo que voy a contestar?



Breve percepción sobre Microsoft Project:
Resulta que el potencial de Microsoft Project en lo personal lo encuentro en su facilidad para empujar o retraer tareas de manera automática cuando estas están vinculadas, pero materializar una programación de un proyecto complejo en el ámbito de la construcción es una tarea que requiere mucha dedicación y resulta extenso para mostrarlo. Teniendo en cuenta que la manera que tiene Project de manipular de forma automática las tareas en el tiempo es excelente, pero al momento de calcular avances físicos requiere cargar a cada una de las tareas el factor "Fuerza de trabajo" o mejor dicho horas hombres lo cual nos genera un gran conflicto al momento de tener entre manos proyectos que son Sub Contratos. Para realizar un presupuesto también es excelente por su modalidad de auto sumas según sus jerarquías, pero para un seguimiento económico tiene un método demasiado lineal de interpretar la importancia de las tareas con poco y nada de flexibilidad como para plantear distintos escenarios al mismo tiempo en el proyecto.

Desarrollo de la solución y la fusión con Excel:
Ahora cuando fuimos capaces de crear una programación de obra a esto lo entiendo como que solo logramos un "Gantt Estatico de referencia", o mejor dicho una "Linea Base del Programa". Muy útil como punto de partida para plantear un linea base de los Costos o si quieren llamarlo un Cash Flow. Pero otro cuento es valernos de esta programación como el primer paso fundamental para darle seguimiento al proyecto.

El objetivo fue permitirle Microsoft Project desempeñarse en lo que es bueno, analizar de manera constante los cambios que surgen en un proyecto y desfasar en el tiempo lo no concluido y como consecuencia de eso ir expandiendo o contrayendo la ubicación temporal de las tareas y el fin probable del proyecto. Lo que iría midiendo el termómetro de la primera pregunta planteada en cuanto al fin del proyecto.

Para lograr lo anterior el proceso es asentar en Project si sucedió o no lo programado. Ahora como logramos no perdernos cuando el Project es gigante?, cuando el equipo de trabajo no maneja project? cuando el proyecto es inmenso y proporcional la gente que trabaja en distintos frentes y la cantidad de información que nos pueden aportar por día? Como traducimos esta información para alguien que no esta preparado para leer un Gantt y mucho menos un Gantt de metros con lineas bases y marcas de retrasos? Y es este el punto donde hago intervenir a Excel como un lenguaje universal, como el generador gráfico del informe y como el enlace con el archivo del Gantt.

Entonces a partir del diseño de una linea base del programa:
  1. Codifiqué cada instancia del Project como si estuviera trabajando un diccionario de EDT, evite la codificación automática de Project por que esta es dinámica y si agrego o quito tareas en el proceso y la reemplazo por la siguiente nomenclatura, entonces con una macro generé la lectura en reversa desde la tarea hasta el máximo de los agrupadores y capturé las dos primeras letras de cada instancia y así logré el identificador, el resultado es que en un Gannt de unas 70.000 tareas no se me duplicó ni siquiera un código.
  2. Generé la segunda Macro que es la que me permitió tener un espejo en excel del Gantt. Un bucle simple que lee de inicio a fin y transcribirá toda la estructura analítica que necesitamos en forma de árbol, interpretadas por sangrías tal cual lo maneja Project para no perder sus dependencias.
  3. Ahora con una tercera Macro en Excel generé un resumen de las tareas repetitivas y las únicas a fin de concentrar el mayor porcentaje de tareas importantes en una tabla tridimensional.
  4. Y el listado quedó de la siguiente manera:
Tareas a nivel general:
  • Excavación y Submuración.
  • Estructura de Hormigón Armado.
  • Instalaciones Ahogadas en estructura.
  • Desencofrado y corrección de detalles.
  • Instalación de equipos de elevación para la logistica de materiales.
  • Conexiones provisorias a las infraestructuras existentes.
  • Conexiones definitivas a las infraestructuras existentes.
  • Obras de infraestructura necesarias (cuando aplique).
  • Equipamientos mecánicos de movimientos
  • Mobiliario de espacios comunes
  • Decoración
  • Tramites de Habilitaciones.
Tareas a nivel Particular:
  • Colocación de marcos de ventanas
  • Colocación de vidrios de ventanas
  • Tuberías suspendidas
  • Amure Cajas Paredes
  • Enhebrado Eléctrica
  • Instalación Sanitaria
  • Distribución de agua fría y caliente e Incendio
  • Colocación y Conexión de Bañera
  • Revestimiento de baño con pastina completa
  • Colocación de fancoil
  • Conexión hidráulica y eléctrica del Fancoil
  • Colocación de Termostato
  • Marcos de Ventilación (Ret., Dif. y Extr.) y Colocación de Rejas
  • Construcción de detalles en seco
  • Colocación de estructura para espejo de Baño
  • Emplacado de Cielorraso en Baño y Pasillo (Encintado y Enmacillado)
  • Calado en Yeso de luminarias
  • Pases de eléctricos por tabique
  • Enduido y Pintura Losa
  • Colocación de sprinklers
  • Colocación de Tapas de Caja Sifonada
  • Sellado de ductos
  • Enduido Tabiques
  • Pintura (1era mano)
  • Pintura en Tabiques
  • Enduido Cielorraso de Baños
  • Pintura baño
  • Pintura (2da mano)
  • Colocación Estructura para Mesadas
  • Colocación de Marmoles
  • Colocación de rieles de cortinero
  • Colocación de Pisos y pisos técnicos
  • Colocación de Zócalos
  • Amure y conexión de Sanitarios
  • Prueba parcial sectorizada de intalaciónes.
  • Colocación de puerta Acceso y Contramarcos
  • Colocación de cerradura
  • Colocación de Tablero y Llaves
  • Instalación de Llaves y tomas
  • Colocación de Luminarias
  • Colocación de tapas
  • Detectores de Humo
  • Amure y conección de Bacha en baños
  • Colocación de griferias
  • Colocación de zócalos de baños
  • Colocación Accesorios Baño
  • Colocación Mamparas y Espejos
  • Limpieza gruesa
  • Amoblamiento
  • Limpieza Fina
  • Reelevamiento de Detalles
  • Corrección de Detalles
  • Primera inspección con el cliente
  • Corrección de No conformidades
  • Segunda Inspección para la entrega de la Unidad y firma del acta.
Aproximadamente 56 tareas particulares, que si los multiplico por un caso de 6 unidades por 25 niveles estaría pensando en 8.400 tareas particulares que deben o deben de cumplirse en diferentes contratos, ahora si a estos 25 niveles le agrego 25 espacios comunes, y si a esto le sumo los espacios únicos como azoteas, lobby y etc, sigo aumentando el numero de tareas, y si hago el sano razonamiento que para que todo esto pueda hacerse es necesario que el material esté disponible y los contratos consensuados seguramente voy a agregar a mi cronograma mas de un hito a cumplir por cada grupo sectorizado de tareas a desarrollar. Y quien será capaz de leer y razonar todo esto? Como hago para estimar un avance porcentual coherente entre tareas que pueden tener el mismo peso de importancia en el avance pero un abismo con la relación Esfuerzo / Tiempo.

Entonces tuve que retraerme y comprimirme para establecer la opción que las tareas fueran agrupadas en 5 fases claramente marcadas por hitos.
  1. La fase de estructura y obras de infraestructuras correspondientes.
  2. La fase de obra gruesa que irá desde que la estructura del sector está terminada hasta el cierre y colocación de cerradura del sector.
  3. La fase de colocación de elementos de valor, que precede inmediatamente a la anterior y concluye con la primera aproximación a la terminación del sector con sus pruebas mecánicas.
  4. La fase de acondicionamiento e inspecciones.
  5. La fase de entrega.
Y sobre lo anterior surgió el siguiente esquema y lo voy a explicar desde el resultado hasta su origen:
  • El resultado es un croquis en forma de corte de la torre, con sus 5 fases ordenadas de izquierda a derecha, y para cada fase su porcentaje de avance, y su ultimo avance parcial registrado en un periodo.


Claro que después de haber creado semejante colorinche surgió la necesidad de explicar como abordarlo.



  1. Un proyecto ordenado debería de mostrarnos desde lejos una tonalidad degradada que ira del verde (100% = Fases completadas) naciendo en su diagonal inferior izquierda, encaminándose perpendicular hacia la diagonal superior derecha pasando por tonos intermedios hasta llegar a un rojo (0% = Fases no iniciadas)
  2. Las Fases que muestren un acumulado del 100% y un avance = 0% serán aquellas que se acumulan del informe anterior como terminadas, en estas fases y en esas zonas las tareas están terminadas y no hay gente trabajando.
  3. Las Fases que muestren un 100% de avance acumulado y un avance parcial mayor a 0% serán aquellas que se lograron en el periodo medido.
  4. Las Fases que muestren Acumulados menores al 100% y un avance parcial al 0% son fases que están trabadas por algún motivo.
  5. Las Fases que muestren Acumulados menores al 100% y un avance parcial mayor al 0% son aquellas donde el proyecto esta enfocado en su avance.
  6. Las Fases que muestren un Acumulado que sea igual al avance Parcial son las fases que se han iniciado en el periodo.
  7. Las Fases que muestren un Acumulado igual a 0% y un Parcial igual a 0% son las fases no iniciadas.
  8. Una fase mayor que tenga avance mayor a su fase antecesora indica una ruptura en el orden del programa que debe de argumentarse.

Cada porcentaje mostrado en el resumen anterior representa la agrupación de todas las tareas de la face que la conforman, para capturar el avance de la fase se pidió que se informe para cada una de las tareas la siguiente regla (0% = Tarea no iniciada, 50% Tarea iniciada, 100% = Tarea terminada), Y teniendo en cuenta que las tareas están agrupadas con cierta relación costo / esfuerzo y con alguna lógica de cronología (La real se encuentra en el Project), el resultado sale de promediar el avance de cada tarea por su porcentaje de incidencia dentro de su grupo. Con esto conseguí parte de la respuesta a la segunda pregunta, el avance físico, para una tarea, para una fase, o agrupando las tareas para un contrato.


La planilla que muestra la imagen anterior se alimenta de está predecesora que muestro a continuación que es en realidad la información que necesito día a día o semana a semana de quienes están full time conduciendo a los operarios que ejecutan el proyecto, y este es mi vinculo directo con Project para buscar la segunda parte de la respuesta referente al tiempo.

Al entregarme una lista de este tipo donde solo necesito la primera columna que me indica la zona de trabajo, la segunda que me indica la tarea y la cuarta que me indica si se inicio (50%) o se terminó (%100), el resto se completo por macros, una columna "Existe" que constantemente revisa que en project exista esa tarea, y cuando no me dará una alarma de que debo o corregir el nombre de la tarea o agregar elementos omitidos a mi programación, otro campo que "Send Pry" esta señal me dirá que automáticamente busque está tarea en Project y la actualice en el avance y con la fecha en la que fue informada, que días mas o menos es cuando recibí el informe, esto hará que el calculo del tiempo en el Project se modifique, me anule tareas terminadas y me destaque las retrasadas y las adelantadas. 

Y con lo anterior habiéndome metido en un circulo que no terminará hasta el fin del proyecto conseguí hacer flotar de manera automática y constante la fecha de fin probable del project desde Excel, y con el sustento de la realidad sucedida día a día. 
Y ahora si quedo listo para volver a empezar, analizar el Gantt y  la programación para determinar si es necesario plantear o no nuevas estrategias o programaciones para cumplir con el objetivo.

Notas y Macros complementarias desarrolladas:
Para evitar las miles de formulas en la tabla tridimencional que harían colapsar el manejo de excel surgió la siguiente macro que va a colocar estos datos simples de una planilla lineal en cada casillero correspondiente de la lista en la tabla tridimensional:

Sub Run()
Dim Cell As Range
For Each Cell In Range("Area_Trabajo")
    Cell.Select
 Tareas'!C1,Control!R1C)/100"
    Dim vAL As Double:  vAL = Excel.WorksheetFunction.SumIfs(Sheets("Estado de Tareas").Range("E:E"), Sheets("Estado de Tareas").Range("Nombre_Tareas"), Me.Cells(Cell.Row, 2), Sheets("Estado de Tareas").Range("A:A"), Me.Cells(1, Cell.Column))
    Select Case vAL
    Case Is = 0
        If Not Cell = "" Then Cell.ClearContents
    Case Else
        If Not Cell = vAL / 100 Then Cell = vAL / 100
    End Select
Next Cell
End Sub


Macros adicionales para manipular el Gantt de semejante tamaño:

Macros para corregir el Gantt eliminado tareas que fueron descartadas por cambios del proyecto:

Solo requiere una celda de excel donde se escriba la tarea a buscar y eliminar

Sub Macro(Target As Range)
Dim PRY As Project
Set PRY = Projects.Item("20160722, Gantt")
PRY.Activate
    On Error Resume Next
    PRY.Application.SetAutoFilter FieldName:="Nombre", FilterType:=pjAutoFilterCustom, Test1:="Igual a", Criteria1:=Target.Text
    If Err.Number = 424 Then
        Err.Clear
        Target.EntireRow.Delete xlUp
        Exit Sub
    End If
    OutlineShowAllTasks
SelectAll
Dim Nombre As String: Nombre = Target.Text
Dim Tsk As Task
For Each Tsk In PRY.Application.ActiveSelection.Tasks
    Select Case Tsk.Summary
        Case False
            FindEx Field:="Id", Test:="Igual a", Value:=Tsk.GetField(pjTaskID), Next:=False, MatchCase:=False, SearchAllFields:=False
            If InStr(1, Tsk.GetField(pjTaskText6), "Hab.") = 1 Then
                If Excel.WorksheetFunction.Trim(Tsk.Name) = Excel.WorksheetFunction.Trim(Nombre) Then
                    Tsk.Delete
                End If
            End If
        Case True
            If Tsk.GetField(pjtasktex6) <> "" Then Call Tsk.SetField(pjTaskText6, "")
    End Select
Next Tsk
Cells(Target.Row, 1) = CDate(Date)
End Sub

Macros para condicinar ciertas tareas no iniciadas de un proyecto a un imprevisto como por ejemplo demoras en el suministro de materiales:

Requiere dos celdas, la primera la tarea que busco, la segunda el numero de tarea a project a donde sera condicionada.


Sub Macro() 

Dim PRY As Project
Set PRY = Projects.Item("20160706, Gantt.mpp")
PRY.Activate
    On Error Resume Next
    PRY.Application.SetAutoFilter FieldName:="Nombre", FilterType:=pjAutoFilterCustom, Test1:="Igual a", Criteria1:="Colocación Espejo de Baño"
    OutlineShowAllTasks
SelectAll
Dim Nombre As String: Nombre = Target.Text
Dim Tsk As Task
For Each Tsk In PRY.Application.ActiveSelection.Tasks
    Select Case Tsk.Summary
        Case False
            FindEx Field:="Id", Test:="Igual a", Value:=Tsk.GetField(pjTaskID), Next:=False, MatchCase:=False, SearchAllFields:=False
            Call Tsk.SetField(pjTaskPredecessors, "15")
        End Select
Next Tsk
Target.EntireRow.Delete xlUp
End Sub

Macro para corregir o reemplazar nombres de tareas en todo el archivo del Gannt

Requiera dos celdas de Excel, en la primera lo que busco, en la segundo su nombre a asignar.

Sub Macro(Target As Range)
If Not Target.Count = 1 Then Exit Sub
If Target = "" Then Exit Sub
Dim PRY As Project
Set PRY = Projects.Item("20160722, Gantt")
If Not Target.Column = Range("Nombre_Tareas").Column Then Exit Sub
PRY.Activate
    'On Error Resume Next
    PRY.Application.SetAutoFilter FieldName:="Nombre", FilterType:=pjAutoFilterCustom, Test1:="Igual a", Criteria1:=Target.Text
    If Err.Number = 424 Then
        Err.Clear
        
        Exit Sub
    End If
    OutlineShowAllTasks
SelectAll
Dim Nombre As String: Nombre = Target.Text
Dim Tsk As Task
For Each Tsk In PRY.Application.ActiveSelection.Tasks
    Select Case Tsk.Summary
        Case False
            FindEx Field:="Id", Test:="Igual a", Value:=Tsk.GetField(pjTaskID), Next:=False, MatchCase:=False, SearchAllFields:=False
            If Excel.WorksheetFunction.Trim(Tsk.Name) = Excel.WorksheetFunction.Trim(Nombre) Then
                Tsk.Name = Target.Offset(0, 1)
            End If
    End Select
Next Tsk
Cells(Target.Row, 3) = CDate(Date)
End Sub

Macro para sincronizar y actualizar en Proyect el estado de la tareas del excel:

Sub Control_A_Estado_Tareas() 'Trae Tareas del Control
Dim Hoja_Matriz As Worksheet: Set Hoja_Matriz = Excel.ThisWorkbook.Sheets("Control")
Dim Hoja_Carga As Worksheet: Set Hoja_Carga = Excel.ThisWorkbook.Sheets("Estado de Tareas")
Dim Rg_Origen As Range: Set Rg_Origen = Hoja_Matriz.Range("Area_Trabajo")
Dim Habitacion As String
Dim Tarea As String
Dim Avance As Double
Dim AvanceNuevo As Double
Dim Temp_rg As Range
Dim Linea As Long
For Each Temp_rg In Rg_Origen.SpecialCells(xlCellTypeConstants)
    'Temp_Rg.Select
    Avance = Excel.WorksheetFunction.SumIfs(Hoja_Carga.Range("Avance").EntireColumn, Hoja_Carga.Range("Area").EntireColumn, Hoja_Matriz.Cells(Hoja_Matriz.Range("Areas").Row, Temp_rg.Column), Hoja_Carga.Range("Nombre_Tareas").EntireColumn, Hoja_Matriz.Cells(Temp_rg.Row, Hoja_Matriz.Range("Tareas").Column))
    Select Case Hoja_Matriz.Cells(Temp_rg.Row, 1)
        Case "Fase 01", "Fase 02", "Fase 03", "78, Entrega de la Unidad", "01, Inicio de las Tareas": GoTo Vuelta
    End Select
    'If Avance = Temp_rg.Value Then: Temp_rg.Interior.Color = 5287936 'Verde
    If Avance > 100 Then Avance = 100
    If Avance < Temp_rg.Value * 100 Then
            Habitacion = Hoja_Matriz.Cells(2, Temp_rg.Column)
            Tarea = Hoja_Matriz.Cells(Temp_rg.Row, 1)
            AvanceNuevo = Temp_rg.Value * 100
            Application.EnableEvents = False
            Linea = Hoja_Carga.UsedRange.SpecialCells(xlCellTypeLastCell).Row + 1
            Hoja_Carga.Range("Area").Rows(Linea) = Habitacion
            Hoja_Carga.Range("Nombre_Tareas").Rows(Linea) = Tarea
            Hoja_Carga.Range("Avance").Rows(Linea) = AvanceNuevo
            Application.EnableEvents = True
    End If
Viceversa:
    'If Avance < Temp_rg.Value Then
     '   Temp_rg.Interior.Color = 65535 'Amarillo
      '  If Avance = 0 Then
       '     Habitacion = Hoja_Matriz.Cells(1, Temp_rg.Column)
        '    Tarea = Hoja_Matriz.Cells(Temp_rg.Row, 2)
         '   Avance = Temp_rg.Value
          '  Application.EnableEvents = False
           ' Linea = Hoja_Carga.UsedRange.SpecialCells(xlCellTypeLastCell).Row + 1
            'Hoja_Carga.Range("Area").Rows(Linea) = Habitacion
           ' Hoja_Carga.Range("Nombre_Tareas").Rows(Linea) = Tarea
            'Hoja_Carga.Range("Avance").Rows(Linea) = Avance * 100
            'Application.EnableEvents = True
        'End If
    'End If
Vuelta:
Next Temp_rg
End Sub


No hay comentarios:

Publicar un comentario