Страницы: 1
RSS
Обработчики собственных событий пользовательской формы Excel
 
Добрый день!
Вопрос от новичка в vba. Не могу разобраться куда писать обработчики пользовательских событий от форм пользователей.
Создаю форму UserForm1. В код формы пишу событие Public Event event1(). Здесь же создаю обработчик стандартного события Click и в него вписываю RaiseEvent event1.
UserForm1(Code):
Код
Public Event Event1()

Private Sub UserForm_Click()
    RaiseEvent Event1
    Debug.Print "Click"
End Sub
Код обработчика события Event1 планирую простейший:
Код
Debug.Print "Event1" 
Если запустить форму, без использования обработчика события Event1, все работает. Форма появляется, нажимаешь по ней мышкой, в окне Immediate пишется "Click". Работает как положено. Запускаю форму с того же Immediate командой UserForm1.Show
И вот тут начинается вся сложность у меня... Куда написать обработчик события Event1?
Писал обработчик сюда же в код формы (UserForm1(Code)):
и вариант с именем как в событии Click
Код
Private Sub UserForm_Event1()
      Debug.Print "Event1"
End Sub
и вариант c оригинальным именем формы UserForm1
Код
Private Sub UserForm1_Event1()
          Debug.Print "Event1"
End Sub
Не работает.
Пытался запустить форму через переменную. В модуле нельзя создавать переменные с WithEvents, говорить используй только в модулях классов.
Создал класс Class1. В его коде создал переменную. Там же появилось в выпадающем списке событие формы, на которую ссылается переменная. Выбрал. Автоматически создался обработчик события Event1. Добавил в него Debug.Print "Event1"
Код
Public WithEvents f As UserForm1

Private Sub f_Event1()
    Debug.Print "event1"
End Sub
Что делать дальше, что бы заработал обработчик? Не могу понять... Суть простая - запускаешь, допустим, через Immediate UserForm1.Show форму и работают оба события - сначала стандартное Click, затем пользовательское Event1. Что с шаблоном класса Class1 делать дальше, что бы при запуске UserForm1 работало и Event1?
Интересует в общем - как обрабатывать ПОЛЬЗОВАТЕЛЬСКИЕ события форм и классов. Где допускается создавать обработчики пользовательских событий?
Стандартные обработчики, как я понял, создаются непосредственно в объекте формы. Можно ли создать свое событие (не стандартное), что бы оно так же было в выпадающем списке событий формы (Click, DblClick,Activate,Deactivae,MyEvent1,  и так далее) Можно ли обработчики стандартных событий (Click, DblClick) помещать не в с самой форме?
Может посоветуете литературу или ресурс, где можно данные вопросы выяснить? Сколько перечитал информации, везде только пишут о том, как создавать обработчики стандартных событий. Может в формах нельзя создавать собственные события? Но допускается же надпись Public Event Event1(), причем только Public. Тогда зачем?...
 
Добрый день!
1) Один вопрос - одна тема. (п. 2.6 Правил форума)
2) Какую конкретно задачу нужно решить? Возможно не туда копаете.
3) Где файл пример?  
 
Цитата
Интересует в общем - как обрабатывать ПОЛЬЗОВАТЕЛЬСКИЕ события форм и классов. Где допускается создавать обработчики пользовательских событий?
 
Денис Родстванепомнящий, классный пример) я бы рекомендовал вам сделать норм пример, где вы покажете вот есть то-то, когда я делаю так-то, хочу что бы получилось вот так вот...
Не бойтесь совершенства. Вам его не достичь.
 
Пользовательское событие? Т.е. заставить форму как-то отреагировать на событие, которого нет в списке событий формы - это непонятно...
Например, у формы есть события типа Click и DblClick, но нет SheetBeforeRightClick, как у листа. Т.е. надо придумать метод, чтоб запускался макрос при нажатии, например, правой клавиши мыши на форме?

Если использовать уже имеющееся Click, то туда и можно запихать нужный код.
Хотя возможно, имеется ввиду ситуация, когда нужно отследить событие Click при нажатии на любой форме, внутри которой явно не указана обработка сего события.
 
Доброе время суток
Цитата
Денис Родстванепомнящий написал:
Создал класс Class1. В его коде создал переменную. Там же появилось в выпадающем списке событие формы, на которую ссылается переменная. Выбрал. Автоматически создался обработчик события Event1. Добавил в него Debug.Print "Event1"
Осталось выполнить инициализацию f :)
 
Андрей VG, спасибо за ответ.
Получается что обработчик пользовательского события формы находится в объекте другого класса. Одного не могу понять - зачем так заставляют делать программистов? Есть какое-то "успокаивающее" объяснение?:) По сути это касаемо не только форм, но и любых классов. Хочешь обрабатывать собственные события классов - делай это в других объектах других классов?
Это единственная схема решения данного вопроса? Или есть другие -нормальные?
Вот это я пытаюсь понять...
Вот задача, допустим, подобная:
Создать свойство у формы, при присвоении значения которому, формой генерируется событие для внешнего(по отношению к форме) коду.
Что бы в модуле с этим работать, получается нужно использовать промежуточный объект промежуточного класса?
Зачем это все?:)
Тоже самое, кстати, и в vb6. Я думал это только в excel, а оно от туда оказывается тянется...
 
Андрей VG, может литературу какую-нибудь посоветуете?
А то везде только пишут про обработку стандартных событий формы - кликов, дубылькликов, активаторов-деактиваторов.
Это и без книжки можно догадаться...
Еще вопрос - а можно ли как-то обработчик своего события вставить в код формы, так же как это происходит с обработчиками стандартных событий?
Это все для общего понимания... практических целей пока не ставлю...  
Изменено: Денис Родстванепомнящий - 06.09.2021 17:05:50
 
Цитата
Денис Родстванепомнящий написал:
Или есть другие -нормальные?
Ну что вы хотите от  пережитков прошлого века?
 
Цитата
RAN написал:
от  пережитков прошлого века?
Ну, да. Событийная модель появилась в Visual Basic 5, в офисе 1997.
Цитата
Денис Родстванепомнящий написал:
а можно ли как-то обработчик своего события вставить в код формы
А зачем? Не проще ли вызвать метод в форме по необходимости? Если уж очень хочется, то переходите на .Net.
Цитата
Денис Родстванепомнящий написал:
может литературу какую-нибудь посоветуете?
Учитывая древность языка - разве что стандартное Джон Уокенбах, Профессиональное программирование на VBA в Excel. По идее, должно быть нечто подобное. Не читал, не скажу.
Страницы: 1
Наверх