Home » excel » excel – How to add minimize button for a userform?

excel – How to add minimize button for a userform?

Posted by: admin April 23, 2020 Leave a comment

Questions:

I need to create a userform for my excel vba program., But how can I add “minimize” button for this userform? Thanks.

How to&Answers:

You can try this code :

Private Sub ToggleButton1_Click() 
    If ToggleButton1.Value = True Then
        Me.Height = Me.Height * 0.25
    Else
        Me.Height = dHeight
    End If
End Sub

Private Sub UserForm_Initialize()
    dHeight = Me.Height    
End Sub
[EDIT] Found this link where they explain how to do it with an API to minimize.

Here is the given code :

Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long

Private Const GWL_STYLE As Long = (-16) 'Sets a new window style
Private Const WS_SYSMENU As Long = &H80000 'Windows style
Private Const WS_MINIMIZEBOX As Long = &H20000
Private Const WS_MAXIMIZEBOX As Long = &H10000
Private Const SW_SHOWMAXIMIZED = 3

Private Sub UserForm_Activate()
Dim lFormHandle As Long, lStyle As Long
'===========================================
'= Originally from Dax =
'= Modified with comments by Ivan F Moala =
'= 22/07/01 =
'===========================================

'Lets find the UserForm Handle the function below retrieves the handle
'to the top-level window whose class name ("ThunderDFrame" for Excel)
'and window name (me.caption or UserformName caption) match the specified strings.
lFormHandle = FindWindow("ThunderDFrame", Me.Caption)

'The GetWindowLong function retrieves information about the specified window.
'The function also retrieves the 32-bit (long) value at the specified offset
'into the extra window memory of a window.
lStyle = GetWindowLong(lFormHandle, GWL_STYLE)

'lStyle is the New window style so lets set it up with the following
lStyle = lStyle Or WS_SYSMENU 'SystemMenu
lStyle = lStyle Or WS_MINIMIZEBOX 'With MinimizeBox
lStyle = lStyle Or WS_MAXIMIZEBOX 'and MaximizeBox

'Now lets set up our New window the SetWindowLong function changes
'the attributes of the specified window , given as lFormHandle,
'GWL_STYLE = New windows style, and our Newly defined style = lStyle
SetWindowLong lFormHandle, GWL_STYLE, (lStyle)

'Remove >'< if you want to show form Maximised
'ShowWindow lFormHandle, SW_SHOWMAXIMIZED 'Shows Form Maximized

'The DrawMenuBar function redraws the menu bar of the specified window.
'We need this as we have changed the menu bar after Windows has created it.
'All we need is the Handle.
DrawMenuBar lFormHandle

End Sub

Regards,

Max

Answer:

'Place this code in a Module

Private Declare Function FindWindowA Lib "USER32" _ 
(ByVal lpClassName As String, _ 
ByVal lpWindowName As String) As Long 

Private Declare Function GetWindowLongA Lib "USER32" _ 
(ByVal hWnd As Long, _ 
ByVal nIndex As Long) As Long 

Private Declare Function SetWindowLongA Lib "USER32" _ 
(ByVal hWnd As Long, _ 
ByVal nIndex As Long, _ 
ByVal dwNewLong As Long) As Long 

Option Explicit 

Sub FormatUserForm(UserFormCaption As String) 
    Dim hWnd            As Long 
    Dim exLong          As Long 
    hWnd = FindWindowA(vbNullString, UserFormCaption) 
    exLong = GetWindowLongA(hWnd, -16) 
    If (exLong And &H20000) = 0 Then 
        SetWindowLongA hWnd, -16, exLong Or &H20000 
    Else 
    End If 
End Sub 
Sub ShowForm() 
    UserForm1.Show 
End Sub 
 'Place this code in a UserForm with one Command Button named CommandButton1.
Option Explicit 

Private Sub CommandButton1_Click() 
    Unload Me 
End Sub 

Private Sub UserForm_Initialize() 
    Call FormatUserForm(Me.Caption) 
End Sub