按下按键时,在后台使用用户表单

时间:2019-05-23 09:48:11

标签: excel vba

我知道我们可以检测是否按下了某个键,例如KeyAscii = 8,但是在userform应用程序处于运行状态时,我只在事件上看到了这一点。

是否可以将窗口置于后台,例如在使用IE时,我可以按 CTRL + 0 ,我的应用程序会识别出它并采取措施?

1 个答案:

答案 0 :(得分:1)

至少据我所知,答案是-不可能,但是..


1。我们需要知道的事情

在进行任何编码之前,让我们先弄清一些事实:

  • Window对象处于xlMinimzed状态时,应用程序将无法执行任何代码
  • 因此,基本上,只要用户关闭,最小化或什至退出应用,我们将不再能够检测任何OnKey (或任何其他)事件,因为当前活动的应用程序(即浏览器)优先于应用程序
    • 因此 CTRL + 0 现在将缩小页面,因为这是浏览器的默认行为。
  • 话虽如此,我们至少可以做一些事情来至少接近某种形式的有用性。

2。应用程序布局

由于您没有提供特定的应用程序详细信息,因此我创建了此模型:

enter image description here

  • 由单个Worksheet组成的CommandButton,启动UserForm1 enter image description here

    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
    

现在这足以使窗口(几乎)最小化并响应按键

enter image description here


3。如果我们要在维护功能时显示UserForm

现在让我们说,我们希望UserForm同时在后台隐藏应用程序的其余部分。

为此,我们需要:

  1. UserForm更改为vbModeless

    为此,请选择UserForm对象并显示属性( F4 enter image description here

  2. 从我们的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


  

如果有任何改进/优化建议,我会   很高兴知道这个问题,这让我很感兴趣。   我将尝试使答案保持最新!