Я не могу воспроизвести проблему и не знаю, что такое SolidWorks, так что это может быть как-то связано с этим. Возможно, вы можете опубликовать вымышленный пример, который показывает, что Initialize вызывается дважды.
Я предполагаю, что это связано с автоматическим созданием экземпляров переменных. Когда вы используете UserForm1, вы создаете объектную переменную с именем UserForm1, которая указывает на объект, также называемый UserForm1. Это похоже на использование ключевого слова New в операторе Dim. Вы никогда не определяли UserForm1 (переменную), но это сделал VBA, и при первом использовании он создается автоматически.
Вы должны попытаться использовать ключевое слово Me при работе внутри модуля класса пользовательских форм (пользовательские формы — это классы, такие же, как и другие объекты, за исключением того, что они имеют элемент пользовательского интерфейса). В событии Initialize скажите
Me.Caption = "blah"
вместо
UserForm1.Caption = "blah"
Может быть (просто теория, которую я не смог доказать), что флаг, который устанавливается, чтобы сказать «Я указываю на реальный экземпляр», не установлен к тому времени, когда вы изменяете свойство Caption, и что используя переменную автоматического создания экземпляра UserForm1, вы принудительно создаете другой экземпляр.
Еще лучше, не используйте переменные с автоматическим созданием экземпляров, хотя они и удобны (и не используйте ключевое слово New в операторе Dim). Вы можете контролировать, когда ваши переменные создаются и уничтожаются, и это лучшая практика. Что-то подобное в стандартном модуле
Sub uftst()
Dim uf As UserForm1
Set uf = New UserForm1 'you control instantiation here
'Now you can change properties before you show it
uf.Caption = "blech"
uf.Show
Set uf = Nothing 'overkill, but you control destruction here
End Sub
Обратите внимание: если для свойства ShowModal установлено значение False, код будет продолжать выполняться, поэтому не уничтожайте переменную, если она выполняется без режима.
person
Dick Kusleika
schedule
25.07.2012