当显示用户表单(运行其Show
方法)时,它不仅会显示在屏幕上,还会显示焦点(例如击键的目的地)。
比如说,userform是一个自定义工具栏。它的Show
会在Workbook_Open()
中触发,但表单本身的使用相对较少,因此我们希望焦点在其出现后立即返回主应用程序窗口。
不幸的是,似乎SetFocus
方法对应用程序对象无效。
那怎么办呢?
我想我的例子的解决方案是在
之后Private Sub Workbook_Open()
[...]
UserForm1.Show
答案 0 :(得分:15)
我用这个:
AppActivate Application.caption
这会将焦点从用户窗体重置为Excel工作表。
答案 1 :(得分:3)
这有点棘手,但这是可以做的。
在子程序“Private Sub UserForm_Initialize()”中,将其添加为最后一行:
Private Sub UserForm_Initialize()
. . . . . . . . . .
Application.OnTime Now(), "MoveFocusToWorksheet"
End Sub
在任何通用代码模块中(如果没有,则添加一个),声明一个API函数:
Public Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
在任何通用代码模块中(当然可以是带有API声明的模块),添加此子例程:
Public Sub MoveFocusToWorksheet()
Dim Dummy As Long
ThisWorkbook.Worksheets("Sheet1").Activate
' "Sheet1" here is the tab name of the sheet you want to move focus to. _
Or simply use then: With shtABC.Activate _
where "shtABC" being the worksheet's CodeName, _
same as ThisWorkbook.Worksheets("Sheet1").CodeName, _
same as the sheets module name showing in the Project Explorer panel.
Dummy = SetForegroundWindow(Application.hwnd)
End Sub
答案 2 :(得分:2)
对我来说
AppActivate ThisWorkbook.Application
在Show
语句似乎正常工作之后。
在其他情况下
AppActivate "Microsoft Excel"
也可以。
答案 3 :(得分:1)
我用 AppActivate ActiveWindow.Caption 因为 AppActivate Application.Caption 如果为同一工作簿打开了多个窗口,则可能会聚焦错误的窗口。
答案 4 :(得分:1)
在其他答案中提到的AppActivate Application.Caption
和{更好的AppActivate ActiveWindow.Caption
都在专注于应用程序窗口本身上发挥了作用……但他们不关注在通常希望焦点位于的实际单元格/范围上。为此,请使用:
ActiveCell.Activate
的好处是,无需在要返回焦点的工作表的单元格区域上额外单击即可,因为额外单击可能会更改先前的选择。
答案 5 :(得分:0)
作为此次优秀讨论的注脚,在某些情况下,您可以通过跳过.Show
的呼叫来避免焦点问题,因此焦点永远不会移动到第一位。例如,使用 Word ,如果要更新无模式窗体或对话框,只需更新所需区域并省略对.Show
的调用,例如:
Sub ShowProblems(ByVal ProbLoc)
EditBox2.TextBox.Text = "Here is the problem location: " & ProbLoc
' not needed: EditBox2.Show vbModeless
End Sub
答案 6 :(得分:0)
我为应用程序创建了一个对象,例如Outlook,然后将WindowSate更改为Maximized(OlMaximized),然后当我想删除焦点时我最小化(olMinimized)
Set OutlookObj = GetObject(, "Outlook.Application")
OutlookObj.ActiveExplorer.WindowState = olMinimized
OutlookObj.ActiveExplorer.WindowState = olMaximized
或者您从应用程序内部更改状态,您还可以更改其位置和大小等以获取更多信息,请参阅:https://msdn.microsoft.com/en-us/library/office/ff838577.aspx
Application.WindowState = xlMaximized
答案 7 :(得分:0)
Private Sub UserForm_Activate()
RefRangeIn.SetFocus
End Sub
它适用于我,excel 2013 VBA
答案 8 :(得分:0)
添加虚拟表单并添加如下代码:
Private Sub SomeButton_Click()
frm_Dummy.Show vbModeless
Unload frm_Dummy
End Sub
OR
Sub SomeSub()
frm_Some.Show vbModeless
frm_Dummy.Show vbModeless
Unload frm_Dummy
End Sub
答案 9 :(得分:0)
另一种形式是:
<select>
答案 10 :(得分:0)
我用用户窗体创建了一个浮动菜单,并使用此代码使光标离开用户窗体并跳转/聚焦回我的工作表。它可以在每个命令按钮代码的末尾,也可以与用户表单的启动代码一起使用。
AppActivate ThisWorkbook.Application
只需将以上代码行放置在任何命令按钮代码和初始show userform代码的“ End Sub”行之前。