加载无模式用户窗体后,将焦点设置回Excel

时间:2018-01-11 22:49:20

标签: excel vba excel-vba userform

我有一个UserForm,它根据在工作表上做出的选择显示其他信息。

调用Userform的过程在工作表模块中,触发器是Worksheet_SelectionChange。表单是无模式的,以便用户可以在工作表上选择不同的单元格。显示带有数据的表单。

问题是Userform将焦点从Excel应用程序中移开,这样箭头键就不起作用了。由于触发器是Worksheet_SelectionChange事件,因此在选择更改后它始终需要关注。

如何从Userform设置焦点或阻止Userform首先关注焦点?

我已经查看了应用程序属性以重新获得焦点,而Userform属性则从Userform中删除焦点,但无法弄清楚。

2 个答案:

答案 0 :(得分:3)

我通常会使用:

AppActivate Application.Caption

答案 1 :(得分:2)

不是真正的解决方案,而是一种可能的解决方法,模仿显示/隐藏而不会多次窃取焦点。

想法是显示无模式用户表格并在打开工作簿时将其移出屏幕(在用户可以使用它之前)。

然后,当遇到具有特定要求的Worksheet_SelectionChange时,将Userform移动到可查看的屏幕(UserForm1.ShowInScreen(LeftLocation)),否则将其移出屏幕(UserForm1.GoOffScreen)。

下面的示例假设 Userform1已禁用,此处只显示一个文本框以显示所选单元格的地址,并且仅显示"显示"选择是Sheet1的B列中的单个单元格时的userform。

它也可以通过将Userform Height和Width更改为零来模仿隐藏(未测试)。

<强> 的ThisWorkbook

Private Sub Workbook_Open()
    With UserForm1
        .Show
        .GoOffScreen
    End With
End Sub

Sheet1 (您希望用户表单做出反应)

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Cells.Count = 1 Then
        If Target.Column = 2 Then
            With UserForm1
                If Not .Visible Then .Show
                .ShowInScreen Application.Left + Target.Width + Target.Offset(0, 1).Left
                .UpdateTextbox Target.Address(0, 0)
            End With
        Else
            UserForm1.GoOffScreen
        End If
    End If
End Sub

最后 Userform1

Option Explicit

Sub UpdateTextbox(ByVal Text As String)
    Me.TextBox1.Value = Text
End Sub

Sub GoOffScreen()
    ' Assuming no screen above this: move above the screen 3 times the userform height
    With Me
        .Top = -3 * .Height
    End With
End Sub

Sub ShowInScreen(ByVal LeftLocation As Double)
    With Me
        .Top = Application.Top + 200
        .Left = LeftLocation
    End With
End Sub