23 abril 2007

Cómo calcular la Programación Ganada con Microsoft Project


Novedades 16/01/14: Una nueva versión que funciona con Microsoft Project Professional 2013 ya se puede descargar desde aquí.

Novedades 11/03/11: La versión MSP 2007 de la nota anterior también funciona con MSP 2010.

Novedades 27/02/09: Una nueva versión que funciona con MSP 2007 ya se puede descargar desde aquí.

Novedades 14/06/07: la primera versión se ha sustituido por una nueva en la que se ha corregido un error de cálculo.

La técnica de la Programación Ganada (ES de su acrónimo en inglés) es una extensión del Análisis del Valor Ganado (AVG) que ha sido reconocida recientemente como una práctica emergente por el Project Management Institute (PMI). Este enfoque novedoso se basa en el potente concepto de Programación Ganada (PG) introducido por Walt Lipke en su artículo pionero “Schedule is Different”. La razón que dio lugar a esta extensión fue el hecho bien conocido de que, en algunos escenarios concretos, algunos indicadores del AVG, como la desviación en programación SV y el índice de eficiencia en coste SPI, se comportan de forma inesperada a partir de cierto momento hacia el final de un proyecto, perdiendo todo su poder predictivo. Para conocer más sobre esta técnica ver la documentación de dominio público que se encuentra en Earned Schedule. Dado que es una práctica muy reciente, hasta donde sé los principales paquetes de software sobre programación de proyectos aún no la incorporan. El propio Lipke ha puesto a disposición una hoja de cálculo para automatizar el cálculo de la PG partiendo del coste planificado BCWS y del valor ganado BCWP.

Quiero mostrar aquí una macro realizada en VBA para MS Project (MSP) que prepara informes mensuales en Excel de los indicadores del AVG y de la PG con el propósito de que pueda ser útil para proyectos de pequeña y mediana entidad cuya programación se lleva con MSP. Y solamente su programación, es decir que el coste se lleva a parte –práctica nada extraña por otro lado. El tipo de proyecto para el que se utiliza la macro es aquél compuesto por actividades desempeñadas por recursos del tipo de mano de obra, en la que su duración se puede condicionar a su esfuerzo. De esta forma, tanto el coste como su duración son proporcionales al esfuerzo, horas-hombre por ejemplo. De esta manera, con seguir las horas es suficiente. Por mi experiencia, la tipología propia de estos proyectos unida a la inmadurez relativa de las organizaciones que suelen desempeñarlos hacen que efectuar un seguimiento del coste, además de la programación, sea con bastante frecuencia una empresa infructuosa. Otro inconveniente de MSP es que posee una implementación del AVG muy pobre, ya que no permite llevar un seguimiento histórico de las curvas S para los costes BCWS, BCWP, ACWP y sus magnitudes derivadas, y por tanto tampoco permite mostrar una representación gráfica de las mismas. Por otro lado, como adelantaba al principio, no incorpora la PG.

En el siguiente archivo de MSP, versión 2003, se puede encontrar un ejemplo del funcionamiento de la macro. Si el fichero se va a abrir con una versión diferente saldrá un mensaje de error y habrá que seleccionar las librerías adecuadas desde el menú del editor de Visual Basic de MSP: Herramientas-->Preferencias. Estas librerías son "Microsoft Project xx.x Object Library" and "Microsoft Excel xx.x Object Library", donde xx.x es la versión correspondiente a la versión de MSP -11.0 para MSP 2003. No olvidar tampoco comprobar el nivel de seguridad de macros de manera que permita su ejecución. Una vez abierto el archivo, aparecerá un nuevo menú llamado “Reports” en la barra de menús. Pinchando sobre el mismo se obtiene el informe en Excel del proyecto. El archivo contiene un ejemplo de proyecto con una duración de 18 meses que se ha actualizado de forma mensual seis veces desde su inicio. Para que el informe se pueda generar, debe haberse guardado una línea base con la planificación inicial del proyecto, y asignar una fecha de estado adecuada. Cada vez que se genera un informe mensual, el archivo va guardando estos datos de forma que va creando un histórico mensual de los indicadores que aparece actualizado cada vez que se genera el informe en Excel, pudiendo así descartar los informes generados con anterioridad. De esta manera, el informe muestra de forma gráfica la evolución de las curvas S y el resto de indicadores. Las magnitudes de tipo coste están medidas en horas-hombre y las de tiempo en semanas o días.

45 comentarios:

  1. Muchas gracias, estoy empezando a pegarme, en serio, con el EVM, y ahora esto.......
    Bueno, genial, por cierto gran blog!

    Claudio

    ResponderEliminar
  2. Felicitaciones, gran aporte

    ResponderEliminar
  3. Muy bueno el artículo de la programación ganada, pero al ejecutar el archivo en MSP 2003, se trunca la ejecución indicando un error 1004.
    ¿será que este error es debido a la macro o a la versión de MSP?

    Saludos

    José Antonio

    ResponderEliminar
  4. José Antonio, gracias por tu comentario. Me alegra que sea de tu interés. Respecto al problema con el archivo de ejemplo, ¿te ocurre cuando intentas abrirlo? Si es así debería ser un problema de la versión de Project que está utilizando, si no es 2003 tendrás que hacer referencia a la correspondiente librería según se cuenta en el artículo. Envíame un email si tienes problemas. Un saludo.

    ResponderEliminar
  5. Estoy usando MSP 2003, Al ejecutar la macro "Reports", en Excel se crean las hojas "Data" y "EAC" normalmente, cuando se esta creando la hoja "Performance Indexes" se presenta el error 1004 y al activar el depurador el cursor su ubica en la línea "xlBook.ActiveChart.SetSourceData Source:=xlBook.Sheets("Data").Range("K3:L20;Q3:Q20"), PlotBy:=xlColumns".

    Saludos

    José Antonio

    ResponderEliminar
  6. Vale, creo que tu instalación de MS Project está en inglés, ¿es así? Prueba a bajarte el fichero que aparece en la versión en inglés del artículo. ¿Conoces algo de VBA?

    ResponderEliminar
  7. A todo el que le salga el error que describe José Antonio que pruebe, bien a bajarse el fichero de la vesrión en inglés de este anuncio , o bien a sustituir la porción de código --Range("K3:L20;Q3:Q20")-- que aparecele en la línea de error del depurador por la siguiente --Range("K3:L20,Q3:Q20")--. Notar que se ha sustituido el punto y coma por una coma. Parece ser un bug que tiene VBA para el multilenguaje o lo que demonios sea -no soy un experto en estas cosas.

    ResponderEliminar
  8. Gracias por la aclaración, ahora si, funciona bien la macro.

    Saludos

    José Antonio

    ResponderEliminar
  9. Jose Antonio,

    Estoy intentando ejecutar la macro en la versión 2007 de MSP.

    Pero se me trunca la principio, no me sale ni el menu reports en la barra.

    El error que me sale es el siguiente:

    Se ha producido el error "2147467259 (80004005) en tiempo de ejecución.

    Error en el método "Add" de objeto "ComandBarControls"

    Lamentablemente no soy ningún experto en visual-basic y un pequeño error no me deja analizar las capacidades de la macro.

    ¿será un error de la macro o es la versión de MSP que yo uso que no es compatible?

    ResponderEliminar
  10. Hola David,

    El error que te sale tiene la pinta de ser debido a una versión diferente. El archivo está creado con MSP 2003 y las librerías correspondientes. Para resolver el problema, lee el último párrafo de esta entrada y busca la correspondiente versión de las librerías para MSP 2007.

    Por otro lado, espero que funcione también para MSP 2007, ya que nunca lo he probado. Si tienes más problemas puedes enviarme un mensaje.

    Diego.

    ResponderEliminar
  11. Hola Diego,

    He revisado lo que me indicabas y está todo correcto.

    He probado la macro directamente y si funciona. El error que sale es porque la macro que genera la barra de "reports" se trunca, por lo que hay que correr la macro EVSM desde visual basic.

    Seguro que es una tonteria, pero no consigo arreglarla.

    David

    ResponderEliminar
  12. Vale. Entonces es un problema del módulo que hace que añanda un nuevo menú "Reports"; algo debe haber cambiado en la versión 2007 para que no funcione. Desgraciadamente, no tengo de momento una dicha versión para verlo. Prueba lo siguiente: cuando falle, picha en la opción "Depurar", eso te lleva a la línea de código donde se para. Copia es línea y envíamela.

    ResponderEliminar
  13. Diego,

    Adjunto la macro, he hecho lo que me comentabas y al depurar, la linea que se marca en amarillo es la que se encuentra entre comillas (en el editor de visual basic la marca con fondo amarillo).

    ----------------------------------
    Sub Reports()

    Dim HelpMenu As CommandBarControl
    Dim NewMenu As CommandBarPopup

    Call DeleteMenu

    Set HelpMenu = CommandBars(3).FindControl(ID:=30010)

    If HelpMenu Is Nothing Then
    """Set NewMenu = CommandBars(3).Controls.Add
    (Type:=msoControlPopup, Temporary:=True)""""
    Else
    Set NewMenu = CommandBars(3).Controls.Add(Type:=msoControlPopup, before:=HelpMenu.Index, Temporary:=True)
    End If

    NewMenu.Caption = "&Reports"

    With NewMenu
    .OnAction = "Algorithm.EVSM"
    End With

    End Sub
    -------------

    Siento las molestías,

    David

    ResponderEliminar
  14. Vaya, yo estoy igual con el MSP2007.. . lastima que mis tiempos de VB estén un lejanos.
    Si doy con una solución intentaré postearla.
    Gran Blog.
    Saludos a todos.

    ResponderEliminar
  15. La macro esta excelente.. Contaras con una version que presente los avances semanales?.. Crees que pueda realizar las modificaciones a tus macros?.. Gracias!!

    ResponderEliminar
  16. Hola Nino, me alegra que te guste. No creo que publique ninguna otra versión, salvo que sea para corregir algún error. En realidad sí que estoy trabajando en una versión expanida con muchas más funcionalidades, en forma de complemento instalable, pero con fines comerciales.

    En cualquier caso, la filosofía ya está en la actual macro y por supuesto que puedes hacer con ella lo que quieras, modificar y desarrollar a partir de ella -de hecho el código se puede simplificar bastante más y puede quedar más reducido. Siéntete libre, y ya me cuentas.

    ResponderEliminar
  17. ESTOY COMENZANDO A TRABAJAR CON EVM A TRAVES DE EXCEL PARA APRENDER BIEN EL CALCULO DE TODOS LOS INDICADORES, ME PODRIAN AYUDAR CON LA FORMULA PARA CALCULAR LA DURACION ESTIMADA EN LAS VARIACIONES ATIPICAS, GRACIAS. HECTOR CASTRO

    ResponderEliminar
  18. Hola.
    El nuevo concepto presentado es interesante, pues personalmente es algo que ya habia identificado como contradictorio en el analisis comun de EVM

    ResponderEliminar
  19. Hola, soy nuevo en el tema de macros, no así en temas de EVM, al ejecutar el archvio de MSP aparece el menú de "Reportes" pero el menú no tiene contenido y no es posible ejecutar la macro desde ahí, lo hago desde el menú de macros y funciona bien. Tienes idea que puede estar pasando.
    PD: tengo MSP 2007
    Un saludo!!!!
    MauroT

    ResponderEliminar
  20. Hola MauroT, creo que en esta entrada encontrarás la respuesta a tu problema.

    ResponderEliminar
  21. Hola,
    Ante todo muchas gracias por tu aporte, tengo un inconveniente al querer llevarme la macro a otro proyecto, me dá el siguiente error "No hay ninguna máscara de código definida para Número19", alguien me puede ayudar?

    Mil gracias de antemano

    ResponderEliminar
  22. Hola Rocío,

    ¿Cómo has transportado la macro a otro proyecto?

    Prueba copiando los módulos "Algorithm" y "Menu" desde el editor de Visual Basic (Alt+F11).

    ResponderEliminar
  23. Hola, es un buen aporte, tienes algun otro ejemplo aplicado con project
    saludos
    Guillermo

    ResponderEliminar
  24. Buenas tardes,
    Estaba espearando algo parecido a esto y al final lo he encontrado. El problema es que no me funciona ninguna de las dos versiones.
    En la versión 2003, me sale una ventana con el texto "Type mismatch (IDTEextensibility2_OnConnection), y despues sale otra ventata con el texto "Se ha producido el error '7' en tiempo de ejecución: Memoria insuficiente". Al pulsar depurar me marca error en la siguiente linea: "Set xlApp = New Excel.Application" Alguién me puede ayudar?

    ResponderEliminar
  25. ¿Qué versión de Project estas utilizando?

    ResponderEliminar
  26. Tanto el project como el excel son el 2003.

    ResponderEliminar
  27. Buenos días,

    Estoy utilizando la macro para project con las siguientes configuraciones:

    - Ms Project 2007 en español
    - Wnidows 7 con configuración regional en español

    Cuando ejecuto la macro que aparece en el ejemplo, obtengo un error en la línea 481
    "Se ha producido el error '1004' en tiempo de ejecución: Error definido por la aplicación o el objeto"

    El código de dicha línea es:
    "xlBook.ActiveChart.SetSourceData Source:=xlBook.Sheets("Data").Range("K3:L20;Q3:Q20"), PlotBy:=xlColumns"

    Me gustaría plantearle las siguientes inquietudes:
    - Cómo puedo solucionar este error para que la ejecución sea exitosa?
    - Intenté utilizar la macro en un archivo .mpp que construí desde cero y la ejecución también arroja errores. Qué
    configuraciones debo tener presentes para que funcione la macro?
    - Posee usted algún tipo de documentación adicional para interpretar la información arrojada por la macro?

    Muchas gracias por su respuesta y por ofrecer esta valiosísima herramienta.

    Saludos,
    Esteban

    ResponderEliminar
  28. Agrego además que la versión del archivo .mpp que estoy usando es earned_schedule_msp2007_es

    Gracias!

    ResponderEliminar
  29. Hola Esteban,
    Es muy raro que no te funcione. Si sabes acceder al editor de Visual Basic (sólo con ir al origen del error cuando este sale ya lo hace automáticamente), prueba a cambiar el punto y coma que hay dentro de Range por una coma, y vuelve a ejecutar la macro a ver que pasa.
    Es decir, sustituye lo que hay por esto:
    xlBook.ActiveChart.SetSourceData Source:=xlBook.Sheets("Data").Range("K3:L20,Q3:Q20"), PlotBy:=xlColumns

    ResponderEliminar
  30. Diego, el problema se solucionó cambiando el punto y coma. Muchas gracias por tu respuesta.

    Sin embargo, me gustaría saber cómo usar la macro en un archivo .mpp propio. No se qué configuraciones específicas se requieran. La acabo de ejecutar y obtengo el error: "Error 1101. El valor del argumento no es válido" en la siguiente línea (64):

    "Set Timenow = ActiveProject.ProjectSummaryTask.TimeScaleData(StartDate:=ActiveProject.ProjectSummaryTask.Start, _
    EndDate:=ActiveProject.StatusDate, _
    Type:=pjTaskTimescaledWork, _
    TimescaleUnit:=TimeScale, _
    count:=1)"

    Tienes alguna idea de cómo lo pueda solucionar?

    Muchas gracias por tu colaboración.
    Esteban

    ResponderEliminar
  31. Me alegro Esteban. Respecto a ejecutarlo en otro archivo (imagino que has copiado el código de la macro a tu nuevo archivo) el error que te sale es por no haber puesto una fecha de estado al proyecto (Menú Proyecto --> Información del proyecto). Y sé que debería haber afinado el programa con mensajes advirtiendo de ello pero, como en principio era para uso personal o en sitios bajo mi tutela, no hacía falta. (Tengo una versión comercial en preparación pero que ahora la tengo parada).

    Recuerda también que los datos son en trabajo (horas) planificado, realizado y pendiente, y no costes. Etc.

    ResponderEliminar
  32. Hola Diego,

    Finalmente logré que la macro funcionara en un .mpp propio, gracias a tus indicaciones.

    Hice la prueba con un proyecto sencillo de 3 tareas con el fin de intentar interpretar los resultados. Registré el progreso de las actividades haciendo uso de la columna % trabajo completado para las 3 tareas. (No indiqué en ninguna de ellas el comienzo ni fin reales). Registré el progreso de manera que fuese evidente un retraso en el proyecto con respecto a la línea base. Sin embargo, al ejecutar la macro, ésta me entrega los siguientes resultados que no comprendo:

    - Expected Finish Date = Baseline Finish Date: Es decir, que el proyecto no se va a retrasar
    - Project Delay = 0
    - SPT (t) =-5.4

    No he logrado interpretar estos resultados. Sospecho que tenga que ver con el método de registro de progreso que utilicé.

    Muchas gracias.

    ResponderEliminar
  33. Gracias Esteban, esto se pone interesante.

    Entiendo que donde has escrito SPT(t), querías escribir SV(t). Si es así, entiendo que lo chocante es que haya desviación en programación pero no desviación en plazo. Esto es muy interesante porque aquí se ve claramente que, aunque ambas sean magnitudes temporales, tienen significados diferentes.

    La desviación en programación indica el esfuerzo necesario para recuperar (en este caso) el trabajo aún no realizado hasta la fecha, mientras que la desviación en plazo el retraso que pueda tener el proyecto según la forma en que se han programado las actividades.

    Imagina que se han producido desviaciones en actividades no críticas, aunque por debajo de sus holguras. En este caso tendríamos una desviación en programación, SV(t)<0, mientras que la desviación en plazo sería nula.

    ¿Responde esto a tu inquietud?

    ResponderEliminar
  34. Diego,

    Donde escribí SPT quise decir SPI (t).
    Entiendo la diferencia que planteas entre la desviación en programación y
    la de plazo.

    Sin embargo, estamos ante un caso especial porque el proyecto ejemplo
    es bastante simple: Consta de 3 actividades y todas hacen parte de la ruta crítica.
    Por tanto, cualquier desviación en la programación implicaría necesariamente un retraso
    en la fecha de terminación del proyecto.

    Tu sabes que para nosotros como gerentes de proyecto es fundamental poder responder
    a la pregunta: En qué fecha terminará el proyecto?

    COmo lo dices, creo que estamos ante un caso interesante. No se si podría enviarte
    de alguna manera el archivo .mpp para que verifiques el detalle de este simple proyecto, pues
    aun sigo sin saber interpretar los resultados.

    Quedo a la espera de tus valiosos comentarios.
    Saludos

    ResponderEliminar
  35. Esteban, envíamelo a la dirección de correo que aparece en Contacto en la columna de la derecha del blog.

    ResponderEliminar
  36. Estimado, eh probado su macro y me parece un gran aporte lo ha programado. Tengo 2 puntos para comentarle y ver la posibilidad si me pudiera asesor:

    1. Cómo hacer que corra tomando en cuenta la línea base 1 (versión 2010).
    2. Cómo hacer que los datos CPTP, CRTR y CPTR, sean en costo y no en trabajo.

    Gracias amigo, que este bien!!

    Ing. Juan Carlos Chávez.

    ResponderEliminar
  37. Si se tiene una Tarea 1 programada como sigue:
    Costo Mes 1 Mes 2
    Tarea 1 $100 50% 50%

    y en el mes 1 se ejecuta el 90% ¿cuál es su valor ganado en el mes 1: $50 o $90?
    De antemano gracias por su respuesta, nos aclarará mucho.

    ResponderEliminar
  38. Estimado Juan Carlos,

    Lamento la demora en la respuesta.

    Respecto a tu pregunta (1): En principio, está programado para que funcione sólo con la línea base primaria. Y (2): No se usan los CPTP, CRTR y CPTR de MSP calculadosw por MSP, sino las horas realizando el propio cálculo en la macro por razones de independencia frente a los cálculos de MSP.

    En principio, la idea de la macro era demostrativa de los conceptos fundamentales de la Programación Ganada (y también del valor ganado) y, siendo el código abierto, para que otros usuarios puedan desrrollar a partir de ahí.

    ResponderEliminar
  39. Hola Raúl, si el 90% es el verdadero avance físico del trabajo realizado, entonces el valor ganado es de $90 = 0.9 * 100.

    ResponderEliminar
  40. Hola

    ¿A que se refiere con "asignar una fecha de estado adecuada" y donde se guardan las actualizaciones que conforman el histórico?

    Gracias por responder

    ResponderEliminar
  41. Hola

    La primera parte de mi pregunta era muy sencilla; la segunda me tomó tiempo pero ya lo encontré.

    Muy bueno te felicito.



    ResponderEliminar
  42. Hola David, veo que ya lo tienes resuelto. Gracias por tu interés.

    Diego,

    ResponderEliminar
  43. Diego

    Aún no me queda claro que en que columna ingresas los datos para el cálculo de BWPS?


    Gracias.

    ResponderEliminar

Nota: solo los miembros de este blog pueden publicar comentarios.