У вас уже есть два правильных ответа; вы не можете буквально иметь конструктор с параметрами в VBA.
Обходной путь Oorang в основном правильный - есть отдельный метод "init". Когда я использую объектно-ориентированный подход к чему-либо в Excel / VBA, я предпочитаю скрывать создание объектов и инициализацию в обычной функции. Так что я бы взял mkFoo (parm) и вызвал бы его, чтобы получить экземпляр Foo. mkFoo () создаст экземпляр New Foo и вызовет Foo.init (). Если вы только когда-либо создавали экземпляры таким образом, вам не нужно проверять, был ли ваш экземпляр инициализирован снова и снова.
Если вы действительно пытаетесь быть корректным и не предоставляете объекту, возможно, теперь опасный метод init (), вы можете использовать интерфейс IFoo (без метода init), который реализуется Foo. Затем mkFoo () возвращает IFoo, и любые пользователи фактического Foo вообще никогда не видят метод init ().
Конечно, теперь у вас есть куча модулей только для Foo - по одному для IFoo, по одному для каждого фактического класса Foo и по одному для вашей функции "Foo factory" ... таким образом, мой комментарий, что это одна из многих причин почему ООП в VBA - это PITA, даже если иногда это полезно.
РЕДАКТИРОВАТЬ: Это было редактирование onedaywhen вскоре после первоначального ответа, но я вытащил его отдельно только сейчас, поскольку это действительно отдельная мысль:
Говоря об Excel, вы можете переместить класс Foo в надстройку .xla и сделать класс PublicNotCreateable. Открытая функция mkFoo (parm) может находиться в стандартном модуле .bas в надстройке и поэтому вызывается как статический класс в C #. Это заставляет код клиента использовать mkFoo как единственный способ создания экземпляра Foo. Без сомнения, существует аналог MS Access для надстроек Excel .xla.