Estructura de control, que permite ejecutar una serie de instrucciones sin necesidad de recalificar un objeto, es decir, sobre el mismo objeto cada vez; entendiendo por objeto toda combinación de código y datos que se pueden tratar como una unidad, por ejemplo, un control, un formulario o un componente de una aplicación. Cada objeto se define por una clase.
Así, un ejemplo de utilización de la función With, sería el siguiente, donde ha sido anidada dentro de la estructura de un bucle For, y mediante la opción Select (utilizada para trabajar en entornos gráficos), se adjudicaría a cada celda de la columna identificada por el contador j, un color y un tipo de letra determinado.
For j = 2 To x + 1
Hoja1.Cells(i, j).Select
With Selection.Interior
.ColorIndex = x + 2
.Pattern = xlSolid
End With
Next j
Las estructuras de bucle también son conocidas por el nombre de estructuras de control. Permitiendo la repetición de determinadas acciones.
Uno de los errores más comunes que se producen en la utilización de bucles de este tipo, es la no inicialización de las variables utilizadas como contadores de iteraciones. Así que habrá que prestar una atención especial en este punto. Una opción para evitar este posible error, sería la definición al principio del programa, como primera línea de código de éste, el ya comentado Option Explicit.
A continuación se presentan las diferentes opciones que permite el Visual Basic para definir bucles, es decir, repetición y/o acumulación de acciones determinadas, entre unos límites definidos. La no definición de estos límites concretos, sería otro error común y más problemático, al producirse la entrada en bucles infinitos, que bloquean el módulo de cálculo de nuestro ordenador.
Do... Loop Until:
Esta estructura de control se puede usar para ejecutar un bloque de instrucciones un número indefinido de veces. Las instrucciones se repiten hasta que una condición llegue a ser True.
Un ejemplo podría ser el siguiente:
Sub ComPrimeroUntil ()
contador = 0
miNum = 20
Do Until miNum = 10
miNum = miNum – 1
contador = contador + 1
Loop
MsgBox "El bucle se ha repetido " &contador& " veces."
End Sub
Do While... Loop
Siguiendo lo explicado en el punto inicial, otro error común sería el no introducir la línea de acumulación del contador (por ejemplo: i = i + 1), con lo que el bucle entraría cada vez en el cálculo, quedándose colgado en este punto.
En este caso, las instrucciones se repiten mientras una condición sea True (al contrario que con el Do… Loop Until).
Este tipo de bucle se utilizaría normalmente en caso de tener que cumplirse una condición marcada por el While. Así, en este tipo de bucles, se puede dar el caso de que no se entre desde el primer momento, debido al no cumplimiento de esta condición.
Ejemplo de utilización de esta función (hay que fijarse en la inicialización previa de la variable contador i):
i = 5
Do While Hoja1.Cells(i, 2) <> ""
b = Hoja1.Cells(i, 5)
c = Hoja1.Cells(i, 6)
d = (b ^ 2) + (c ^ 2)
a = Sqr(d)
Hoja1.Cells(i, 7) = a
i = i + 1
Loop
For... To... Next
Mediante la palabra clave Step, se puede aumentar o disminuir la variable contador en el valor que se desee (For j = 2 To 10 Step 2).
Se pueden anidar bucles For...Next, colocando un bucle For...Next dentro de otro. Para ello, hay que proporcionar a cada bucle un nombre de variable único como su contador. La siguiente construcción es correcta:
For i = 1 To 10
For j = 1 To 10
...
Next j
Next i
Si se omite un contador en una instrucción Next, la ejecución continúa como si se hubiera incluido. Se produce un error si se encuentra una instrucción Next antes de su instrucción For correspondiente.
Al contrario de lo que se comentaba para los bucles Do… While, los bucles For…, se ejecutarán hasta agotar el intervalo de acumulación del contador, es decir, siempre se entraría en el bucle, y no se pararía de ejecutar hasta no terminar el contador.
Un ejemplo concreto podría ser el siguiente:
For i = 1 To 15
x = Hoja1.Cells(i, 1)
If x <> 0 Then
For j = 2 To x + 1
Hoja1.Cells(i, j).Select
With Selection.Interior
.ColorIndex = x + 2
.Pattern = xlSolid
End With
Next j
End If
Next i
Donde se ve como se deben anidar varios bucles consecutivos, y como se introducen funciones condicionales como If, y otras estructuras de control, como el With, que pasamos a comentar a continuación.
En este caso, esta instrucción será más útil que la Condición If..., cuando se ejecute uno de varios grupos de instrucciones, dependiendo del valor de una expresión condición a cumplir.
If … Then … / If … Then … Else … / If … Then … ElseIf … Then …
¿Cuándo poner el EndIf?, ¿cuándo no?, ¿cuándo se deberían usar los “:” (dos puntos)?
Las instrucciones If...Then...Else se pueden presentar en varios formatos, con unas características determinadas. Normalmente, se presentan anidadas en tantos niveles como sea necesario. Esto, sin embargo, puede hacer menos legible el código, por lo que es aconsejable utilizar una instrucción Select Case en vez de recurrir a múltiples niveles de instrucciones If...Then...Else anidadas (únicamente en caso de que el excesivo número de anidamientos pudiera dar problemas en la legibilidad del programa, o errores en la depuración de éste).
Así, si realizamos la condición en varias líneas de código, será necesario cerrar el anidamiento con un End If; instrucción que no se usaría en caso de realizar la condición en un sola línea (If Then, condición cierta).
Ejemplos de utilización:
Ahora se presentan una serie de ejemplos prácticos, con los que aclarar y facilitar el uso de las condiciones If en la programación en Visual Basic.
Básicamente, en el ejemplo siguiente se observa, como se deberían de utilizar los anidamientos consecutivos de If… Then, ElseIf… Then y Else. Se observa aquí, cómo se utilizaría el End If, siempre en el caso del anidamiento de condiciones, y no en el caso de escribir la condición If (general) en una sola línea.
If b > 0 And c > 0 Then
Hoja1.Cells(i, 8) = a
Else
If b > 0 And c < 0 Then
Hoja1.Cells(i, 8) = a + 360
Else
Hoja1.Cells(i, 8) = a + 180
End If
End If
Con esto queda la variable perfectamente definida, si no se pusiera no ocurriría posiblemente nada, salvo que se utilizaría una mayor cantidad de memoria de la necesaria, al definirse instantáneamente en el momento de utilizarla como de tipo Value.
vamos a mostrar cómo hacer dos programas, el primero para saber si un número es primo, y el segundo, para obtener listas de números primos.
Para esto, en el primer programa, mostraremos qué funciones se deben utilizar para declarar menús de trabajo, y cómo trabajar con ellas, además de cómo llamar a otras funciones sin utilizar la función que se había visto previamente para este propósito (función call). En el segundo programa, veremos de qué forma se podrán declarar listas de números primos, en un número indicado previamente por nosotros mismos.
Vamos a ver ahora qué es lo que deberemos hacer para poder declarar y utilizar menús de trabajo, aplicándolo de manera práctica para poder declarar si un número dado al programa es primo o no.
Como se puede ver en la pantalla anterior del Editor de Visual Basic, el programa previamente descrito se ha dividido en dos partes. En la parte que vemos aquí (declarada a partir del botón) mediante la función InputBox, se declarará un menú que se verá en la página de la Hoja de Cálculo del Microsoft Excel, presentando el texto “DIME UN NUMERO”, identificado con la variable numero definida como string. Esta cadena (que recibe el número que se introduciría desde teclado) mediante la función Val, registrará el valor numérico deseado que se pasaría a la otra función (la que calcularía si dicho número es primo o no).
Esto también se podría haber conseguido de una manera un poco más simple, declarando únicamente valor como entero y guardando el número introducido en la InputBox directamente como entero como se puede ver en la siguiente captura:
Una vez hecho esto, dentro de una condición if, y utilizando la función MsgBox (esta función, al igual que la previamente definida InputBox, tiene como misión el mostrar en pantalla un mensaje en forma de menú de Windows, pero ahora presentando un resultado determinado y definido desde programa) se mostraría un mensaje sobre la Hoja de Cálculo, diciendo si el número previamente introducido es primo o no.
Tal como se ha visto previamente, tomando el valor de la variable valor se llama a la función esprimo (x), donde la variable x equivale al valor enviado valor. Así, definiendo esta función como Boolean, la cual daría como resultado una respuesta verdadera o falsa (true o false), se entraría en un bucle Do While (que utiliza como condiciones que el número introducido es inicialmente primo, para entrar en el bucle, y que el último número por el que se dividirá el introducido, para comprobar si es primo o no, deberá ser menor o igual a la raíz cuadrada del introducido). En este bucle, dentro se pondría una condición if, en la que indica que para que un número no sea primo, el resto de dividirlo por otro menor que él debe ser cero.

Como se puede comprobar, al trabajar con variables Booleanas, se devuelve o recibe un True o un False, que en función de la definición de la condición if del siguiente programa (el definido por el botón), se dará como resultado lo correspondiente al “si” (if) o al “sino” (else).
Ahora se ve cómo quedaría en la pantalla de la hoja de Excel lo expuesto previamente. Se ve, en la página siguiente, como al hacer clic sobre el botón, aparecería el menú pidiendo un número, y acto seguido se diría si éste es primo o no.
Ahora se van a definir los dos programas necesarios para obtener un número determinado de números primos, siguiendo el mismo esquema previamente definido. Primero se ve cómo se define con la función InputBox, un nuevo menú en el que se pide el número de números primos deseado. Además, se incluye una línea de código para poder borrar el listado previo de números primos cada vez que se haga clic sobre el botón (para que salga un nuevo menú).
Esta llamada mediante la función Call, se hace a una macro grabada mientras se seleccionaba toda la columna A y se borraba su contenido, como se puede ver.
Aquí se puede observar el segundo programa, llamado por el primero, y pasándole el número de números primos a generar (tamaño de la lista) empezando por el 2.
Aquí se ve como una vez se recibe la información de la otra función, se definen dos contadores para controlar los dos bucles. El primero controlaría la acumulación de números primos hasta la cantidad indicada (x), y a continuación, al igual que antes, definiendo la variable primo como booleana, se entra al segundo bucle (encargado del cálculo de los primos) suponiendo que la primera entrada es un número primo (2 es primo) y que además el número por el que se divida cada número para comprobar que sea primo, deberá ser inferior a la raíz cuadrada de dicho número.
Finalmente, con una condición, se irían acumulando en la columna los diferentes números primos encontrados hasta llegar a la cantidad deseada.
Aquí se verá ahora el resultado deseado.
En primer lugar, se debería considerar que una macro es un pequeño programa ejecutable desde la Hoja de Cálculo, y que realiza funciones repetitivas o comunes en la normal ejecución de la actividad con la herramienta de cálculo. Así, y en el caso particular de grabar una macro para poder cambiar de color una serie de celdas de la Hoja de Cálculo, se procede de la siguiente forma. En el menú, se toma la opción Desarrollador, y en ésta, Grabar macro. Acto seguido, se realiza la acción a grabar en la macro, en este caso, cambiar de color el color de una columna de la hoja de cálculo.
Abriendo la opción de Visual Basic, la macro grabada quedaría reflejada de la siguiente manera:
En el paso anterior se ve, en el código definido por la macro, la opción Range; esto define el rango de aplicabilidad de la opción escogida con el código, en ese caso el cambio de color de las celdas A1 hasta la A10.
Además se le puede cambiar el nombre al botón para que deje de “llamarse” CommandButton1 y así poder ponerle el nombre deseado y cambiar otras propiedades como el color del botón. Pero, ¿cómo se consigue cambiar el nombre al botón?
Para ello, se selecciona el Modo Diseño del cuadro de controles de la pestaña Desarrollador, una vez ahí, se haría clic con el botón derecho del ratón, sobre el botón al que se le quiere cambiar el nombre. Acto seguido, se selecciona la opción Propiedades y dentro de estas se cambia la opción Caption.
Una vez mostradas las acciones anteriores, se va a pasar a definir el ejemplo concreto. Así, y como ya habíamos dicho, vamos a definir el código de programa necesario para por un lado generar la serie de Fibonacci de términos aleatorios, y por el otro, tomar de los valores de la serie anterior exclusivamente las cifras correspondientes a las unidades.