См. этот ответ , почему вы не можете просто подписать процедуры обработчика событий типа волей-неволей в соответствии с вашими потребностями.
Каждая процедура определяет область действия .Локальные переменные (объявленные с помощью Dim
, ... или не объявленные вообще) находятся внутри этой области процедуры и не имеют выхода.
Следующий более высокий уровень области действия - область действия модуля..Переменные, объявленные в этой области, доступны для всех процедур в модуле.Используйте ключевое слово Private
, чтобы объявить их (Dim
также допустимо, но я предпочитаю резервировать его для местных жителей, поскольку Private
недопустимо на уровне процедуры) - рассмотрите возможность использования значимого идентификатора name, тоже ... "coll" мало что говорит о для чего это :
Option Explicit
Private RowNumbers As Object
И затем вы можете инициализировать его в обработчике Initialize
:
Private Sub UserForm_Initialize()
Set RowNumbers = CreateObject("System.Collections.ArrayList")
End Sub
Возможно, также неплохо было бы явно стереть его в обработчике Terminate
, поскольку это объект .NET (FWIW, это вообще не массив VBA и не имеет ничего общего с массивами):
Private Sub UserForm_Terminate()
Set RowNumbers = Nothing
End Sub
Следующий более высокий уровень области действия - глобальная область действия , но как только вы поймете, как передавать параметры между процедурами и когда использовать переменные области действия модуля, вам почти никогда не понадобитсялюбые глобалы.Для полноты картины глобальная переменная будет объявлена в стандартном модуле с использованием ключевого слова Public
(тоже работает Global
, но это сбивает с толку, поскольку то, что мы называем "глобальным", действительно просто "project-scope ", и, кроме того, Public
гораздо более явно противодействует Private
, так что это хорошо для согласованности).
Если вы добавите Option Explicit
в начало ваших модулей, VBA будетОтказаться от компиляции кода, который использует необъявленные переменные и который выделил бы coll
и, вероятно, NumberIndex
.
Посмотрите, помечают ли проверки Rubberduck другие проблемы (отказ от ответственности: Iуправлять этим проектом с открытым исходным кодом).