Элементы управления ActiveX всегда регистрируют свои обработчики событий следующим образом:
Private Sub NameOfTheControl_NameOfTheEvent({args})
Если вы переименуете обработчик, элемент управления перестанет работать - потому что name обработчика must должно быть сформировано, как указано выше, с подчеркиванием, разделяющим имя элемента управления и имя обработанного события.
Так что, если ваши элементы управления должны существовать во время компиляции, нет никакого способа обойти это: для 33 элементов управлениявам нужно 33 обработчика.
Это не значит, что вам нужно, чтобы эта огромная процедура повторялась 33 раза!
Извлеките процедуру.Выделите все тело этого обработчика, обрежьте его.
Теперь создайте новый прототип процедуры:
Private Sub HandleCheckBoxClick(ByVal controlName As String)
End Sub
и вставьте туда тело.Затем замените все места, в которых у вас есть жестко запрограммированный "agi1"
, ссылкой на этот параметр controlName
:
Dim rngFormat As Range
Set rngFormat = ActiveDocument.Range( _
Start:=ActiveDocument.Bookmarks(controlName).Range.Start, _
End:=ActiveDocument.Bookmarks(controlName).Range.End)
With rngFormat
.Font.Size = 8
End With
'...
Местами, в которых вы ссылаетесь на элемент управления с использованием его программного имени, будетнемного сложнее:
v = ThisDocument.agi1.Value
Вы можете получить элемент управления MSForms.CheckBox
через коллекцию ThisDocument.InlineShapes
, но , который не позволит вам найти флажок по его имени , поэтому вам нужнофункция, которая может сделать это за вас:
Private Function FindCheckBoxByName(ByVal controlName As String) As MSForms.CheckBox
Dim sh As InlineShape
For Each sh In ThisDocument.InlineShapes
If TypeOf sh.OLEFormat.Object Is MSForms.CheckBox Then
If sh.OLEFormat.Object.Name = controlName Then
'return the MSForms control:
Set FindControlByName = sh.OLEFormat.Object
End If
End If
Next
И теперь вы можете сделать это:
Dim cb As MSForms.ChecBox
Set cb = FindCheckBoxByName(controlName)
If cb Is Nothing Then
MsgBox "No ActiveX CheckBox control named '" & controlName & "' was found in ThisDocument."
Exit Sub
End If
v = cb.Value
После того, как все ссылки на элемент управления ActiveX параметризованы, ваши 33 обработчики теперь могут выглядетькак это:
Private Sub agi1_Click()
HandleCheckBoxClick "agi1"
End Sub
Private Sub agi2_Click()
HandleCheckBoxClick "agi2"
End Sub
'...
Private Sub agi33_Click()
HandleCheckBoxClick "agi33"
End Sub
В качестве альтернативы, вы можете создать флажки во время выполнения, а затем обработать их событие Click
в специальном модуле класса, но это немного сложнее ;-)