
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:
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;)