Модификация переменной, ссылающейся на экземпляр класса, с помощью ключевого слова WithEvents, чтобы она могла вызывать события в VBA Excel.
WithEvents — модификатор переменной
Используется WithEvents для модификации объектных переменных, которым, в дальнейшем, будут присвоены ссылки на объекты, вызывающие события.
Чаще всего переменную с ключевым словом WithEvents объявляют на уровне модуля:
1 |
Private WithEvents Btn As MSForms.CommandButton |
Реже такие переменные объявляют с ключевым словом Public или Dim, но это тоже допустимо.
Особенности применения WithEvents
Правила и ограничения модификации переменных с помощью ключевого слова WithEvents:
- WithEvents можно использовать только на уровне класса или модуля.
- Нельзя использовать WithEvents для элемента структуры. Можно объявить только отдельные переменные, а не массивы WithEvents.
- Переменная с WithEvents должна быть объявлена как объектная, но конкретного класса, который может вызывать события:
As MSForms.ComboBox
,As MSForms.CommandButton
и т.д. То есть, объявлениеAs Object
не подходит.
Пример с использованием WithEvents
Создание с помощью кода VBA Excel интерфейса для отображения расстояний от Солнца до планет Солнечной системы:
1. Создайте пользовательскую форму.
2. Разместите в модуле формы следующий код:
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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
Option Explicit 'Объявляем переменные для создания меток Dim lb1, lb2 'Объявляем переменную для поля со списком, 'которая будет обрабатывать события 'благодаря ключевому слову WithEvents Private WithEvents cb1 As MSForms.ComboBox Private Sub UserForm_Initialize() With Me .Height = 170 .Width = 305 .Caption = "Расстояние от Солнца до планет Солнечной системы" 'Программно создаем элементы управления Set lb1 = .Controls.Add("Forms.Label.1") Set lb2 = .Controls.Add("Forms.Label.1") Set cb1 = .Controls.Add("Forms.ComboBox.1") End With With lb1 .Height = 22 .Width = 290 .Top = 60 .Left = 18 .Font.Size = 12 .Caption = "Расстояние от Солнца до выбранной планеты" End With With lb2 .Caption = "" .Height = 22 .Width = 290 .Top = 90 .Left = 18 .Font.Size = 14 End With With cb1 .Height = 22 .Width = 150 .Top = 20 .Left = 18 .Font.Size = 12 .List = Array("Меркурий", "Венера", "Земля", _ "Марс", "Юпитер", "Сатурн", "Уран", "Нептун") .Value = "Выберите планету" End With End Sub Private Sub cb1_Change() Dim pl(), km() pl = Array("Меркурия", "Венеры", "Земли", _ "Марса", "Юпитера", "Сатурна", "Урана", "Нептуна") km = Array("57,91 млн км (0,387 а. е.)", "108 млн км (0,723 а. е.)", _ "149,6 млн км (1 а. е.)", "228 млн км (1,52 а. е.)", _ "778,57 млн км (5,2 а. е.)", "1,43 млрд км (9,58 а. е.)", _ "2,87 млрд км (19,1914 а. е.)", "4,55 млрд км (30,1 а. е.)") If cb1.ListIndex > -1 Then lb1.Caption = "Расстояние от Солнца до " & pl(cb1.ListIndex) & ":" lb2.Caption = km(cb1.ListIndex) End If End Sub |
В данном примере динамически созданный элемент управления ComboBox реагирует на событие ComboBox_Change().
Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи.