显示用户表单后,将焦点设置回应用程序窗口

当显示一个用户窗体(运行其Show方法)时,它不仅显示在屏幕上,而且还将焦点(例如按键的目的地)。

说,用户表单是一个自定义的工具栏。 它的ShowWorkbook_Open()触发,但是表单本身的使用相对较less,所以我们希望焦点在其出现后立即回到主应用程序窗口。

不幸的是,似乎SetFocus方法不适用于应用程序对象。

那么这是如何完成的?

我想我的例子的解决scheme之后

 Private Sub Workbook_Open() [...] UserForm1.Show 

我使用这个:

AppActivate Application.caption

这将重点从用户窗体重新设置到您的Excel工作表。

这有点棘手,但这是可以做的。

在子例程“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 

为了我

 AppActivate ThisWorkbook.Application 

Show语句后似乎正常工作。

在其他情况下

 AppActivate "Microsoft Excel" 

也可能没事。

作为这个优秀讨论的脚注,在某些情况下,您可以跳过对.Show的调用来避免焦点问题,所以焦点永远不会移动。 例如在Word中 ,如果您正在更新无模式表单或对话框,只需更新所需的区域并省略对.Show的调用,例如:

 Sub ShowProblems(ByVal ProbLoc) EditBox2.TextBox.Text = "Here is the problem location: " & ProbLoc ' not needed: EditBox2.Show vbModeless End Sub 

我为应用程序创build一个对象,例如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 
 Private Sub UserForm_Activate() RefRangeIn.SetFocus End Sub 

它适用于我,在Excel 2013 VBA

添加一个虚拟表单并添加代码如下:

Private Sub SomeButton_Click() enter code here frm_Dummy.Show vbModeless Unload frm_Dummy

结束小组

要么

Sub SomeSub() enter code here frm_Some.Show vbModeless frm_Dummy.Show vbModeless Unload frm_Dummy

结束小组