0

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()は、すべてのコードの先頭で宣言されているだけでなく、問題ないようです。

私は何が欠けていますか?

4

1 に答える 1

0

GSergが提案したように、さらにデバッグを行いました。問題の原因はservreqでした。私はそれが実際に関数に小数を渡したことに気づいていなかったので、これを理解したとき、それを機能させるための迅速な修正でした。

正しい道に沿って私のようなニュービーを提案してくれたGS​​ergに再び感謝します。:D

于 2013-02-24T03:10:23.597 に答える