20
Cómo hacer que un macro se repita EL BUCLE DO Un bucle Do… cuenta las filas de un grupo de datos siempre que no haya ninguna fila vacía. Suponga que desea contar el número de filas de un grupo de datos que a veces es pequeño y otras extraordinariamente grande. Quiere utilizar un bucle Do…. Este tipo de bucle realiza una acción tantas veces como sea necesario. Contaría el número de filas que encontrara en el conjunto de datos. O suponga que desea realizar una acción en dos grupos de datos que contienen un número diferente de filas. También utilizaría un bucle Do…. El bucle se ejecutaría tantas veces como fuera necesario para los dos grupos de datos. ¿Cómo sabe el bucle lo que es necesario? Usted se lo indica. El bucle deja de ejecutarse cuando encuentra un segmento de datos específico, como una línea en blanco o un determinado texto. Para especificar cuándo debe parar el bucle Do…, se utiliza la condición While o la condición Until. El bucle se ejecuta mientras se cumplan determinadas condiciones o hasta que se cumpla una determinada condición. Por tanto, para que un bucle se detenga cuando encuentre una celda en

Creacion de Bucles Para Macros en Excel

Embed Size (px)

Citation preview

Page 1: Creacion de Bucles Para Macros en Excel

 Cómo hacer que un macro se repita

EL BUCLE DO

Un bucle Do… cuenta las filas de un grupo de datos siempre que no haya ninguna fila vacía.

Suponga que desea contar el número de filas de un grupo de datos que a veces es pequeño y otras extraordinariamente grande. Quiere utilizar un bucle Do…. Este tipo de bucle realiza una acción tantas veces como sea necesario. Contaría el número de filas que encontrara en el conjunto de datos. O suponga que desea realizar una acción en dos grupos de datos que contienen un número diferente de filas. También utilizaría un bucle Do…. El bucle se ejecutaría tantas veces como fuera necesario para los dos grupos de datos. ¿Cómo sabe el bucle lo que es necesario? Usted se lo indica. El bucle deja de ejecutarse cuando encuentra un segmento de datos específico, como una línea en blanco o un determinado texto.

Para especificar cuándo debe parar el bucle Do…, se utiliza la condición While o la condición Until. El bucle se ejecuta mientras se cumplan determinadas condiciones o hasta que se cumpla una determinada condición. Por tanto, para que un bucle se detenga cuando encuentre una celda en blanco en la primera columna, utilizaría una condición While como la siguiente:

Aquí se utiliza la condición While para que el bucle se ejecute mientras la celda en la que trabaja no esté en blanco. La celda en la que el bucle trabaja es x, y (x,1) es la primera celda de esa fila. Utilizados juntos, los signos <> significan "no es igual". Las comillas con nada en medio indican una celda en blanco.

Si quisiera que el bucle se ejecutara hasta que encontrara una celda con el número 365, utilizará la condición Until. De esa forma, le indicaría al bucle cuándo debe parar.

Page 2: Creacion de Bucles Para Macros en Excel

BUCLE FOR EACH

Un bucle For Each…Next permite que la palabra "Aceptar" aparezca más oscura que otro texto, en cualquier lugar de una selección.

Utilizaría el bucle For Each…Next para realizar una acción en cada celda de un grupo de datos. Suponga, por ejemplo, que desea que la palabra "Aceptar" aparezca más oscura que el resto del texto en cualquier lugar del grupo de datos seleccionado. El código sería similar al siguiente:

"MyCell" indica cualquier celda en la que trabaje el bucle, y "For Each" indica que el bucle actuará sobre todas las celdas de la selección. Si el bucle encuentra una celda que contiene la palabra "Aceptar", la mostrará más oscura. (La apariencia del texto se controla mediante la propiedad Font, y la propiedad Bold indica un texto más oscuro.)

Page 3: Creacion de Bucles Para Macros en Excel

Los bucles Do… y For Each…Next son eficaces aunque simples. Ahora vamos a complicar un poco las cosas introduciendo bucles anidados. Los bucles anidados se utilizan cuando hay que realizar una acción en un grupo de datos varias veces, o a través de varios grupos de datos. Para establecer una analogía con los bucles anidados, considere el movimiento de traslación de la Tierra. Una vuelta completa alrededor del Sol, un año, es similar al bucle exterior, y el movimiento de rotación de la Tierra en torno a su eje es similar al bucle interior anidado dentro del bucle exterior. Cada año se producen 365 bucles interiores, y el bucle exterior se repite cada primero de enero:

Es cierto que este código no se ejecutaría en Excel, pero ilustra el hecho de que para cada gran bucle (alrededor del Sol) hay 365 bucles más pequeños (alrededor del eje de la Tierra).

Considere también un proceso que sí que se ejecutaría en Excel. Suponga que desea quitar las filas duplicadas de una hoja de cálculo. Podría comparar la primera fila con todas las demás, buscar los duplicados y eliminarlas. A continuación, compararía la segunda fila con todas las demás, y así una y otra vez. El bucle exterior permitiría que el bucle se repitiera para cada fila, y el bucle interior realizaría la tarea de comparar y eliminar.

En la siguiente lección veremos exactamente cómo se realiza esta operación

EJEMPLO 1

Page 4: Creacion de Bucles Para Macros en Excel

Con esta macro, podría combinar valores de dos columnas en una tercera columna, con un espacio en medio. En los datos de la práctica, las columnas que se van a combinar son First Name, Last Name y Full Name, como se muestra en la ilustración. Tal vez esté pensando "Esto lo podría hacer con una fórmula. ¿Para qué necesito una macro?", y estaría en lo cierto. Puede hacer muchas cosas en Excel con fórmulas, y este proceso parece ser el candidato ideal para una fórmula. Sin embargo, también sirve para explicar cómo funciona un bucle Do… y qué se puede hacer con este tipo de bucle.

En este ejemplo, el primer nombre y el apellido se copian en la columna Full Name (nombre completo) con un espacio en medio. Esta operación se realiza mientras el valor de Cells(x,3) no esté en blanco. La variable x se utiliza para controlar el número de fila actual y, cuando x aumenta, la operación continúa en la fila siguiente. Las columnas se especifican mediante los valores constantes 3, 4 y 5, que representan las columnas C, D y E, respectivamente.

Sugerencia    Preste especial atención al texto comentado en verde cuando intente comprender el funcionamiento de estas macros de VBA. Cuando trabaje con el Editor de Visual Basic, podrá insertar más comentarios escribiendo un apóstrofo al principio de una nueva línea. VBA omite esa línea cuando ejecuta la macro.

Page 5: Creacion de Bucles Para Macros en Excel

EJEMPLO 2

Con esta macro, podría definir los colores de fondo de las celdas del rango seleccionado. El fondo será rojo si la celda contiene la palabra "book" (libro), verde si contiene la palabra "movie" (película), azul si contiene otro valor y claro si la celda está en blanco.

Este proceso se podría realizar mediante la característica Formato condicional, pero este ejemplo de código muestra cómo operar en todas las celdas de un rango seleccionado con un bucle.

"MyCell" es una variable que controla la celda en la que actúa el bucle. Los asteriscos del ejemplo de código permiten que el código busque el texto especificado cuando está integrado en otro texto. Como se muestra en la ilustración, este código no busca sólo el texto que empieza por mayúsculas. Encuentra "Book" y "Read the book". Para conseguir este comportamiento, tendría que especificarlo antes de entrar en la macro.

Page 6: Creacion de Bucles Para Macros en Excel

Al principio del módulo, antes de escribir Sub o de pegar otro código, debería introducir el siguiente código:

Esta opción especifica que todo el código posterior que utilice el operador Like no distinga entre mayúsculas y minúsculas en el texto en el que actúa. Sin esta opción, el ejemplo de código sólo cambiaría el color del fondo cuando encontrara texto con la inicial en mayúsculas.

EJEMPLO 3

Con esta macro podría eliminar las filas que contiene valores duplicados en las columnas D y F. Lo bueno de esta macro es que puede adaptarla para que actúe en valores duplicados de otras columnas en sus datos.

Nota    Tenga cuidado cuando ejecute esta macro. Eliminará los datos de su hoja de cálculo. Y cuando se ejecuta una macro, no hay un comando Deshacer. Lo hecho, hecho está. Para su seguridad, copie primero los datos y ejecute esta macro en la copia para probar los resultados.

Page 7: Creacion de Bucles Para Macros en Excel

El bucle interno busca todas las filas que son un duplicado de la fila inicial y las quita. El bucle externo desplaza la fila inicial hacia abajo de la selección, fila por fila, hasta que compara cada fila con todas las que están debajo en la selección.

EJEMPLO 4Como puedo hacer un bucle en una macro para que se ejecute desde la primera hasta la ultima fila de la hoja excel?

Sub CambiaColor() ' ActiveSheet.Range("A1").Activate Do While Not IsEmpty(ActiveCell)

With Selection.Interior .ColorIndex = 6 .Pattern = xlSolid End With

ActiveCell.Offset(1, 0).Activate Loop End Sub

Un saludo, Javi

Page 8: Creacion de Bucles Para Macros en Excel

EJEMPLO 6

Hacer que la macro se repita mediante un bucle.- Con esto, conseguiríamos que el cursor se desplazase una fila hacia abajo, pero luego se pararía. Tendríamos que ir pulsando Ctrl + K constantemente. Debemos crear un bucle controlado de forma que la macro se ejecute una y otra vez hasta que nosotros lo decidamos.

Para ello, crearemos un procedimiento personalizado en el que se creará un bucle que contendrá la macro:

Procedimiento

Comienzo del bucle

Macro

Fin del bucle y volver a comenzar bucle

Fin del procedimiento

Ahora bien, ¿cómo sabe él cuando tiene que parar el bucle? Evidentemente no continuará hasta la fila 65.536. ¿Cuándo debe parar? Cuando encuentre la primera celda vacía. En ese momento parará.

Procedimiento

Comienzo del bucle. Repetir bucle hasta que celda activa = ""

Macro

Fin del bucle y volver a comenzar bucle

Fin del procedimiento

Su equivalente en lenguaje basic sería:

El bucle Do Until...Loop (repetir hasta que se cumpla la condición) verifica que cada vuelta se vaya comprobando que la condición no se cumple. En el momento en que se cumple, es decir, en que la celda activa no contiene nada (""), se detiene el bucle.

Page 9: Creacion de Bucles Para Macros en Excel

13.Modifica el código de la macro como este último ejemplo, sitúate en la celda D3 y ejecuta la macro.

¿A que ya va pareciendo otra cosa? No obstante continúan los inconvenientes. La macro se detiene. Tendríamos que volver a situar el cursor en la primera celda a comprobar de la segunda columna. Vamos a desplazar la celda activa para que se sitúe automáticamente en la siguiente columna.

Podríamos, al finalizar el bucle, añadir la siguiente línea:

Loop

Range("E3").Select

End Sub

Y Excel situaría el cursor automáticamente en la siguiente columna. A continuación sólo quedará volver a ejecutar la macro. El problema viene cuando haya que volver a ejecutarla en la siguiente columna; el cursor volverá a la celda E3.

Vamos a añadir líneas de código que desplacen el cursor hacia arriba y lo sitúen en la siguiente celda con un valor numérico. Corresponde a las pulsaciones Flecha derecha, Flecha arriba, Fin, Flecha arriba, Flecha abajo que serían las encargadas de situar el cursor en la siguiente columna.

ActiveCell.Offset(0, 1).Activate

ActiveCell.Offset(-1, 0).Activate

Selection.End(xlUp).Select

ActiveCell.Offset(1, 0).Activate

De esta forma, controlamos la posición del cursor de forma que se sitúe en la primera celda numérica de la siguiente columna.

1.Modifica la macro de esta forma.

2.Prueba la macro.

3.En la siguiente columna, vuelve a ejecutar la macro.

La macro debería pasar siempre de una columna a otra

 

Page 10: Creacion de Bucles Para Macros en Excel

Estructuras de Repeticion (Bucles For ..Next ) Las estructuras For...Next las emplearemos en los casos cuando s conocemos el número de veces que es necesario repetir la ejecucion de determinadas instrucciones

Sub obtener_los_56_colores()

'aqui es conocido que Excel maneja una paleta de 56 colores'entonces sabemos tambien que es necesario repetir cierta seccion del codigo

Dim a As Byte

Range("A1:A56").Select

For a = 1 To 56 'repetir 56 veces

Selection.Cells(a).Interior.color = ActiveWorkbook.Colors(a)

'asignar colores del libro a la respectiva celda

Next a

End Sub

Do While… LoopInstrucción que repite las instrucciones mientras una condición es TRUE/VERDADERO.

Ejemplo

Excel tiene valores en las celdas B1:B100. Quieres buscar la primera celda que tenga un valor más alto/igual que 1,50.

i = 1 Do While Cells(i, 2) <> "" f Cells(i, 1) >= 1.5 Then Exit Do i = i + 1Loop MsgBox "El valor se encontró en fila no. " & i

i = la línea donde empezamos el bucle. Ponemos i = 1. Cells(i, 2) significará línea i (=1), columna 2. Es decir celda B1. Al final del bucle, i nos dará la línea que buscamos.

Do While Cells(i, 2) <> “” significa que queremos que un bucle siga hasta que no hayan más celdas con valores en esta columna.

Page 11: Creacion de Bucles Para Macros en Excel

Aplicamos la condición a cada celda, para luego salir del bucle (Exit Do) si encuentra un valor igual a ó más alto que 1,50 (VBA utiliza punto en vez de coma para decimales).

Al final devolvemos un Messagebox para presentar el resultado.

vba_bucles_dowhile…loop.aspInstrucción que repite las instrucciones hasta que una condición se convierta en TRUE/VERDADERO.

Ejemplo

Una hoja Excel tiene datos (en este caso nombres) en las celdas A1:A5. Queremos que el bucle pare en “Alexis”.

A B

1 Alberto

2 Alejandro

3 Alex

4 Alexis

5 Allain

6

i = 1 Do Until Cells(i, 1) = "Alexis" i = i + 1Loop MsgBox "El nombre Alexis se encontró en la línea " & i

i = la línea donde empezamos el bucle. Ponemos i = 1. Cells(i, 1) significará línea i (=1), columna 1.

Es decir celda A1. Al final del bucle, i nos dará la línea que buscamos.

Do Until Cells(i, 1) = “Alexis” significa que queremos que un bucle que siga hasta que encuentre la cadena de texto “Alexis”.

Page 12: Creacion de Bucles Para Macros en Excel

Al final presentamos una caja de diálogo para presentar el resultado, cual en este caso sería 4.

For i… NextEsta instrucción se repite el número de veces (i) que tú indicas.

Ejemplo

Creamos un bucle sencillo. Queremos que se repita 4 veces, y que la variable intValor (al empezar = 1) se incremente con 2 cada vuelta. Este nos da el resultado intValor = 9 (1+2+2+2+2).

Observa que el bucle tiene step 1. Esto significa que i se incrementa con 1 cada vuelta. Esto es, que si queremos un bucle que vaya para atrás, pondríamos step -1.

intValor = 1 For i = 1 to 4 step 1intValor = intValor + 2Next i

For Each… NextInstrucción que repite las instrucciones según el número de objetos especificados.

Por ejemplo, For each Cell de un rango en Excel.

Ejemplo

En este ejemplo vamos a construir un bucle que evalua cada celda de un rango. El rango será celdas A1:A5, que seescribe como Range(Cells(1, 1), Cells(5, 1). Con el Exit For salimos del bucle al cumplir la condición.

Dim rngArea rngArea = Range(Cells(1, 1), Cells(5, 1)) For Each Cell In rngArea If Cell = "Alexis" Then MsgBox "¡Encontró Alexis" Exit For End IfNext

Page 13: Creacion de Bucles Para Macros en Excel

Macro para crear una tabla dinámicaEn esta lección continuaremos profundizando en el estudio de las macros y crearemos nuevas para nuestra hoja de Pedidos.xls.

En tu capacidad de contable y analista de la empresa cuya hoja utilizamos en la pasada lección, te habrás sentido admirado de cómo se distribuyen en las diferentes líneas de diseño de camisetas en las diferentes áreas geográficas de América y por los diferentes canales de ventas.

Vamos a crear una tabla dinámica que muestre las unidades de los pedidos por categorías, resaltando celdas que contengan ventas excepcionales. Más adelante crearemos otra tabla para producir gráficos.

Macro para crear una tabla dinámica de referencias cruzadas.-

1.Sin nada en pantalla, abre la hoja Pedidos.dbf para abrir nuestra base de datos histórica de pedidos que realizamos en la lección anterior.

2.Accede a Datos - Informe de tablas y gráficos dinámicos.

3.En el paso 1, pulsa en Siguiente.

4.En el paso 2, selecciona todo el rango de datos y pulsa en Siguiente.

5.En el paso 3 finaliza y después coloca los campos como sigue:

6.Pulsa en Siguiente.

7.En el último paso, acepta de forma que la tabla se cree en una nueva hoja.

8.Baja el zoom al 75%

9.Cámbiale el nombre a la hoja por el de: Tabla dinámica.

10.Desde la opción Archivo - Guardar como... guarda el libro con el nombre: Categorías.xls (asegúrate de que guardas con formato XLS).

Page 14: Creacion de Bucles Para Macros en Excel

La tabla muestra una información global de los productos, pero vamos a ver la relación que existe entre las distintas categorías de diseño. Para ello, convertiremos la tabla para que produzca en porcentajes y así poder comparar mejor la relación existente.

11.Ve a la celda A1.

12.Pulsa sobre el botón Configuración de campo de la barra de herramientas:

Aparece el cuadro de diálogo del campo de la tabla con información sobre el campo Suma de unidades.

13.Pulsa sobre el botón Opciones para expandir el cuadro de diálogo.

14.Selecciona de la lista la opción Mostrar datos como... - % de la fila.

15.Selecciona la palabra Suma del nombre del cuadro y sustitúyelo por Porcentajes:

16.Sal del cuadro aceptando los cambios.

Observa cómo los datos se han convertido a porcentajes. La columna de la derecha visualiza los porcentajes al 100%. Vamos a hacer que no se visualicen:

17.Selecciona cualquier celda de la columna K.

18.Accede a Formato - Columna - Ocultar.

Ahora nadie podrá ver que el total es el porcentaje 100% del total de la fila.

Crear una macro que marque las excepciones manualmente.- Imaginemos que queremos marcar en color amarillo todas aquellas celdas cuya cantidad sea superior al número 30. Manualmente, si la hoja es muy grande, puede ser un trabajo mortal.

1.Selecciona la celda D3.

2.Abre la paleta portátil de colores y selecciona el color amarillo. (El sexto color). El fondo se convertirá en amarillo.

Page 15: Creacion de Bucles Para Macros en Excel

3.Busca hacia abajo en la columna D para la siguiente columna con valor superior al 30%, es decir, la celda D7, y cambia su fondo a amarillo igual que la celda anterior.

Dar formato a una celda para que disponga de color y un aspecto especial puede ser divertido las dos o tres primeras veces. Pero cuando se repite la misma acción una y otra vez, puede ser bastante aburrido.

Vamos a crear una macro que mirará si la celda es superior a un valor. Si lo es, le dará el color amarillo de fondo.

1.Crea una nueva macro y la llamas: FormatoCelda.

2.En Opciones, asígnale la combinación Ctrl + K

3.Coloca el fondo amarillo.

4.Finaliza la grabación de la macro.

5.Sitúa el cursor en cualquier celda con valor superior a 30%

6.Pulsa Ctrl + K

Evidentemente, esto es como hacerlo manualmente, pero con una combinación de teclas que llame a una macro. Veamos cómo modificarla:

7.Accede a Herramientas - Macro - Macros, selecciona la macro y pulsa en Modificar.

8.Observa el código. Siempre hará lo mismo.

9.Modifícalo añadiendo estas líneas:

La rutina If...Then - End If comprueba si la condición que sigue a If es cierta. Si lo es, se ejecutan las sentencias del interior. Si no lo es, no se ejecutan. Esta orden debe acabar con la sentencia End If.

10.Cierra la ventana del editor y sitúa el cursor sobre alguna celda cuyo valor no pase del 30%. Ejecuta la macro pulsando Ctrl + K y observa que no aparece el color de fondo.

11.Haz lo mismo con cualquier celda que sí pase del 30%.

Page 16: Creacion de Bucles Para Macros en Excel

La macro va tomando cuerpo, pero todavía tenemos que desplazar el cursor manualmente y mirar si el contenido de la celda es superior a la condición establecida.

Vamos a hacer que el cursor se desplace automáticamente una celda hacia abajo. Para ello, utilizaremos la orden offset (fila,columna).

12.Agrega estas líneas: