Первым шагом является создание функции (одна функция, а не две) для покрытия повторения.
Private Sub ChangeMenuColour(Menu as ControlMenu, GotFocus as Boolean)
If GotFocus then
ControlMenu.BackColor = RGB(92, 131, 180)
ControlMenu.ForeColor = RGB(92, 131, 180)
Else
ControlMenu.BackColor = RGB(255, 255, 255)
ControlMenu.ForeColor = RGB(0, 0, 0)
End If
End Sub
Примечание: объявите Menu
как правильный тип управления (тип безопасности), я просто использовал ControlMenu
, так как не знаю, какой тип управления вы используете.
Теперь для каждого элемента управления вам нужно только вызвать функцию. Например:
Private Sub cmdMenu1_LostFocus()
ChangeMenuColour Me.cmdMenu1, False
End Sub
Преимущество этого первого шага состоит в том, что если вы когда-нибудь решите изменить свою цветовую схему, вам нужно всего лишь отредактировать одну процедуру вместо десятков.
Для вашего следующего шага вы можете создать собственный класс, включающий член WithEvents
, который также обрабатывает соответствующее событие. См. Excel VBA добавить обработчик для каждого флажка в форме для этого примера. Однако работа по достижению этого может быть больше, чем простое повторение, которое у вас есть выше.
Используя код по ссылке, приведенной выше, с учетом вашего примера:
'This is in a class module called MenuHandler
Private WithEvents menu As MSForms.ControlMenu ' substitute with your specific control
Property Set TargetMenu(targetobject as ControlMenu)
set menu = targetobject
End Property
Private Sub menu_GotFocus()
ChangeMenuColour True
end sub
Private Sub menu_LosttFocus()
ChangeMenuColour False
end sub
Private Sub ChangeMenuColour(GotFocus as Boolean) ' Note change in signature, change in context on how this is used
If GotFocus then
menu.BackColor = RGB(92, 131, 180)
menu.ForeColor = RGB(92, 131, 180)
Else
menu.BackColor = RGB(255, 255, 255)
menu.ForeColor = RGB(0, 0, 0)
End If
End Sub
Теперь в вашей основной форме вам нужно только связать ваши меню с этим обработчиком. Вы можете сделать это через коллекцию по ссылке выше или (если у вас ограниченное, конечное и статическое количество меню) просто иметь отдельные объекты (пример ниже). Вы выбираете, какой из них наиболее эффективен и проще в вашем контексте.
' This is in the user form
' Declare the handler links as module-level, not within any sub or event handler
Private menuHandler1 as new MenuHandler
Private menuHandler2 as new MenuHandler
Private menuHandler3 as new MenuHandler
' The following code would go in the initialise/load event handler
Set menuHandler1.TargetMenu = cmdMenu1 ' now you don't have to add any other focus handlers for this menu - but you can anyway
Set menuHandler2.TargetMenu = cmdMenu2
Set menuHandler3.TargetMenu = cmdMenu3
С другой стороны
' This is in the user form
' Declare the handler links as module-level, not within any sub or event handler
Private menuHandlerCollection as new Collection ' will store the MenuHandlers
' The following code would go in the initialise/load event handler or where you create your menus
Dim menuHandlerInstance as MenuHandler
' Usually some other code here
' the following may be in a loop, or you might just have a list of items to add
' only a single instance included here as an example
Set menuHandlerInstance = new MenuHandler
Set menuHandlerInstance .TargetMenu = cmdMenuX ' now you don't have to add any other focus handlers for this menu
menuHandlerCollection.Add menuHandlerInstance