Vba ошибка out of stack space

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim b As Integer
    b = 0

    Dim cell As Range
    Dim rgn As Range

    Set rgn = Range("f2:f200")

    For Each cell In rgn
        If IsEmpty(cell) = False Then
            b = b + 1
        End If
    Next

    Range("d2").Value = b
End Sub

Hi, I met a problem when trying to run the following piece of Excel VBA code. A message box will pop out and say there is a

«out of stack space»

problem to line Set rgn = range("f2:f200"), then another message box will pop out and say

«method ‘value’ of object ‘range’ failed»

I don’t know what is wrong… Thank you very much for helping.

Community's user avatar

asked Jun 13, 2017 at 7:36

Jiaming Yang's user avatar

The problem is that you are changing cells in a Change event, which will trigger the event again, and again, and again…

You need to disable events temporarily:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim b As Integer
    b = 0

    Dim cell As Range
    Dim rgn As Range

    Set rgn = Range("f2:f200")

    For Each cell In rgn
        If IsEmpty(cell) = False Then
            b = b + 1
        End If
    Next
    Application.Enableevents = False
    Range("d2").Value = b
    Application.Enableevents = True
End Sub

answered Jun 13, 2017 at 7:42

Rory's user avatar

RoryRory

32.8k5 gold badges32 silver badges35 bronze badges

2

Search code, repositories, users, issues, pull requests…

Provide feedback

Saved searches

Use saved searches to filter your results more quickly

Sign up

I have a very simple macro in an Excel sheet, to allows users to recalculate.

I have no other macros/code in the workbook, and only this work book open

Sub Calculate()
    Calculate
End Sub

This is activated by a button.

However, when pressed I get two error boxes, see image.

What does Out of stack space mean ?
And how do I resolve this issue ?
enter image description here

I have looked on this website:

https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/out-of-stack-space-error-28

It says I may have too many funtions ??
This macro used to work fine, and it is hardly doing a lot so cannot understand the issue.

I am able to calculate the sheet using the option under the formulas tab.

 

denis76

Пользователь

Сообщений: 22
Регистрация: 19.02.2013

#1

31.05.2016 15:23:02

Добрый день!

Столкнулся неожиданно с такой ситуацией: при вызове вложенной процедуры в VBA появляется указанное сообщение об ошибке:

Код
... out of stack space...

Собственно говоря, процедура довольно громоздкая, обрабатывает и пересчитывает массивы данных размером примерно 10000*200 ячеек… хотя работала до сего времени вполне нормально…

Собственно говоря, в чем здесь может быть причина появления такого сообщения:
— много переменных?
— большой размер переменных (массивов)?
— большое кол-во вызовов функций?
— вызов функций с аргументами в виде больших массивов (используется несколько раз такое)?

Какие тут способы решения имеются — может, надо как-то уничтожать переменные после использования, очищать стек — как это сделать?… Может, какие-то параметры в реестре надо подправить или еще где?.. Что известно по данному вопросу уважаемым специалистам?..

Спасибо заранее…

 

Sanja

Пользователь

Сообщений: 15282
Регистрация: 10.01.2013

Собственно говоря почему-бы не в

ПОИСК

?

Согласие есть продукт при полном непротивлении сторон.

 

denis76

Пользователь

Сообщений: 22
Регистрация: 19.02.2013

#3

31.05.2016 15:46:06

Хорошо…

Вот, смотрю, там 5 случаев указано, к моему может, видимо, это относиться:

Цитата
…Your local variables require more local variable space than is available.Try declaring some variables at the module level instead. You can also declare all variables in the procedure static by preceding the Property,Sub, or Function keyword with Static. Or you can use the Static statement to declare individual Static variables within procedures…

Все равно странно, больше всего ведь места массивы занимают, но не на них ошибка вылезает…
И как, получается, каждую что ли переменную надо в начале модуля объявлять заранее? А потом что, уничтожать надо или как?

Еще вот, смотрю в редакторе VBA — там такая закладка Call stack — почему-то в ней список в 50 с лишним процедур, когда у меня столько их одновременно не вызывается… и некоторые повторяются почему-то…
И вообще, как-то размер и заполненность этого стека можно ли узнать и регулировать?..

 

Нет файла — нет идей, что тут не понятно.

 

Игорь

Пользователь

Сообщений: 3671
Регистрация: 23.12.2012

Причина — большой размер массивов
10,000*200 = 2 млн ячеек — таких массивов много в памяти Excel не удержит

Как вариант еще одной причины, — вызов функций с аргументами в виде больших массивов
Массивы такие надо передавать как byRef в другие функции
(ну и вообще сделать в коде так, чтобы не создавались лишние копии такого большого массива, — а то памяти не хватит)

 

denis76

Пользователь

Сообщений: 22
Регистрация: 19.02.2013

#6

31.05.2016 16:12:19

Цитата
kalbasiatka написал: Нет файла — нет идей, что тут не понятно.

Глубоко сомневаюсь, что данный файл кому-то разбирать охота будет… но думаю, что основные варианты можно предположить и без его досконального исследования…

 

denis76

Пользователь

Сообщений: 22
Регистрация: 19.02.2013

#7

31.05.2016 16:14:51

Цитата
Игорь написал: Причина — большой размер массивов

Про массивы — да, все так, но ведь он не выдает Out of memory (это прошло с установкой 64-битной версии), а вот на стек именно ругается-то… А каков этот стек и его допустимый размер — мне пока неведомо…

 

denis76

Пользователь

Сообщений: 22
Регистрация: 19.02.2013

#8

31.05.2016 16:17:04

Цитата
Игорь написал: Массивы такие надо передавать как byRef в другие функции

Так вроде бы по умолчанию они так и передаются, нет разве?.. И вроде как лишних копий не делается…

Изменено: denis7601.06.2016 22:06:07

 

Hugo

Пользователь

Сообщений: 23706
Регистрация: 22.12.2012

Мне стека не хватало пару раз из-за рекурсии.

 

denis76

Пользователь

Сообщений: 22
Регистрация: 19.02.2013

Разобрался, в чем дело… когда начал код улучшать, нашел место, где процедуры вызывают одна другую поочередно…

 

Hugo

Пользователь

Сообщений: 23706
Регистрация: 22.12.2012

#11

01.06.2016 12:07:48

Т.е. тоже виновата рекурсия?

I am almost done this snippet of code, which should allow me to calculate the number of tuesdays, thursdays, saturdays and sundays in 2 date ranges. The line «skips = ModWeekdays(NotificationDate, OrderDate, PlacementDate, ReleaseDate)» is highlighted and the error box says error ’28’, out of stack space. Can someone help me out here?

'//////This is for Valley Estimate of Demurrage Days/////////////
Public Function ModWeekdays(ByRef NotificationDate As Date, ByRef OrderDate As Date, ByRef PlacementDate As Date, ByRef ReleaseDate As Date) As Integer
Dim skips As Integer
Dim WeekendDays As Integer
Dim WeekendDays2 As Integer
'skips = 0
WeekendDays = 0
WeekendDays2 = 0


   Do While NotificationDate <= OrderDate
   If DatePart("w", NotificationDate) = 0 Then
   WeekendDays = WeekendDays + 1
   ElseIf DatePart("w", NotificationDate) = 2 Then
   WeekendDays = WeekendDays + 1
   ElseIf DatePart("w", NotificationDate) = 4 Then
   WeekendDays = WeekendDays + 1
   ElseIf DatePart("w", NotificationDate) = 6 Then
   WeekendDays = WeekendDays + 1
   End If
   NotificationDate = DateAdd("d", 1, NotificationDate)
   Loop

   Do While PlacementDate <= ReleaseDate
   If DatePart("w", PlacementDate) = 0 Then
   WeekendDays2 = WeekendDays2 + 1
   ElseIf DatePart("w", PlacementDate) = 2 Then
   WeekendDays2 = WeekendDays2 + 1
   ElseIf DatePart("w", PlacementDate) = 4 Then
   WeekendDays2 = WeekendDays2 + 1
   ElseIf DatePart("w", PlacementDate) = 6 Then
   WeekendDays2 = WeekendDays2 + 1
   End If
   PlacementDate = PlacementDate + 1
   Loop

   skips = WeekendDays + WeekendDays2
   skips = ModWeekdays(NotificationDate, OrderDate, PlacementDate, ReleaseDate)


End Function

Понравилась статья? Поделить с друзьями:
  • Vba ошибка 462
  • Vba обработка ошибок on error
  • Vcurentime140 dll ошибка
  • Vba ошибка 459
  • Vba код ошибки 400