domingo, 2 de junio de 2013

Un caso para el bucle DO WHILE en VBA



Hace bastante tiempo que no escribo en el blog, y agradezco a las personas que de distintas partes del mundo me han escrito felicitándome por el blog, y pidiéndome algunos trucos o consejos. Esos correos me alientan a seguir aportando un granito de arena a la enseñanza del Excel.


Luego de ese preámbulo, vamos al grano, como diría el pollito, hace aproximadamente 10 días recibí un correo de una persona (no voy a mencionar su nombre), indicándome que necesita una ayuda, tip, truco, buenas vibras, lo que fuere... con un problema en concreto.

Resulta que el descarga de Internet unos datos que utiliza para realizar unos operaciones, pero que los datos que descarga le dan un valor inicial y un final, y el necesita hacer una lista de número empezando desde el valor inicial hasta llegar al valor final.

Para entenderlo mejor les presento esta imagen:


Entonces los datos descargados de Internet son los que se encuentran en la columna A y B, y necesita realizar la lista que encontramos en la columna F, en donde la lista inicia en el primer valor, y continua hasta llegar al valor final de la primera linea de datos, para luego hacer lo mismo con la segunda linea de datos, y así sucesivamente hasta el final de la tabla de datos origen.

Por lo tanto, se me ocurrió que el proceso debe repetirlo mientras exista datos en la tabla origen y se detendrá cuando encuentre la primera celda en blanco.

No les voy a negar que intente hacerlo con unas funciones inicialmente, y aunque obtuve éxito con ellas, luego el proceso se volvía engorroso, cansado, tedioso, abrumador y confuso. (como para que quede claro porque no opte por ese proceso, ja).

Fue entonces cuando se me vino a la mente EL BUCLE DO WHILE, (Hacer mientras), este bucle es una secuencia de instrucciones en Macros, que te permite repetir uno o mas operaciones mientras una condición se cumpla.

La sintaxis del bucle sería la siguiente:

  DO WHILE Condición sea Verdad
          Sentencia 1
          Sentencia 2
          Sentencia ....
  LOOP

Entonces el repetirá las sentencias "mientras" la condición sea verdad, y cuando se vuelva falsa entonces se detiene. OJO: En algún momento tiene que convertirse en falsa, pues si no, la sentencia sigue corriendo y corriendo y probablemente pegue la memoria del computador (o como diríamos en Perú: Se cuelgue la compu).

Si nunca han hecho una macros, no se preocupen que "QUIEN NADA SABE, NADA TEME", pues empezaremos desde cero.

Otro detalle que me inclino por esta solución, es que el compañero que me consultó esto, me indicó que tenía Excel 97, por ello haré algunas salvedades con respecto a ciertas operaciones mas adelante.

El proceso de creación de la macros

Una vez que tengo los datos ya en una hoja de Excel (de preferencia que el primer dato este en la celda A2, para que no tengan problemas con el código), presionamos la teclas ALT+F11 (en cualquier versión del Excel es igual)

Al presionar estas teclas nos abrirá el Visual Basic for Application (VBA), como mostramos en la siguiente imagen:


Estando en esta pantalla, vamos a ir al Menú INSERTAR / MODULO (cuidado vayan a seleccionar Modulo de clase), y nos aparecerá una pantalla en blanco, en el cual copiaremos el siguiente código: (Copiar desde la palabra Sub hasta la linea End Sub)

Sub CreaLista()

Range("F2:F60000").Clear
'Esta linea limpia el rango de F2 a F60000
'Coloco hasta 60000 porque el Excel 97 tiene hasta
'65536 filas, por eso el numero no debe ser mayor a este
Fin = 2
'Indica la primera celda en blanco de la columna F

Range("A2").Select
'Seleccino la celda A2 que es donde esta el primer valor
Do While ActiveCell <> Empty
'El bucle do while (hacer mientras) es un bucle repetitivo
'Va a realizarle N veces hasta que la celda este vacia.
'Hacer mientras la celda actual sea diferente de VACIA
    dato1 = ActiveCell
    'En la variable dato1 asigno el valor de la celda actual
    dato2 = ActiveCell.Offset(0, 1)
    'La funcion OFFSET indica una coordena (Filas, Columnas)
    'En la variable dato2 asigno el valor de la celda que esta
    'una columna a la derecha de la celda actual
    If dato1 < dato2 Then
    'Pregunto si dato1 es menor a dato2
        Range("F" & Fin) = dato1
        'En la celda vacia de la columna F asigno el valor de dato1
        Fin = Fin + 1
        'Aumento en uno el valor de la variable Fin
        'Si inicialmente era 2, ahora sera 3, luego 4, etc
        dato1 = dato1 + 1
        'Aumento en uno el valor de dato1
        For x = dato1 To dato2
        'El bucle for realiza N veces las instrucciones
        'En este caso a la variable X sera desde dato1 hasta dato2
            Range("F" & Fin) = x
            'La celda vacia de F se le asigna el valor de X
            Fin = Fin + 1
            'Aumento en uno la variable Fin
        Next x
        'Siguiente x
    End If
    'Fin Si
    ActiveCell.Offset(1, 0).Select
    'Cambio de fila
Loop
'Repetir el do while
End Sub

En realidad la macro es muy pequeña, solo que he colocado varios comentarios para su mejor entendimiento. Todas las lineas color verde son comentarios, es decir, no afectan en lo más mínimo a la lógica de programación y si han podido observar empieza con una comilla simple.

Como ejecutar la Macros

Luego de haber copiado el código en un Módulo de VBA, cerramos el Visual Basic, y regresamos al Excel.

Ahora hay que ejecutar la Macros y para ello presionaremos las teclas ALT+F8 y nos aparecerá la siguiente ventana:


Finalmente hacemos clic en Ejecutar, y en menos de un segundo la lista se habrá creado.

Puedes variar los datos de la tabla y al ejecutarla nuevamente la macros la lista se actualizará automáticamente.

Espero que les haya servido, cualquier consulta no duden en indicarmelo y con gusto los ayudo.

Mas vale tarde que nunca.

Ing. Enrique Neciosup Morales