호출 스택 수준 제한이 있나요?
문제
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로 떨어졌습니다. 나는 또한 옵션을 명시 적으로 추가했습니다.
스택 메모리 소비.
프로 시저에 매개 변수를 저장하는 데 사용되는 경우 스택을 이해하고 절차의 로컬 변수에 사용됩니다.
따라서 스택 공간의 소비는 재귀 통화 수에 비례합니다.
따라서 스택의 필요한 크기는 다음과 같습니다. 재귀 호출 수 * (호출 매개 변수의 크기+ 로컬 변수의 공간)