VBA разрешает ссылки на идентификаторы в следующем порядке:
- Локальные объявления (включая параметры)
- Объявления модулей
- Объявления в рамках проекта ("глобальные")
- Глобальные объявления из библиотек, на которые имеются ссылки (в порядке приоритета)
Таким образом, внутри области действия Getone
идентификатор lsatest
ссылается на локальную переменную, объявленную здесь:
Dim lsatest()
То, что здесь происходит, называется затенение идентификатора : локальный lsatest
это скрытие / затенение идентификатор области действия модуля lsatest
в следующем, более высоком scope.
Если вы хотите, чтобы Getone
использовал lsatest
, определенный в области видимости модуля, то у вас не может быть локального lsatest
идентификатора.
Rubberduck может предупредить об этом - и многое другое:
"переменная" ... спасибо, французский Windows. Это должно означать "Переменная" VBAProject.Module1.Getone.lsatest 'скрывает переменную' VBAProject.Module1.lsatest '. "
При этом я не вижу никаких причин для любого модуля или глобальных переменных здесь.
Функции должны быть автономными и надежными: тот факт, что вы вызываете одну и ту же функцию два раза подряд и получаете разные результаты, является симптомом c побочного эффекта функция - избегайте смешивания глобального состояния и функций. Значение arrind
больше не 0
после первого запуска. Если вы хотите идентичные результаты, вам нужно идентичное начальное состояние.