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.
asked Jun 13, 2017 at 7:36
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
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 ?
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 |
#1 31.05.2016 15:23:02 Добрый день! Столкнулся неожиданно с такой ситуацией: при вызове вложенной процедуры в VBA появляется указанное сообщение об ошибке:
Собственно говоря, процедура довольно громоздкая, обрабатывает и пересчитывает массивы данных размером примерно 10000*200 ячеек… хотя работала до сего времени вполне нормально… Собственно говоря, в чем здесь может быть причина появления такого сообщения: Какие тут способы решения имеются — может, надо как-то уничтожать переменные после использования, очищать стек — как это сделать?… Может, какие-то параметры в реестре надо подправить или еще где?.. Что известно по данному вопросу уважаемым специалистам?.. Спасибо заранее… |
||
Sanja Пользователь Сообщений: 15282 |
Собственно говоря почему-бы не в ПОИСК ? Согласие есть продукт при полном непротивлении сторон. |
denis76 Пользователь Сообщений: 22 |
#3 31.05.2016 15:46:06 Хорошо… Вот, смотрю, там 5 случаев указано, к моему может, видимо, это относиться:
Все равно странно, больше всего ведь места массивы занимают, но не на них ошибка вылезает… Еще вот, смотрю в редакторе VBA — там такая закладка Call stack — почему-то в ней список в 50 с лишним процедур, когда у меня столько их одновременно не вызывается… и некоторые повторяются почему-то… |
||
Нет файла — нет идей, что тут не понятно. |
|
Игорь Пользователь Сообщений: 3671 |
Причина — большой размер массивов Как вариант еще одной причины, — вызов функций с аргументами в виде больших массивов |
denis76 Пользователь Сообщений: 22 |
#6 31.05.2016 16:12:19
Глубоко сомневаюсь, что данный файл кому-то разбирать охота будет… но думаю, что основные варианты можно предположить и без его досконального исследования… |
||
denis76 Пользователь Сообщений: 22 |
#7 31.05.2016 16:14:51
Про массивы — да, все так, но ведь он не выдает Out of memory (это прошло с установкой 64-битной версии), а вот на стек именно ругается-то… А каков этот стек и его допустимый размер — мне пока неведомо… |
||
denis76 Пользователь Сообщений: 22 |
#8 31.05.2016 16:17:04
Так вроде бы по умолчанию они так и передаются, нет разве?.. И вроде как лишних копий не делается… Изменено: denis76 — 01.06.2016 22:06:07 |
||
Hugo Пользователь Сообщений: 23706 |
Мне стека не хватало пару раз из-за рекурсии. |
denis76 Пользователь Сообщений: 22 |
Разобрался, в чем дело… когда начал код улучшать, нашел место, где процедуры вызывают одна другую поочередно… |
Hugo Пользователь Сообщений: 23706 |
#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