VBA: Как отредактировать код, чтобы устранить ошибку нехватки места в стеке? - PullRequest
0 голосов
/ 27 января 2019

Этот код раньше работал, но недавно я получаю сообщение об ошибке (недостаточно места в стеке).

Я думаю, что код не работает, потому что я вызываю функцию слишком много раз без выхода / завершения.

Если это так, сколько раз вы можете вызывать функцию и могу ли я что-то сделать, чтобы это исправить?

Я не являюсь первоначальным автором этого кода.

Я включил саб, где происходит ошибка.

    Sub CalculatePct(e As Variant)
        Dim G As Integer
        Dim pct As Double
        Dim Owned100Pct As Boolean
        If entities(e) < 0 Then

            pct = 0
            Owned100Pct = True  ' Keeps track if the entity exists in the table other than as a parent

            For G = 1 To UBound(MainArray, 1)
                If MainArray(G, colEntity) = e Then

                    Owned100Pct = False

                    If entities(MainArray(G, colParent)) = -1 Then
                        'If we don't know the parent's ownership percentage, go and calculate it
                        CalculatePct MainArray(G, colParent)    
                    End If

                    pct = pct + CDbl(MainArray(G, colPct)) / 100 * entities(MainArray(G, colParent))

                End If
            Next

            If Owned100Pct Then
                'Assume 100% owned if we don't know the parentage
                '("Outside" entities won't go through here as they are already set to 0%)
                entities(e) = 1
            Else
                'Store the entity's percentage
                entities(e) = pct
            End If
        End If

    End Sub

Ответы [ 2 ]

0 голосов
/ 27 января 2019

@TimWilliams отмечено в комментариях - у вас бесконечный цикл рекурсии.

Выделение проблемной области:

Sub CalculatePct(e As Variant)
[...]
                If entities(MainArray(G, colParent)) = -1 Then
                    CalculatePct MainArray(G, colParent)    
                End If
[...]
End Sub

e - это параметр, а entities(e) - этопроверено.В коде вместо e используется MainParent(G, colParent), поэтому следующий вызов подпрограммы дает e = MainParent(G, colParent).

До точки в коде вы не меняетезначение G, colParent.entities или MainArray.Поэтому, если entities(MainArray(G, colParent)) = -1 он будет называть себя вечно.

Не зная ничего о коде (включая необходимость рекурсии), я не могу предложить каких-либо окончательных решений.Однако необходимо учитывать следующее:

  • Переписывание в цикл вместо рекурсивного вызова
  • Выполнение рекурсивного вызова для подмножества MainArray
  • Выполнениелюбые изменения в G или colParent до рекурсивного вызова
0 голосов
/ 27 января 2019

Вы не указали ни на какой строке возникает ошибка, ни на том, что представляет MainArray, но я предполагаю, что MainArray вырос до размера, большего, чем тот, к которому можно получить доступ с коротким целым числом со знаком.

Измените объявление вашей итерационной переменной на Длинное целое со знаком.Это увеличивает функциональный предел переменной с 32 767 итераций до 2 147 483 647.

Dim G As Long
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...