一段时间不活动后,我在Excel中弹出一个用户窗体。唯一的问题是,在单击excel之前,用户窗体是不可见的,因此,当用户看到它时,另一个子运行将在单击工作表后关闭工作表。我不确定它的相关性,但我相信我拥有3个屏幕的事实有点干扰。
底线:如何使用户窗体出现在所有其他活动窗口的前面
在此先感谢您的帮助!
一些不必要的背景
工作表在工作中的共享文件夹中。弹出此非活动用户窗体例程的原因,而另一个关闭excel例程的原因是因为一次只有一个人可以进行和保存更改。如果用户闲置了5分钟,则该例程将引导用户,并当前创建带有自动保存标题和日期/时间的saveas版本。
答案 0 :(得分:0)
我再次遇到了这个问题。 在较旧的时间(相同的excel版本)上,我只需要将焦点设置为该窗体的控件,然后再将其设置为不可见和可见,但是(为什么呢?)在我的新Form上不起作用。
所以我搜索了一下,发现了这个。
在Userform_Initialize中:
With ThisWorkbook
'.Windows(1).WindowState = xlMinimized 'workbook minimize, not needed
'.VBProject.VBE.MainWindow.WindowState = vbext_ws_Minimize 'VBE minimize , not needed
'SetFormParent Me, FORM_PARENT_NONE 'makes the userform independantfrom workbooks
TopMostForm Me, True 'forces userform to show on top at all times
'DoEvents
TopMostForm Me, False 'Userform uses normal Zorder again
End With
您不需要的大多数代码,但我想向您展示,它可以独立存在Excel窗口或VBE窗口。
您可以使用Google找到TopMostForm和SetFormParent的过程,但这里是(64位)。
Sub TopMostForm(F As MSForms.UserForm, Top As Boolean)
' Makes a form the top window if top = True. When top = False it removes this property.
Dim hwnd As LongPtr
hwnd = HWndOfUserForm(F)
If Top Then
SetWindowPos hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE
Else
SetWindowPos hwnd, 0, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE
End If
End Sub
Function SetFormParent(Uf As MSForms.UserForm, _
Parent As FORM_PARENT_WINDOW_TYPE, Optional w As Window) As Boolean ' mettre ,2
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' SetFormParent
' Set the UserForm UF as a child of (1) the Application, (2) the
' Excel ActiveWindow, or (3) no parent. Returns TRUE if successful
' or FALSE if unsuccessful.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim UFHWnd As LongPtr
Dim WindHWnd As LongPtr
Dim R As LongPtr
If w Is Nothing Then Set w = Application.ActiveWindow
UFHWnd = HWndOfUserForm(Uf)
If UFHWnd = 0 Then
SetFormParent = False
Exit Function
End If
Select Case Parent
Case FORM_PARENT_APPLICATION
R = SetParent(UFHWnd, Application.hwnd)
Case FORM_PARENT_NONE
R = SetParent(UFHWnd, 0&)
Case FORM_PARENT_WINDOW
If w Is Nothing Then
SetFormParent = False
Exit Function
End If
WindHWnd = WindowHWnd(w)
If WindHWnd = 0 Then
SetFormParent = False
Exit Function
End If
R = SetParent(UFHWnd, WindHWnd)
Case Else
SetFormParent = False
Exit Function
End Select
SetFormParent = (R <> 0)
End Function