В общем проблема состоит вот в чём. У меня есть форма, на ней куча текстбоксов, кнопок и меток (но это не важно). Каждый текстбокс и кнопка имеют свои определённые имена (не дефолтные). Мне на каждую кнопку и текстбокс нужно было привязать по одному обработчику одного события. И я воспользовался вот этим прекрасным методом:
1) Добавил класс
cm_ControlsEvents, добавил ему необходимые контролы и соответствующие обработчики:
Код |
---|
Public WithEvents txbx As MSForms.TextBox
Public WithEvents btn As MSForms.CommandButton
Private Sub btn_Click()
// выполняется код
End Sub
Private Sub txbx_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
// выполняется код
End Sub |
2) Далее в ощем модуле объявил массив этих самых классов
Код |
---|
Public controlsArray() As New cm_ControlsEvents |
3) И в процессе инициализации формы я заполняю массив ссылками на соответствующие контролы:
Код |
---|
Private Sub UserForm_Initialize()
Dim item As Control, countControls As Integer
ReDim controlsArray(Me.Controls.Count)
countControls = 0
For Each item In Me.Controls
If TypeOf item Is MSForms.TextBox Then
Set controlsArray(countControls).txbx = item
item.TabStop = True
countControls = countControls + 1
ElseIf TypeOf item Is MSForms.CommandButton Then
If item.Tag = "Copy" Then
Set controlsArray(countControls).btn = item
item.TabStop = False
countControls = countControls + 1
End If
ElseIf Not TypeOf item Is MSForms.Label Then
item.TabStop = False
countControls = countControls + 1
End If
Next item
End Sub |
Тут в код можно особо не вникать, всё там нормально заполняется и работает.
И теперь по клику на любой из кнопок корректно срабатывает событие btn_Click() и, соответственно, при нажатии клавиш в текстбоксе чётко отрабатывает событие txbx_KeyPress().
В общем проблем не было до тех пор, пока мне не понадобилось использовать событие txbx_Enter(). Дело в том, что если я его добавляю в класс cm_ControlsEvents
Код |
---|
Public WithEvents txbx As MSForms.TextBox
Public WithEvents btn As MSForms.CommandButton
Private Sub btn_Click()
// выполняется код
End Sub
Private Sub txbx_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
// выполняется код
End Sub
Private Sub txbx_Enter()
// должен выполняться код
End Sub |
то оно просто-напросто не срабатывает ни под каким предлогом. Однако если же я в модуле формы просто объявлю обработчик для какого-то конкретного текстбокса, вот так:
Код |
---|
Sub txbx_GPP_2_Enter()
MsgBox "Event enter txbx!"
End Sub |
то оно прекрасно срабатывает при фокусе на этом текстбоксе. Однако мне нужно этот обработчик поцепить на все текстбоксы в форме и я не понимаю почему именно это событие не срабатывает через класс cm_ControlsEvents.
Вот суть проблемы. Прошу гуру VBA поделиться дельным советом по этому поводу. Заранее благодарен