Como Cambiar el tamaño de un formulario de usuario con VBA o API de Windows

Índice
  1. Solución API de Windows
    1. ¿Como funciona?
    2. Configurar el código API de Windows
    3. Configurando el formulario de usuario
  2. Solución única de VBA
    1. ¿Como funciona?
    2. Configurando el formulario de usuario

Al crear un formulario de usuario de VBA, generalmente lo configuramos en un tamaño específico. La mayoría de los demás formularios y ventanas dentro de los entornos Excel y Windows no tienen un tamaño fijo; el usuario puede cambiar su tamaño. Con un poco de magia de codificación, podemos lograr un efecto de cambio de tamaño similar para nuestros formularios de usuario de VBA. Esta publicación le mostrará cómo.

A continuación se presentan dos soluciones, un método API de Windows y un método exclusivo de VBA. De las dos, la solución API de Windows tiene una sensación más fluida e integrada para el usuario, pero sólo funcionará en Windows. Si se espera que su código funcione en Windows y Mac, entonces usar la solución VBA es la mejor opción.

Descargue el archivo de ejemplo: únase al programa Insiders gratuito y obtenga acceso al archivo de ejemplo utilizado para esta publicación.

Nombre del archivo: 0178 Cambiar tamaño VBA UserForm.zip

Tener acceso

Solución API de Windows

Los códigos API de Windows utilizan funciones especiales que no forman parte de Excel o VBA, sino de la aplicación principal de Windows. El tema de los códigos API de Windows es demasiado amplio para discutirlo aquí, pero siguiendo las instrucciones a continuación aún puede hacer que el código funcione, incluso si no comprende completamente por qué funciona.

Recuerde, los códigos API de Windows solo funcionarán en Windows.

¿Como funciona?

Una breve descripción general de cómo funciona el proceso le ayudará a comprender qué hace el siguiente código.

  1. Cambie la configuración de Windows para permitir que se cambie el tamaño del formulario de usuario.
  2. En UserForm, utilice el evento Resize para capturar cuándo se cambia el tamaño del formulario.
  3. El tamaño o la posición de los objetos cambia después de cada evento de cambio de tamaño.

Configurar el código API de Windows

Copie el siguiente código en un nuevo módulo estándar. Debe incluirse en la parte superior del módulo antes de cualquier función o subprocedimiento, pero debajo de la declaración Option Explicit (si la hay).

Public Const GWL_STYLE = -16Public Const WS_CAPTION = HC00000Public Const WS_THICKFRAME = H40000#If VBA7 Luego declara públicamente la función PtrSafe GetWindowLong _ Lib "user32" Alias ​​"GetWindowLongA" ( _ ByVal hWnd As Long, ByVal nIndex As Long) Mientras pública declara la función PtrSafe SetWindowLong _ Lib "user32" Alias ​​"SetWindowLongA" ( _ ByVal hWnd As Long, ByVal nIndex As Long, _ ByVal dwNewLong As Long) Mientras declara públicamente Función PtrSafe DrawMenuBar _ Lib "user32" (ByVal hWnd As Long) Mientras declara públicamente Función PtrSafe FindWindowA _ Lib "user32" (ByVal lpClassName como cadena, _ ByVal lpWindowName como cadena) mientras#Else Función de declaración pública GetWindowLong _ Lib "user32" Alias ​​"GetWindowLongA" (_ ByVal hWnd mientras, ByVal nIndex mientras) Como Función de declaración pública larga SetWindowLong _ Lib "user32" Alias ​​"SetWindowLongA" ( _ ByVal hWnd As Long, ByVal nIndex As Long, _ ByVal dwNewLong As Long) Mientras función de declaración pública larga DrawMenuBar _ Lib "user32" (ByVal hWnd As Long) Como Función de declaración pública larga FindWindowA _ Lib "user32" (ByVal lpClassName como cadena, _ ByVal lpWindowName como cadena) como larga#End If

El siguiente código debe incluirse dentro del mismo módulo que el código anterior , pero no es necesario que esté directamente debajo de él.

Sub ResizeWindowSettings(frm As Object, show As Boolean)Dim windowStyle As LongDim windowHandle As Long'Obtener las referencias a la ventana y la posición del estilo dentro de la memoria de WindowswindowHandle = FindWindowA(vbNullString, frm.Caption)windowStyle = GetWindowLong(windowHandle, GWL_STYLE)'Determinar el estilo a aplicar basadoSi show = False Entonces windowStyle = windowStyle Y (No WS_THICKFRAME)De lo contrario windowStyle = windowStyle + (WS_THICKFRAME)End If'Aplicar el nuevo estiloSetWindowLong windowHandle, GWL_STYLE, windowStyle'Recrear la ventana UserForm con el nuevo estilo DrawMenuBar windowHandleEnd Sub

Los dos segmentos de código anteriores crean un procedimiento reutilizable que podemos usar para activar o desactivar la configuración de cambio de tamaño del formulario de usuario. Cada vez que queramos activar el cambio de tamaño para un formulario de usuario, use lo siguiente:

Llame a ResizeWindowSettings(myUserForm, True)

Para desactivar el cambio de tamaño, utilice lo siguiente

Llame a ResizeWindowSettings(myUserForm, False)

Simplemente reemplace myUserForm con el nombre de su formulario, o use Me si está dentro del módulo de código de UserForm.

Configurando el formulario de usuario

Para ilustrar el proceso, creé un formulario de usuario que se ve así:

Cambio de tamaño de la API de Windows

Sólo hay dos elementos:

  • Un ListBox llamado lstListBox
  • Un botón llamado cmdClose

Ambos elementos deberían cambiar cuando UserForm cambie de tamaño. lstListBox debería cambiar de tamaño, pero no de posición, mientras que cmdClose cambiará de posición pero no de tamaño. Para permitir que esto suceda, necesitamos conocer la posición de estos objetos desde la parte inferior y derecha del formulario de usuario. Siempre que mantengamos la misma distancia desde la parte inferior y la derecha, parecerá que estos elementos se mueven sincronizados con el formulario de usuario.

El siguiente código debe incluirse dentro del módulo de código de UserForm para funcionar correctamente.

Para capturar las posiciones iniciales inferior y derecha del ListBox y el botón, configuramos algunas variables privadas para contener los valores.

Lst privadoListBoxBottom como dobleLstListBox privadoDerecho como dobleCmd privadoCerrar inferior como dobleCmd privadoCerrarDerecho como doble

Ahora configuremos qué sucede cuando se inicializa UserForm.

En primer lugar, el cambio de tamaño se habilita llamando al código creado en la sección API de Windows anterior. En segundo lugar, almacenamos la posición de los objetos en las variables privadas creadas anteriormente.

Private Sub UserForm_Initialize()'Llame a la API de Windows para habilitar el cambio de tamañoCall ResizeWindowSettings(Me, True)'Obtenga la posición de anclaje inferior derecha de los objetos que se van a cambiar de tamañolstListBoxBottom = Me.Height - lstListBox.Top - lstListBox.HeightlstListBoxRight = Me.Width - lstListBox .Izquierda - lstListBox.WidthcmdCloseBottom = Me.Height - cmdClose.Top - cmdClose.HeightcmdCloseRight = Me.Width - cmdClose.Left - cmdClose.WidthEnd Sub

A continuación, utilizando el evento de cambio de tamaño del formulario de usuario, cambiamos el tamaño/posición de ListBox y el botón:

  • lstListBox cambia alto y ancho
  • cmdCloses cambia la posición superior e izquierda
Private Sub UserForm_Resize()En caso de error Reanudar Siguiente'Establezca la nueva posición de los objetoslstListBox.Height = Me.Height - lstListBoxBottom - lstListBox.ToplstListBox.Width = Me.Width - lstListBoxRight - lstListBox.LeftcmdClose.Top = Me.Height - cmdCloseBottom - cmdClose.HeightcmdClose.Left = Me.Width - cmdCloseRight - cmdClose.WidthOn Error Ir a 0End Sub

Eso es. Ahora tienes el código que necesitas. Así que inicia el UserForm y comienza a cambiar el tamaño.

Cambiar tamaño de VBA - icono

Cuando el mouse pasa sobre el borde del formulario de usuario, el ícono cambia, simplemente haga clic y arrastre. Con este método, el cambio de tamaño puede ocurrir en cualquier lado del UserForm.

Solución única de VBA

La solución VBA utiliza eventos del mouse para activar cuándo cambiar la altura y el ancho del formulario de usuario. Personalmente, creo que no es tan sencillo como la solución API de Windows, pero es mucho más fácil de entender y también se puede utilizar en una Mac.

¿Como funciona?

La solución VBA utiliza un método de aplicación diferente al de la solución API de Windows.

  1. El formulario de usuario contiene un objeto que, al hacer clic, registra la posición del mouse.
  2. A medida que se mueve el mouse, el formulario de usuario y sus objetos se reposicionan o cambian de tamaño según la nueva posición del mouse.
  3. Cuando se suelta el botón del ratón, el movimiento cesa para ajustar el tamaño.

Configurando el formulario de usuario

Para ilustrar el proceso, he creado otro formulario de usuario; se parece a esto:

Cambiar tamaño de VBA

Sólo hay tres elementos:

  • ListBox llamado lstListBox
  • Botón llamado cmdCerrar
  • Etiqueta llamada lblResizer

lblResizer es una etiqueta que incluye el carácter "y" del conjunto de fuentes Wingdings 3. Esto se muestra como un pequeño triángulo en la esquina inferior derecha para mostrarle al usuario dónde hacer clic para cambiar el tamaño de la ventana. Las propiedades Color y MousePointer se configuran de la siguiente manera:

Configuración de lblResizer

Todos estos elementos, junto con el formulario de usuario en sí, deberán cambiar cuando se haga clic y se mueva el mouse sobre el objeto lblResizer.

Todo el código debe estar contenido dentro del módulo de código del UserForm.

Configuraremos algunas variables privadas para mantener la posición del mouse y el estado del clic, junto con el tamaño de ventana mínimo permitido.

Cambio de tamaño privadoHabilitado como booleanoRatón privadoX como dobleRatón privadoY como dobleMín privadoAncho como dobleAltura mínima privada como doble

Al inicializar el formulario de usuario, el siguiente código colocará lblResizer en la esquina inferior derecha y establecerá el tamaño de ventana mínimo permitido.

Private Sub UserForm_Initialize()'Coloque el icono de cambio de tamañolblResizer.Left = Me.InsideWidth - lblResizer.WidthlblResizer.Top = Me.InsideHeight - lblResizer.HeightminHeight = 125minWidth = 125End Sub

El siguiente código se activa cuando el mouse hace clic en el ícono lblResizer. El código registra que se ha hecho clic en el icono y la posición del mouse en ese momento.

Private Sub lblResizer_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, _ ByVal X As Single, ByVal Y As Single)'El usuario hizo clic en lblResizerresizeEnabled = True'Capture la posición del mouse al hacer clicmouseX = XmouseY = YEnd Sub

El siguiente código se activa cuando el mouse se mueve sobre lblResizer.

En primer lugar, comprobará que la ventana sea mayor que el tamaño mínimo permitido y que se haya hecho clic con el mouse. Si ambos son Verdaderos, el formulario de usuario y los objetos se reposicionan o cambian de tamaño según el tamaño del movimiento del mouse.

Private Sub lblResizer_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _ ByVal X As Single, ByVal Y As Single)'Compruebe si el UserForm no tiene un tamaño demasiado pequeñoDim enableResize As BooleanallowResize = TrueIf Me.Width + X - mouseX minWidth Then enableResize = FalseIf Me.Height + Y - mouseY minHeight Then enableResize = False'Compruebe si el mouse hizo clic en lblResizer y el tamaño mínimo es superior. If resizeEnabled = True Y enableResize = True Luego 'Cambiar el tamaño/mover objetos según el movimiento del mouse desde que se hizo clic' Cambiar el tamaño del formulario de usuario Me.Width = Me.Width + X - mouseX Me.Height = Me.Height + Y - mouseY 'Cambiar el tamaño del ListBox lstListBox.Width = lstListBox.Width + X - mouseX lstListBox.Height = lstListBox.Height + Y - mouseY 'Mover el botón Cerrar cmdClose.Left = cmdClose.Left + X - mouseX cmdClose.Top = cmdClose.Top + Y - mouseY 'Mover el ícono Resizer lblResizer.Left = Me.InsideWidth - lblResizer.Width lblResizer.Top = Me.InsideHeight - lblResizer .AlturaEnd IfEnd Sub

El siguiente código se activa cuando se suelta el botón del mouse; el movimiento del mouse deja de cambiar el tamaño del formulario de usuario.

Private Sub lblResizer_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, _ ByVal X As Single, ByVal Y As Single)'El usuario anuló el clic en lblResizerresizeEnabled = FalseEnd Sub

Eso es; estamos listos para comenzar. Abra el formulario de usuario y comience a cambiar el tamaño.

Cambiar tamaño de VBA - icono

En este ejemplo, el formulario de usuario solo cambia de tamaño cuando el mouse hace clic en el ícono en la parte inferior derecha. Podríamos agregar la capacidad de expandirse desde la derecha, abajo o izquierda usando objetos ubicados justo dentro de los bordes del UserForm.


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir

Este sitio web utiliza cookies para mejorar la experiencia del usuario y garantizar un funcionamiento eficiente. Al utilizar nuestro sitio web, aceptas todas las cookies de acuerdo con nuestra política de cookies. Leer mas...