El Formulario de reserva de cursos es un formulario simple que ilustra los principios del diseño de UserForm y la codificación VBA asociada .

Utiliza una selección de controles que incluyen cuadros de texto, cuadros combinados, botones de opción agrupados en un marco, casillas de verificación y botones de comando .

Cuando el usuario hace clic en el botón Aceptar, su entrada se ingresa en la siguiente fila disponible en la hoja de trabajo .

Descripción de la forma de Excel:

Hay dos cuadros de texto simples (Nombre: _ y _Teléfono: _) en los que el usuario puede escribir texto libre, y dos cuadros combinados (_Departamento y Curso)

que permiten al usuario elegir un elemento de la lista.

Hay tres botones de opción (Introducción, Intermedio y Avanzado) agrupados en un marco (Nivel) para que el usuario pueda elegir solo una de las opciones.

Hay dos casillas de verificación (Lunch Required y Vegetarian) que, debido a que no están agrupadas en un marco, pueden seleccionarse ambas si es necesario.

Sin embargo, si la persona que realiza la reserva no quiere el almuerzo, no es necesario que sepa si es vegetariano o no. Por lo tanto, la casilla de verificación Vegetariano está atenuada hasta que se solicite.

Hay tres botones de comando (OK, Cancel y Clear Form) cada uno de los cuales realiza una función predefinida cuando se hace clic en él.

Configuración de las propiedades de control:

Control

Type

Property

Setting

UserForm

UserForm

Name

frmCourseBooking

Caption

Course Booking Form

Name

Text Box

Name

txtName

Phone

Text Box

Name

txtPhone

Department

Combo Box

Name

cboDepartment

Course

Combo Box

Name

cboCourse

Level

Frame

Name

fraLevel

Caption

Level

Introduction

Option Button

Name

optIntroduction

Intermediate

Option Button

Name

optIntermediate

Advanced

Option Button

Name

optAdvanced

Lunch Required

Check Box

Name

chkLunch

Vegetarian

Check Box

Name

chkVegetarian

Enabled

False

OK

Command Button

Name

cmdOk

Caption

OK

Default

True

Cancel

Command Button

Name

cmdCancel

Caption

Cancel

Cancel

True

Clear Form

Command Button

Name

cmdClearForm

=== Crear formularios en Excel Si desea crear el formulario usted mismo, simplemente copie el diseño que se muestra en la ilustración anterior. Siga los pasos a continuación:

  1. Abra el libro de trabajo al que desea que pertenezca el formulario (los formularios de usuario, como las macros, deben adjuntarse a un libro de trabajo) y cambie al Editor de Visual Basic.

  2. En el Editor de Visual Basic, haga clic en el botón Insertar formulario de usuario (o vaya a Insertar> Formulario de usuario).

  3. Si la caja de herramientas no aparece por sí sola (primero haga clic en el formulario para asegurarse de que no se oculta), haga clic en el botón Caja de herramientas (o vaya a Ver> Caja de herramientas).

  4. Para colocar un control en el formulario, haga clic en el botón correspondiente en la caja de herramientas y luego haga clic en el formulario. Los controles se pueden mover arrastrándolos por sus bordes o cambiar de tamaño arrastrando los botones alrededor de su perímetro.

  5. Para editar las propiedades de un control, asegúrese de que el control elegido esté seleccionado y luego realice los cambios apropiados en la ventana Propiedades. Si no puede ver la ventana de propiedades, vaya a Ver> Ventana de propiedades.

  6. Para eliminar un control del formulario, selecciónelo y haga clic en la tecla Eliminar en su teclado.

Un UserForm en realidad no hará nada hasta que se cree el código que impulsa el formulario y sus diversos controles. El siguiente paso es escribir el código que impulsa el formulario en sí.

Adición del código: 1 Inicialización del formulario === == Inicialización del formulario:

La mayoría de los formularios necesitan algún tipo de configuración cuando se abren. Esto puede consistir en establecer valores predeterminados, asegurarse de que los campos estén vacíos o crear listas de cuadros combinados. Este proceso se llama Inicializar el formulario y se encarga de una macro llamada UserForm_Initialize (en caso de que esté confundido por mi variante ortografía de la palabra «initialis (z) e», es porque hablo inglés y VBA habla americano, pero no se preocupe, ¡VBA lo deletreará por usted!). Aquí se explica cómo crear el código para inicializar el formulario de reserva de cursos:

  1. Para ver la ventana de código del formulario, vaya a Ver> Código o haga clic en F7.

  2. Cuando la ventana de código se abre por primera vez, contiene un procedimiento UserForm_Click () vacío. Use las listas desplegables en la parte superior de la ventana de código para elegir UserForm e Initialize. Esto creará el procedimiento que necesita. Ahora puede eliminar el procedimiento UserForm_Click ().

  3. Ingrese el siguiente código en el procedimiento:

Private Sub UserForm_Initialize()

txtName.Value = ""

txtPhone.Value = ""

With cboDepartment

.AddItem "Sales"

.AddItem "Marketing"

.AddItem "Administration"

.AddItem "Design"

.AddItem "Advertising"

.AddItem "Dispatch"

.AddItem "Transportation"

End With

cboDepartment.Value = ""

With cboCourse

.AddItem "Access"

.AddItem "Excel"

.AddItem "PowerPoint"

.AddItem "Word"

.AddItem "FrontPage"

End With

cboCourse.Value = ""

optIntroduction = True

chkLunch = False

chkVegetarian = False

txtName.SetFocus

End Sub

Cómo funciona el código de inicialización:

El propósito del procedimiento UserForm_Initialize () es preparar el formulario de usuario en VBA para su uso, estableciendo los valores predeterminados para los diversos controles y creando las listas que mostrarán los cuadros combinados.

Estas líneas establecen el contenido de los dos cuadros de texto en vacío:

txtName.Value = ""

txtPhone.Value = ""

Luego vienen las instrucciones para los cuadros combinados. En primer lugar, se especifica el contenido de la lista, luego el valor inicial del cuadro combinado se establece en vacío.

With cboDepartment

.AddItem "Sales"

.AddItem "Marketing"

(as many as necessary…)

End With

cboDepartment.Value = «»

Si es necesario, se puede hacer una elección inicial del grupo de opciones, en este caso:

optIntroduction = True Ambas casillas de verificación se establecen en False (es decir, sin marcar). Establezca en Verdadero si desea que la casilla de verificación aparezca ya marcada:

chkLunch = False chkVegetarian = False Finalmente, el foco se lleva al primer cuadro de texto. Esto coloca el cursor de los usuarios en el cuadro de texto para que no necesiten hacer clic en el cuadro antes de comenzar a escribir:

txtName.SetFocus === Agregar el código: 2 Hacer que los botones funcionen Hay tres botones de comando en el formulario y cada uno debe ser alimentado por su propio procedimiento. Empezando por los sencillos…

Codificación del botón Cancelar:

Anteriormente, usamos la ventana Propiedades para establecer la propiedad Cancelar del botón Cancelar en Verdadero. Cuando establece la propiedad Cancelar de un botón de comando en Verdadero, esto tiene el efecto de «hacer clic» en ese botón cuando el usuario presiona la tecla Esc en su teclado. Pero esto solo no hará que le suceda nada al formulario. Debe crear el código para el evento de clic del botón que, en este caso, cerrará el formulario. Así es como:

  1. Con el UserForm abierto para editar en el Editor de Visual Basic, haga doble clic en el botón Cancelar. La ventana de código del formulario se abre con el procedimiento cmdCancel_Click () listo para editar.

  2. El código para cerrar un formulario es muy simple. Agregue una línea de código al procedimiento para que se vea así:

Private Sub cmdCancel_Click()

Unload Me

End Sub

Codificación del botón Borrar formulario:

Agregué un botón para borrar el formulario en caso de que el usuario quisiera cambiar de opinión y restablecer todo, y para que fuera más fácil si tenía que hacer varias reservas a la vez. Todo lo que tiene que hacer es ejecutar el procedimiento de inicialización nuevamente. A una macro se le puede decir que ejecute otra macro (o una serie de macros si es necesario) usando la palabra clave Call:

  1. Haga doble clic en el botón Borrar formulario. La ventana de código del formulario se abre con el procedimiento cmdClearForm_Click () listo para editar.

  2. Agregue una línea de código al procedimiento para que se vea así:

Private Sub cmdClearForm_Click()

Call UserForm_Initialize

End Sub

Codificación del botón OK:

Este es el fragmento de código que tiene que hacer el trabajo de transferir las opciones del usuario y la entrada de texto a la hoja de trabajo. Cuando establecemos la propiedad Cancelar del botón Cancelar en True, también establecemos la propiedad predeterminada del botón Aceptar en True. Esto tiene que hacer clic en el botón Aceptar cuando el usuario presiona la tecla Intro (o Retorno) en su teclado (siempre que no haya usado su tecla Tab para pasar a otro botón).

Aquí está el código para que funcione el botón:

  1. Haga doble clic en el botón Aceptar. La ventana de código del formulario se abre con el procedimiento cmdOK_Click () listo para editar.

  2. Edite el procedimiento para agregar el siguiente código:

Private Sub cmdOK_Click()

ActiveWorkbook.Sheets("Course Bookings").Activate

Range("A1").Select

Do

If IsEmpty(ActiveCell) = FalseThen

ActiveCell.Offset(1, 0).Select

End If

Loop Until IsEmpty(ActiveCell) = True

ActiveCell.Value = txtName.Value

ActiveCell.Offset(0, 1) = txtPhone.Value

ActiveCell.Offset(0, 2) = cboDepartment.Value

ActiveCell.Offset(0, 3) = cboCourse.Value

If optIntroduction = True Then

ActiveCell.Offset(0, 4).Value = "Intro"

ElseIf optIntermediate = True Then

ActiveCell.Offset(0, 4).Value = "Intermed"

Else

ActiveCell.Offset(0, 4).Value = "Adv"

End If

If chkLunch = True Then

ActiveCell.Offset(0, 5).Value = "Yes"

Else

ActiveCell.Offset(0, 5).Value = "No"

End If

If chkVegetarian = True Then

ActiveCell.Offset(0, 6).Value = "Yes"

Else

If chkLunch = False Then

ActiveCell.Offset(0, 6).Value = ""

Else

ActiveCell.Offset(0, 6).Value = "No"

End If

End If

Range("A1").Select

End Sub

Cómo funciona el código CmdOK_Click:

Las dos primeras líneas aseguran que el libro de trabajo correcto esté activo y mueve la selección a la celda A1:

ActiveWorkbook.Sheets("Course Bookings").Activate

Range("A1").Select

The next few lines moves the selection down the worksheet until it finds an empty cell:

Do

If IsEmpty(ActiveCell) = False Then

ActiveCell.Offset(1, 0).Select

End If

Loop Until IsEmpty(ActiveCell) = True

Las siguientes cuatro líneas comienzan a escribir el contenido del formulario en la hoja de trabajo, usando la celda activa (que está en la columna A) como referencia y moviendo a lo largo de la fila una celda a la vez:

ActiveCell.Value = txtName.Value

ActiveCell.Offset(0, 1) = txtPhone.Value

ActiveCell.Offset(0, 2) = cboDepartment.Value

ActiveCell.Offset(0, 3) = cboCourse.Value

Ahora llegamos a los botones de opción. Estos se han colocado en un marco en el formulario para que el usuario pueda elegir solo uno. Se utiliza una instrucción IF para indicarle a Excel qué hacer para cada opción:

If optIntroduction = True Then

ActiveCell.Offset(0, 4).Value = "Intro"

ElseIf optIntermediate = True Then

ActiveCell.Offset(0, 4).Value = "Intermed"

Else

ActiveCell.Offset(0, 4).Value = "Adv"

End If

Las declaraciones IF de VBA son mucho más fáciles de administrar que la función IF de Excel.

Puede tener tantas opciones como desee, simplemente inserte un ElseIf adicional para cada una. Si solo hubiera dos opciones, no necesitaría ElseIf, solo el If y Else serían suficientes (no lo olvide, todos necesitan un End If).

Hay otra instrucción IF para cada casilla de verificación. Para la casilla de verificación Se requiere almuerzo, una marca en la casilla significa «Sí», la persona requiere almuerzo, y ninguna marca significa «No», no lo hace.

If chkLunch = True Then

ActiveCell.Offset(0, 5).Value = "Yes"

Else

ActiveCell.Offset(0, 5).Value = "No"

End If

Podríamos usar una declaración IF similar para la casilla de verificación Vegetariano, pero si la persona no requiere almuerzo, es irrelevante si es vegetariana o no. En cualquier caso, sería incorrecto asumir que no eran vegetarianos simplemente porque no necesitaban el almuerzo. Por lo tanto, la instrucción IF contiene una segunda instrucción if anidada:

If chkVegetarian = True Then

ActiveCell.Offset(0, 6).Value = "Yes"

Else

If chkLunch = False Then

ActiveCell.Offset(0, 6).Value = ""

Else

ActiveCell.Offset(0, 6).Value = "No"

End If

End If

Una marca en la casilla significa «Sí», la persona es vegetariana. Si no hay ninguna marca en la casilla, la instrucción IF anidada mira la casilla de verificación Se requiere almuerzo. Si la casilla de verificación Se requiere almuerzo tiene una marca, entonces la ausencia de una marca en la casilla de verificación Vegetariano significa que la persona no es vegetariana, por lo que inserta «No» en la celda. Sin embargo, si la casilla de verificación Se requiere almuerzo no tiene una marca, entonces no sabemos si la persona es vegetariana (no importa de todos modos) por lo que la celda se deja en blanco («»).

Finalmente, la selección se devuelve al principio de la hoja de trabajo, lista para la siguiente entrada:

Rango («A1») Seleccione === Agregar el código 3: Manipulación del formulario Finalmente, un ejemplo de cómo se pueden manipular los controles en un formulario mientras está en uso. Cuando se establecieron las propiedades de control, la propiedad Habilitada de la casilla de verificación Vegetariana se estableció en False. Cuando un control no está habilitado, el usuario no puede ingresar un valor en él, aunque puede contener un valor que ya estaba allí, y VBA puede agregar, eliminar o cambiar el valor.

No necesitamos saber si la persona es vegetariana (¡incluso si lo es!) Si no está pidiendo el almuerzo. Por lo tanto, la casilla de verificación Vegetariana permanece desactivada a menos que se coloque una marca en la casilla de verificación Se requiere almuerzo. Entonces el usuario es libre de marcar la casilla de verificación Vegetariano si así lo desea. Si la marcan sabremos que han respondido «Sí» y si no, sabremos que han respondido «No».

Podemos alternar la propiedad Enabled de False a True mediante un procedimiento que se ejecuta automáticamente cada vez que cambia el valor de la casilla de verificación Lunch Required. Afortunadamente, más controles tienen un procedimiento Change y el que usamos aquí es chkLunch_Change (). Usaremos esto para habilitar la casilla de verificación Vegetariano cuando la casilla de verificación de Almuerzo Requerido esté marcada y la desactivaremos cuando la casilla de verificación de Almuerzo Requerido no esté marcada.

Solo hay una cosa más que debemos hacer. Supongamos que alguien marcó la casilla de verificación Almuerzo requerido y también marcó la casilla Vegetariana. Luego cambiaron de opinión y quitaron la marca de la casilla de verificación Se requiere almuerzo. La casilla de verificación Vegetariana estaría desactivada, pero la marca que se colocó anteriormente permanecería.

Una línea adicional de código puede garantizar que la marca se elimine cuando la casilla está desactivada. Aquí está todo:

Private Sub chkLunch_Change()

If chkLunch = True Then

chkVegetarian.Enabled = True

Else

chkVegetarian.Enabled = False

chkVegetarian = False

End If

End Sub

Abrir el formulario El formulario ahora está listo para usarse, por lo que debe abrirse con una macro simple. Eso se puede adjuntar a un botón de barra de herramientas personalizado, un botón de comando dibujado en la hoja de trabajo o cualquier gráfico (haga clic con el botón derecho en el gráfico y elija Asignar macro). Si es necesario, cree un nuevo módulo para el libro de trabajo y agregue este procedimiento:

Sub OpenCourseBookingForm()

frmCourseBooking.Show

End Sub

Si te gustaron nuestros blogs, compártelo con tus amigos en Facebook. Y también puedes seguirnos en Twitter y Facebook.

Nos encantaría saber de usted, háganos saber cómo podemos mejorar, complementar o innovar nuestro trabajo y hacerlo mejor para usted. Escríbanos a [email protected]