Está en la página 1de 21

DN-0103 Administración de Proyectos y Herramientas para el Análisis de Datos

PRÁCTICA #2: PROGRAMACIÓN EN VBA


FICHA TÉCNICA1
Ejercicio #1: Edición y activación de formularios
a) Genere una macro que despliegue el formulario EvaluacionFrm.
Para generar la macro, lo primero que debe hacerse es insertar un módulo, para lo cual se debe escoger
la opción Módulo de la pestaña Insertar del editor de VBA:

Luego debe abrirse el módulo para desplegar la ventana de Código y escribir las instrucciones
correspondientes para desplegar el formulario:

1
Elaborada por la profesora Alejandra Selva Mora.
b) En la hoja “Evaluaciones”, inserte un botón de comando que ejecute la macro desarrollada en el paso
anterior.
Para insertar un botón en la hoja MS-Excel, debe seleccionar la opción Insertar de la pestaña Desarrollador
/ Programador. Se desplegará una pequeña ventana en la que aparecerán controles, similares a los de los
formularios. De todos ellos, se debe seleccionar el botón de comando:

Mediante el cursor y los movimientos del ratón, debe ubicar el control sobre la celda que desee para que
se despliegue una ventana en la que podrá seleccionar la macro que será asignada al botón. En esta
ventana, deberá escoger la macro generada en el ejercicio anterior y hacer click en el botón Aceptar:
Luego puede editar el texto del botón para que sea más amigable a los usuarios:

c) Ejecute las siguientes instrucciones en el formulario EvaluacionFrm:


o Restrinja el tamaño del control FecEvaluacionTxt para que admita un máximo de 12 caracteres.
o Actualice las propiedades del control Opc40 de manera que se encuentre seleccionado.
o Sustituya las etiquetas de la parte inferior del formulario por dos botones de comando: uno
llamado CalcularBtn con la leyenda “Calcular Puntos” y otro llamado RegistrarBtn con la leyenda
“Registrar Prueba”; este último debe estar deshabilitado.
o Deshabilite los siguientes controles: los cuadros de texto correspondientes al género e ITN actual
del jugador; los marcos que contienen los datos de la profundidad de golpes de fondo, de voleas,
de precisión de golpes de fondo, de saque y de movilidad; y los cuadros de texto correspondientes
al total de golpes, puntuación total y nuevo ITN.

Para cambiar los valores de las propiedades de los controles, debe desplegar la Ventana de Propiedades,
buscar las que desea modificar y cambiar los valores correspondientes:
Ejercicio #2: Interacción de controles
a) Cargue los nombres de los jugadores que se encuentran en la hoja “Jugadores” en el control
JugadorCmb, de manera que puedan ser vistos desde que se despliega el formulario.
Se solicita cargar los nombres de los jugadores al desplegar el formulario, por lo que la macro debe
escribirse en el evento Activate y utilizando el método AddItem. Al buscar los datos correspondientes en
la hoja “Jugadores” se puede verificar que el primero se encuentra en la columna A, por lo que solo se
deben agregar valores en el cuadro combinado mediant4 un algoritmo como el siguiente:

Lenguaje Natural Pseudocódigo


Paso 1: Determinar la última fila con datos de la ult_fila  última_fila_con_datos
hoja “Jugadores”
Paso 2: Añadir los datos en el cuadro JugadorCmb  Jugadores.ColumnaA
combinado

Este algoritmo puede traducirse en el siguiente código de programación:

b) Cargue los nombres de los instructores que se encuentran en la hoja “Evaluadores” de manera que
puedan ser vistos desde que se despliega el formulario, pero considere que solo deben ser incluidos en
el caso de que su certificación no haya vencido.
Igual que en el ejercicio anterior, se solicita que los valores se carguen en el control al desplegar el
formulario, por lo que estas instrucciones también deben ser incluidas en el evento Activate del
formulario. A diferencia del caso anterior, existe una condición específica para incluir los nombres de los
evaluadores: solo deberán aparecer en el cuadro aquéllos cuyo certificado no haya vencido. Analizando
los datos de la hoja “Evaluadores”, se puede observar que la fecha del certificado se encuentra en la
columna C, por lo que debe compararse esa fecha con la fecha del sistema:

Lenguaje Natural Pseudocódigo


Paso 1: Determinar la última fila con datos de la ult_fila  última_fila_con_datos
hoja “Evaluadores”
Paso 2: Si la fecha de caducidad es posterior a If Evaluadores.ColC >= fecha_actual then
la fecha actual
Paso 3: Añadir los datos en el cuadro EvaluadorCmb
combinado  Evaluadores.ColumnaA
Este algoritmo puede traducirse en el siguiente código de programación:

c) Genere una macro que, al seleccionar un jugador, busque su género e ITN actual y los despliegue en
los controles correspondientes.
A continuación, se solicita que, a partir del jugador seleccionado por el usuario, se busque su género y
valor ITN actual en los controles correspondientes del formulario, los cuales son GeneroTxt e
ITNActualTxt. Como el control JugadorCmb es de tipo cuadro combinado, la macro puede ser programada
en el evento Change, de manera que cada vez que se cambie el valor seleccionado se efectúe la búsqueda
y se desplieguen los datos, manteniendo actualizada la información del formulario. A partir de estas
instrucciones, un algoritmo para la programación es el siguiente:

Lenguaje Natural Pseudocódigo


Paso 1: Realizar la búsqueda del jugador en la Buscar el valor de JugadorCmb en
hoja “Jugadores” “Jugadores”
Paso 2: Si se encontró el valor Si valor_encontrado then
Paso 3: Desplegar los datos de género e ITN GeneroTxt  Jugadores.ColumnaC
Actual ITNActualTxt  Jugadores.ColumnaD

Recordando que VBA es un lenguaje orientado a objetos, se puede utilizar el método Find para hacer una
búsqueda de valores (es una alternativa a la búsqueda secuencial que se ha realizado en prácticas
anteriores). Para utilizar este método, debe declararse una variable de memoria de tipo objeto Range, que
es el tipo de datos que representa a las celdas de una hoja Excel. Adicionalmente, se recomienda utilizar
una variable de tipo String en la que se establecerá el rango de celdas en que se efectuará la búsqueda.
Para el caso que se está trabajando, se va a buscar el valor del control JugadorCmb en la columna A de la
hoja “Jugadores”, desde la fila 4 hasta la última fila con valores. Con este objetivo, se debe buscar el valor
de la última fila con datos para generar el rango de valores correspondientes (en este caso, ese valor es
“A4:A26”, donde 26 es la fila con los datos del último jugador registrado).
A partir de este cálculo de valores iniciales, es que se puede utilizar el método Find, el cual requiere del
valor que se está buscando (el contenido del control JugadorCmb) y, opcionalmente, las propiedades de
las celdas en que se buscará dicho valor, las cuales podrían ser2:
o xlValues si la búsqueda solo se hace en la propiedad Value de las celdas;
o xlFormulas si la búsqueda solo se hace en la propiedad Formula de las celdas; o
o xlNotes si la búsqueda solo se hace en la propiedad NoteText de las celdas.
En este caso, la búsqueda solo se realizará en los valores, así que se utilizará la constante xlValues.
Otro aspecto por aclarar al utilizar variables de memoria de tipo objeto es que, cuando se le asignan
valores, debe utilizarse la instrucción Set. Como el método Find devuelve una celda, entonces a la variable
de memoria se le asigna el resultado de la búsqueda (en caso de que el método no encuentre el valor
buscado, el método devuelve el valor Nothing):

De esta forma, solo si el valor resultante de la búsqueda es diferente de Nothing, se asignarán los valores
correspondientes en los controles del formulario. Entonces, el código de programación completo es el
siguiente:

d) Genere una macro que habilite o deshabilite el marco correspondiente a los datos de profundidad de
golpes con base en el valor seleccionado por el usuario para el control ProfGF.
El control ProfGF es de tipo casilla de verificación. Este tipo de controles son booleanos, es decir, sus
valores solo pueden ser Verdadero (cuando está marcado) o Falso. La propiedad Enabled de los controles

2
Para detallar más parámetros del método Find, buscar detalles en https://msdn.microsoft.com/en-us/vba/excel-
vba/articles/range-find-method-excel
también contiene valores booleanos: Verdadero (habilitado para el usuario) o Falso (deshabilitado para el
usuario).
Lo que piden las instrucciones es que el marco correspondiente a los datos de profundidad de golpes, cuyo
nombre es Frame3, se habilite cuando el valor de ProfGF sea verdadero y se deshabilite cuando el valor
de ProfGF sea falso. Esto implica que el valor Enabled del marco deberá ser igual al valor del control
ProfGF. Para lograr el comportamiento esperado, la programación debe realizarse en el evento Click del
control ProfGF, de manera que cada vez que el usuario seleccione cambiar el valor de éste, se habilite o
deshabilite el marco correspondiente de la siguiente forma:

e) Genere una macro que habilite o deshabilite el marco correspondiente a los datos de profundidad de
voleas con base en el valor seleccionado por el usuario para el control ProfVoleas.
Similar al caso anterior:

f) Genere una macro que habilite o deshabilite el marco correspondiente a los datos de precisión de
golpes con base en el valor seleccionado por el usuario para el control PrecGF.
Similar a casos anteriores:

g) Genere una macro que habilite o deshabilite el marco correspondiente a los datos de los saques con
base en el valor seleccionado por el usuario para el control Saque.
Similar a casos anteriores:
h) Genere una macro que habilite o deshabilite el marco correspondiente a los datos de movilidad con
base en el valor seleccionado por el usuario para el control Movilidad.
Similar a casos anteriores:

Ejercicio #3: Procesamiento de datos


a) Genere una macro que se ejecute cuando el usuario presione el botón CalcularBtn y que efectúe lo
siguiente:
o Verificar que se incluyeron datos en los controles correspondientes al nombre del jugador, al
nombre del evaluador, a la fecha de la evaluación y, al menos, que se haya seleccionado una de
las pruebas para calcular los puntos obtenidos. En caso de que algún dato no haya sido incluido,
se deberá desplegar un mensaje de error y deberá finalizar la ejecución de la macro.
o Si no hubo ningún error en las verificaciones anteriores, se calcularán los puntos de la siguiente
forma (considere siempre que una casilla vacía equivale a cero puntos):
 Si el control ProfGF se encuentra seleccionado, el valor del control ProfGFSubtotal deberá
ser la suma de los valores de los controles del ProfGF01 hasta el ProfGF10; el valor del
control ProfGFConsistencia deberá ser la cantidad de controles del ProfGF01 al ProfGF10
cuyos valores sean mayores a cero; y el valor del control ProfGFTotal será la suma de
ProfGFConsistencia más ProfGFSubtotal.
 Si el control ProfVoleas se encuentra seleccionado, el valor del control ProfVSubtotal
deberá ser la suma de los valores de los controles del ProfV01 hasta el ProfV08; el valor
del control ProfVConsistencia deberá ser la cantidad de controles del ProfV01 al ProfV08
cuyos valores sean mayores a cero; y el valor del control ProfVTotal será la suma de
ProfVConsistencia más ProfVSubtotal.
 Si el control PrecGF se encuentra seleccionado, el valor del control PrecGFSubtotal deberá
ser la suma de los valores de los controles del PrecGF01 hasta el PrecGF12; el valor del
control PrecGFConsistencia deberá ser la cantidad de controles del PrecGF01 al PrecGF12
cuyos valores sean mayores a cero; y el valor del control PrecGFTotal será la suma de
PrecGFConsistencia más PrecGFSubtotal.
 Si el control Saque se encuentra seleccionado, el valor del control SaqueSubtotal deberá
ser la suma de los valores de los controles del Saque01 hasta el Saque12; el valor del
control SaqueConsistencia deberá ser la cantidad de controles del Saque01 al Saque12
cuyos valores sean mayores a cero; y el valor del control SaqueTotal será la suma de
SaqueConsistencia más SaqueSubtotal.
 Si el control Movilidad se encuentra seleccionado, el valor del control MovilidadTxt
corresponderá al total de puntos obtenidos con base en la tabla llamada “Puntuación por
Movilidad” que se encuentra en la hoja Puntuaciones del archivo.
 El valor del control TotalGolpesTxt debe ser la suma de ProfGFTotal, ProfVTotal,
PrecGFTotal y SaqueTotal.
 El valor del control PuntosTxt debe ser la suma de TotalGolpesTxt y MovilidadTxt.
 El valor del control NuevoITNTxt se calcula a partir de los puntos obtenidos (PuntosTxt) y
el género del jugador, con base en la tabla llamada “Categorías ITN” que se encuentra en
la hoja Puntuaciones del archivo.
 Por último, se debe habilitar el control RegistrarBtn.

Inicialmente, debe determinarse en el evento de cuál objeto debe generarse la macro: como se indica que
al presionar el botón CalcularBtn, lo cual ayuda a la escogencia del evento Click del control CalcularBtn.
La primera consideración consiste en verificar que se hayan incluido datos en los controles
correspondientes al jugador, al evaluador y a la fecha de la prueba, así como que se haya escogido alguna
prueba por registrar (si no se escogió ninguna prueba, no tiene sentido hacer cálculos porque no hay
resultados). Para los tres primeros valores, esta validación se hace comparando los contenidos de los
controles con la constante vbNullString; para las casillas de verificación, la validación consiste en verificar
que, al menos una de ellas se encuentre seleccionada (es decir, su valor es True).
Solo en el caso de que se haya incluido toda la información antes mencionada es que se debe proceder a
realizar los cálculos de los puntos por pruebas y de la suma total de golpes efectuados. Por último, se
obtienen los resultados globales para obtener la puntuación final e indicar la nueva categoría ITN. De esta
forma, el algoritmo de solución puede expresarse de la siguiente forma:

Lenguaje Natural Pseudocódigo


Paso 1: Si falta incluir algún dato Si JugadorCmb = vacío OR
EvaluadorCmb = vacío OR
FechaTxt = vacío OR
ninguna_prueba_seleccionada
Paso 1.1: Desplegar mensaje de error MsgBox “Falta información”

Paso 2: Si se incluyeron todos los datos Else


Paso 3: Si se seleccionó la profundidad de Si ProfGF then
golpes de fondo
Paso 3.1: Se calcula el subtotal sumando los subtotal  suma de los valores
golpes numéricos de cada golpe
Paso 3.2: Se calcula la consistencia contando los consistencia  cantidad de golpes
golpes efectivos con puntaje > 0
Paso 3.3: Se calcula el total sumando el subtotal total  subtotal + consistencia
con la consistencia
Paso 3.4: Se suman los puntos de esta prueba al suma_golpes  suma_golpes + total
total de golpes
Paso 4: Si se seleccionó la profundidad de Si ProfVoleas then
voleas
Paso 4.1: Se calcula el subtotal sumando los subtotal  suma de los valores
golpes numéricos de cada golpe
Paso 4.2: Se calcula la consistencia contando los consistencia  cantidad de golpes
golpes efectivos con puntaje > 0
Paso 4.3: Se calcula el total sumando el subtotal total  subtotal + consistencia
con la consistencia
Paso 4.4: Se suman los puntos de esta prueba al suma_golpes  suma_golpes + total
total de golpes

Paso 5: Si se seleccionó la precisión de golpes Si PrecGF then


de fondo
Paso 5.1: Se calcula el subtotal sumando los subtotal  suma de los valores
golpes numéricos de cada golpe
Paso 5.2: Se calcula la consistencia contando los consistencia  cantidad de golpes
golpes efectivos con puntaje > 0
Paso 5.3: Se calcula el total sumando el subtotal total  subtotal + consistencia
con la consistencia
Paso 5.4: Se suman los puntos de esta prueba al suma_golpes  suma_golpes + total
total de golpes
Paso 6: Si se seleccionó la prueba de saques Si Saque then

Paso 6.1: Se calcula el subtotal sumando los subtotal  suma de los valores
golpes numéricos de cada golpe
Paso 6.2: Se calcula la consistencia contando los consistencia  cantidad de golpes
golpes efectivos con puntaje > 0
Paso 6.3: Se calcula el total sumando el subtotal total  subtotal + consistencia
con la consistencia
Paso 6.4: Se suman los puntos de esta prueba al suma_golpes  suma_golpes + total
total de golpes
Paso 7: Si se seleccionó la prueba de Si Movilidad then
movilidad
Paso 7.1: Verificar cuántos segundos se Si Opc40 then
registraron para terminar la prueba MovilidadTxt  Range(“C4”).Value
Si no, si Opc39 then
Obtener los puntos correspondientes MovilidadTxt  Range(“C5”).Value
a ese tiempo con base en la tabla Si no, si Opc38 then
Puntuación por Movilidad que se
MovilidadTxt  Range(“C6”).Value…
encuentra en el archivo

Paso 8: Se suma el total de golpes TotalGolpesTxt  suma_golpes

Paso 9: Se calcula el total de puntos PuntosTxt  TotalGolpesTxt +


MovilidadTxt
Paso 10: Si el género del jugador es Si GeneroTxt = “Femenino” then
“Femenino”
Paso 10.1: Se compara la cantidad de puntos con Si PuntosTxt >= 57 AND PuntosTxt <= 79
los rangos femeninos establecidos en Then
la tabla Categorías ITN que se
ITNActualTxt = “ITN 10”
encuentra en el archivo para obtener
la categoría final Si no, si PuntosTxt >= 109 AND PuntosTxt
<= 140
ITNActualTxt = “ITN 9”....

Paso 11: Si no (el género del jugador es Else


“Masculino”)
Paso 11.1: Se compara la cantidad de puntos con Si PuntosTxt >= 75 AND PuntosTxt <= 104
los rangos masculinos establecidos en Then
la tabla Categorías ITN que se
ITNActualTxt = “ITN 10”
encuentra en el archivo para obtener
la categoría final Si no, si PuntosTxt >= 105 AND PuntosTxt
<= 139
ITNActualTxt = “ITN 9”…

Paso 13: Habilitar botón para el registro de los RegistrarBtn.Enabled  True


datos

Para resolver los pasos #1 y #2, puede utilizarse un único condicional que revise que se hayan incluido
todos los valores requeridos, o bien, puede hacerse una revisión control por control. Este último caso
permite generar mensajes de error muy específicos que guían al usuario exactamente al punto que
necesita corregir. Desarrollándolo de esta forma, el código de programación sería el siguiente:
Nótese que la sentencia Else es la que permite que solo se efectúen los cálculos si no hay información
faltante. Si se omitiera esta sentencia (cerrando la estructura condicional), la macro efectuaría la
validación, pero continuaría efectuando los cálculos.
El paso #3 consiste en verificar si se seleccionó la prueba de profundidad de golpes (mediante el valor del
control ProfGF), en cuyo caso se deberán sumar los valores de los controles ProfGF01 hasta ProfGF10.
Debe considerarse que, como cualquier cuadro de texto, su contenido es de tipo texto o String, por lo que
para realizar la suma es recomendable convertir los contenidos en valores numéricos mediante el uso de
la función Val:

Otra consideración es que, para obtener la puntuación por consistencia, se cuentan los controles cuya
puntuación sea mayor a cero. Para desarrollar este cálculo, se puede utilizar una variable de memoria en
que se registre la cantidad de controles que cumplan con dicha condición. Para finalizar los cálculos de
esta prueba, se suman la consistencia y el subtotal de golpes para obtener los puntos resultantes y, en
otra variable de memoria, se guarda esta información para obtener, posteriormente, el resultado final de
todas las pruebas. De esta forma, el código de programación completo sería el siguiente:
De forma muy similar al paso #3 es que se desarrolla el código correspondiente a los pasos #4, #5 y #6,
con las dos consideraciones siguientes:
i. Se debe reinicializar en cero la variable de memoria que cuenta la cantidad de golpes con
puntuación mayor a cero (para no volver a contar los registros de pruebas anteriores); y
ii. Para no perder la puntuación de la prueba anterior que permitirá calcular el resultado final,
debe actualizarse su valor de la siguiente forma:
De esta forma, las instrucciones para los pasos #4, #5 y #6 son las siguientes:
Para el paso #7, se debe trabajar de forma diferente dado que lo que se tiene son controles de tipo botón
de opción. Esto significa que el usuario solo puede haber seleccionado uno de ellos, por lo que se debe
hacer es verificar cuál fue seleccionado y, a partir de ello, se asignan los puntos con base en la tabla
Puntuación por Movilidad que se encuentra en la hoja “Puntuaciones” del archivo (por lo que debe ser
activada) mediante el uso de estructuras de programación condicionales, de la siguiente forma:
Nótese que, en caso de que no se haya seleccionado la prueba de movilidad, se le asigna una puntuación
de cero con el fin de no perjudicar los resultados finales de la prueba, que incluyen ese dato.
Los pasos #8 y #9 consisten en obtener los resultados de puntuación a partir de los cálculos anteriores:

Los pasos #10 y #11 consisten en comparar el total de puntos obtenidos por el jugador con la tabla de
categorías que se encuentra en la hoja “Puntuaciones” del archivo, según la puntuación obtenida y el
género, para lo cual también se utilizan estructuras de programación condicionales.
Para hacer la revisión en el caso de jugadoras femeninas, se procede de la siguiente forma:
En el caso de los jugadores masculinos, el trabajo es similar al anterior, actualizando los valores de los
rangos para cada categoría:

Para finalizar el cálculo de las puntuaciones, solo falta habilitar el control RegistrarBtn, de la siguiente
forma:
b) Genere una macro que se ejecute cuando el usuario presione el botón RegistrarBtn y que efectúe lo
siguiente:
o Guardar los datos en la primera fila disponible de la hoja “Evaluaciones”, considerando que solo
debe guardar la información de cada tipo de prueba cuando la casilla correspondiente del
formulario se encuentra seleccionada.
o Actualizar el valor del ITN del jugador evaluado en la hoja “Jugadores”.
o Salvar el archivo.
o Desplegar un mensaje que indique que la evaluación se registró exitosamente.
o Cerrar el formulario.

Para que esta macro se ejecute al presionar el botón RegistrarBtn, debe ser programada en el evento Click
de dicho control. El algoritmo correspondiente al registro de evaluaciones es el siguiente:

Lenguaje Natural Pseudocódigo


Paso 1: Determinar la primera fila vacía de la fila  última_fila_con_datos + 1
hoja “Evaluaciones”
Paso 2: Escribir los datos generales en las celda(A+fila)  JugadorCmb
columnas correspondientes celda(B+fila)  GeneroTxt
celda(C+fila)  EvaluadorCmb
celda(D+fila)  FechaTxt
Paso 3: Si se seleccionó la profundidad de Si ProfGF then
golpes de fondo
Paso 3.1: Escribir puntuación de la prueba celda(E+fila)  ProfGFTotal

Paso 4: Si se seleccionó la profundidad de Si ProfVoleas then


voleas
Paso 4.1: Escribir puntuación de la prueba celda(F+fila)  ProfVTotal

Paso 5: Si se seleccionó la precisión de golpes Si PrecGF then


de fondo
Paso 5.1: Escribir puntuación de la prueba celda(G+fila)  PrecGFTotal

Paso 6: Si se seleccionaron los saques Si Saque then

Paso 6.1: Escribir puntuación de la prueba celda(H+fila)  SaqueTotal


Paso 7: Escribir los datos de los resultados celda(I+fila)  TotalGolpesTxt
obtenidos celda(J+fila)  MovilidadTxt
celda(K+fila)  PuntosTxt
celda(L+fila)  ITNActualTxt
Paso 8: Actualizar la categoría ITN del jugador Jugadores.ColumnaD  ITNActualTxt
en la hoja “Jugadores”
Paso 5: Salvar el archivo de trabajo ThisWorkBook.Save

Paso 6: Desplegar mensaje de aviso de que se MsgBox “Registro exitoso de la


registró la evaluación evaluación.”
Paso 7: Cerrar el formulario Unload Me

Para registrar los datos, debe siempre considerarse que:


 Los valores numéricos provenientes de cuadros de texto deben ser convertidos en números mediante
la función Val antes de escribirlos en la hoja Excel.
 Para actualizar el nuevo valor ITN del jugador, puede utilizarse el método Find de la siguiente forma:
se busca el nombre del jugador y, al encontrar el registro correspondiente, se utiliza la propiedad Row
para determinar la fila en que debe actualizarse el valor ITN para la columna D (esto se hace en la hoja
“Jugadores”).

De esta forma, el código de programación para la macro es el siguiente:

También podría gustarte