Добавьте взвешенные числа вдоль потока карты процесса в Excel

Добавьте взвешенные числа вдоль потока карты процесса в Excel

Я создал карту процесса в Excel, которую визуализирую с помощью Visio. У меня есть процессы и решения. Процессы требуют времени, а результат решения взвешивается с вероятностью. Если предположить, что мои цифры верны (что, вероятно, не так ;)), это должно позволить мне рассчитать среднее время выполнения всего процесса.

Теперь, чтобы получить среднее время выполнения, мне нужно суммировать по путям, принимая во внимание веса. Это само по себе несложная задача, однако я бы предпочел форум, который не будет специфичен для текущего состояния карты, но сможет обновляться, если я добавлю больше процессов и решений. В принципе, это должно быть возможно с помощью какой-то рекурсивной функции, поскольку пути определены в таблице Excel. Однако я немного запутался в том, как я буду реализовывать рекурсивную функцию в Excel, если это вообще возможно.

Кто-нибудь когда-нибудь делал это? Или есть подсказка, как это может работать? Или мне нужно прибегнуть к внешним инструментам?

EDIT: Вот пример для моего 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

И да, я знаю, что это не самый элегантный фрагмент кода ;)

Связанный контент