Проблема в том, что код, отвечающий за отображение формы, не должен заботиться о каких-либо элементах управления в любой форме.
Возникает ошибка 438, поскольку класс UserForm
не имеет CancelButton
, ProceedButton
, ExitButton
или labmsg
членов.
Решение состоит в том, чтобы либо потерять раннее связывание и позднее связывание этих вызовов участников, сделав их всех go против Object
(или Variant
, но Object
здесь более уместно), ... или переоценка того, кто за что отвечает.
Похоже, вы делаете что-то вроде индикатор прогресса ; когда вы начинаете нуждаться в заменяемых объектных компонентах и поддерживать раннее связывание - это необходимость , правильный инструмент для этого - полиморфизм , то есть интерфейсы.
Связанная статья описывает, как сделать многоразовый индикатор прогресса, рабочий код которого полностью отделен от формы индикатора. Вам нужно что-то вроде этого, за исключением упомянутого в конце статьи, вы хотите, чтобы ProgressIndicatorForm
и LlamaIndicatorForm
реализовали некоторый интерфейс IProgressView
, и имели бы этот IProgressView
воспринимается как зависимость от класса ProgressIndicator
, а не встроена в код инициализации.
Сложной частью будет управление выставлением событий индикатора прогресса на интерфейсе - для этого потребуется формальный класс ProgressIndicatorEvents
для пересылки событий Activated
и Cancelled
в класс ProgressIndicator
, аналогично тому, как этот класс перенаправляет события из абстрактного представления в другой компонент.
Сделано правильно, в результате вы получите код вызова, который выглядит следующим образом:
Dim progressForm As IProgressView
If Environ$("username") = "redacted" Then
Set progressForm = New LlamaProgressForm
Else
Set progressForm = New StandardProgressForm
End If
With ProgressIndicator.Create("DoWork", Form:=progressForm)
.Execute
End With
Где DoWork
- ваш «рабочий код» - может быть любой Sub
процедурой, которая принимает параметр ProgressIndicator
.
Очевидно, что это намного больше, чем просто кодирование против Object
, и я бы не стал винить вас за то, что вы пошли по простому маршруту. Но действующие здесь принципы заслуживают изучения, если изучение новых концепций программирования важнее, чем просто заставить его работать.