Transcription
En este curso estamos viendo el lenguaje BBVA o Visual Basic para Aplicaciones, y este es un lenguaje de programación. El concepto que tenemos que tener muy claro y máximo es el concepto de programación estructurada: qué es y cómo lo hacemos.
Otro concepto también muy importante, ya que se va a estar utilizando constantemente en macros, es el concepto de bucles o de ciclos. Y hablando de ciclos o bucles, en este video vamos a ver la instrucción `For Next`, que es un bucle que nos va a ayudar a repetir una instrucción N cantidad de veces. Y ojo, esta instrucción `For Next` es muy diferente a la instrucción `ForEach Next`. Si bien también es un ciclo, se maneja de manera diferente. Vamos a ver de qué estamos hablando.
La premisa de la programación estructurada es que un segmento de código debe tener un punto de entrada y un punto de salida, es decir, uno y un final. Recuerda que cuando vimos la instrucción `If`, comenzamos con `If` y terminamos con `End If`. Y aquí estamos haciendo una entrada y una salida de una estructura. Y antes de continuar, quiero dar paso a mi amigo Andrés Rojas Moncada, del canal Excel Hecho Fácil, que nos va a explicar de manera muy sencilla qué es la programación estructurada. Vamos, Andrés.
Aquí es importante evitar el código donde veamos la instrucción `GoTo`. Puede ser que navegando en internet descargues macros en donde veas esta instrucción `GoTo`, y solo una cosa te voy a decir: no uses código en donde venga esta instrucción. Usar `GoTo` solo cuando deseamos controlar errores. Esto lo vamos a ver en temas posteriores. Si tú descargas código y por ahí ves que tenemos `GoTo` en varias ocasiones, ese código tíralo. Realmente este código no nos sirve. ¿Esto por qué? Porque tenemos que evitar el código espagueti. Mucha gente actualmente lo sigue utilizando, y espero realmente que no se sientan ofendidos, pero utilizar `GoTo` en el código ya no se usa. Por favor, no lo usen. La programación estructurada nos permite tener código fácil de leer y entender.
Bucles o ciclos en programación. Un bucle es una secuencia que se repite N cantidad de veces. Y cuando hablamos de bucles o de ciclos, estos se pueden repetir hasta que llegue el número final. Por ejemplo, si le decimos que se repita de 1 hasta 10, que se repita 10 veces, o hasta que se cumpla una condición. Los bucles más utilizados, y vamos a ver por supuesto en este curso, es el bucle o la instrucción `For Next`, que es la que vamos a ver en este video, la clase número 23. También, después en otro video, vamos a ver el ciclo `Do While` y el ciclo `Do Until`. Ahorita no es necesario explicar de qué se trata, lo vamos a ver en videos posteriores.
Vamos a ver entonces en este video ejemplos utilizando el bucle `For Next`. Vamos a trabajar sobre este archivo del capítulo número 23. Nos vamos a la ficha Programador, Visual Basic. En la parte izquierda tenemos el módulo que se llama "Bucle For Next". Vamos a ver una macro muy sencilla en donde vamos a ver de manera simple el uso del bucle `For Next`, y posteriormente vamos a ver un ejemplo más elaborado y más aplicable a la realidad.
Bien, vamos a crear una macro que le vamos a poner "BucleFor". Y vamos a declarar inicialmente una variable `Dim i`. Así, cuando utilizamos el ciclo `For Next`, regularmente utilizamos la variable `i` de iteración, o también algunos utilizan la variable contador. Yo regularmente utilizo la variable `i`. Vamos a ver. Si ustedes quieren hacer un ciclo, vamos a crear un ciclo `For Next` en donde repitamos una macro 5 veces. Aquí es en donde entran los ciclos o los bucles.
Bien, la sintaxis de `For Next` es: inicialmente la palabra reservada `For`, posteriormente la variable del contador, que quedamos que era la variable `i`, igual a, vamos a decirle desde dónde hasta dónde, termina dónde inicia, dónde termina. Inicia en 1 `To` o hasta 5. Quiero que se repita de 1 a 5 veces. Y posteriormente cerramos con `Next`. Y a esto nos referimos con programación estructurada: tenemos una entrada y tenemos aquí un cierre. Esta estructura es fácil de leer.
Ahora, lo que pongamos aquí en esta línea lo vamos a repetir cinco veces. Y por ejemplo, en la primera vez que se ejecuta, la variable `i`, ¿cuánto creen que va a valer? Uno. Exactamente. En la siguiente vuelta, ¿cuánto creen que va a valer `i`? Y va a valer 2, hasta que llegue al 5. Entonces, escribo `MsgBox`. Voy a poner un mensaje que diga "El valor del contador i es: " y esto lo vamos a concatenar con la variable `i` o el contador.
Vamos a ver cómo funciona esta macro. La corro. "El valor del contador i es: 1". Aceptar. Ahora es 2, 3, 4 y 5. Como le dijimos que el ciclo sea de 1 a 5, esta línea de código se ejecutó en cinco ocasiones. Y conforme se ejecutó en el ciclo, la variable `i` fue cambiando su valor.
Vamos a ver ahora otro ejemplo en donde vamos a insertar una nueva hoja, una hoja en blanco, y vamos a crear un índice con los nombres de las hojas que tenemos aquí. Y como no requerimos saber cuántas hojas son, porque esa cantidad la vamos a obtener de una propiedad, entonces aquí yo puedo tener esas cuatro hojas o las que yo quiera. El ciclo se va a ejecutar de uno hasta la última hoja o el total de hojas. Aquí se inserta una nueva hoja, la hoja se va a insertar al inicio, y aquí se van a poner los nombres de todas las hojas. Eso lo haremos con una macro. Entonces, vamos a mover esto acá y listo.
Creamos la macro. Voy a crear una macro que le vamos a poner "CrearIndice". Y voy a presionar este botón para que se muestre solamente esta macro. Bien, vamos a crear algunas variables. Voy a declarar la variable `hoja` de tipo `Worksheet` o de tipo hoja. Esta variable me va a guardar la hoja nueva, la hoja que se inserte. Después, la variable `cantidadHojas`, esta variable me va a guardar el número de hojas que tenga este archivo. Después, vamos a declarar la variable `i`, que es la variable del contador, de tipo `Integer` o de tipo integer. Y después declaramos las variables `nuevoNombre` y `respuesta`, estas variables van a quedar de tipo `Variant`.
El primer paso es insertar una nueva hoja, y esa nueva hoja se va a insertar antes de la primera hoja. Aquí le decimos `ThisWorkbook.Sheets.Add`. Después, el método `Add`, y después le decimos `Before`, es decir, antes de `Sheets(1)`, queremos que se añada una nueva hoja antes de la hoja 1. La hoja 1 es "Excel e Info", la hoja con el índice 1. Ahora vamos a utilizar la instrucción `Set` para decirle `hoja = Application.ActiveSheet`. Recuerden que al utilizar `Set`, estamos añadiendo este objeto a esta variable. Y qué objeto es, el objeto `ActiveSheet` o la hoja activa. Y cuál es la hoja que se añadió.
Ahora utilizamos la instrucción `With`, que es algo que vimos en otro video. `hoja.Range("A1")`. Aquí vamos a trabajar con la instrucción `With`. Recordemos que si yo pongo aquí el punto, es para evitar escribir otra vez `hoja.Range`. Aquí le decimos `Value = "Índice"`, y después `Font.Bold = True`. La hoja es aquí, la hoja activa, la hoja que se añadió, la hoja que se insertó en el rango A1, le ponemos el valor "Índice", y ese mismo rango A1 lo ponemos aquí en negritas.
Ahora, la variable `cantidadHojas`, y esa variable nos va a guardar el valor de `ThisWorkbook.Sheets.Count`, la propiedad `Count`, el conteo de hojas de este archivo se va a guardar en la variable `cantidadHojas`. Y ahora sí, vamos a utilizar el ciclo `For`. Le decimos `For i = 1 To`. Al decirle 1 hasta, le vamos a decir de 1 hasta la última hoja. Y como yo no sé cuántas hojas tiene ese archivo, pero sí sé que esa cantidad está guardada en una variable que es `cantidadHojas`, entonces de 1 hasta `cantidadHojas`, `Next i`. Y este `For` se va a ejecutar de 1 hasta la cantidad de hojas o el número de cantidad de hojas que tengamos en el archivo.
Ahora le vamos a decir `hoja`, ¿qué hoja? Quedamos que es la hoja que se insertó. `hoja.Range("A1").Offset(i, 0)`. Esta propiedad la vimos en los videos iniciales de este curso, que nos va a ayudar a desplazarnos filas hacia abajo o hacia arriba y columnas hacia la derecha o hacia la izquierda. Entonces, yo quiero que del rango A1, utilizando la propiedad `Offset`, nos movemos una fila hacia abajo. Y por qué una, porque una fila hacia abajo va a ser el nombre de la primera hoja. Entonces, en lugar de que yo lo ponga al 1, le voy a poner la `i`, porque es el contador. Entonces, cuando se recorre una vez, `i` vale 1. Cuando se recorre otra vez, `i` vale 2. Entonces, dos filas hacia abajo quiero que aparezca el nombre de la segunda hoja, pero quiero moverme 0 columnas. Cierro paréntesis. `Value = Sheets(i).Name`. Bien, para que no se confundan, haremos lo siguiente: en la hoja que se inserte, aquí se le pone el valor del índice con `For`, y con `Offset` de A1, recorremos una fila hacia abajo y le ponemos el nombre de la primera hoja. Después, en el siguiente recorrido de `For`, el nombre de la siguiente hoja, después el nombre de la siguiente hoja, y así hasta llegar al último nombre que es "Hoja 4". Cuando lleguemos al último nombre que sería `cantidadHojas`, en ese momento termina el ciclo. Y aquí se pondrían los nombres de las hojas.
Y una vez que recorrimos de 1 hasta la última hoja, vamos a mostrar un mensaje en donde le preguntemos al usuario si queremos asignarle un nombre a la hoja que se insertó. Entonces, vamos a recordar lo que vimos en videos anteriores, que es `MsgBox`. Un mensaje en donde vamos a preguntarle al usuario lo siguiente: "¿Desea asignarle nombre a la hoja nueva?". Que es a la hoja que se insertó. Ahora quiero mostrar el botón que sea `vbYesNoCancel`, porque queremos que se muestre el botón que diga "Sí", "No" o "Cancelar". Entonces, aquí elegimos `vbYesNoCancel`, el signo de más, queremos que se muestre el icono `vbQuestion` o de pregunta, coma, y el título de esta ventana o el título de este mensaje: "Excel e Info". Aquí en esta línea, a la variable `respuesta` le vamos a guardar el resultado del botón presionado, el botón "Sí", el botón "No" o el botón "Cancelar". Esto lo vimos en un video en donde explicamos a fondo la instrucción o la función `MsgBox`.
Bien, ahora vamos a evaluar si se presionó cuál de los tres botones y depende de la respuesta realizamos una acción. Aquí le decimos `If respuesta = vbYes Then`. Es decir, si se presiona el botón "Sí", `Then` o entonces, aquí le vamos a decir `Application.Dialogs(xlDialogWorkbookName).Show`. La propiedad `Dialogs` o `Dialogs`, abro paréntesis, aquí vamos a mostrar un diálogo o un cuadro de diálogo de los que ya tiene Excel por defecto, no hay que crearlo. Del tercero podemos llamar cuadro de diálogo que ya use Excel. ¿Cuál utilizamos? El que se llama `xlDialogWorkbookName`, es decir, nombre de hoja, o el diálogo, el cuadro de diálogo de nombre de hoja. Cierro paréntesis, punto y el método `Show`, es decir, mostrar el cuadro de diálogo para cambiarle el nombre a la hoja activa. `Else`. Aquí le ponemos un comentario y simplemente le ponemos nada. Como no se presiona el botón que sí, realmente no hacemos nada, pero le dejamos un comentario. Y recuerden siempre que se abre una estructura, se cierra. Aquí se abrió el `If` y lo cerramos aquí con `End If`. Y termina la macro.
Ahora vamos a recorrer esta macro paso por paso e ir viendo lo que se va haciendo línea por línea. Bien, vamos a correr la macro paso por paso. Va a ser con la tecla F8. Nos vamos a depuración, paso a paso por instrucciones. La línea que está sombreada en amarillo es la línea que se va a ejecutar cuando presionemos F8. Entonces, F8. Aquí estamos añadiendo una hoja antes de la hoja con índice 1. F8. Listo. Aquí insertamos la hoja, que es la hoja 13. F8. Aquí a la variable `hoja` le guardamos el objeto `ActiveSheet` o hoja activa. Al rango A1 de la hoja o de la hoja activa le vamos a poner "Índice". F8. Y ahí está el texto "Índice". Ahora le ponemos negrita a ese texto. Listo. Ahí está.
Ahora, `cantidadHojas` va a ser igual a el conteo de hojas del archivo. Presiono F8. Y vean, si yo pongo el cursor sobre `cantidadHojas`, me dice que `cantidadHojas` es igual a 8. Yo no necesité contar las hojas porque la propiedad `Count` me va a decir cuántas hojas tenemos en el archivo. Entonces, aquí va a ser 8, y el ciclo `For` va a recorrer de 1 hasta 8. Esta línea se va a ejecutar 8 veces, que es la cantidad de hojas. Presiono F8. Bien. Si yo me pongo sobre la variable `i`, vean que `i` vale 1. Aquí, del rango A1, una fila hacia abajo con `Offset`, va a ser igual a `Sheets(1).Name`. Presiono F8. Y aquí vemos "Hoja 13", que es la hoja activa. F8. Ahora, si me pongo sobre la variable `i`, vemos que ahora `i` vale 2. Entonces, de A1, dos filas hacia abajo, que es la fila número 3, se va a poner el nombre de la hoja 2. Presiono F8 varias ocasiones y vean como en la parte izquierda se van poniendo los nombres de todas las hojas. Presiono F8, F8. Y aquí ya salimos del ciclo `For`.
Ahora estamos en el `MsgBox` en donde le preguntamos si queremos asignarle un nombre a la hoja. Presiona F8. Y aquí nos muestra "¿Desea asignarle nombre a la hoja nueva?". Le decimos que sí. Ahora evaluamos si `respuesta` es igual a `vbYes`. Entonces, presiono F8. Como yo presioné que sí, se va a esta línea en donde mostramos el cuadro de diálogo para nombre de la hoja y `Show` para mostrar. F8. Y aquí se muestra este cuadro de diálogo. Este es un cuadro de diálogo propio de Excel que lo mandamos llamar desde macros. Entonces, le ponemos a la hoja "Índice". Aceptar. Y fíjense bien que la hoja nueva ya tiene el valor de "Índice". `End If`. Cerramos el ciclo `If`. F8, F8. Y la macro termina.
Puedo creer que esta macro haya sido algo complicada, sin embargo, los temas que vimos en esta macro ya los hemos visto en videos anteriores de este curso. Es por lo que es importante que estemos llevando la secuencia, porque conforme vamos viendo más temas, los voy integrando en los ejemplos que vamos viendo. Y si algún tema no nos queda claro, entonces podemos perdernos. Es por eso que mi recomendación es: veas los videos anteriores para que esto lo entendamos sin problemas.
Si el video te gustó, por favor, regálame un like, comparte este video y el curso en tus redes sociales, suscríbete a este canal si no lo has hecho y activa la campanita si quieres que YouTube te avise cuando publique un nuevo video. Y sobre todo, practica. Mi nombre es Sergio. ¡Hasta la próxima!