将用户表单带到Forefront Excel VBA

时间:2018-08-07 18:45:54

标签: excel vba excel-vba userform

一段时间不活动后,我在Excel中弹出一个用户窗体。唯一的问题是,在单击excel之前,用户窗体是不可见的,因此,当用户看到它时,另一个子运行将在单击工作表后关闭工作表。我不确定它的相关性,但我相信我拥有3个屏幕的事实有点干扰。

底线:如何使用户窗体出现在所有其他活动窗口的前面

在此先感谢您的帮助!

一些不必要的背景

工作表在工作中的共享文件夹中。弹出此非活动用户窗体例程的原因,而另一个关闭excel例程的原因是因为一次只有一个人可以进行和保存更改。如果用户闲置了5分钟,则该例程将引导用户,并当前创建带有自动保存标题和日期/时间的saveas版本。

1 个答案:

答案 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