По крайней мере, насколько мне известно, ответ - это невозможно, но ..
1.Вещи, которые нам нужно знать
Давайте разберемся в фактах, прежде чем приступить к кодированию:
- Приложение excel не сможет выполнить какой-либо код, пока
Window
объект находится в xlMinimzed
состоянии - Таким образом, в основном, как только пользователь закроет, свернет или даже выкинет Приложения, мы больше не сможемобнаруживать любые
OnKey
(или любые другие) события, поскольку текущее активное приложение (т.е. браузер) имеет приоритет над excel приложением - следовательно CTRL + 0 теперь будет уменьшать масштаб страницы, так как это поведение браузера по умолчанию.
- С учетом сказанного мы можем сделатьпо крайней мере, некоторые вещи, чтобы приблизиться, по крайней мере, к некоторой форме полезности из этого.
2.Макет приложения
Поскольку вы не предоставили конкретные сведения о приложении, я создал этот макет:
![enter image description here](https://i.stack.imgur.com/C2g5M.png)
Worksheet
, состоящий из одного CommandButton
, который запускает UserForm1
![enter image description here](https://i.stack.imgur.com/GMic0.png)
Private Sub CommandButton1_Click()
UserForm1.Show
End Sub
Модуль с именем Module1
, который содержитпростое привет-мировое сообщение (для события OnKey
)
Public Sub hello()
MsgBox "Hello world!"
End Sub
И UserForm1
, который содержит код для нашей OnKey
обработки
Private Sub UserForm_Activate()
With ActiveWindow
.WindowState = xlNormal
' we need to change window state to xlNormal
' xlMaximized would result in width/height property changing error
' and with xlMinimized our Onkey would not work
.Width = 0
.Height = 0
End With
Range("A1").Select
' we need a range selected, otherwise Application OnKey will not fire
Application.OnKey "^0", "Module1.hello" ' launches hello world procedure
Me.Hide
End Sub
Теперь этого достаточно, чтобы свернуть (почти) окно и ответить на нажатие
![enter image description here](https://i.stack.imgur.com/u8w5S.png)
3.Если мы хотим показать UserForm
при сохранении функциональности
Теперь давайте предположим, что мы хотим UserForm
при скрытии остальных excel приложений в фоновом режиме.
Для этого нам необходимо:
Изменить UserForm
на vbModeless
. Для этого выберите объект UserForm
и покажитесвойства ( F4 ) ![enter image description here](https://i.stack.imgur.com/3SAgk.png)
Удалить строку Me.Hide
из нашего UserForm1
кода
Private Sub UserForm_Activate()
With ActiveWindow
.WindowState = xlNormal
.Width = 0
.Height = 0
End With
Range("A1").Select
Application.OnKey "^0", "Module1.hello"
' Me.Hide <- remove me
End Sub
Это оставляет нам следующую функциональность
![enter image description here](https://i.stack.imgur.com/M8JPY.gif)
Если есть какие-либо предложениядля улучшения / оптимизации я был бы рад узнать, так как этот вопрос меня немного заинтриговал.Я постараюсь держать ответ в курсе!