VBA UserForm阻塞资源管理器文件打开 如何保留窗体常驻运行
VBA UserForm常驻同时允许操作资源管理器的解决方案
问题根因
VBA的UserForm默认以模态模式加载,加载后会独占当前Office程序的全部交互焦点,因此未关闭窗体时无法操作包括弹出的资源管理器在内的其他窗口。
可落地解决方法
方法1:动态指定无模式加载(最便捷)
在调用窗体显示的Show方法后追加参数vbModeless即可,无需修改窗体本身属性:
' 原模态加载代码(阻塞其他窗口操作) UserForm1.Show ' 替换为无模式加载代码(窗体常驻,可正常操作其他窗口) UserForm1.Show vbModeless
方法2:修改窗体默认加载属性
如果需要窗体每次打开默认都是无模式,可直接在VBA编辑器的工程面板选中对应UserForm,在属性窗口找到ShowModal选项,将默认值True修改为False,后续直接调用UserForm1.Show就会默认以无模式加载。
适配优化方案
如果需要无模式窗体始终保持在所有窗口顶层不被遮挡,可以调用Windows API实现置顶,适配32/64位Office的代码如下:
' 窗体模块顶部的API声明,64位Office需保留PtrSafe关键字,32位可删除 Private Declare PtrSafe Function SetWindowPos Lib "user32.dll" (ByVal hWnd As LongPtr, ByVal hWndInsertAfter As LongPtr, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal uFlags As Long) As Long ' 置顶相关常量定义 Private Const HWND_TOPMOST = -1 Private Const SWP_NOSIZE = &H1 Private Const SWP_NOMOVE = &H2 ' 放在窗体的Initialize事件中,窗体加载时自动置顶 Private Sub UserForm_Initialize() SetWindowPos Me.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE End Sub
内容的提问来源于stack exchange,提问作者Rush Sina
相关产品推荐
相关产品推荐

