Привязка события к программно созданному элементу управления формы в VBA Excel на примере привязки события SpinButton_Change к счетчику и события CommandButton_Click к кнопке.
Привязка события к элементу управления
Динамически созданные элементы управления пользовательской формы никак не реагируют на свойственные им события. Чтобы это изменить, необходимо объявить переменные, предназначенные для создания этих элементов управления,
- с типом, описывающим создаваемый элемент управления;
- с ключевым словом WithEvents, которое указывает, что создаваемый объект должен быть связан со всеми присущими ему событиями.
Процедуры событий для программно созданных элементов управления должны быть заранее приготовлены в модуле пользовательской формы.
Синтаксис процедур событий для динамически создаваемых элементов управления:
1 |
Sub ИмяПеременной_Событие() |
Пример привязки событий к объектам
Пример привязки события SpinButton_Change к программно созданному счетчику (SpinButton) и привязки события CommandButton_Click к динамически созданной кнопке (CommandButton):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
Option Explicit Dim myTxt As Control Private WithEvents mySpinB As SpinButton Private WithEvents myBtn As CommandButton Private Sub UserForm_Initialize() With Me Set mySpinB = .Controls.Add("Forms.SpinButton.1") Set myTxt = .Controls.Add("Forms.TextBox.1") Set myBtn = .Controls.Add("Forms.CommandButton.1") End With With myTxt .Left = 30 .Top = 10 .Text = "0" End With With mySpinB .Left = 10 .Top = 10 End With With myBtn .Left = 30 .Top = 40 .Caption = "Обнулить" End With End Sub Sub mySpinB_Change() myTxt.Text = mySpinB.Value End Sub Sub myBtn_Click() myTxt.Text = "0" mySpinB.Value = 0 End Sub |
Внешний вид пользовательской формы с динамически созданными элементами управления (SpinButton, TextBox и CommandButton) с размерами по умолчанию в VBA Excel 2016:
Значение счетчика автоматически копируется в текстовое поле, а кнопка «Обнулить» обнуляет и счетчик, и значение в текстовом поле.
Как же долго я разбирался почему у меня ваш код работает, а мой нет. Хотя уже все 10 раз перепроверил (вроде бы). Я уже 100500 способов перепробовал, перелопатил весь код, «оптимизировал» и изменял все подряд. Дошел до того, что начал построчно копировать и сверять и понял, что я невнимательный балбес которому надо еще много читать и изучать.
Спасибо за ваш труд. Очень помогло.
Добрый день.
А для массива контролов как будет выглядеть этот пример? В Интернете предлагается через классы. Есть вариант проще?
Спасибо
Поддерживаю вопрос! Тоже столкнулся с нуждой добавить кучу кнопок. Как событийно к ним обращаться? По имени, как у стандартных контролов увы, не получается.(
Добрый день,Евгений!
Как собрать данные по имеющимся файлам в папке Проба, дата и время изменения с отображением на активном Листе1 файла Первый.xlsm в ячейке (обновлено, дата, время, или просто заливается цветом).
В папке Проба имеется 10 файлов (ПР1.xlsm, ПР2.xlsm,…ПР10.xlsm) с постоянными именами. Обновляются файлы не открывая их, при помощи Вставить с заменой.
Далее в файле Первый.xlsm (обновлено, дата, время, или просто заливается цветом) по каждому файлу для дальнейшего открытия их, чтобы все данные в файлах по ссылкам заняли свои места.
Может что-то есть у Вас подобное?
Обсуждение закрыто.