Una pregunta muy frecuente entre los usuarios de Microsoft Excel que ya se aventuraron en usar el Visual Basic para Aplicaciones (VBA) que viene con él y que han comenzado, a su vez, a usar los formularios de usuarios de VBA (UserForm), es que como le agregan a este los “clásicos” botones del Windows de maximizar y minimizar, ya que estos no los traen. Lo primero es decir, que si se pueden agregar dichos botones, lo segundo será decir que no es difícil y lo tercero será decir que aunque no es difícil hay que usar funciones de la API de Windows, que a algunas y algunos les podría parecer un misterio.
Bueno, para empezar algunas definiciones rápidas:
1- API: Interfaz de programación de aplicaciones, que es un conjunto de funciones residentes en bibliotecas que permiten que una aplicación se ejecute en un sistema operativo. Se utilizan para realizar tareas cuando resulta difícil escribir procedimientos equivalentes con el código propio del programa que se está usando.
2- FindWindow: Función del API de windows que nos Devuelve el "Handle" de la ventana que coincida con la clase y nombre indicados
3- GetWindowLong: Función del API de windows que obtiene las características de la ventana que se le indica
4- SetWindowLong: Función del API de windows que modifica un atributo de la ventana especificada
5- Thunderdframe: Nombre de la “clase” de los Userform del VBA de Excel (A partir del Excel 2000).
¿Y qué hacemos ahora? Pues, simplemente agregamos nuestro UserForm, vamos a él, presionamos F7 para ver su modulo y agregar código, y pegamos lo que coloco a continuación:
Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) 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 Sub UserForm_Initialize()
Dim lngMyHandle As Long, lngCurrentStyle As Long, lngNewStyle As Long
'Obtenemos el "Handle" del Userform
lngMyHandle = FindWindow("THUNDERDFRAME", Me.Caption)
'Obtenemos el estilo actual del UserForm
lngCurrentStyle = GetWindowLong(lngMyHandle, GWL_STYLE)
'Creamos un nuevo estilo de titulo con los botones deseados
lngNewStyle = lngCurrentStyle Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX
'Aplicamos las nuevas propiedades al UserForm
SetWindowLong lngMyHandle, GWL_STYLE, lngNewStyle
End Sub
El resultado una vez insertado el código es como el mostrado en la imagen anexa:
Algo importante y que sirve para obtener mejores resultados, es colocar la propiedad “ShowModal” de nuestro UserForm en “False”. Ahora si, disfruten de las nuevas propiedades de su Userform.
Nota: Si no me equivoco, la primera vez que vi el uso de código para obtener este resultado, era obra de Daniel Klann
Saludos y Éxito
El Equipo de EXCELLENTIAS.COM














¡Excelente aporte Abraham! Hay poco material en español al respecto de este particular y menos con la claridad con la que lo explicas. De seguro resultará de mucha utilidad a la comunidad.
Estamos en contacto, saludos y éxito.
[...] [...]
Hola Dogod ¿Cómo estás?
¡Bienvenido!
Muchas gracias por tu comentario, si tienes alguna inquietud adicional no dudes en contactarnos, adicionalmente dispones de nuestro foro donde gustosamente seran atendidas tus dudas o sugerencias.
¡Saludos y Éxito!
El Equipo EXCELLENTIAS.COM
Holajtuki78: y lo que hay ahí arriba mismo sobre el tema no te sirve? Este artículo:
http://excellentias.com/ocultar-hojas-en-excel-tr…
No lo he probado pero me gustaría saber y ojalá sirviera para como dices ocultar todas las hojas y sólo dejar visible el formulario…. si te funciona me dices.
Un saludo
Hola Dogod, la solución dada por Abraham me funcionó perfecto.
Gracias, Saludos
Hola:
Es cierto,
bueno de nuevo gracias y saludos a los dos.
Hasta pronto.
Dogod
[...] he definido en otro artículo (http://excellentias.com/userform-con-botones-maximizar-minimizar/) lo que es el API de Windows así como algunas de sus funciones, incluyendo una que usaremos hoy [...]
Excelente aporte, pero si lo pego en un userform limpio si me funciona, si lo agrego a algún formulario ya con código contenido me despliega un mensaje que dice: "los comentarios solamente pueden aparece después de EndSub End funcntion o End Property"
Aunque lo coloque abajo de un End Sub, por lo que necesito que me ilustres.
Hola que tal, esta muy padre el codigo, pero tengo un problema no se si me puedas ayudar, en mi userform en el cual coloco el codigo tengo una imagen como fondo, y al poner maximizar la imagen se distorsiona alguna solucion???? muchas gracias!!
ok, gracias tienes razon pues solo copie y pegue deja analizo lo que me dices.
Buenas:
He probado el poner los botones de maximizar y minimizar el userform y van de lujo.
La unica pega es que al darle a maximizar, los botones que tengo en el userform se me quedan desplazados hacia la derecha, y la mitad de la pantalla del lado izquierdo se queda vacia.
Hay alguna forma de que al darle a maximizar, los botones del userform se queden centrados en la pantall.
Muchas gracias.
Un saludo
Hola, me respondo yo mismo, ya me di cuenta del error y sí funciona. Mil gracias!!
Saludos
Hola.
Si dejas la propiedad "ShowModal" del Userform en "True" obtendras un efecto algo parecido a lo que solicitas. DE todos modos, si tu intencion es que no se vea el Excel en su conjunto, lo ideal es que al correr tu Userform coloques la aplicacion como no visible:
Application.Visible = False
Saludos
Abraham