2009-02-12 4 views
0

Я действительно что-то борюсь с чем-то здесь. У меня есть модуль класса, назовем его FormMan, у которого есть куча методов, связанных с большим количеством пользовательских форм, которые у меня есть в моем проекте. Один конкретный метод следует вызывать из множества разных мест и довольно прост - он просто добавляет определенное количество элементов управления в форму и расширяет высоту форм для размещения этих новых элементов управления.VBA UserForm Object

Пользователь передает количество элементов управления и пользовательскую форму.

oF.AddControlsToForm iNumberOfControls,frmTest 

В модуле FormMan класса:

Public Sub Addcontrols(iNum as integer, oForm as userform) 

//stuff happens here, oForm is used extensively 

oForm.Height = i //object does not support this property or method 
frmTest.Height = i //works 

oForm.Show //object does not... 
frmTest.show //works 

end sub 

В окне Locals, oForm не имеют свойство высоты, так что вполне справедливо. Но oForm был определен как frmTest. Могу сказать oForm.BackColor = vbred, и я могу установить ctl = oform.TextBox1, например

Это должна быть общая процедура, которая может добавить кучу элементов управления в любую форму. Я попробовал загрузку и показ формы, прежде чем назначать ее для oForm.

Почему высота и показать свойства и методы пользовательских форм, но не объектов, объявленных как пользовательские формы? Что я делаю не так?

Действительно оцените любую помощь.

ответ

4

Проблема заключается в том, что объекты UserForm и frmTest не одного типа. Фактически, frmTest является подтипом UserForm, который расширяет его, добавляя свойство Height, среди других членов.

Вам, вероятно, придется прибегнуть к объявлению вашего параметра функции как объекта.

Public Sub Addcontrols(iNum as integer, oForm as Object) 

Это должно работать так, как вам хочется, хотя, к сожалению, вы будете жертвовать безопасностью типа. Большинство концепций OO, как правило, разваливаются в контексте VBA.

1

Главное, чтобы помнить о VBA, это то, что он квази-OO, а не полный OO. Я столкнулся с множеством суетливых проблем вокруг этой проблемы, и поэтому теперь я стараюсь не полагаться полностью на согласованность VBA.

Это, как говорится, попробуйте это:

Dim fname = oForm.Name (or whatever the property is for this subobject) 
With VBA.UserForms.Add(fname) 
    .Height = x 
    .Show 
End With 

Разве это не так приятно странно?!?! У меня нет примера кода, готового и ожидающего, поэтому я не могу гарантировать успех, но это похоже на правильный подход.

+0

Я был настроен до того, как начал этот проект. Спасибо за вашу помощь. – user51498

+0

Нет проблем! Я научился любить VBA со временем, если только b/c Excel является очень надежным фоном для приложений. – notnot