Como puedo agregar minimizar en una macro?

Estoy trabajando en el formulario que te pregunte ayer ... ¿mira tengo duda si puedo agregar minimizar en la ventana de la macro? ¿Y qué se apegue a los margenes de la pantalla al ser abierto?

2 respuestas

Respuesta
2

Para que en un "UserForm" funcione el tener botones de maximizar/minimizar tanto en Office de 32 bits como en Office de 64 bits, se debe colocar lo siguiente en el módulo del "UserForm:

#If VBA7 Then
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare PtrSafe Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long
Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
#Else
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function DrawMenuBar Lib "user32" (ByVal hWnd 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 GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
#End If
Private Const WS_MINIMIZEBOX As Long = &H20000
Private Const WS_MAXIMIZEBOX As Long = &H10000
Private Const GWL_STYLE As Long = (-16)
Private Const WS_SYSMENU As Long = &H80000
Private Sub UserForm_Initialize()
Dim hWnd As Long
Dim lngWstyle As Long
Dim lngMyHandle As Long, lngCurrentStyle As Long, lngNewStyle As Long
If Application.Version < 9 Then
    lngMyHandle = FindWindow("THUNDERXFRAME", Me.Caption)
Else
    lngMyHandle = FindWindow("THUNDERDFRAME", Me.Caption)
End If
lngCurrentStyle = GetWindowLong(lngMyHandle, GWL_STYLE)
lngNewStyle = lngCurrentStyle Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX
SetWindowLong lngMyHandle, GWL_STYLE, lngNewStyle
End Sub

OJO, en Excel de 64 bits se verán líneas rojas (tipo error) pero NO hay problema, el "#IF" las tiene, por decirlo de un modo, "controlada". 

Abraham Valencia

PD: Sugiero probarlo en un "Userform" nuevo como para probar/entender.

Me funcionó, pero.. existe la posibilidad de que se maximize la macro automaticamente?

Al ser agregado esos botones mediante funciones de la API de Windows, no hay una forma de activarlos por código.

Una forma de "maximizar" un "UserForm" es NO usar llamados a la API y suar más bien algo así:

Private Sub UserForm_Initialize()
Application.ActiveWindow.WindowState = xlMaximized
Me.Width = Application.Width
Me.Height = Application.Height
End Sub

¿Qué tal?

Abraham Valencia

la diferencia es que ahora no me minimiza , sino que solo se maximiza

Era solo para que des idea, estimado. Para minimizarlo agrega un botón. Mira, prueba así:

Option Explicit
Dim Ancho As Long, Alto As Long, Derecha As Long, Arriba As Long
Private Sub UserForm_Initialize()
Ancho = Me.Width
Alto = Me.Height
Derecha = (Application.Width - Me.Width) / 2
Arriba = (Application.Height - Me.Height) / 2
Application.ActiveWindow.WindowState = xlMaximized
Me.Width = Application.Width
Me.Height = Application.Height
End Sub
Private Sub CommandButton1_Click()
Me.Width = Ancho
Me.Height = Alto
Me.Left = Derecha
Me.Top = Arriba
End Sub

Salu2

Abraham Valencia

Respuesta
1

Si tu equipo es de 32 bits, utiliza el siguiente código. Lo debes poner al inicio de todo el código de tu Userform, en la sección de General Declaraciones

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function DrawMenuBar Lib "user32" (ByVal hWnd 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 GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Const WS_MINIMIZEBOX As Long = &H20000
Private Const WS_MAXIMIZEBOX As Long = &H10000
Private Const GWL_STYLE As Long = (-16)
Private Const WS_SYSMENU As Long = &H80000 'variable para ocultar el botón x

Después, en el evento initialize

Private Sub UserForm_Initialize() ' Declaración de variantes para los botones de maximizar y minimizar
    Dim lngMyHandle As Long, lngCurrentStyle As Long, lngNewStyle As Long
    If Application.Version < 9 Then
        lngMyHandle = FindWindow("THUNDERXFRAME", Me.Caption)
    Else
        lngMyHandle = FindWindow("THUNDERDFRAME", Me.Caption)
    End If
    lngCurrentStyle = GetWindowLong(lngMyHandle, GWL_STYLE)
    lngNewStyle = lngCurrentStyle Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX
    SetWindowLong lngMyHandle, GWL_STYLE, lngNewStyle
    Dim hWnd As Long 'para ocultar el botón "X"
    Dim lngWstyle As Long
End Sub

Y en el evento Activate:

Private Sub UserForm_Activate()
    'para poner el form a la izquierda y arriba de la pantalla
    Me.Top = 0
    Me.Left = 0
End Sub

Si ya tienes los eventos, solamente agrega el código dentro del evento.

Sal u dos

es de 64 bits

los primeros codigos de private que parte los pego?

Los primeros códigos van al inicio de todo el código del userform

Prueba para ver si te funcionan, de lo contrario tendrás que buscar el similar para 64 bits

Tendrás que buscar la alternativa para 64 bits

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas