vbaコードでErlang計算機を使用しようとしている状況があります。以前にErlangコードを単独で使用したことがあるので、Erlangコードが機能することはわかっていますが、erlangコードをコピーして別のモジュールに貼り付けると、コードの先頭で、必要な関数を呼び出せないようです。私がそれを呼ぶと、Excelは応答しなくなり、多くのメモリを消費します。これはおそらくどこかに無限ループがあることを意味していることは知っていますが、それがどこにあるのか、またはこれが実際に私が気付いていない別の問題であるのかどうかはわかりません。
アーラン計算機は無料のプログラムであり、この巧妙な計算に感謝します。
私が呼び出している関数:agentno()
'Version 1.0 Joanne Sparkes, Expedio Virtual Assistance Ltd for Call Centre Helper
'18th November 2008
'---------------------------------------------------------------------------------
Public Function utilisation(intensity As Double, agents As Long) As Double
'Copyright Expedio Virtual Assistance Ltd 2008
'calculates utilisation or agent occupancy
On Error GoTo utilisationerror
utilisation = intensity / agents
utilisationexit:
If utilisation < 0 Then utilisation = 0
If utilisation > 1 Then utilisation = 1
Exit Function
utilisationerror:
utilisation = 0
Resume utilisationexit
End Function
Public Function top(intensity As Double, agents As Long) As Double
'Copyright Expedio Virtual Assistance Ltd 2008
'top row of Erlang-C Formula
top = (intensity ^ agents) / Application.WorksheetFunction.Fact(agents)
End Function
Public Function erlangBR(intensity As Double, agents As Long) As Double
'Copyright Expedio Virtual Assistance Ltd 2008
'calculates summed factorial element of Erlang-C formula
Dim k As Long, max As Long, answer As Double
k = 0
max = agents - 1
answer = 0
For k = 0 To max
answer = answer + ((intensity ^ k) / Application.WorksheetFunction.Fact(k))
Next k
erlangBR = answer
End Function
Public Function ErlangC(intensity As Double, agents As Long) As Double
'Copyright Expedio Virtual Assistance Ltd 2008
'Brings together elements of Erlang C formula Top, Utilisation and ErlangBR
On Error GoTo ErlangCError
ErlangC = (top(intensity, agents)) / ((top(intensity, agents)) + ((1 -utilisation (intensity, agents)) * erlangBR(intensity, agents)))
ErlangCExit:
If ErlangC < 0 Then ErlangC = 0
If ErlangC > 1 Then ErlangC = 1
Exit Function
ErlangCError:
Resume ErlangCExit
End Function
Public Function Servicelevel(intensity As Double, agents As Long, target As Double, duration As Double) As Double
'Copyright Expedio Virtual Assistance Ltd 2008
'calculation of service level
On Error GoTo servicelevelerror
Servicelevel = 1 - (ErlangC(intensity, agents) * Exp(-(agents - intensity) * target / duration))
Servicelevelexit:
If Servicelevel > 1 Then Servicelevel = 1
If Servicelevel < 0 Then Servicelevel = 0
Exit Function
servicelevelerror:
Servicelevel = 0
Resume Servicelevelexit
End Function
Public Function agentno(intensity As Double, target As Double, duration As Double, servreq As Double) As Long
'Copyright Expedio Virtual Assistance Ltd 2008
'calculates minimum agent numbers for required service level
Dim agents As Long, minagents As Long
minagents = Int(intensity)
agents = minagents
While Servicelevel(intensity, agents, target, duration) < servreq
agents = agents + 1
Wend
agentno = agents
End Function
長いコードについては申し訳ありませんが、実際に何が起こっているのかを理解するには、それが必要だと感じました。
とにかく、私はagentno()関数を呼び出そうとします(必要なものを渡します)、そしてそれを動作させることができません。
これが私がそれを使おうとしているところです:
For icount = 1 To 22
For jcount = 1 To 6
intensity = ((CallsForecasted(icount, jcount) / 1800) * duration) 'Calculates the intensity at each interval.
AgentsNeeded(icount, jcount) = agentno(intensity, target, duration, servreq) ' <--- <--- <--- <---THIS IS THE ONE GIVING ME TROUBLE!!!!!!!!!!!!!!!!!!!!!!!!
Next jcount
Next icount
debug.printテストを実行したところ、強度が正しく計算されていることがわかりました(ここに投稿するために削除しました)。そのため、その時点まですべてが機能していることがわかりますが、agentno()が呼び出されるとすぐにExcelが停止します。上記のように応答し、大量のメモリを消費します。配列AgentsNeeded()は、すべてのコードの先頭で宣言されているだけでなく、問題ないようです。
私は何が欠けていますか?