Страницы: 1
RSS
Название формы переменной
 
Доброго всем времени суток.
Подскажите, пожалуйста, как правильно обратиться к форме через переменную, например, вызвать ее из модуля.

FrmNullBase.combobox1.listindex нужно заменить, например, на a.combobox1.listindex

Как правильно объявить a?
Иногда только промахнувшись, понимаешь как ты попал.
 
Код
set a=FrmNullBase
n=a.combobox1.listindex
 
Спасибо за помощь
Иногда только промахнувшись, понимаешь как ты попал.
 
У меня эта переменная должна быть глобальной, как ее объявить?
Public a as ...
Иногда только промахнувшись, понимаешь как ты попал.
 
Казанский, Ваш код работает только на уровне Формы, а у меня вызов происходит из модуля. Итог - отрицателен.
Иногда только промахнувшись, понимаешь как ты попал.
 
Доброе время суток
Так в модуле и нужно объявлять
Код
Public a As Object
'Или
Public a As FrmNullBase 'если это название класса формы
 
Прилагаю пример. Может так будет удобнее. У меня пока не получилось.
Иногда только промахнувшись, понимаешь как ты попал.
 
А где set a=UserForm1 перед использованием переменной?
Или ещё проще передавать как параметр метода FilControls

Код
'В модуле
Public FillControls(ByVal a As UserForm1)
    '...
    a.Combox.List = Dict.Keys
End Sub
'В коде формы вызываем
FillControls Me
Изменено: Андрей VG - 18.04.2015 11:07:30
 
У меня set a=UserForm1 в модуле формы при ее инициализации - это не правильно?
Иногда только промахнувшись, понимаешь как ты попал.
 
и еще один вопрос - a - объявляю как object?
Иногда только промахнувшись, понимаешь как ты попал.
 
Забыл сказать, что у меня много разных форм будут обращаться к FillControls, поэтому приявязать к UserForm1 не могу, как у вас PublicFillControls(ByVal a AsUserForm1), видимо если я объявлю а как object, то можно писать PublicFillControls(ByVala AsUserForm) или нет???
Иногда только промахнувшись, понимаешь как ты попал.
 
Цитата
Эмир написал: У меня set a=UserForm1 в модуле формы при ее инициализации
Да, согласен, то только после вызова FillControls.
Если для множества форм, тогда действительно лучше ByVal a As Object, хотя и ByVal a As UserForm сработало. Только у всех этих форм есть Combobox1, Combobox2 и именно в том требуемом смысле их наполнения и управления?
Изменено: Андрей VG - 18.04.2015 11:43:54
 
Андрей, не могу пока ничего сделать, сразу не сказал, что форм будет несколько, которые будут обращаться к FillControls, и нужно каждую из этих форм вызывать через переменную.
Никогда не делал этого, возможно это не сложно, но потерял уже 2 часа без результата. Может вы можете помочь с этой проблемой?
Иногда только промахнувшись, понимаешь как ты попал.
 
Да комбобоксы будут наполнять этими же данными на разных формах и нумероваться так же, только названия форм меняется.
Иногда только промахнувшись, понимаешь как ты попал.
 
Для примера. По запускайте UserForm1, UserForm2.
С учётом того что на обоих одинаковые элементы управления с одинаковыми названиями и смысл наполнения один и тот же - это работает. Если у вас аналогично, то и расширенный ваш вариант будет работать
 
Я решил проблему, с вашей помощью. Спасибо Андрей.
В модуле я а объявил как object
В коде формы перед вызовом FillControls прописал Set a = UserForm1
В модуле -
Оставил Sub FillControlls() c пустыми параметрами. Работает.

Вы согласитесь или могут быть подводные камни?
Иногда только промахнувшись, понимаешь как ты попал.
 
Спасибо за пример.
Сейчас буду адаптировать к себе.
Иногда только промахнувшись, понимаешь как ты попал.
 
Кстати, вариант, который описал я, тоже работает на всех формах, только ваш короче.
Иногда только промахнувшись, понимаешь как ты попал.
 
Можно и так. Просто гуру программирования рекомендуют по реже использовать глобальные переменные.
В данном случае, это лишняя строчка в коде каждой форме Set a = Me (лучше так.Me ссылка на объект класса формы), которую надо не забывать прописать в каждой форме.
Причём ошибка будет возникать в методе FillControls, если глобальная переменная а не инициализирована (по умолчанию Nothing). Но опять же не по тому месту, где логически есть ошибка.
А если вы её инициализировали её в коде одной формы, а в другой забыли написать Set a = Me, то изменения будет проведены над элементами управления предыдущей формы. Хотя ошибки, с точки зрения VBA не будет. Лишнее время при отладке - почему ведёт себя не так как хочется?
Если же передача объекта идёт через параметр метода, то даже если вы забыли написать при вызове метода, то VBA выдаст вам сообщение об ошибке об отсутствующем параметре.
Так что вам выбирать, что для вас удобнее.
Успехов.
Изменено: Андрей VG - 18.04.2015 11:59:19
 
Спасибо вам большое, Андрей, за пояснения. Я все переписал без глобальных переменных по вашему совету. Полностью согласен - и код меньше и ошибок не будет.
Иногда только промахнувшись, понимаешь как ты попал.
 
И сам файл..
Иногда только промахнувшись, понимаешь как ты попал.
Страницы: 1
Наверх