문제

Excel VBA에서 일부 잘못된 코드를 보고 있는 두 명의 동료가 있는데 호출 스택의 수준 수에 제한이 있는지 궁금합니다.

도움이 되었습니까?

해결책

함수가 꼬리 재귀이고 VBA가 이를 처리할 수 없으면(처리할 수 없음) 스택 오버플로가 발생합니다.

간단한 테스트로 다음 스니펫을 함께 해킹했습니다.

Dim count As Integer

Sub Rec()
    count = count + 1
    Cells(1, 1) = count
    Call Rec
End Sub

이는 적어도 여기 내 Excel 2007 버전에서는 이에 대한 제한이 4007회 반복임을 알려줍니다.

다른 팁

짧은 대답은 예입니다. 결국 스택 오버플로 예외를 얻을 수 있습니다.

그래도 한도가 무엇인지 확실하지 않습니다.

방금이 매크로를 Excel 2003에서 실행했으며 "스택 공간에서"오류 28을 얻기 전에 4775 통화를 깊이 얻었습니다.

Sub Macro1()
    recurse (0)
End Sub

Sub recurse(level As Long)
   ActiveCell.FormulaR1C1 = Str$(level)
   Call recurse(level + 1)
End Sub

내가 아는 오래된 질문이지만, 오늘 내가보고있는이 질문에 대한 최신 정보를 갖는 것이 유용 할 것이라고 생각했습니다.

HARD 한계는 Excel 2016에서 매개 변수없는 절차를 위해 6801 호출으로 호출되는 것 같습니다. VBA_INterested가 말했듯 이이 숫자는 재귀 절차에 대한 매개 변수 수에 따라 줄어 듭니다.

Excel 2016에서 다음 테스트를 실행했습니다.

6801 재귀 후 하위 재귀 (매개 변수가없는)가 오버플로 퍼졌습니다.
6442 번 재귀 후 하위 recurse1 (1 파라미터 포함)이 오버플로 퍼졌습니다.
Sub Recurse2 (2 개의 매개 변수 포함)는 6120 이후에 오버플로 퍼졌습니다.

Option Explicit

Sub RecurseStatic()
    Static i As Long
    Debug.Print i
    i = i + 1
    RecurseStatic
End Sub

Sub RunRecurse1()
    Recurse1 0
End Sub

Sub Recurse1(i As Long)
    Debug.Print i
    Recurse1 i + 1
End Sub

Sub RunRecurse2()
    Recurse2 0, 0
End Sub

Sub Recurse2(i As Long, j As Long)
    Debug.Print i, j
    Recurse2 i + 1, j + 1
End Sub

Excel 2013에서 Anders의 코드를 실행했으며 결과는 1180에 불과했습니다. 최신 버전의 Excel에서 재귀 제한을 줄 였는지 또는 문제가 기계 의존적이거나 무엇인지 확실하지 않습니다.

편집 : 변경 : ActiveEcell.formular1c1 = str $ (레벨) to Range ( "A1"). Formular1c1 = str $ (레벨)

그리고 전화의 #은 807로 떨어졌습니다. 나는 또한 옵션을 명시 적으로 추가했습니다.

스택 메모리 소비.

프로 시저에 매개 변수를 저장하는 데 사용되는 경우 스택을 이해하고 절차의 로컬 변수에 사용됩니다.

따라서 스택 공간의 소비는 재귀 통화 수에 비례합니다.

따라서 스택의 필요한 크기는 다음과 같습니다. 재귀 호출 수 * (호출 매개 변수의 크기+ 로컬 변수의 공간)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top