Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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:
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:
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:
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:
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:
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:
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
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: