
Я создал карту процесса в 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
И да, я знаю, что это не самый элегантный фрагмент кода ;)