У меня есть база данных Access 2003, которая будет динамически загружать базы данных MDB в качестве справочной библиотеки. Причиной этого является то, что эта база данных является интерфейсом меню для 60+ баз данных приложений. Вместо того, чтобы иметь дело с постоянными ссылками на все эти базы данных, интерфейс меню будет динамически ссылаться на то, что необходимо, когда пользователь делает выбор. Я работал над перемещением этой базы данных в Access 2010 и созданием пользовательской ленты. Я начал использовать технику с здесь для захвата объекта ленты в глобальную переменную при загрузке ленты. Затем я столкнулся с проблемой, при которой я мог убедиться, что код выполняется, и глобальной переменной правильно назначена ссылка на ленту, но после того, как база данных пройдет через процедуру запуска, эта глобальная переменная будет сброшена в Nothing.
Чтобы проверить, что происходит, я создал простую базу данных для тестирования. В этой базе данных у меня был модуль с глобальной переменной:
Public obj as Object
У меня тогда была такая функция:
Public Function SetObj()
Set obj = Application
Debug.Print "IsNothing=" & (obj Is Nothing)
References.AddFromFile "Test.mdb"
Debug.Print "IsNothing=" & (obj Is Nothing)
End Function
Очевидно, в моем коде "Test.mdb" относится к реальному файлу. Если я запускаю этот код, Debug.Print выдает мне «IsNothing = False» для обоих экземпляров, но после завершения функции и, если я подожду пару секунд, Debug.Print выдаст мне «IsNothing = True». Если я закомментирую References.AddFromFile, Debug.Print выдаст мне «IsNothing = False» независимо от того, как долго я буду ждать.
Для меня имеет смысл, что, так как Access должен перекомпилировать код VBA после загрузки библиотеки, все глобальные переменные сбрасываются. Я экспериментировал с перемещением глобальной переменной в класс, но так как тогда мне нужна глобальная переменная для класса, вместо этого переменная класса получает сброс. Я попытался использовать локальную переменную в функции, чтобы сохранить значение глобальной переменной, но похоже, что Access ждет пару секунд после завершения выполнения кода, чтобы выполнить повторную компиляцию, так что это тоже не работает. У кого-нибудь есть другие идеи для достижения этой цели?