使用 VBA 将焦点设置在 Excel 用户表单上

Set Focus on an Excel User Form Using VBA

我的项目已完成 95%,但仍有一个小问题。我的代码,来自用户表单的 运行,打开一个包含第一行的 PDF 文档,在第二行中识别它的 window,并在第三行中移动和调整 window 的大小。

    ActiveWorkbook.FollowHyperlink Mail(0) & Mail(Me.Tag)
    Wnd = FindWindow(vbNullString, AcrobatWindowID(Mail(Me.Tag)))
    SetWindowPos Wnd, HWND_TOP, 1950, 10, 1100, 1300, SWP_NOACTIVATE

在此操作结束时,用户表单变暗。焦点似乎仍然在 PDF 上。这并不重要,因为表格已经完全开发,我可以点击它或 PDF 来激活,就像我想要的那样。

尽管如此,我还是试图将焦点放在窗体上,然后放在特定的控件上。我成功地找到了 Excel window 但未能将焦点设置在窗体上,更不用说控件了。事实上,我不知道如何检查我是否成功将焦点设置在 Excel window 上。我在尝试使用这段代码时不确定其语法。

Public Const SWP_NOMOVE = &H2           ' ignore cx and cy
Public Const SWP_NOSIZE = &H1           ' ignore X and Y

SetWindowPos Wnd, HWND_TOP, 0, 0, 0, 0, (SWP_NOMOVE + SWP_NOSIZE)

无论如何,表格仍然是灰色的。有人对我有什么建议吗?

为了获得表单处理程序,您应该这样进行:

  1. 使用API GetActiveWindow并在表单代码模块顶部(在声明区域)创建一个Private变量:
Option Explicit

Private Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr

Private frmHwnd as LongPtr
  1. UserForm_Initialize 事件中插入下一行代码:
frmHwnd = GetActiveWindow