我有一个UserForm,它根据在工作表上做出的选择显示其他信息。
调用Userform的过程在工作表模块中,触发器是Worksheet_SelectionChange
。表单是无模式的,以便用户可以在工作表上选择不同的单元格。显示带有数据的表单。
问题是Userform将焦点从Excel应用程序中移开,这样箭头键就不起作用了。由于触发器是Worksheet_SelectionChange
事件,因此在选择更改后它始终需要关注。
如何从Userform设置焦点或阻止Userform首先关注焦点?
我已经查看了应用程序属性以重新获得焦点,而Userform属性则从Userform中删除焦点,但无法弄清楚。
答案 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