我知道我们可以检测是否按下了某个键,例如KeyAscii = 8
,但是在userform应用程序处于运行状态时,我只在事件上看到了这一点。
是否可以将窗口置于后台,例如在使用IE时,我可以按 CTRL + 0 ,我的应用程序会识别出它并采取措施?
答案 0 :(得分:1)
至少据我所知,答案是-不可能,但是..
在进行任何编码之前,让我们先弄清一些事实:
Window
对象处于xlMinimzed
状态时,excel应用程序将无法执行任何代码OnKey
(或任何其他)事件,因为当前活动的应用程序(即浏览器)优先于excel应用程序
由于您没有提供特定的应用程序详细信息,因此我创建了此模型:
由单个Worksheet
组成的CommandButton
,启动UserForm1
Private Sub CommandButton1_Click()
UserForm1.Show
End Sub
名为Module1
的模块,其中包含一条简单的hello world消息(用于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
现在这足以使窗口(几乎)最小化并响应按键
UserForm
现在让我们说,我们希望UserForm
同时在后台隐藏excel应用程序的其余部分。
为此,我们需要:
将UserForm
更改为vbModeless
从我们的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
这使我们具有以下功能性
如果有任何改进/优化建议,我会 很高兴知道这个问题,这让我很感兴趣。 我将尝试使答案保持最新!