显示用户表单后,将焦点设置回应用程序窗口
当显示一个用户窗体(运行其Show
方法)时,它不仅显示在屏幕上,而且还将焦点(例如按键的目的地)。
说,用户表单是一个自定义的工具栏。 它的Show
在Workbook_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
结束小组