
Ich habe eine Prozesskarte in Excel erstellt, die ich mit Visio visualisiere. Ich habe Prozesse und Entscheidungen. Prozesse brauchen Zeit und das Entscheidungsergebnis wird mit einer Wahrscheinlichkeit gewichtet. Vorausgesetzt, meine Zahlen sind korrekt (was sie wahrscheinlich nicht sind ;)), sollte mir dies ermöglichen, die durchschnittliche Ausführungszeit des gesamten Prozesses zu berechnen.
Um nun die durchschnittliche Ausführungszeit zu erhalten, muss ich die Pfade unter Berücksichtigung der Gewichte zusammenfassen. Das ist an sich keine schwierige Aufgabe, ich würde jedoch ein Forum bevorzugen, das nicht spezifisch auf den aktuellen Zustand der Karte zugeschnitten ist, sondern sich selbst aktualisieren kann, wenn ich weitere Prozesse und Entscheidungen hinzufüge. Im Prinzip sollte dies mit einer Art rekursiver Funktion möglich sein, da die Pfade in der Excel-Tabelle definiert sind. Ich bin jedoch etwas ratlos, wie ich eine rekursive Funktion in Excel implementieren würde, falls das überhaupt möglich ist.
Hat das schon mal jemand gemacht? Oder hat einen Tipp, wie das funktionieren könnte? Oder muss ich auf externe Tools zurückgreifen?
EDIT: Hier ist ein Beispiel für mein Excel:
Somit definieren „Prozessschritt“ und „Nächster Schritt-ID“ zusammen mehrere Pfade von „Start“ bis „Ende“. Entscheidungen haben Ergebnisse mit einer bestimmten Gewichtung (ausgedrückt in Prozent), die die Wahrscheinlichkeit darstellt, dass die erste der beiden „Nächster Schritt-IDs“ gewählt wird.
In diesem Fall würde es also ungefähr so beginnen: 1 + 0,4*(2 ...) + 0,6*(2 ...) ... wie Sie sehen, ist es ziemlich schwierig, es manuell richtig hinzubekommen, selbst wenn ich Excel nie ändern würde. Stellen Sie sich nun vor, ich füge ein paar Schritte hinzu ...
Ich hoffe, das klärt die Aufgabe. Ich versuche das jetzt mit VBA zu lösen … aber ich habe noch nie VBA verwendet, also wäre ich trotzdem für alle Hinweise dankbar.
Antwort1
Ok, ich habe das also schließlich selbst mit einer rekursiven VBA-Funktion gelöst:
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
Und ja, ich bin mir bewusst, dass dies nicht der eleganteste Code ist ;)