Добрый день!
Я передал несколько переменных из Worksheet_Change Листа:
Код |
---|
Private Sub Worksheet_Change(ByVal zChange as Range)
...
Dim zRng As Range
Dim zRngCount As Integer
Dim zArr(1 to zRngCount - предположим, что она здесь уже определена как конкретное число)
Call zCall(zArr, zRng, zRngCount)
...
((после выполнения zCall - продолжается выполнение Worksheet_Change))
End Sub |
в Sub отдельного модуля:
Код |
---|
Sub zCall(zArr, zRng As Range, zRngCount As Integer)
For i = 1 to zRngCount
zArr(i) = ((присваиваю некое значение из области zRng))
Next i
End Sub |
В действительности, каждой из представленных переменных несколько десятков,
и для каждой производится не одна, а множество процедур в Sub'e (в частности - не один "For", а десятки).
Проблема в том, что выполнение zCall (вызванного из Worksheet_Change) непостижимым образом прерывается, прямо посреди одного из ничем не примечательных циклов. Даже сам цикл не завершается! Выполнение Worksheet_Change продолжается, но результаты "передачи" переменных получаются неверными.
Факты могу привести следующие:
- без переноса, код работает идеально (перенос потребовался из-за возникшей на днях "Procedure too large");
- прерывание происходит тем позже, чем меньше длина массива zRng (зависит от порядкового номера строки, изменение ячейки\ячеек которой инициировало Worksheet_Change); но если редактировать одну и ту же ячейку (при прочих равных условиях), прерывание происходит в одном и том же месте;
- часть кода, которую Sub "успевает" отработать полностью (до прерывания) - даёт верный результат;
- в режиме дебаггера видно, что на некоторых "не отработанных" массивах (при наведении курсором, уже после возвращения в Worksheet_Change) висит статус "Subscript out of range";
- прерывание (в Sub'e) происходит примерно на 240-280 строке кода;
- Sub после вызова из Worksheet_Change выполняется беспрерывно, не считая причины публикации вопроса: никаких других процедур не предусмотрено, никаких условий выхода \ вызова других процедур, ничего такого;
- Excel 2013, 32 bit, сборка стандартная: плагинов \ расширений нет;
- ни на одном этапе, никаких ошибок Excel при этом не выдаёт.
Может я не верно произвожу процедуру передачи? Но об этом можно судить из оформления метода Call.
Может у Sub'ов какое-то ограничение (ну там, не знаю, по количеству итераций)? Хотя я пробовал прогнать переданную таким же образом переменную через 30000 итераций в одном-единственном цикле: всё прошло успешно.
Странно то, что прерывание может произойти ПРЯМО посреди цикла! For i, Next i, Next, Next...
А потом - БАЦ! И не дойдя до следующего "Next" (не говоря про остальные строки кода), его выкинет обратно в Worksheet_Change. И так каждый раз, и зависит - такое впечатление - только от длины zRng (т.е., в разных случаях обрываются разные циклы; хотя все они идентичны: лишь порядковые номера у заполняемых массивов разные).
К сожалению, не могу привести код целиком.
2018.05.03Товарищи, прошу простить грешного: ошибка оказалась моя личная.Длина одного из массивов, используемых внутри цикла, была на 1цу меньше по сравнению с длиной цикла (это правильно, не вдаваясь в подробности, с точки зрения внутренней логики).Уж не знаю, почему, но при передаче в модуль - это вызывало крах процедуры.До передачи же (когда ещё не было ошибки "too large") - он, судя по всему, просто дальше продолжал.
Всем большое спасибо за участие! Ваши советы и опыт всегда мне очень помогали!
2018.05.24
А ещё это говно лечится простой резолюцией где-нибудь в начале процедуры
(или перед проблемным местом):- ибо действует только в пределах процедуры, в отличие от Application.EnableEvents
(что логично, конечно, но всё равно вымораживает), и при разделении одной процедуры на несколько - соответственно, теряется; потому он, собственно, и "продолжал" до разделения.