我在 excel 中创建了一个流程图,并用 visio 将其可视化。我有流程和决策。流程需要时间,决策结果用概率加权。假设我的数字是正确的(可能不正确 ;)),这应该可以让我计算出整个流程的平均执行时间。
现在,为了获得平均执行时间,我需要沿路径进行总结,同时考虑权重。这本身并不是一项艰巨的任务,但是我更喜欢一个不特定于地图当前状态的论坛,但如果我添加更多流程和决策,论坛将能够自我更新。原则上,这应该可以通过某种递归函数来实现,因为路径是在 excel 表中定义的。但是,我有点不知道如何在 excel 中实现递归函数,如果这是可能的。
有人这样做过吗?或者有人能提示一下如何操作吗?还是我需要借助外部工具?
因此,“流程步骤”和“下一步 ID”共同定义了从“开始”到“结束”的多条路径。决策的结果具有一定的权重(以百分比表示),即采用两个“下一步 ID”中的第一个的概率。
因此,在这种情况下,它会以这样的方式开始:1 + 0.4*(2 ...) + 0.6*(2 ...) ... 如您所见,即使我永远不会修改 excel,手动操作也很难做到正确。现在想象一下我添加几个步骤...
我希望这能澄清任务。我现在正尝试使用 VBA 解决这个问题...但我从未使用过 VBA,因此我仍然很感激任何提示。
答案1
好的,所以我最终用递归 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
是的,我知道这不是最优雅的代码;)