
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
그리고 그렇습니다. 저는 이것이 가장 우아한 코드가 아니라는 것을 알고 있습니다. ;)