Agregue números ponderados a lo largo de un flujo de mapa de procesos en Excel

Agregue números ponderados a lo largo de un flujo de mapa de procesos en Excel

He creado un mapa de procesos en excel que visualizo con visio. Tengo procesos y decisiones. Los procesos toman tiempo y el resultado de la decisión se pondera con una probabilidad. Suponiendo que mis números sean correctos (que probablemente no lo sean;)), esto debería permitirme calcular el tiempo promedio de ejecución de todo el proceso.

Ahora, para obtener el tiempo de ejecución promedio, necesito resumir las rutas, teniendo en cuenta los pesos. Esto en sí no es una tarea difícil, sin embargo, preferiría un foro que no sea específico del estado actual del mapa, pero que pueda actualizarse si agrego más procesos y decisiones. En principio, esto debería ser posible con algún tipo de función recursiva, porque las rutas están definidas en la hoja de Excel. Sin embargo, estoy un poco perdido en cuanto a cómo implementaría una función recursiva en Excel, si eso fuera posible.

¿Alguien ha hecho esto alguna vez? ¿O tiene alguna pista sobre cómo podría funcionar esto? ¿O necesito recurrir a herramientas externas?

EDITAR: Aquí hay un ejemplo para mi Excel: ingrese la descripción de la imagen aquí

Entonces, "Paso del proceso" y "ID del siguiente paso" juntos definen múltiples rutas desde el "Inicio" hasta el "Fin". Las decisiones tienen resultados con cierto peso (expresado en porcentaje), que es la probabilidad de que se tome el primero de los dos "ID del siguiente paso".

Entonces, en este caso, comenzaría algo como esto: 1 + 0.4*(2...) + 0.6*(2...)... como puedes ver, incluso si nunca modificara Excel, es bastante difícil. para hacerlo bien, hágalo manualmente. Ahora imagina que agrego algunos pasos...

Espero que esto aclare la tarea. Estoy intentando resolver esto con VBA ahora... pero nunca he usado VBA, así que aún agradecería cualquier sugerencia.

Respuesta1

Ok, finalmente resolví esto yo mismo con una función recursiva de VBA:

Function ProcessTime(row, time) As Double
    Application.Volatile
    ' Define Columns
    ProcessStepCol = 2
    NextStepIDCol = 4
    ShapeTypeCol = 6
    TimeCol = 7
    PyesCol = 8
    ' Do actual calculation
    ShapeType = Worksheets("Process").Cells(row, ShapeTypeCol).Value
    
    ' Exit at the End
    If ShapeType = "End" Then
        ProcessTime = time
        Exit Function
    End If
    
    ' Simply add current time if we have a Process
    If ShapeType = "Process" Then
        NextStepRow = GetNextStepRows(row, 0)
        TimeOfThisRow = Worksheets("Process").Cells(row, TimeCol).Value
        ProcessTime = time + ProcessTime(NextStepRow, TimeOfThisRow)
        Exit Function
    End If
    
    ' Add wheights to branches if we have a Decision
    If ShapeType = "Decision" Then
        NextStepRowYes = GetNextStepRows(row, 0)
        NextStepRowNo = GetNextStepRows(row, 1)
        P_yes = Worksheets("AlertProcess").Cells(row, PyesCol).Value / 100
        P_no = 1 - P_yes
        ProcessTime = time + (P_yes * ProcessTime(NextStepRowYes, 0)) + (P_no * ProcessTime(NextStepRowNo, 0))
        Exit Function
    End If
End Function


' Find the row of the next step
Function GetNextStepRows(row, stepNo) As Long
    Application.Volatile
    ' Define Columns
    ProcessStepCol = 2
    NextStepIDCol = 4
    ' Do actual calculation
    NextStepIDs = Worksheets("AlertProcess").Cells(row, NextStepIDCol).Value
    NextStepIDsSplit = Split(NextStepIDs, ",")
    NextStepID = NextStepIDsSplit(stepNo)
    GetNextStepRows = Worksheets("AlertProcess").Range("B:B").Find(What:=NextStepID).row
End Function

Y sí, soy consciente de que este no es el código más elegante;)

información relacionada