How to disable the X close button on a UserForm
Article contributed by Jonathan West
Sometimes, you don't want to allow the user to close a UserForm until they have gone through all the steps you have specified.
Word VBA UserForms don't directly allow you to disable the Close button, but a little Windows API trickery can get round this.
Paste the following into the UserForm's code window for any form where you
want the X greyed out and disabled.
Private Const MF_BYPOSITION = &H400
Private Const MF_REMOVE = &H1000
Private Declare Function DrawMenuBar Lib "user32" _
( ByVal hWnd As Long ) As Long
Private Declare Function GetMenuItemCount Lib "user32" _
( ByVal hMenu As Long ) As Long
Private Declare Function GetSystemMenu Lib "user32" _
( ByVal hWnd As Long , _
ByVal bRevert As Long ) As Long
Private Declare Function RemoveMenu Lib "user32" _
( ByVal hMenu As Long , _
ByVal nPosition As Long , _
ByVal wFlags As Long ) As Long
Private Declare Function FindWindow Lib "user32" _
Alias "FindWindowA" _
( ByVal lpClassName As String , _
ByVal lpWindowName As String ) As Long
Private hWnd As Long
Private Sub UserForm_Initialize()
Dim hMenu As Long
Dim menuItemCount As Long
'Obtain the window handle to the userform
hWnd = FindWindow (vbNullString, Me.Caption)
'Obtain the handle to the form's system menu
hMenu = GetSystemMenu (hWnd, 0 )
If hMenu Then
'Obtain the number of items in the menu
menuItemCount = GetMenuItemCount (hMenu)
'Remove the system menu Close menu item.
'The menu item is 0-based, so the last
'item on the menu is menuItemCount - 1
Call RemoveMenu (hMenu, menuItemCount - 1 , _
MF_REMOVE Or MF_BYPOSITION)
'Remove the system menu separator line
Call RemoveMenu (hMenu, menuItemCount - 2 , _
MF_REMOVE Or MF_BYPOSITION)
'Force a redraw of the menu. This
'refreshes the titlebar, dimming the X
Call DrawMenuBar (hWnd)
End If
End Sub
This code is a VBA adaptation of
a VB6 code sample published by Randy Birch
(Visual Basic MVP) at http://vbnet.mvps.org/code/forms/killclose.htm
(link removed by Lene Fredborg 3-Feb-2017).
I would like to thank Randy for permission to use his code in this article.