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?
Cómputos de Instalaciones Eléctricas
Translate
Mostrando entradas con la etiqueta Programación de obras. Mostrar todas las entradas
Mostrando entradas con la etiqueta Programación de obras. Mostrar todas las entradas
Construyendo en Revit
Conversando sobre un proyecto especifico hace muchos años con un prestigioso ingeniero rescaté lo siguiente:
La información de entrada o de punto de partida:
"Cuando descubres una falencia y mejoras un proyecto en el papel en su etapa de diseño, el costo será de $1 y la ganancia de millones. Cuando dejas pasar el tiempo esta proporción se irá invirtiendo de manera opuesta hasta llegar al punto donde la construcción esté terminada y el costo de cambiar o afrontar una falencia cueste millones y la ganancia de hacerlo sea de $1"Lo que describo a continuación es un ejemplo que realice por el año 2010 que desde entonces lo uso para dar clases de Revit, e independiente del aprendizaje del programa para el modelado siempre intento ser lo más claro posible definiendo que, si bien lo que hacemos es un dibujo, el resultado debe representar una simulación constructiva del proyecto.
La información de entrada o de punto de partida:
Aplicando las Normas ISO 9001 a la construcción
Si había cosas engorrosas en la cual involucrarse este fue un gran hallazgo! Reescribir las normas ISO 9001 para una empresa constructora.
La revisión de los procesos llevó un año, y sin quererlo y de curioso esto me llevó a cuatro cursos sobre calidad y a estudiar el estándar del PMI. Como conclusión lo más importante fue razonar de que podría revisar, mejorar y optimizar los procesos de manera infinita por lo lejano de los rincones hacia esto nos lleva pero que por más robusto y sofisticado que esto resulte, se vuelve completamente frágil y vulnerable cuando la cabeza del organigrama tuvo un mal día y decidió restarle importancia al asunto.
De aquí en adelante el desarrollo del trabajo aplicado ya que de poco iré agregando el desarrollo de los aplicativos en Excel que intentan resolver varias aspectos del seguimiento de la calidad del proceso.
La estructura del Manual se dividió de la siguiente manera entendiendo que:
La Estructura del manual quedó de la siguiente manera:
La revisión de los procesos llevó un año, y sin quererlo y de curioso esto me llevó a cuatro cursos sobre calidad y a estudiar el estándar del PMI. Como conclusión lo más importante fue razonar de que podría revisar, mejorar y optimizar los procesos de manera infinita por lo lejano de los rincones hacia esto nos lleva pero que por más robusto y sofisticado que esto resulte, se vuelve completamente frágil y vulnerable cuando la cabeza del organigrama tuvo un mal día y decidió restarle importancia al asunto.
De aquí en adelante el desarrollo del trabajo aplicado ya que de poco iré agregando el desarrollo de los aplicativos en Excel que intentan resolver varias aspectos del seguimiento de la calidad del proceso.
La estructura del Manual se dividió de la siguiente manera entendiendo que:
De la Norma surgen los "MANUALES ESCRITOS", de lo anterior surgen los "PROCEDIMIENTOS GENERALES", que de estos pueden derivar o no en "PROCEDIMIENTOS ESPECÍFICO" pero siempre de aquí en adelante surgirán los "FORMULARIOS A COMPLETAR" y que solo con estos se podrá seguir adelante con los "FORMULARIOS DE SEGUIMIENTO"El total del manual fue escrito en Excel ya que su sistema de pestañas y mis escasos conocimientos de programación me permitan concentrar en un solo archivo el total del manual y de esta manera controlar mejor las versiones. Entre otras una macro escrita de suma utilidad fue la Macro para unificar los formatos en un Manual.
La Estructura del manual quedó de la siguiente manera:
La estructura de la información para obras edilicias
Desde hace un tiempo
percibí el enorme conflicto que existe en este rubro con el manejo
de la información como herramienta vital del proceso de construir.
Lo anterior resumido en un lenguaje mundano significa que al no haber un consenso entre las partes interesadas en las maneras, métodos y formatos de organizar y compartir la información nos lleva indefectiblemente al desgaste de invertir tiempo en interpretar la personalización de formatos en los planos de proyectos, sobre todo en la manera de dibujar y presentarlos, a tener que interpretar diversas planillas y controles que intentan reflejar lo mismo pero de formas diametralmente opuestas.
Hasta acá el desgaste solo se traduce en tiempo y claro que atentan contra la capacidad de quien interpreta la información recibida entendiendo que este es idóneo en el tema y tiene que deducir todo el razonamiento que lo llevó a presentar el trabajo de tal o cual manera. Cuando a esto le sumamos un problema de dialogo en los equipos de trabajo surge el peligro más doloroso, el ejecutar o trabajar en base a información no vigente por el solo hecho de haber un conflicto de entre quienes producen la información y quienes las toman como referencia para tomar decisiones.
Con el tiempo, algunas mañas de acumular documentación como una anécdota de mi experiencia, surgió el dilema que había participado de varios proyectos con diferentes tipos de responsabilidades, de que todavía conservo toda la información o la mayor parte de ella y que una manera de evolucionar en cada objetivo nuevo era volver hacia la última experiencia y tomarla como punto de partida para acomodarla a la situación que se presente.
Entonces partí de la base de que quería organizar todos los proyectos en los que he trabajado y de
los que trabajaré, de forma que me permita acceder a la información
de una manera directa sin navegar por la computadora horas, y esto me llevo a razonar todos los hitos y procesos de la vida de un proyecto donde se genera o se registra un documento.
Aclarando que todos los proyectos que traje al caso son de construcción de obras edilicias surgió la siguiente estructura de información:
Estructura de las carpetas:
Mi Plan de Gestion del Proyecto de un Edificio
PLAN DE GESTIÓN (PM)
El objetivo de este articulo es mostrar el desarrollo de cada uno de los puntos que contienen el índice de este trabajo ya que desde cada uno de estos puntos se podría derivar un mundo de análisis y al mismo tiempo si observo el trabajo como un conjunto sin duda fue un ejercicio único para pensar un proyecto de inicio a fin incluyendo sobre costos y ahorros sin que se haya gastado nada mas que mi tiempo.
ÍNDICE:
#, Enunciado:
01, RESUMEN EJECUTIVO
02, ANTECEDENTES
03, METODOLOGÍA DE GESTIÓN
03.01, Procesos a utilizar.
03.02, Metodología de Ejecución del trabajo.
03.03, Metodología de Supervisión y control de los cambios.
03.04, Gestión de los Cambios.
03.05, Uso de las líneas base.
04, PLAN DE GESTIÓN DEL ALCANCE
04.01, Proceso de definición de alcance.05, PLAN DE GESTIÓN DEL CRONOGRAMA
04.02, Proceso para elaboración de WBS.
04.03, Proceso para elaboración del Diccionario WBS.
04.04, Proceso para verificación de alcance.
04.05, Proceso para control de alcance.
05.01, Siglas asignadas al proyecto.06, PLAN DE GESTIÓN DE COSTOS
05.02, Proceso de definición de actividades.
05.03, Proceso de secuenciamento de actividades.
05.04, Proceso de estimación de recursos de las actividades.
05.05, Proceso de estimación de duración de las actividades.
05.06, Proceso de desarrollo de cronograma.
05.07, Proceso de desarrollo de cronograma.
06.01, Proceso de definición de los costos.07 PLAN DE GESTIÓN DE CALIDAD
06.02, Proceso de integración del presupuesto.
06.03, Proceso de control de los costos.
06.04, Flujograma del proceso de control de los costos.
07.01, Política de calidad del proyecto.
07.02, Alcances de la gestión de la calidad.
07.03, Referencias de la gestión de la calidad.
07.04, Implicados en plan de gestión de calidad.
07.05, Parámetros de la calidad.
07.06, Gestión de la calidad.
07.07, Flujograma del control de la calidad.
08, PLAN DE MEJORA DEL PROCESO
09, PLAN DE GESTIÓN DE LOS RECURSOS HUMANOS
09.01, Estructura de desglose de la Organización.10, PLAN DE GESTIÓN DE LAS COMUNICACIONES
09.02, Adquisición de personal.
09.03, Necesidades de Capacitación.
09.04, Reconocimientos y recompensas.
10.01, Identificación de los interesados.
10.02, Planificación de las com. y Expectativas de los interesados.
10.03, Distribución de la información.
10.04, Comunicación del desempeño.
11, PLAN DE GESTIÓN DE LOS RIESGOS
11.01, Plan de riesgo aplicado.
11.02, Identificación de los riesgos.
11.03, Análisis cualitativo de los riesgos.
11.04, Planificación de la respuesta a los riesgos.
12, PLAN DE GESTIÓN DE LAS ADQUISICIONES
13, ANEXOS
13.01, Lista de Hitos.
13.02, Calendario de Recursos.
13.02.01, Días Festivos.
13.02.02, Periodos de disponibilidad.
13.03, Línea Base del Cronograma (estimación inicial).
13.04, Línea Base del Costo (estimación inicial).
13.05, Línea Base de Alcance.
13.05.01, Enunciado del Alcance del Proyecto.
13.05.02, Estructura de Desglose del Trabajo (EDT o WBS).
13.05.03, Diccionario de la EDT.
13.06, Registro de Riesgos.
13.07, Matriz de los Interesados.
14, HISTORIAL DE REVISIONES
Macro para diseñar, computar y presupuestar obras de instalación eléctrica enlazando AutoCAD con Excel.
Si bien al momento de emprender esta macro ya existían otras que ofrecían estos beneficios, todas las opciones requerían de pagar una licencia y aprender una nueva metodología de trabajo con todo lo que esto implica en cuestión de tiempo y dedicación sin conocer con certeza si los alcances se ajustaban a los requerimientos. Fue aquí donde surgió esta idea ambiciosa de tomar los procesos artesanos que hasta el momento practicaba un grupo de ingenieros eléctricos, meterme en todos sus procesos del diseño, cómputos, certificación y conducción de las obras e intentar resumir algunos aspectos del trabajo diario.
Esta aplicación fue creada con el fin de ser usada en obras edilicias convencionales con estructura de concreto.
Sin mayores excusas paso a comentar de que se trata este conjuntos de macros que terminaron formando una aplicación integral:
El primer paso fue definir toda la simbología que según normas pre establecidas serían usadas para los proyectos.
Una vez definida se redibujaron teniendo en cuenta que sería necesario dibujar a escala real todo aquello que nos ayude a tener precisión en los proyectos.
A partir de esto una simple macro que ponga una planta arquitectónica en modo borrador entendiendo que un factor importante son los muros y las vigas, y por supuesto saber de qué se trata cada espacio.

Para agilizar el trabajo de proyecto se creó también un panel de botones en AutoCAD que al apretar cada símbolo nos pediría hacer click a donde insertarlo.
Auxiliado por la botonera se insertan todos los elementos eléctricos del proyecto según el mejor criterio de diseño.
Nos queda de la siguiente manera:
A partir de acá se unen los elementos con polilíneas realmente como serán los circuitos.
Con lo anterior realizado empezamos a analizar los circuitos, para esto nos auxiliamos de otra macro.
Se definió las posibles combinaciones de cables que podrían llevar cada tubería. Una regla mnemotécnica muy simple de aprender que en este momento no me voy a extender. Pero el caso es que al hacer click en cada botón y luego seleccionar una tubería asignará su diámetro y el tipo con la combinación de cables que contiene.
Ej:
a = 2x1,5 + T
a’=3x1,5 + T
b =2x2,5 + T
Etc.
Así pinchamos en la nomenclatura que queramos usar y a continuación seleccionamos el caño a la cual queremos asignarle esta nomenclatura, una vez seleccionado el caño insertamos el punto medio del dibujo del texto de la nomenclatura y finalmente con otro click asignamos su orientación para una fácil lectura.
Cada símbolo insertado deja asignada una capa predeterminada al caño. Es condición inalterable que cada caño este definido por una capa que indique su nomenclatura, como por ejemplo: una arco en la capa “A” indica que es una cañería que recorre por losa y es de la nomenclatura 2X1,5 + T.
Ej:
a = 2x1,5 + T
a’=3x1,5 + T
b =2x2,5 + T
Etc.
Así pinchamos en la nomenclatura que queramos usar y a continuación seleccionamos el caño a la cual queremos asignarle esta nomenclatura, una vez seleccionado el caño insertamos el punto medio del dibujo del texto de la nomenclatura y finalmente con otro click asignamos su orientación para una fácil lectura.
Cada símbolo insertado deja asignada una capa predeterminada al caño. Es condición inalterable que cada caño este definido por una capa que indique su nomenclatura, como por ejemplo: una arco en la capa “A” indica que es una cañería que recorre por losa y es de la nomenclatura 2X1,5 + T.
Ampliando el ejemplo nos queda de la siguiente manera el proyecto.
Quizás llame la atención de que en el siguiente plano hay cañería en azul y también en rojo, la razón de esta fue ya asignarle al programa que mientras coloque la nomenclatura, del color rojo a todos los caños que son RS16, azul a todos los RS19, verde a los RS22 y violeta a los RS38 (queda a criterio usar o no caños RS13 ya que por su debilidad y diferencia en costo con el RS16 por experiencia se eligió usar RS16) sin alejarme del asunto, el hecho de los distintos colores es que para el momento de la ejecución de la obra, basta con entregarle al operario el plano con los muros, vigas cotas y cañerías en distintos colores y una referencia que diga que color es cada caño, entonces ya no entregamos nomenclaturas y reducimos la posibilidad de error.
Un detalle muy importante es que hasta aquí solo tenemos la proyección horizontal del proyecto, pues nos falta todo lo vertical, para esto se indica en cada caja una bajada con el símbolo naranja que se ve a continuación, este símbolo indica una continuación de la tubería en dirección vertical con una distancia hacia el artefacto.Acá es donde interviene el botón estrella del asunto, nos pedirá seleccionar el proyecto, y luego abrirá una ventana con ciertos parámetros a tener en cuenta para el computo.
Nos pedirá un poquito de espera, que por cierto para matar la ansiedad y la incertidumbre se agregó la animación de que cada tubo que se lee va cambiando de color.
Este panel es casi lo mas importante del éxito del programa ya que con una revisión de lo ejecutado contra el cómputo se podrá ir ajustando los porcentajes de desperdicio y error para los planos futuros, este porcentaje puede ser muy variable según la calidad de la mano de obra.
Notaremos lo siguiente. Las líneas en muros se empezaran a poner de color naranja y las de losa de color verde, este no es mas que un control propio de errores, si de repente al finalizar el computo notamos que alguna línea mantiene el color original, esto quiere decir que algún error hay, el posible error es que la línea no tenga la nomenclatura asignada, recordemos que al asignar una nomenclatura esta asigna por defecto una capa y un color, y es esta capa y línea la que el programa lee.
Listo, al desaparecer la leyenda central de la pantalla. Se abrirá un Excel con nuestro cómputo métrico correspondiente a nuestra selección, en forma de cómputo detallado en tres etapas: La primera que será la etapa de losas, la segunda que será la etapa de paredes y la tercera que será la etapa de cableado.
Porteros Eléctricos, Tapas Rectangulares ciegas RED, Llave de 2 combinaciones, Llave de 2 combinaciones y un dimer, Llave de 2 dimers, Artefacto de dos tubos fluorescentes, Llave de 2 puntos, Llave de 2 tomacorriente, Llave de 3 combinaciones, Llave de 3 dimer, Artefacto de 3 tubos fluorescentes, Llave de 3 puntos, Tomacorriente trifásico, Artefacto de 4 fluorescentes, Artefacto de 8 fluorescentes, Artefacto de 8 fluorescentes y uno de emergencia, Tomacorriente de 20A, Artefacto aplique exterior, Farolas exteriores, Campanilla para timbre, Rosetas de madera chicas, Artefacto de centro de 2 velas, Artefacto de centro de 1 vela, Célula Fotoeléctrica, Llave de combinación, Llave de combinación y dimer, Llave de combinación y tomacorriente, Dicroicas, Llave de 2 puntos y combinación, Llave de dimer, Flotante para tanque de reserva de agua, Llave de punto, Llave de 2 puntos y dimer, Llave de punto y combinación, Llave de punto y dimer, Llave de punto y tomacorriente, Llave con pulsador de escalera, Tapas Rectangulares ciegas TE, Llave pulsador de timbre, Tomacorriente, Tapas Rectangulares ciegas TV, Ventilador de techo, Ventilador de techo con cuatro luminarias, Florones, Cajas Rectangulares, Caja octogonal chica, Rosetas para aplique, Caja cuadrada 10x10, Tapa ciega cuadrada 10x10, Caja cuadrada 15x15, Tapa ciega cuadrada 15x15, Caja cuadrada 20x20, Tapa ciega cuadrada 20x20, Tablero seccional, Cajas octogonales grandes, Artefacto de luz de emergencia, Medidores, Cajas de Medidores, Tornillos y tacos fisher, Cables, Caños y Conectores.
Si te interesa dale al boton G+, comenta, participa...
Y escribime para enviarte el ejemplo!
Panel de Control y Trazabilidad de las Compras y Suministros
En general,
por mucha programación que se pueda pronosticar en un proceso de producción, una pata
fundamental para el cumplimiento es el suministro de los insumos.
Siguiendo el concepto que indica el estándar de las normas ISO 9001, que detalla en resumen que si un proceso es crítico para la satisfacción del resultado, este proceso debe de ser controlado en toda su trazabilidad.
El primer paso para avanzar sobre lo anterior fue entender y visualizar el proceso en su totalidad y quedo de la siguiente manera y surgió el flujograma del Proceso.
Junto al flujograma surgieron establecer los siguientes objetivos:
- Establecer tiempo lógico de respuestas.
- Tiempo de proceso de la orden de compra = 1 días.
- Tiempo para la cotización = 2 días.
- Tiempo de aprobación de la orden de compra = 1 día.
- Tiempo de envío de la orden de compra al proveedor = 1 día.
- Tiempo de entrega del material = Depende la negociación.
- Pago al proveedor = Preestablecido con apr. de contabilidad.
- Para Compras de insumos nuevos incrementar la investigación de los proveedores = +3 días.
- Tiempo del proceso= 7 días + Tiempo de entrega del proveedor.
- Para compras frecuentes el tiempo del proceso será 5 días + Tiempo de entrega del proveedor.
La
aplicación consiste en determinar cada hito del proceso de las compras
entendiendo que el proceso nace cuando quien tiene la necesidad la informa de
manera formal y muere con la entrega del o los insumos.
Para lo anterior se determinó que el proceso en su teoría lineal debería de seguir más o menos la siguiente lógica:
01) Nace el proceso con el pedido de materiales:
05) Luego un aporte del Comprador:
06) El aporte de los contables:
Para lo anterior se determinó que el proceso en su teoría lineal debería de seguir más o menos la siguiente lógica:
01) Nace el proceso con el pedido de materiales:
Quiero saber:
02) Una vez decidido el proveedor se genera una orden de compra:
- Cuando se generó la orden de pedido?
- Que numero se le asignó a la orden de pedido?
- Para cuando me informan que necesitan en obra el material pedido?
- Cuantos presupuestos se generaron para atender la orden de pedido?
Quiero saber:
03) Momento que culmina la dulce espera de recibir lo comprado:
- Que orden/es de compra se asignó a la solicitud?
- Con qué fecha salió la OC?
- Que Fecha se pacto para la entrega?
- Con quién fué el trato comercial?
Quiero saber:
04) Luego el proveedor complementa la información de la compra:
- Se recibió la compra? SI - NO - Falta Remito
- Con que Fecha?
- Hubo reclamos sobre la calidad de la recepción? SI-NO
- La recepción del material fué sellada y firmada por alguien? SI-NO
Quiero saber:
- De que Fecha es la factura?
- Que Numero tiene la Factura?
- Cual es el Concepto de la Factura?
- Cual es el SubTotal de la Factura?
05) Luego un aporte del Comprador:
Quiero saber:
- Que Imputación contable tubo la factura?
- Se verificó el precio Unitario y el sub-total de los comprado con lo facturado?
- La Orden de compra fué aprobada para el pago? SI-NO
06) El aporte de los contables:
Quiero saber:
07) Mis deducciones sobre el proveedor:
- Como se va a pagar esa factura?
- Cuando se va a Pagar?
Quiero saber:
07) Mis deducciones sobre el departamento de compras:
- El proveedor cumplió con su compromiso en tiempos?
- Presentó factura en donde debía?
- La entrega se consiguió en los tiempos que la obra lo proponía?
- Presentó factura luego de los 7 días de la entrega?
- Hubo quejas sobre el producto entregado?
- Fué el mejor proveedor de una terna?
Quiero saber:
08) El Resultado de haber preguntado tanto:
- Hubo Orden de Pedido para generar la compra?
- Compras cumplió con el requerimiento que obra le marcaba?
- Compras comparó precios antes de comprar?
- El tiempo entre la orden de pedido la compra fué menor a 2 días?
- El tiempo entre la factura generada y orden de compra fué menor a 2 días?
La aplicación aparte de informar del estado de cada proceso de compra vigente debía de responder siete preguntas básicas a saber del conjunto de procesos como un todo:
Fue eficiente el departamento de compras en dar el servicio al área de
producción?
1) Los procesos realmente comienzan de manera formal?
2) Las compras son realizadas en los primeros dos días del pedido?
3) Los suministros fueron logrados según requerimientos del área de producción?
2) Las compras son realizadas en los primeros dos días del pedido?
3) Los suministros fueron logrados según requerimientos del área de producción?
Que tan eficiente fueron los proveedores con la responsabilidad que le tocaba?
4) Los proveedores que cumplieron con la fecha requerida?
5) Las compras fueron recibidas a satisfacción?
5) Las compras fueron recibidas a satisfacción?
Fue eficiente el departamento en cuanto a los aspectos económicos?
6) Se hicieron comparaciones de precios?
7) Se dio por finalizado el proceso de manera formal contra un remito?
7) Se dio por finalizado el proceso de manera formal contra un remito?
Entonces, todas estas preguntas debería de evaluarse de manera mensual y poder ser comparadas con su mes predecesor para poder trazar los objetivos a superar y surge:
Panel de Control y Trazabilidad de las Compras y Suministros:
Si te interesa dale al boton G+, comenta, participa...
Y escribime para enviarte el ejemplo!
Un Gantt en Excel manipulando los recursos y la curva de inversión.
Observando el rechazo masivo a usar Project para programar obras surgió esta macro.
Las entradas son las tareas, su comienzo, su duración y su costo tanto programado como real.
La salida automática es la integración del diagrama de gantt con sus barras, la curva de inversión, la curva de avance y la interposición de los recursos en la escala del tiempo en la parte superior, y por supuesto la fecha de hoy transversal a toda la información gráfica. Todo en la misma pantalla y en simultáneo.
Pero como? es la pregunta!
Una vez escritas las actividades, y las fechas de inicio y de fin de cada una vamos a necesitar un auxiliar llamado B_Crear_Calendario que arme por nosotros el calendario hacia la derecha con un formato que sea entendible a simple vista, claro que para esto entiendo que la fecha de partida será la fecha más pequeña del programa y la máxima la fecha más lejana de todo el programa.
Luego, otro auxiliar llamado C_Crear_Barras nos ayudará a crear dentro de este calendario las barras correspondientes a las tareas pero, teniendo en cuenta que a cada tarea será asignada un recurso, al mismo tiempo en la parte superior aparecerá la gráfica de quién será el responsable de esa tarea ocupando la franja en la línea de tiempo.
Pero si pienso que también quiero una curva de avance y que no pueden convivir dos informaciones en la misma celda, la solución está en crear por medio de la macro las barras como shapes contenidas en las celdas a las que corresponda y al mismo tiempo escribir dentro de la celda el valor que le corresponda. En resumen digo que solo vamos a ver la barra, pero que está en su interior esconde el avance fraccionado.
Pero como fraccionamos ese porcentaje? Aca voy a buscar suplantar una gran mentira por mentiritas más pequeñas con alguna certezas. Es decir que en vez de dividir el precio calculado en el plazo propuesto lo que sería un avance lineal voy a proponer que puede o no haber anticipo financiero, que puedo o no haber una retención para el final de la tarea y que todo lo que ocurra post anticipo y antes de la devolución de la retención será planeado con algún criterio de rendimiento. Y es aquí donde traigo algunas variantes con el solo objetivo de intentar acercarme un poquito más a la realidad.
Módulo B_Crear_Calendario:
Option Explicit
Dim Bcle As Long
Public Function Armar_Calendario()'1) Refresco las constantes del proyecto donde Determino la Hoja del Calendario, Determinar el área del calendario, Obtengo la última fila del programa, Obtener la minima y maxima del calendario y calculo los dias de duracion.
A_Declarar_Constantes.Declarar
'2) y desactivo las advertencias y desactivo act. Automaticas
Excel.Application.DisplayAlerts = False
Application.ScreenUpdating = False
'3) Borro todo el calendario actual
Hoja_Work.Range(Cells(1, Columna_Inicio_Calendario), Cells(Max_Row, 6500)).Delete
'4) Escribo fechas y dias en la cabezera
For Bcle = Columna_Inicio_Calendario To Periodo + Columna_Inicio_Calendario
Hoja_Work.Cells(Fila_Year, Bcle) = Min_Fecha + (Bcle - Columna_Inicio_Calendario)
Hoja_Work.Cells(Fila_Month, Bcle) = Min_Fecha + (Bcle - Columna_Inicio_Calendario)
Hoja_Work.Cells(Fila_Day, Bcle) = Min_Fecha + (Bcle - Columna_Inicio_Calendario)
Hoja_Work.Cells(Fila_Day_Letra, Bcle) = UCase(Left((Format(Min_Fecha + (Bcle - Columna_Inicio_Calendario), "ddd")), 1))
If Hoja_Work.Cells(Fila_Day_Letra, Bcle) = "D" Then
Hoja_Work.Cells(Fila_Day_Letra, Bcle).Font.color = -16776961
With Hoja_Work.Range(Cells(Fila_Day_Letra, Bcle), Cells(Max_Row - 1, Bcle)).Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorDark1
.TintAndShade = -0.149998474074526
.PatternTintAndShade = 0
End With
End If
Next
Dim Temp_Range As Range
Dim Temp_Inicio As Integer
'5) Resumo los meses
Temp_Inicio = Columna_Inicio_Calendario
For Bcle = Columna_Inicio_Calendario To Periodo + Columna_Inicio_Calendario
If Not Format(Hoja_Work.Cells(Fila_Month, Bcle), "mm") = Format(Hoja_Work.Cells(Fila_Month, Bcle + 1), "mm") Then
Set Temp_Range = Hoja_Work.Range(Cells(Fila_Month, Temp_Inicio), Cells(Fila_Month, Bcle))
Temp_Range.Merge
Temp_Inicio = Bcle + 1
End If
Next
'6) Resumo los años
Temp_Inicio = Columna_Inicio_Calendario
For Bcle = Columna_Inicio_Calendario To Periodo + Columna_Inicio_Calendario
If Not Year(Hoja_Work.Cells(Fila_Year, Bcle)) = Year(Hoja_Work.Cells(Fila_Year, Bcle + 1)) Then
Set Temp_Range = Hoja_Work.Range(Cells(Fila_Year, Temp_Inicio), Cells(Fila_Year, Bcle))
Temp_Range.Merge
Temp_Inicio = Bcle + 1
End If
Next
'7) Doy formato a las cuatro filas
Set Temp_Range = Hoja_Work.Range(Cells(Fila_Day, Columna_Inicio_Calendario), Cells(3, Bcle - 1))
Temp_Range.NumberFormat = "dd"
Set Temp_Range = Hoja_Work.Range(Cells(Fila_Month, Columna_Inicio_Calendario), Cells(2, Bcle - 1))
Temp_Range.NumberFormat = "mmmm"
Set Temp_Range = Hoja_Work.Range(Cells(Fila_Year, Columna_Inicio_Calendario), Cells(1, Bcle - 1))
Temp_Range.NumberFormat = "yyyy"
Set Temp_Range = Hoja_Work.Range(Cells(Fila_Year, Columna_Inicio_Calendario), Cells(Fila_Day_Letra, Bcle - 1))
Temp_Range.HorizontalAlignment = -4108
Temp_Range.EntireColumn.AutoFit
Temp_Range.Borders.Value = 1
'8) Doy formato al interior del calendario
Set Temp_Range = Hoja_Work.Range(Cells(Fila_Inicio_Calendario, Columna_Inicio_Calendario), Cells(Max_Row - 1, Columna_Inicio_Calendario + Periodo))
With Temp_Range.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThick
End With
With Temp_Range.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThick
End With
With Temp_Range.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlMedium
End With
With Temp_Range.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThick
End With
With Temp_Range.Borders(xlInsideVertical)
.LineStyle = xlDot
.ColorIndex = xlAutomatic
.TintAndShade = -0.149998474074526
.Weight = xlThin
End With
With Temp_Range.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.ColorIndex = xlAutomatic
.TintAndShade = -0.149998474074526
.Weight = xlHairline
End With
'09) Activo las advertencias y termino la aplicación
Excel.Application.DisplayAlerts = True
Application.ScreenUpdating = True
End
End Function
Public Function Crear_Barras_Completo()
'1) Refrezco las constantes del proyecto donde Determino la Hoja del Calendario, Determino el area del calendario, Obtengo la ultima fila del programa, Obtengo la minima y maxima del calendario y calculo los dias de duracion
A_Declarar_Constantes.Declarar
'2) y desactivo las advertencias y desactivo act. Automaticas
Excel.Application.DisplayAlerts = False
Application.ScreenUpdating = False
'3) Recorro programa y escribo barrasDim Grafico As Shape
For Each Grafico In Excel.Sheets("Gantt").Shapes
Grafico.Delete
' If Left(Grafico.Name, 1) = "P" Or Left(Grafico.Name, 1) = "T" Then: Grafico.Delete
Next
For Bcle = Fila_Inicio_Calendario To Max_Row - 1
'MsgBox Hoja_Work.Cells(Bcle, Col_ID)
'MsgBox Hoja_Work.Cells(Bcle, Col_Name)
'MsgBox Hoja_Work.Cells(Bcle, Col_Start)
'MsgBox Val(Hoja_Work.Cells(Bcle, Col_Dur))
' MsgBox Hoja_Work.Cells(Bcle, Col_Finish)
' MsgBox Hoja_Work.Cells(Bcle, Col_Cost)
' MsgBox Hoja_Work.Cells(Bcle, Col_Recurso)
'Calculo la ubicacion de la barra
'Dim Col_Start As Long
Set Temp_Range = Hoja_Work.Range(Hoja_Work.Cells(Bcle, Hoja_Work.Cells(Bcle, Col_Start) - Min_Fecha + Columna_Inicio_Calendario), Hoja_Work.Cells(Bcle, Hoja_Work.Cells(Bcle, Col_Start) - Min_Fecha + Columna_Inicio_Calendario + Val(Hoja_Work.Cells(Bcle, Col_Dur))))
Dim C_X As Double: C_X = Temp_Range.Left
Dim C_Y As Double: C_Y = Temp_Range.Top + Temp_Range.Height * 0.1
Dim Alto As Double: Alto = Temp_Range.Height * 0.8
Dim Ancho As Double: Ancho = Temp_Range.Width
Dim Texto As String: Texto = Hoja_Work.Cells(Bcle, Col_Name)
Dim Barra_Name As String: Barra_Name = Hoja_Work.Cells(Bcle, Col_ID)
If C_X = 0 Then Exit Function
If C_Y = 0 Then Exit Function
If Alto = 0 Then Exit Function
If Ancho = 0 Then Exit Function
If Texto = "" Then Exit Function
If Barra_Name = "" Then Exit Function
Barras_Gantt C_X, C_Y, Alto, Ancho, Texto, "R_" & Barra_Name
Next
End Function
Public Function Barras_Gantt(C_X As Double, C_Y As Double, Alto As Double, Ancho As Double, Texto As String, Barra_Name As String)
Dim barra As Shape
'Dim Typo As String
Set barra = ActiveSheet.Shapes.AddShape(msoShapeRoundedRectangle, C_X, C_Y, Ancho, Alto)
With barra
If Left(Barra_Name, 1) = "P" Then
.ShapeStyle = msoShapeStylePreset37
.Name = Barra_Name
.Fill.Solid
.Fill.Visible = msoTrue
.Fill.ForeColor.ObjectThemeColor = msoThemeColorBackground1
.Fill.ForeColor.TintAndShade = 0.2
.Fill.ForeColor.Brightness = -0.35
.Fill.Transparency = 0.2
.TextFrame2.TextRange.Characters.Text = Texto
.TextFrame2.TextRange.ParagraphFormat.Alignment = msoAlignCenter
.TextFrame2.VerticalAnchor = msoAnchorMiddle
.TextFrame2.TextRange.Font.Size = 8
.TextFrame2.TextRange.Font.Fill.Visible = msoTrue
.TextFrame2.TextRange.Font.Fill.ForeColor.ObjectThemeColor = msoThemeColorText1
.TextFrame2.TextRange.Font.Fill.ForeColor.TintAndShade = 0
.TextFrame2.TextRange.Font.Fill.ForeColor.Brightness = 0
.TextFrame2.TextRange.Font.Fill.Transparency = 0
.TextFrame2.TextRange.Font.Fill.Solid
End If
If Left(Barra_Name, 1) = "R" Then
.ShapeStyle = msoShapeStylePreset38
.TextFrame2.TextRange.Characters.Text = Texto
.TextFrame2.TextRange.ParagraphFormat.Alignment = msoAlignCenter
.TextFrame2.VerticalAnchor = msoAnchorMiddle
.TextFrame2.TextRange.Font.Size = 8
.TextFrame2.TextRange.Font.Fill.Visible = msoTrue
.TextFrame2.TextRange.Font.Fill.ForeColor.ObjectThemeColor = msoThemeColorText1
.TextFrame2.TextRange.Font.Fill.ForeColor.TintAndShade = 0
.TextFrame2.TextRange.Font.Fill.ForeColor.Brightness = 0
.TextFrame2.TextRange.Font.Fill.Transparency = 0
.TextFrame2.TextRange.Font.Fill.Solid
.Name = Barra_Name
End If
If Left(Barra_Name, 1) = "T" Then
.ShapeStyle = msoShapeStylePreset1
.TextFrame2.TextRange.Characters.Text = Texto
.Fill.ForeColor.RGB = RGB(255, 0, 0)
.Fill.Transparency = 0.75
.TextFrame2.TextRange.ParagraphFormat.Alignment = msoAlignCenter
.TextFrame2.VerticalAnchor = msoAnchorMiddle
.TextFrame2.TextRange.Font.Size = 10
.TextFrame2.TextRange.Font.Fill.Solid
.TextFrame2.TextRange.Font.Fill.Visible = msoTrue
.TextFrame2.TextRange.Font.Fill.ForeColor.RGB = RGB(0, 0, 0)
.Name = Barra_Name
End If
End With
End Function
Módulo A_Declarar_Constantes:
Option Explicit
Public Columna_Inicio_Calendario As Integer
Public Fila_Inicio_Calendario As Integer
Public Fila_Year As Long
Public Fila_Month As Long
Public Fila_Day As Long
Public Fila_Day_Letra As Long
Public Hoja_Gantt As String
Public Hoja_Work As Worksheet
Public Min_Fecha As Date
Public Max_Fecha As Date
Public Periodo As Long
Public Max_Row As Long
Public Col_ID As Long
Public Col_Name As Long
Public Col_Start As Long
Public Col_Dur As Long
Public Col_Finish As Long
Public Col_Cost As Long
Public Col_Recurso As Long
Public Function Declarar()
Hoja_Gantt = "Gantt"
Set Hoja_Work = Excel.Sheets(Hoja_Gantt)
Columna_Inicio_Calendario = 22
Fila_Inicio_Calendario = 8
Col_ID = 1
Col_Name = 2
Col_Start = 11
Col_Dur = 12
Col_Finish = 13
Col_Cost = 6
Col_Recurso = 8
Fila_Year = Fila_Inicio_Calendario - 4
Fila_Month = Fila_Inicio_Calendario - 3
Fila_Day = Fila_Inicio_Calendario - 2
Fila_Day_Letra = Fila_Inicio_Calendario - 1
Max_Row = (Hoja_Work.UsedRange.Row) + Hoja_Work.UsedRange.Rows.Count
Dim Bcle As Long
For Bcle = Fila_Inicio_Calendario To Max_Row
If CDate(Hoja_Work.Cells(Bcle, Col_Finish)) > 0 And CDate(Hoja_Work.Cells(Bcle, Col_Finish)) > CDate(Max_Fecha) Then Max_Fecha = Hoja_Work.Cells(Bcle, Col_Finish)
Next
Min_Fecha = Max_Fecha 'Supuesto
For Bcle = Fila_Inicio_Calendario To Max_Row
If CDate(Hoja_Work.Cells(Bcle, Col_Start)) > 0 And CDate(Hoja_Work.Cells(Bcle, Col_Start)) < CDate(Min_Fecha) Then Min_Fecha = Hoja_Work.Cells(Bcle, Col_Start)
Next
Periodo = Max_Fecha - Min_Fecha
End Function
El Reactivo en la Hoja del Gantt:
Option Explicit
Dim Bcle As Long
Private Sub Worksheet_Change(ByVal Target As Range)
Inicio:
Dim Hoja As String: Hoja = "Gantt"
Dim Barra_Name As String
Dim Fecha_I As Date
Dim Fecha_F As Date
Dim Dias As Long
Dim barra As Shape
Dim Min_Fecha As Date
Dim Temp_Fecha As Date
Dim C_Ini As Long: Dim C_Fi As Long
Dim L_Barra As Double
Dim P_Recurso As String
'Defino columnas
Dim Colum_P_I As Long: Colum_P_I = 11
Dim Colum_P_D As Long: Colum_P_D = 12
Dim Colum_P_F As Long: Colum_P_F = 13
Dim Colum_R_I As Long: Colum_R_I = 14
Dim Colum_R_D As Long: Colum_R_D = 15
Dim Colum_R_F As Long: Colum_R_F = 16
Dim Colum_Inicio_Gantt As Long: Colum_Inicio_Gantt = 22
'Defino datos comunes
Min_Fecha = Sheets(Hoja).Cells(4, 8)
Ctrl_G.Obtener_Rango Hoja, Target.Row, 1, Barra_Name
Select Case Target.Column
Case Colum_P_I To Colum_P_F
Barra_Name = "P_" & Barra_Name
P_Recurso = "T_" & Excel.Sheets(Hoja).Cells(Target.Row, 1)
Fecha_I = Sheets(Hoja).Cells(Target.Row, Colum_P_I)
Dias = Sheets(Hoja).Cells(Target.Row, Colum_P_D)
Fecha_F = Sheets(Hoja).Cells(Target.Row, Colum_P_F): Fecha_F = Fecha_I + Dias
If Target.Column = Colum_P_I Then
If Not Sheets(Hoja).Cells(Target.Row, Colum_P_F) = Fecha_F Then Sheets(Hoja).Cells(Target.Row, Colum_P_F) = Fecha_F
Sheets(Hoja).Cells(Target.Row, Colum_P_D) = Dias
End If
If Target.Column = Colum_P_F Then
Dias = Fecha_F - Fecha_I
If Not Sheets(Hoja).Cells(Target.Row, Colum_P_D) = Dias Then Sheets(Hoja).Cells(Target.Row, Colum_P_D) = Dias
End If
If Target.Column = Colum_P_D Then
If Not Sheets(Hoja).Cells(Target.Row, Colum_P_F) = Fecha_F Then Sheets(Hoja).Cells(Target.Row, Colum_P_F) = Fecha_F
For Each barra In Sheets(Hoja).Shapes
If barra.Name = Barra_Name Then: barra.Delete: Exit For
Next
'Borro la barra del recurso
For Each barra In Sheets(Hoja).Shapes
If barra.Name = P_Recurso Then: barra.Delete: Exit For
Next
If Sheets(Hoja).Cells(Target.Row, Colum_P_I) = 0 Or Sheets(Hoja).Cells(Target.Row, Colum_P_F) = 0 Then Exit Sub
Temp_Fecha = Sheets(Hoja).Cells(Target.Row, Colum_P_F)
C_Ini = Colum_Inicio_Gantt + (Fecha_I - Min_Fecha): C_Fi = C_Ini + Dias
L_Barra = Sheets(Hoja).Range(Cells(Target.Row, C_Ini), Cells(Target.Row, C_Fi)).Width
C_Fi = L_Barra
C_Ini = Val(Excel.Sheets(Hoja).Cells(Target.Row, C_Ini).Left)
'Ctrl_G.Barras_Gantt Val(C_Ini), Target.Top + Target.Height / 6, Val(C_Fi), Target.Height / 1.5, Excel.Sheets(Hoja).Cells(Target.Row, 2), Barra_Name
Dim Cel_I, Cel_F As Long
' modifico costos en gantt
Display_Excel.Proteger_Hoja Excel.ThisWorkbook.Name, "Gantt", False
Sheets("Gantt").Range(Cells(Target.Row, Colum_Inicio_Gantt), Cells(Target.Row, 365)).Clear
Display_Excel.Proteger_Hoja Excel.ThisWorkbook.Name, "Gantt", False
Cel_I = Colum_Inicio_Gantt + (Fecha_I - Min_Fecha)
Cel_F = Cel_I + Dias
For Bcle = Cel_I To Cel_F
Display_Excel.Proteger_Hoja Excel.ThisWorkbook.Name, "Gantt", False
Cells(Target.Row, Bcle) = Cells(Target.Row, 6) / (Cel_F - Cel_I + 1)
Next
Formato.Format_H_Text Excel.ActiveWorkbook.Name, Hoja, Cells(Target.Row, Cel_I), Cells(Target.Row, Cel_F), 4
'Escribo el recurso
If Len(Excel.Sheets(Hoja).Cells(Target.Row, 8)) > 0 Then
Cel_I = Colum_Inicio_Gantt + (Fecha_I - Min_Fecha)
Cel_F = Cel_I + Dias
'Verifico de no pisarlo
Dim H_Recursos As Double: H_Recursos = Excel.Sheets("Gantt").Range(Cells(1, 1), Cells(4, 1)).Height
Dim Cant_Max_Rec As Double: Cant_Max_Rec = 0 'se obtiene de fila 1
For Bcle = Cel_I To Cel_F
If Excel.Sheets(Hoja).Cells(1, Bcle) > Cant_Max_Rec Then Cant_Max_Rec = Val(Excel.Sheets(Hoja).Cells(1, Bcle))
Next
Dim barra_Altura As Long: barra_Altura = H_Recursos / Cant_Max_Rec
Dim Recurso_Y As Double: Recurso_Y = 0
Dim Recurso_Y_min As Double: Recurso_Y_min = H_Recursos - barra_Altura
For Each barra In Sheets(Hoja).Shapes
If Left(barra.Name, 1) = "T" Then
If barra.Left > C_Ini And barra.Left < (C_Ini + C_Fi) Or barra.Left + barra.Width > C_Ini And barra.Left + barra.Width < (C_Ini + C_Fi) Then
barra.Height = barra_Altura
If barra.Height + barra.Top >= Recurso_Y Then Recurso_Y = barra.Height + barra.Top
If barra.Height < Recurso_Y_min Then Recurso_Y_min = barra.Height
End If
End If
Next
MsgBox Recurso_Y_min & "-" & Recurso_Y
Display_Excel.Proteger_Hoja Excel.ThisWorkbook.Name, "Gantt", False
'Ctrl_G.Barras_Gantt Val(C_Ini), ((Temp_N - 1) * barra_Altura), Val(C_Fi), Val(barra_Altura), Excel.Sheets(Hoja).Cells(Target.Row, 8), P_Recurso
'Ctrl_G.Barras_Gantt Val(C_Ini), Recurso_Y, Val(C_Fi), Val(barra_Altura), Excel.Sheets(Hoja).Cells(Target.Row, 8), P_Recurso
End If
End If
Case Colum_R_I To Colum_R_F
Barra_Name = "R_" & Barra_Name
Fecha_I = Sheets(Hoja).Cells(Target.Row, Colum_R_I)
Dias = Sheets(Hoja).Cells(Target.Row, Colum_R_D)
Fecha_F = Sheets(Hoja).Cells(Target.Row, Colum_R_F): Fecha_F = Fecha_I + Dias
If Target.Column = Colum_R_I Then
If Not Sheets(Hoja).Cells(Target.Row, Colum_R_F) = Fecha_F Then Sheets(Hoja).Cells(Target.Row, Colum_R_F) = Fecha_F
Sheets(Hoja).Cells(Target.Row, Colum_R_D) = Dias
End If
If Target.Column = Colum_R_F Then
Dias = Fecha_F - Fecha_I
If Not Sheets(Hoja).Cells(Target.Row, Colum_R_D) = Dias Then Sheets(Hoja).Cells(Target.Row, Colum_R_D) = Dias
End If
If Target.Column = Colum_R_D Then
If Not Sheets(Hoja).Cells(Target.Row, Colum_R_F) = Fecha_F Then Sheets(Hoja).Cells(Target.Row, Colum_R_F) = Fecha_F
For Each barra In Sheets(Hoja).Shapes
If barra.Name = Barra_Name Then: barra.Delete: Exit For
Next
If Sheets(Hoja).Cells(Target.Row, Colum_R_I) = 0 Or Sheets(Hoja).Cells(Target.Row, Colum_R_F) = 0 Then Exit Sub
Temp_Fecha = Sheets(Hoja).Cells(Target.Row, Colum_R_F)
C_Ini = Colum_Inicio_Gantt + (Fecha_I - Min_Fecha): C_Fi = C_Ini + Dias
L_Barra = Sheets(Hoja).Range(Cells(Target.Row, C_Ini), Cells(Target.Row, C_Fi)).Width
C_Fi = L_Barra
C_Ini = Val(Excel.Sheets(Hoja).Cells(Target.Row, C_Ini).Left)
'Ctrl_G.Barras_Gantt Val(C_Ini), Target.Top + Target.Height / 4, Val(C_Fi), Target.Height / 2, Excel.Sheets(Hoja).Cells(Target.Row, 2), Barra_Name
End If
End Select
End Sub
Public Sub Ubicar_Avance()
Display_Excel.Proteger_Hoja Excel.ThisWorkbook.Name, "Gantt", False
Dim Grafico As Shape
'Dim Titulo As Range
Dim T As Double
Dim L As Double
Dim H As Double
Dim W As Double
For Each Grafico In Excel.Sheets("Gantt").Shapes
With Excel.Sheets("Gantt")
Select Case Grafico.Name
Case "G_Desagregado": T = .Cells(5, 1).Top
L = .Cells(5, 1).Left
H = .Cells(6, 3).Top - Grafico.Top
W = .Cells(6, 3).Left - Grafico.Left
Grafico.Locked = True
Case "G_Separador": T = .Cells(1, 21).Top
L = .Cells(1, 21).Left
H = .Cells(43, 22).Top - Grafico.Top
W = .Cells(43, 22).Left - Grafico.Left
Grafico.Locked = True
Case "G_Licitacion": T = .Cells(5, 3).Top
L = .Cells(5, 3).Left
H = .Cells(6, 8).Top - Grafico.Top
W = .Cells(6, 8).Left - Grafico.Left
Grafico.Locked = True
Case "G_Titulo": T = .Cells(1, 1).Top
L = .Cells(1, 1).Left
H = .Cells(3, 21).Top - Grafico.Top
W = .Cells(3, 21).Left - Grafico.Left
Grafico.Locked = True
Case "G_Prog": T = .Cells(5, 8).Top
L = .Cells(5, 8).Left
H = .Cells(6, 14).Top - Grafico.Top
W = .Cells(6, 14).Left - Grafico.Left
Grafico.Locked = True
Case "G_Real": T = .Cells(5, 14).Top
L = .Cells(5, 14).Left
H = .Cells(6, 21).Top - Grafico.Top
W = .Cells(6, 21).Left - Grafico.Left
Grafico.Locked = True
End Select
End With
If Grafico.Name = "Deagregado" Then
Grafico.Top = Excel.Sheets("Gantt").Cells(5, 1).Top
Grafico.Left = Excel.Sheets("Gantt").Cells(5, 1).Left
Grafico.Height = Excel.Sheets("Gantt").Cells(6, 1).Top - Grafico.Top
Grafico.Width = Excel.Sheets("Gantt").Cells(6, 3).Left - Grafico.Left
Grafico.Locked = False
End If
If Grafico.Name = "G_Titulo_Gantt" Then
Grafico.Top = Excel.Sheets("Gantt").Cells(1, 1).Top
Grafico.Left = Excel.Sheets("Gantt").Cells(6, 22).Left
Grafico.Height = Excel.Sheets("Gantt").Cells(5, 1).Top - Grafico.Top
Grafico.Width = Excel.Sheets("Gantt").Cells(43, 182).Left - Grafico.Left
Grafico.Locked = True
End If
If Grafico.Name = "G_Avances" Then
Grafico.Top = Excel.Sheets("Gantt").Cells(6, 1).Top
Grafico.Left = Excel.Sheets("Gantt").Cells(6, 22).Left
Grafico.Height = Excel.Sheets("Gantt").Cells(43, 1).Top - Grafico.Top
Grafico.Width = Excel.Sheets("Gantt").Cells(43, 182).Left - Grafico.Left
Grafico.Locked = True
End If
Next
Display_Excel.Proteger_Hoja Excel.ThisWorkbook.Name, "Gantt", True
End Sub
Public Function Obtener_Max_Min_Date_Partes()
Dim Temp_Range As Variant
Dim Bcle As Long
Dim Min_Date As Date
Dim Max_Dateb As Date
Dim Max_Row As Long
Ctrl_G.Obtener_Ultima_fila "Partes $", Max_Row
Ctrl_G.Capturar_Mtz_Total "Partes $", Temp_Range, 2, 2, 2, Max_Row
For Bcle = 1 To UBound(Temp_Range)
If Bcle = 1 Then Max_Dateb = Temp_Range(Bcle, 1)
If Bcle = 1 Then Min_Date = Temp_Range(Bcle, 1)
If Temp_Range(Bcle, 1) > Max_Dateb Then: Max_Dateb = Temp_Range(Bcle, 1)
If Temp_Range(Bcle, 1) < Min_Date And Temp_Range(Bcle, 1) > 0 Then: Min_Date = Temp_Range(Bcle, 1)
Next
Ctrl_G.Obtener_Ultima_fila "Gantt", Max_Row
Ctrl_G.Capturar_Mtz_Total "Gantt", Temp_Range, 6, 6, 5, Max_Row
For Bcle = 1 To UBound(Temp_Range)
If Temp_Range(Bcle, 1) < Min_Date And Temp_Range(Bcle, 1) > 0 Then: Min_Date = Temp_Range(Bcle, 1)
Next
Ctrl_G.Capturar_Mtz_Total "Gantt", Temp_Range, 8, 8, 5, Max_Row
For Bcle = 1 To UBound(Temp_Range)
If Temp_Range(Bcle, 1) > Max_Dateb Then: Max_Dateb = Temp_Range(Bcle, 1)
Next
Ctrl_G.Capturar_Mtz_Total "Gantt", Temp_Range, 9, 9, 5, Max_Row
For Bcle = 1 To UBound(Temp_Range)
If Temp_Range(Bcle, 1) < Min_Date And Temp_Range(Bcle, 1) > 0 Then: Min_Date = Temp_Range(Bcle, 1)
Next
Ctrl_G.Capturar_Mtz_Total "Gantt", Temp_Range, 11, 11, 5, Max_Row
For Bcle = 1 To UBound(Temp_Range)
If Temp_Range(Bcle, 1) > Max_Dateb Then: Max_Dateb = Temp_Range(Bcle, 1)
Next
Sheets("Gantt").Cells(1, 5) = Min_Date
Sheets("Gantt").Cells(2, 5) = Max_Dateb
Armar_Calendario
End Function
Si te interesa dale al boton G+, comenta, participa...
Y escribime para enviarte el ejemplo!
Suscribirse a:
Entradas (Atom)



















