Это стоит вам указатель объекта, это все.Я бы не назвал это пространством имен .
Каждый отдельный модуль UserForm
, с которым вы когда-либо работали, имеет атрибут VB_PredeclaredId
, установленный на True
.Этот экземпляр автоматически создается, как вы заметили, и, хотя вы можете явно уничтожить его, в следующий раз, когда на него будут ссылаться, он будет автоматически (без вывода сообщений) заново создан ... с любым исходным состоянием / было ... довольноочень похоже на объект с автоматическим созданием, то есть объявление As New
.
Так что то, что у вас есть, больше похоже на иерархию объектов, чем на структуру пространства имен - очень, очень похоже на то, как вы можете развернуть объект Excelмодель, начинающаяся с Application
, и перейдите к следующему:
Set someCell = Excel.Application.Workbooks(1).Worksheets(1).Range("A1")
Здесь «пространство имен» - это библиотека Excel
, Application
- корневой объект, а остальная часть этого выражения - членaccess - свойства get, названные в честь классов.
Но классы не находятся в "пространствах имен" ... Worksheets
collection type (class) существует сам по себе, подБиблиотека Excel
: свойство Worksheets
класса Application
никоим образом не формирует и не защищает класс от "конфликта имен": если ваш пользовательский код имеет имя модуля классаd Worksheets
(и это вполне возможно), а затем в соответствии с тем, как VBA разрешает ссылки на идентификаторы, Dim foo As Worksheet
будет экземпляром этого пользовательского класса: единственным допустимым квалификатором является имя библиотеки (Excel
, или MyVBAProject
).
Итак, у вас есть разумный подход для построения относительно сложной структуры объектной модели - но он не будет (не может) заменять или имитировать пространство имен,Если вы обнаружите, что создаете «пустые» классы, пересмотрите свой дизайн.
Что касается последнего вопроса, я не вижу, как наличие 100 предварительно объявленных пользовательских объектов может отличаться от проекта с 100 пользовательскими формами: в обоихя хотел бы знать, есть ли способ обрезать это и обобщать / повторно использовать компоненты, будь то формы или классы.
То, чего вы хотите избежать, - это предварительно объявленный объект, который содержит состояние - потому чтотеперь это состояние действительно глобально, и вы не можете контролировать, что может изменить это состояние, где и когда: Application.Calculation
является ярким примером этого.