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

时间:2015-01-20 10:04:19

标签: excel vba excel-vba focus userform

当显示用户表单(运行其Show方法)时,它不仅会显示在屏幕上,还会显示焦点(例如击键的目的地)。

比如说,userform是一个自定义工具栏。它的Show会在Workbook_Open()中触发,但表单本身的使用相对较少,因此我们希望焦点在其出现后立即返回主应用程序窗口。

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

那怎么办呢?

我想我的例子的解决方案是在

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

11 个答案:

答案 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”行之前。