在 Excel 中沿流程图流程添加加权数字

在 Excel 中沿流程图流程添加加权数字

我在 excel 中创建了一个流程图,并用 visio 将其可视化。我有流程和决策。流程需要时间,决策结果用概率加权。假设我的数字是正确的(可能不正确 ;)),这应该可以让我计算出整个流程的平均执行时间。

现在,为了获得平均执行时间,我需要沿路径进行总结,同时考虑权重。这本身并不是一项艰巨的任务,但是我更喜欢一个不特定于地图当前状态的论坛,但如果我添加更多流程和决策,论坛将能够自我更新。原则上,这应该可以通过某种递归函数来实现,因为路径是在 excel 表中定义的。但是,我有点不知道如何在 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

是的,我知道这不是最优雅的代码;)

相关内容