Вы находитесь на странице: 1из 49

Macros y lenguaje VBA

Aprender a programar con Excel (2 edicin)

El objetivo de este libro es ensearle, mediante prcticas, cmo disear macros, nombre que se le da a los
programas realizados en un entorno de Microsoft Office y que permiten reproducir automticamente y de manera
infinita un conjunto de tareas. No est dirigido a programadores, sino a cualquier usuario habitual de Microsoft Excel
(estudiante, comerciante, jefe de proyectos, gestor, asesor, etc.) que desee descubrir la programacin con Excel para
automatizar las tareas repetitivas. Aunque nunca haya escrito un programa o ni siquiera haya visto una lnea de
cdigo en su vida, los ejemplos simples y pedaggicos de este libro le mostrarn, paso a paso, cmo disear un
programa.

Tras la descripcin del entorno de trabajo VBE utilizado para la creacin de macros, descubrir los conceptos
bsicos de la programacin con VBA a travs de los objetos, de sus mtodos y de sus propiedades; a continuacin,
realizar su primer programa gracias a la Grabadora de macros y despus abordaremos los elementos
fundamentales de la programacin VBA que son las variables, las condiciones y los bucles, antes de aprender a
depurar su programa.

La siguiente parte aborda la nocin de programacin modular y presenta al detalle las principales funciones que
puede insertar en un programa (funciones lgicas, matemticas), la gestin de cadenas de caracteres, la gestin de
fechas y horas, las manipulaciones en los libros Excel y en todos los tipos de archivos que tenga en los directorios de
su ordenador.

Para acabar, ver cmo optimizar su programa, trabajar con tablas en la memoria, hacer que sus programas
sean compatibles con las versiones de 32 y 64 bits, crear cuadros de dilogo personalizados, insertar
controles (etiqueta, zona de texto, botn, etc.) y gestionar los errores de ejecucin.

Todos los ejemplos del libro se pueden descargar gratuitamente en esta pgina.

Introduccin
El objetivo de este libro es ensearle, mediante prcticas, cmo disear macros con Microsoft Excel. Una macro es
el nombre que se le da a los programas que se escriben en un entorno de Office (Excel, Word, Access,
PowerPoint). stas le permiten reproducir tareas un gran nmero de veces y sin error.

A quin va dirigido este libro?


Ya sea usted estudiante, comerciante, jefe de proyectos, gestor, asesor, o simplemente utilice Excel a diario para
la gestin de sus cuentas o de una asociacin, habr constatado que a menudo tiene que realizar las mismas
tareas y le gustara mejorar sus conocimientos de Excel para automatizar esas tareas.

Aunque nunca haya creado un programa, ni siquiera haya visto una lnea de cdigo en su vida, los ejemplos
siguientes le mostrarn, paso a paso, cmo crear macros mediante el lenguaje VBA.

Qu es una macro?
Una macro es un conjunto de lneas de cdigo que contienen instrucciones. Excel interpretar estas instrucciones o
estas funciones para realizar diversas tareas: operaciones matemticas, operaciones en hojas de clculo,
operaciones en archivos, etc. Por tanto, estas instrucciones siempre se interpretarn del mismo modo y, adems,
el trabajo se har mucho ms rpido que si tuviera que volver a hacer la misma tarea varias veces.

El lenguaje empleado para codificar estas instrucciones es el VBA (Visual Basic for Applications). La ventaja
principal de este lenguaje es que es muy comprensible puesto que las instrucciones se escriben (casi) como si
fuese lenguaje corriente.

Desde Excel 2007, Microsoft distingue entre guardar un libro sin macro (.xlsx) y guardar un libro con macro
(.xlsm). Un libro que contiene macros y que se ha guardado en formato xlsx no conservar sus lneas de cdigo. Al
mismo tiempo es un mecanismo de seguridad para comprobar la existencia de un programa en un libro y una
obligacin a la hora de guardarlo.

Qu inters tiene hacer macros?


Disear una macro tiene muchas ventajas. En primer lugar, el programa har y deshar las instrucciones siempre
en el mismo orden. Por lo tanto, una macro le garantiza la integridad de su trabajo. Adems, un programa le
har ganar tiempo a la hora de realizar sus tareas.

Imagine que tiene que trabajar en un archivo de un millar de datos. Para tratar este archivo manualmente, podra
necesitar 3 4 horas, mientras que si trabaja con una macro, bastaran 3 4 segundos para tratar los datos.

Contenido del libro


Este libro est dividido en cuatro partes. La primera parte le presenta el entorno de trabajo empleado para el
diseo de macros. La segunda parte le explica los principios bsicos de programacin. En la tercera parte,
encontrar las principales funciones que tendr que utilizar en su trabajo. Y en la cuarta parte, descubrir las
tcnicas de optimizacin que permiten mejorar la ejecucin de sus programas as como las tcnicas utilizadas para
la creacin de cuadros de dilogo personalizados.

Sea cual sea la versin de Excel con la que trabaje, en el libro encontrar las respuestas a sus problemas. Desde
Excel 2003, el lenguaje VBA ha evolucionado muy poco, no obstante le sealaremos las pocas diferencias entre las
versiones.

Puede consultar este manual captulo por captulo, en funcin de sus necesidades, sin que tenga que respetar
necesariamente el ndice de contenidos. Este libro es ante todo una ayuda para la creacin de programas.
Todos los ejemplos presentados se pueden descargar gratuitamente en la pgina Informacin.

El editor de visual basic

Introduccin
Para crear macros, no se trabaja con Excel sino con otro programa, el Editor Visual Basic, ms comnmente
llamado Visual Basic Editor o incluso VBE.

Como se muestra en la imagen anterior, Microsoft Excel y Visual Basic Editor son dos aplicaciones que aparecen
por separado en la barra de tareas de Windows. Sin embargo, aunque VBE sea una aplicacin aparte, sta no puede
iniciarse si no es desde Excel.
Cmo iniciar Visual Basic Editor?
El proceso difiere segn la versin de Excel empleada.

1. Versin Excel 2003 (o anterior)

Para iniciar Visual Basic Editor, utilice el men Herramientas - Macro y haga clic en la opcin Editor de Visual
Basic o pulse [Alt][F11].

2. Versin Excel 2007 (o posterior)

En las nuevas versiones de Excel, las herramientas que permiten crear macros estn ocultas por defecto.

Para visualizar la pestaa reservada a las herramientas de programacin, haga clic en la pestaa ARCHIVO y
despus en el botn Opciones. Seleccione la categora Personalizar cinta de opciones. En la zona Pestaas
principales, active Desarrollador y despus acepte.

Aparecer la pestaa DESARROLLADOR.

En esta nueva pestaa, haga clic en el icono Visual Basic para iniciar VBE.

En todas las versiones de Excel, puede iniciar VBE pulsando las teclas [Alt][F11].
La interfaz
Al inicio, la aplicacin Visual Basic aparece como en la captura de pantalla siguiente.

La interfaz est compuesta por el Explorador de proyectos (1), la ventana de propiedades (2) y la zona de trabajo
(3).

Por el momento, la zona de trabajo est vaca pero vamos a aadir mdulos o cuadros de dilogo (traducido
por Userform) para empezar la introduccin de lneas de cdigo.

1. Los mdulos

Los mdulos son el alma de la programacin. Un mdulo se presenta como una hoja en blanco en la que usted
escribir sus lneas de cdigo.

Para insertar un mdulo, en el Explorador de proyectos, haga clic con el botn derecho del ratn en su proyecto
(o en su libro Excel) y seleccione el men Insertar - Mdulo.
Ahora, la zona de trabajo contiene un mdulo que se presenta como una hoja en blanco. Ver
aparecer este mdulo en el Explorador de proyectos.

Por defecto, su nombre genrico es "Mdulo1, 2, 3, "

Para darle otro nombre, como por ejemplo Primer_Programa, escriba el nombre en la ventana de propiedades en
lugar de la palabra Mdulo1.

Se ha modificado el nombre de su mdulo en el Explorador de proyectos.

2. Los cuadros de dilogo personalizados

Hacer macros tambin es crear sus propios cuadros de dilogo.

Para insertar un cuadro de dilogo, en el Explorador de proyectos, haga clic con el botn derecho del ratn en el
documento y seleccione el men Insertar - UserForm (que es la traduccin de cuadro de dilogo).
Aparecer un cuadro de dilogo en blanco en la zona de trabajo:

En los captulos Los cuadros de dilogo personalizados y Los controles, veremos cmo rellenar un cuadro de
dilogo y tambin cmo recuperar la informacin introducida. Podemos observar que del mismo modo que
aparecen los mdulos, aparece un icono UserForm1 en el rbol del Explorador de proyectos y que la ventana
de propiedades contiene muchos ms elementos para un cuadro de dilogo que para un mdulo.
Para ordenar cada elemento (Hoja de clculo, Mdulo y Userform) en subdirectorios, basta con activar el
icono Alternar carpetas del Explorador de proyectos.

3. Las barras de herramientas

Al inicio, slo est visible la barra de herramientas Estndar, pero una gran parte de las funciones que usar con
frecuencia no estn en esta barra de herramientas. Se pueden mostrar otras dos barras de herramientas:

Para visualizar las barras de herramientas que faltan, coloque el puntero del ratn en una zona vaca (sin texto ni
icono) de la barra de herramientas y haga clic con el botn derecho del ratn para que aparezca el siguiente men
contextual.

Slo est marcada la opcin Estndar.

Marque las dos primeras opciones para que aparezcan la barra de Depuracin y la barra de Edicin.

Si estas barras de herramientas se muestran como una barra flotante y quiere colocarlas en la parte superior de la
ventana de la aplicacin, haga clic en la barra de ttulo de la barra de herramientas y deslcela hacia las otras barras
de herramientas. Cuando suelte el botn del ratn, la barra de herramientas se colocar en el mismo nivel que las
dems barras de herramientas.
La programacin en visual basic

Introduccin
La ventaja de Visual Basic, con respecto a otros lenguajes de programacin, es su simplicidad de comprensin para
cualquier nefito; es un lenguaje orientado a objetos.

Qu es un objeto?
En Visual Basic, un objeto corresponde a uno de los elementos de la aplicacin Excel: un libro (Workbook), una
hoja de clculo (Worksheet), una columna (Column), una fila (Row), un rango de celdas (Range), una celda
(Cells), etc.

A esos objetos se les asociar ya sea una propiedad o un mtodo.

1. Propiedad de un objeto

Una propiedad corresponde a las caractersticas de un objeto.

Para una celda, las propiedades pueden ser su valor, su color, su tamao, su fuente de carcter, etc.
Para una hoja, las propiedades pueden ser su nombre, su visibilidad (oculta o no), su color de pestaa,
etc.

Las propiedades que se aplican a un objeto son diferentes de un objeto a otro.

2. Mtodo de un objeto

Un mtodo corresponde a una accin efectuada a un objeto.

Una celda se puede copiar, pegar, borrar, etc.


Una hoja se puede copiar, suprimir, renombrar, etc.

Regla de codificacin
La codificacin de los mtodos y de las propiedades es muy sencilla: un objeto se asocia a un mtodo o a una
propiedad separndolos por un punto:

Objeto.Mtodo

Objeto.Propriedad

Por ejemplo, podemos escribir:

Sheets("Hoja1").Delete Supresin(Mtodo) de la hoja 1(Objeto)

Cada objeto posee numerosas propiedades y mtodos.

Para ayudarle a encontrar todas las propiedades relacionadas con un objeto, tras escribir un punto, aparecer un
men desplegable.
En ese men, identificar las propiedades mediante el icono y los mtodos mediante el icono .

Si despus de escribir un punto no aparece el men desplegable, puede hacerlo aparecer pulsando las teclas
[Ctrl][Espacio].

1. Asociacin de objetos

Es posible hacer asociaciones de objetos entre s.

Por ejemplo, para expresar que quiere copiar (Mtodo) desde la hoja 2 (Objeto), la celda B5 (Objeto),
escribir la lnea siguiente:

Sheets("Hoja2").Cells(5,2).Copy

Tambin puede especificar el nombre del libro cuando su macro necesite trabajar en varios archivos de Excel.

Workbooks("libro1.xlsx").Sheets("Hoja1").Cells(4, 5) = _
Workbooks("libro2.xlsx").Sheets("Hoja1").Cells(1, 3)

Atencin: respete el orden de los trminos. Una celda est incluida en una hoja de clculo. Por lo tanto debe
escribir el objeto Hoja antes que el objeto Celda.

2. Asociacin de propiedades o de mtodos

Del mismo modo, puede asociar a un objeto varias propiedades o mtodos. Por ejemplo, si quiere contar el
nmero de filas de la columna A, puede escribir la instruccin siguiente:

Cells(1, 1).CurrentRegion.Rows.Count

Esta escritura puede traducirse del siguiente modo: a partir de la celda A1, seleccionamos el conjunto de celdas
adyacentes, despus nos centramos en las filas que contamos.

Codificacin de las celdas y de los rangos de celdas


Todos sus programas van a utilizar, de una forma o de otra, el contenido de una celda o de un rango de celdas.
Llegados a esta fase del libro es importante explicar cmo utilizar una celda y/o una hoja.

1. La celda

Una celda se codifica del siguiente modo:

Cells(nmero de fila, nmero de columna)


Siempre hay que escribir la palabra en plural. El nmero de fila y el nmero de columna son obligatoriamente
valores numricos enteros positivos.

Observe que el nmero de fila se escribe en primer lugar, al contrario que en las referencias de celdas de Excel,
en las que el nmero de fila aparece tras la letra de columna: A1, D3, F34...

2. El rango de celdas

Range(referencia)

Un rango de celdas se traduce por la instruccin Range. Esta instruccin puede utilizarse de tres maneras
diferentes.

Tomemos como ejemplo la seleccin de las celdas A1 a C5; podemos escribir:

Range("A1:C5").Select Las referencias de las celdas se escriben "literalmente" entre comillas.


No se pueden variar esas referencias, estn congeladas.

[A1:C5].Select Aqu, reemplazamos la instruccin Range por unos corchetes, las


referencias estn escritas sin comillas.

Range(Cells(1, 1), Cells(3, Esta escritura puede parecer ms compleja, pero es el mtodo que
5)).Select queremos destacar, ya que con ste cada componente de las
referencias de celda puede gestionarse por una variable.

3. Las celdas nombradas

Cuando se nombra una celda o un rango de celdas, puede recordar sus nombres en lugar de dar las referencias
de las celdas.

Por ejemplo, si la celda A1 se llama IVA, puede escribir simplemente:

[IVA].Select

De este modo, incluso si desplaza esta celda a otro lugar de su hoja de clculo, la instruccin no se modificar en
su cdigo.

Significado del signo =


El signo = debe considerarse como un puente.

La informacin que est a la derecha del signo = se traslada hacia el elemento que est a la izquierda.

Por ejemplo, para asignar el valor 15 a la celda A1, escribimos:

Cells(1,1) = 15

Para colorear de rojo el fondo de la celda A1, escribimos:

Cells(1,1).Interior.Color = 255

Tambin podemos invertir la escritura. Para conocer el cdigo del color de la celda A1 y poner ese resultado en la
celda D1, vamos a escribir el cdigo siguiente:

Cells(1,4) = Cells(1,1).Interior.Color
Por ltimo, para reproducir el color de la celda A1 a la celda D1:

Cells(1,4).Interior.Color = Cells(1,1).Interior.Color

Los procedimientos
Todas las lneas de cdigo deben escribirse en uno o varios procedimientos.

Un procedimiento se caracteriza por la escritura de la instruccin Sub (diminutivo de Subroutine que significa
Procedimiento en espaol) y de la instruccin End Sub que concluye el procedimiento.

Sub Cambiar_el_color()
Instrucciones
End Sub

Para iniciar este programa, puede o bien pulsar la tecla [F5] o bien hacer clic en el icono.

Para nombrar un procedimiento, se admiten todos los trminos salvo las palabras reservadas (como For, Next,
While, Cells, etc.). Adems, si nombra su procedimiento con varias palabras, el nico separador autorizado es _
(underscore o guin bajo). Los espacios y el guin (-) estn prohibidos.

Si su proyecto se compone de varios procedimientos, cada procedimiento deber tener un nombre nico.

Las funciones
Las funciones se diferencian de los procedimientos por el hecho de que stas devuelven un valor al final del
tratamiento. Para escribir una funcin, hay que escribir el cdigo entre las instrucciones Function y End
Function.

Vamos a crear una funcin personalizada que devolver en una celda el nombre de su hoja activa. Escribiremos
esta funcin de la forma siguiente:

Function Nombre_Hoja()
Nombre_Hoja = ActiveSheet.Name
End Function

Aunque simple, este cdigo aporta una informacin fundamental con respecto a un procedimiento: el resultado del
clculo se almacena en el nombre de la funcin (Nombre_Hoja).

Todas las funciones creadas pueden nombrarse en una hoja de clculo.

Escriba el nombre de su funcin en una celda.


Observar que su funcin Nombre_Hoja aparece en el men desplegable con el mismo ttulo que las funciones
integradas de Excel.

Termine la escritura de su funcin (no olvide los parntesis).

El resultado de la funcin se muestra en la celda:

En una hoja de clculo, las funciones se interpretan directamente sin usted tenga que iniciar el programa (como
para un procedimiento).

Es evidente que una funcin personalizada es ms importante si se le transmiten parmetros para obtener un
resultado calculado con los elementos ofrecidos. Estudiaremos este punto en el captulo Estructura de un programa
- Parmetros de llamada.

Primer programa

Introduccin
Una vez vistos los principios bsicos de la programacin, podemos escribir nuestro primer programa. Para ello,
vamos a pedirle a Excel que nos ayude gracias a la Grabadora de macros.

La Grabadora de macros
Esta herramienta grabar todas las acciones realizadas con Excel: seleccin de una celda, de un grupo de celdas,
dar formato, etc.

Muy a menudo, tendr que eliminar algo de cdigo para guardar slo lo esencial.

1. Versin Excel 2003 (o anterior)

Para iniciar la Grabadora, vaya al men Herramientas - Macro, y active la opcin Grabar nueva macro.
Aparecer un cuadro de dilogo que le pide que escoja un nombre para su macro.

Indique el nombre de la macro y haga clic en Aceptar.

A partir de ese momento, todas las acciones que realice se grabarn en el Visual Basic Editor.

Para detener la grabacin, haga clic en el botn Stop que aparece en una barra de herramientas flotante.
2. Versin Excel 2007 (o posterior)

En la esquina inferior izquierda de la ventana de Excel, en la barra de estado, ver al lado de la instruccin Listo,
el icono de la Grabadora.

Para iniciar la grabacin, basta con hacer clic en este icono:

Aparecer un cuadro de dilogo que le pide que escoja un nombre para su macro.

Indique el nombre de la macro y haga clic en Aceptar.

A partir de ese momento, todas las acciones que realice se grabarn en el Visual Basic Editor.

Para detener la grabacin, haga clic en el mismo sitio (el icono habr cambiado de apariencia):
Primer ejercicio
Para nuestro primer programa, vamos a trabajar con el libro (Ejemplo 4-C) que podr descargar de la pgina
Informacin.

El objetivo de nuestro trabajo es combinar los nombres de la columna A cuando stos sean idnticos para alcanzar el
resultado siguiente:

Como comprobar, el nmero de lneas que se van a combinar, vara. Por lo tanto no es posible utilizar la herramienta

Copiar formato ya que esta herramienta respeta no slo el formato, sino tambin el nmero de lneas
afectadas. As que debemos crear una macro para realizar esta tarea automticamente.

En un primer momento, vamos a utilizar la Grabadora de macros para codificar la primera combinacin de
celda. Es importante que respete los pasos siguientes para que pueda llegar exactamente al mismo cdigo que el
que figura a continuacin.

Inicie la Grabadora.
Conserve el nombre Macro1 y haga clic en Aceptar.

Seleccione las celdas A2 a A5.

Abra el cuadro de dilogo Formato de celdas (Formato - Celda en Excel 2003 o, en Excel 2007, 2010 y 2013,
haga clic en el icono de cuadro de dilogo del grupo Alineacin en la pestaa INICIO).

Aparecer el siguiente cuadro de dilogo:

Ventana de configuracin de alineacin de una celda


Marque la opcin Combinar celdas.

Escoja la alineacin Horizontal: Izquierda (sangra).

Escoja la alineacin Vertical: Centrar.

Pulse Aceptar.

Aparecer un mensaje de error que le indica que la combinacin har desaparecer valores pero no le haga caso:
haga clic en Aceptar.

El resultado en la pantalla ser el siguiente:

Detenga la grabacin haciendo clic en el botn Stop .

A continuacin acceda a Visual Basic Editor: en el Mdulo1 encontrar un programa similar a ste:
Sub Macro1()

Macro1 by.................

Range("A2:A5").Select
With Selection
.HorizontalAlignment = xlLeft
.VerticalAlignment = xlCenter
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = True
End With
End Sub

Encontrar ese cdigo en el archivo del Ejemplo 4-B2.

Examen del cdigo


El cdigo comienza por lneas escritas en verde precedidas de un apstrofo: estas lneas son comentarios. Una
lnea precedida de un apstrofo no se interpreta como cdigo.

La primera lnea que se interpretar corresponde a la seleccin del rango de celdas A2 a A5:

Range("A2:A5").Select

A continuacin, visualizar el conjunto de datos reunidos en un bloque With/End With. Un bloque de datos
With/End With permite asociar varias propiedades a un solo objeto. Aqu, para el objeto Selection, las lneas
corresponden a nueve propiedades del cuadro de dilogo Formato - Celda - pestaa Alineacin:
HorizontalAlignment, VerticalAlignment, WrapText, etc.

Es uno de los principales defectos de la Grabadora de macros: cuando activa un cuadro de dilogo de Excel
(Formato de celdas, Configurar pgina, etc.) la Grabadora codifica todos los elementos de este cuadro de
dilogo, aunque no los haya modificado.

No dude en suprimir las lneas de cdigo intiles (para optimizar la utilizacin de la Grabadora, puede consultar el
captulo Optimizacin).

En nuestro ejemplo, como slo hemos cambiado tres parmetros en el cuadro de dilogo, podemos conservar las
siguientes lneas:
Sub Macro1()
Range("A2:A5").Select
With Selection
.HorizontalAlignment = xlLeft
.VerticalAlignment = xlCenter
.MergeCells = True
End With
End Sub
Ejecucin del cdigo
Ahora vamos a utilizar el cdigo para dar formato a las dems celdas del libro.

Inicie su programa, haciendo clic en el icono o pulsando la tecla [F5].

No ve ningn cambio en su hoja de clculo! De hecho, la primera lnea de cdigo indica que ha seleccionado las
celdas A2 a A5, el programa slo se aplicar en esta seleccin (debido a la instruccin With Selection).

Para que este programa se aplique a cualquier seleccin de celdas, debe eliminar la lnea de cdigo
Range("A2:A5").Select.

El cdigo pasa a ser:

Sub Macro1()
With Selection
.HorizontalAlignment = xlLeft
.VerticalAlignment = xlCenter
.MergeCells = True
End With
End Sub

Ahora comprobemos la buena ejecucin del programa.

Seleccione las celdas A6:A12 e inicie su programa.

Las celdas A6 a A12 se han combinado.

Seleccione las celdas A13:A14 e inicie su programa.

Para cada seleccin realizada, el programa combina las celdas y alinea el texto en las celdas combinadas. Cada vez
que lo ejecute, aparecer un mensaje de alerta de la combinacin. En el captulo Trabajar en un libro Excel, ver
cmo evitar estos mensajes con la propiedad DisplayAlerts.

En el captulo de los bucles veremos cmo automatizar este programa para combinar todas las celdas sin tener
que seleccionarlas previamente.

Sntesis
Utilizar la Grabadora de macros tiene ventajas, pero tambin inconvenientes:

Ventajas Inconvenientes

Permite recuperar el cdigo de objetos, de La Grabadora de macros escribe muchos


propiedades, de mtodos, as como los parmetros cdigos intiles.
de formato (color, bordes, orientacin, casillas de Todas las referencias de celdas se graban
formulario, etc.). "literalmente" (se transcriben con sus
coordenadas, sin posibilidad de cambiarlas).
Todas las acciones se escriben a medida que
se van realizando, sin posibilidad de repeticin
(vase Los bucles).
Las variables

Introduccin
Como vimos en el captulo Primer programa, la Grabadora de macros convierte cada una de las selecciones de
celda, de rango de celdas, en referencias fijas:

Range("A3:B5").Select
Range("C8").Select
Columns("D").Select

Este tipo de escritura del cdigo tiende a desaparecer ya que las referencias sern invariablemente las mismas. Es
decir, el inters de hacer un programa es aplicar una instruccin a una celda, y despus reproducir esta instruccin
en otras celdas.

Por tanto, no hace falta escribir directamente las referencias de celda en el cdigo, sino utilizar una variable que,
como su propio nombre indica, permitir hacer variar las coordenadas de la celda.

Qu es una variable?
Una variable es un dato que va a nombrar y en el que va a introducir informacin: cifra, dato, texto, etc.

Realmente no hay reglas para el nombre que le da a sus variables; puede escoger cualquier palabra con la
condicin de que no sea una de las palabras reservadas (palabras clave) de VBA (como Sheets, Cells, Worksheets,
Column, Row, etc.).

Una variable puede estar compuesta por una o varias palabras pero no deben estar separadas por un espacio o
por un guin (-). El nico carcter de separacin autorizado es el guin bajo (_).

Para mayor eficacia en la gestin de sus variables, es preferible dar prioridad a nombres comprensibles
(Nm_Fila, Nombre_Libro, Nombre_Hoja, etc.), en lugar de elegir nombres compuestos por una sola letra (i,
j, k, etc.).

Declaracin de una variable

1. Declaracin obligatoria o no?

Visual Basic permite trabajar con variables sin declararlas. Sin embargo, un lenguaje informtico cualquiera no
puede trabajar al mismo tiempo con datos numricos y datos textuales. En efecto, si trata de agregar cifras y
texto, su programa se detendr y se quedar colgado.

Declarar sus variables prevendr un error de ejecucin.

En los ejemplos siguientes, se declararn todas las variables. Cuando se declara una variable, basta con escribir
los primeros caracteres de su nombre y despus utilizar el atajo [Ctrl][Espacio] para que se muestre el
nombre completo instantneamente.

Podr hacer obligatoria la introduccin de variables modificando una opcin de la configuracin de Visual Basic
Editor.

Abra el men Herramientas - Opciones.

Marque la opcin Requerir declaracin de variables.


Haga clic Aceptar.

La adicin de un nuevo mdulo empezar sistemticamente por la instruccin, que impone la declaracin de
todas las variables, Option Explicit.

2. Tipo de variable

El Visual Basic le propone una docena de tipos de variables distintas para declarar sus variables (vase Anexo -
Tipos de variables). Sin embargo, no necesitar utilizarlas todas ya que normalmente slo emplear cuatro o
cinco.

a. Declaracin de texto

Cuando una variable contenga texto, tendr que declararse obligatoriamente en String.

b. Declaracin de fechas

Las fechas son nmeros particulares, ya que las manipulaciones relacionadas con las fechas son especficas
(da, mes, ao). En caso de necesitar almacenar una fecha en una variable, la declarar en un tipo Date
(como es lgico).

c. Declaracin de objetos

El trmino objetos puede despistar, pero ha de saber que una hoja de clculo, un libro, una celda, etc. son
objetos. Por tanto, cuando realice algn tratamiento en hojas (como con la funcin For Each, por ejemplo),
tendr que declarar sus variables en Object.

d. Declaracin de nmeros

En informtica, un nmero con decimales y un nmero entero son dos elementos diferentes, y por lo tanto, no
se declaran del mismo modo. Para los nmeros decimales, debe declararlos en Double y para los nmeros
enteros, ha de declararlos en Long.

Existen otros tipos de declaracin de los nmeros como Byte, Single, etc.
Hace ya unos quince aos, era muy importante la optimizacin de la memoria y, por tanto, declarar muy bien
las variables. Hoy en da, dado el rendimiento de los ordenadores ya no es necesario tener eso en cuenta. El
Visual Basic 7 (que sali con Office 2010) convierte sistemticamente las declaraciones de tipo Byte,
Integer en tipo Long y Single en Double al ejecutar un programa.

Por lo tanto, para los nmeros trabaje slo con los tipos Double y Long.

Desde que sali Office 2010, el Visual Basic trabaja con ordenadores con una arquitectura de 64 bits. Si
aumenta el tamao de la memoria, puede realizar clculos en 8 bytes. Para definir una variable con 8 bytes, le
tiene que designar el tipo LongLong. Esto slo funciona para las versiones de Office de 64 bits.

e. Declaracin booleana

En un test entre dos valores, el resultado puede ser Verdadero (1) o Falso (0). Por consiguiente, si tiene que
almacenar en la memoria el resultado de un test, puede hacerlo en una variable que slo acepte estos dos
estados, es decir, de tipo Boolean.

f. Declaracin cajn de sastre

Existe este ltimo tipo de variable; se trata del tipo Variant. Al declarar una variable en Variant, puede tratar
tanto texto, como nmeros, como objetos.

Evidentemente, es ms fcil aprender programacin codificando todas las variables con este tipo, pero el mayor
riesgo es que quiera realizar manipulaciones de variables (clculo o concatenacin) en los distintos tipos. Por lo
tanto, aprenda a usarlos bien pronto para evitar el abuso de este tipo de declaracin.

3. La instruccin Dim

La instruccin Dim (diminutivo de Dimension) permite definir un nombre como si fuese una variable y asignarle
un espacio de almacenamiento.

DIM Nombre_de_la_variable AS Tipo de variable

Una variable se declara siempre al principio de un procedimiento. Al declarar una variable dentro de un
procedimiento, sta slo se reconocer (o ser visible) para este nico procedimiento.

La declaracin de una variable con la instruccin Dim inicializa la variable.

Una variable declarada en uno de los formatos numricos tendr como valor 0, una variable declarada de tipo
String estar vaca (no confundir con una cadena de caracteres que contiene espacios). Esto implica que si
vuelve a referirse a este procedimiento en el transcurso del programa, no conservar el ltimo valor
almacenado en las variables.

4. La instruccin Static

STATIC Nombre_de_la_variable AS Tipo de variable

La instruccin Static se declara tambin en un procedimiento pero, a diferencia de la instruccin Dim que inicializa
las variables desde la entrada a este procedimiento, una variable declarada en Static conserva su valor en la
memoria; este valor se conserva mientras Excel est abierto. O dicho de otra forma, si vuelve a iniciar su programa,
su cdigo se ejecutar utilizando el ltimo valor de sus variables declaradas en Static.

Por ejemplo, si inicia varias veces el siguiente cdigo:

Sub Variable_Static()
Static Nm_Fila as Long
Nm_Fila = Nm_Fila +1
Cells(Nm_Fila , 1) = Nm_Fila
End Sub

En el primer paso, el valor es Nm_Fila = 0; la instruccin Nm_Fila = Nm_Fila +1 cambiar el valor de


la variable a 1. Por lo tanto, en la celda A1 el programa mostrar 1.

En el segundo paso, Nm_Fila sigue valiendo 1. Entonces, la instruccin Nm_Fila = Nm_Fila +1 colocar
el valor de la variable a 2, y por lo tanto en B1 el valor mostrado ser 2. Y as sucesivamente al realizar las
diferentes acciones de este programa.

Observar que para cada nueva ejecucin, el programa escribe el resultado en una nueva lnea. Como la variable se
ha declarado en Static, cada nueva ejecucin reutilizar el anterior valor calculado.

Si ahora utiliza el mismo programa pero con la variable declarada en Dim, el valor de la variable seguir siendo
igual a 1, ya que Dim reinicializa sistemticamente las variables.

Sub Variable_Static()
Dim Nm_Fila as Long
Nm_Fila = Nm_Fila +1
Cells(Nm_Fila , 1) = Nm_Fila
End Sub

5. La instruccin Public

Si desea que una variable sea visible para todos los procedimientos de un proyecto, deber declararla al principio
de un mdulo de la siguiente forma:

PUBLIC Nombre_de_la_variable AS Tipo de variable

Como para una variable Static, el valor se conservar en la memoria mientras Excel est abierto y todos los
procedimientos o funciones de su proyecto reconocern la variable.

Generalmente, los nombres de archivos o los nombres de hoja de clculo se declaran en variable Public ya que esa
informacin a menudo la vuelven a usar todos los procedimientos.

Caso prctico de utilizacin de una variable


Queremos hacer un programa que mostrar un nmero de fila, sumar este nmero de fila consigo mismo y
multiplicarlo por s mismo. Podemos escribir el cdigo de la siguiente forma:

Sub Clculo()
Cells(1, 1) = 1
Cells(1, 2) = 1 + 1
Cells(1, 3) = 1 * 1
End Sub

El resultado es el siguiente:
Si iniciamos varias veces este programa, obtendremos siempre el mismo resultado. Para hacer ms dinmico este
programa, vamos a reemplazar todos los valores 1 por una variable.

El cdigo pasa a ser:

Sub Clculo()
Dim Val_Data As Long

Val_Data = 1
Cells(1, 1) = Val_Data
Cells(1, 2) = Val_Data + Val_Data
Cells(1, 3) = Val_Data * Val_Data
End Sub

Si iniciamos varias veces este programa, el resultado seguir invariable ya que la ejecucin se har siempre con el
valor 1.

Ahora, si le damos el valor 2 a la variable Val_Data, obtendremos el siguiente resultado:

Tambin podemos utilizar la variable Val_Data para reemplazar el parmetro del nmero de fila en la instruccin
Cells.

El cdigo pasa a ser:

Sub Clculo()
Dim Val_Data As Long
Val_Data = 1
Cells(Val_Data, 1) = Val_Data
Cells(Val_Data, 2) = Val_Data + Val_Data
Cells(Val_Data, 3) = Val_Data * Val_Data

End Sub

Inicie tres veces seguidas el programa con los valores para la variable Val_Data: 1, 2 y 3.

El resultado figura en su hoja de clculo en las filas 1, 2 y 3:


Las tablas

1. Presentacin

En programacin, puede designar a una sola variable varios valores mediante una tabla.

Por ejemplo, puede crear una tabla que se llamar Da_Semana y que contendr todos los das de la semana:
lunes, martes...

2. Declaracin

Una tabla se declara como una variable tradicional, pero adems hay que indicar el tamao de la tabla (es decir,
el nmero mximo de elementos que podr contener la tabla). Esta informacin se colocar entre parntesis
como en el ejemplo siguiente:

Dim Mi_Tabla(30) As Double

Atencin: el primer elemento de una tabla se almacena en la posicin (o en el ndice) 0. Por tanto, la tabla
Mi_tabla(30) puede contener como mximo 31 datos.

3. Utilizacin

Para recuperar un elemento de la tabla, basta con indicar por medio de un ndice el elemento que desea
recuperar.

Por ejemplo, si desea mostrar en A1 el primer elemento de su tabla, escribir:

Cells(1, 2) = Mi_Tabla(30)

Por el contrario, si indica un ndice mayor que el tamao inicial de la tabla, el programa se detendr debido a un
rebasamiento de capacidad.

Cells(1, 3) = Mi_Tabla(31) Rebasamiento de capacidad

4. Carga de una tabla

Existen dos mtodos para cargar los valores de una tabla.

La instruccin Array

Array(dato1, dato2, ...)

Puede rellenar una tabla inicializando todos sus valores, directamente en el cdigo, mediante la variable Array.

Con este mtodo, la declaracin de la variable de la tabla debe ser obligatoriamente en Variant (cf. Anexos -
Tipos de variables) y sin precisar el tamao de la tabla.

Sub Carga_Tabla()
Dim Mi_Tabla As Variant
Mi_Tabla = Array("Lunes", "Martes", "Mircoles", "Jueves", _
"Viernes", "Sbado", "Domingo")
End Sub
El resultado en la memoria ser el siguiente:

Mediante un bucle

Este mtodo lo estudiaremos en el captulo que trata sobre los bucles y encontrar un ejemplo completo en el
captulo Optimizacin - seccin Optimizacin en una tabla.

5. Cambiar el tamao de una tabla

ReDim Tabla(dimensin)

A menudo es difcil saber en un principio el tamao de una tabla. Y ms an si su programa debe ejecutarse
varias veces para datos distintos. Afortunadamente, VBA permite cambiar el tamao de su tabla durante el
tratamiento.

El mtodo para cambiar el tamao de una tabla es bastante sencillo. En primer lugar, hay que declarar la tabla
sin ninguna dimensin (pero conservando los parntesis) y de tipo Variant:

Dim Mi_Tabla() As String Redefinir una tabla


para 9 elementos

A continuacin, en cuanto sepa el nmero de elementos que va a agregar a la tabla, proceda al cambio de tamao
indicando su tamao en los parntesis:

ReDim Mi_Tabla (8)

Otra posibilidad es que recupere el nmero de filas introducidas en la columna A y a continuacin, utilice este valor
para darle un tamao a su tabla:

N_Filas = Cells(1, 1).CurrentRegion.Rows.Count


ReDim Mi_Tabla(N_Filas - 1)

Aqu, el valor -1 es necesario para respetar el hecho de que una tabla empiece siempre en la posicin 0.

Sin embargo, puede especificar que una tabla empiece por la posicin 1 escribiendo al principio del mdulo la
siguiente instruccin:

Option Base 1

El cambio de tamao de una tabla implica su inicializacin. No obstante, puede conservar los datos almacenados en
la tabla agregando la opcin Preserve en el cambio de tamao.

ReDim Preserve Mi_Tabla(N_Filas - 1)

6. Tabla con varios tamaos

Si desea almacenar en la memoria no slo una columna, sino varias, puede crear una tabla multidimensional.
Para ello, debe declarar su tabla separando cada dimensin mediante una coma:

Dim Mi_Tabla(x, y, z, .......) As Long

Al declarar una tabla con 2 dimensiones - como por ejemplo Mi_Tabla(5,4) - en la memoria crea una tabla
de 5 filas con 4 columnas (es decir, 20 valores).

Ms all de 2 dimensiones, es muy difcil representar simplemente una tabla. Adems, es muy raro que tenga
que crear tablas con ms de 2 dimensiones, pero al menos, sepa que es posible.

7. La ventaja de las tablas

La gran ventaja de almacenar valores en la memoria es la de mejorar bastante la velocidad de ejecucin del
programa. En efecto, al buscar sus datos en la hoja de clculo, llama a un objeto grfico (la hoja de clculo
propiamente dicha), lo cual sobrecargar enormemente el tiempo de ejecucin.

Si utiliza los valores de una columna como el elemento de clculo, es preferible cargarlos previamente en una tabla
para reducir el tiempo de tratamiento.

Es bastante difcil cuantificar el tiempo de tratamiento ganado si trabajamos con tablas ya que todo depende de su
programa y de las consultas a los valores que realice. Pero es posible reducir por 3 (incluso mucho ms) el tiempo
de tratamiento. Consulte el captulo Optimizacin para medir el beneficio por la utilizacin de una tabla.

Las condiciones

Introduccin
Un programa informtico a menudo realiza comparaciones entre valores y, en funcin del resultado de esta
comparacin, efecta un tratamiento especfico.

La instruccin If
IF condicin THEN
[Instrucciones si Verdadero]
[ELSE]
[Instrucciones si Falso]
END IF

1. Presentacin

La instruccin IF es muy simple de entender. Se realiza un test (o condicin) que sea o bien verificado
(Verdadero) o bien no verificado (Falso).

Por ejemplo, puede comprobar:

el valor de los nmeros de fila,


la presencia o no de datos en una celda,
la diferencia de valor entre dos celdas,
la presencia de una hoja en un libro,
Una condicin slo devuelve dos datos: el test es Verdadero o Falso (y nada ms).

En el caso de que el test sea Verdadero, el programa ejecuta las instrucciones que se encuentran despus de
THEN (traduccin de Entonces).

Si el resultado de la condicin es Falso, el programa realiza las instrucciones que se encuentran despus de ELSE
(traduccin de Si no).

"Si el test es verdadero entonces .... si no ....".

Si desea comprobar que el estado de una variable es True, no es necesario que especifique el valor. Las
siguientes dos expresiones son similares.

If Mi_Variable = True Then

If Mi_Variable Then

En el captulo Las funciones bsicas veremos cmo integrar operadores de comparacin u operadores lgicos
(And, Or) para enriquecer nuestros tests.

2. Ejemplo de aplicacin

La siguiente hoja de clculo muestra el resultado de los encuentros entre 6 equipos. En la columna A aparece el
nombre de los equipos, en la B el nmero de puntos en la clasificacin y en la C, el resultado de la ltima jornada
(ganado = 1, perdido = 0).

Cuando se ha ganado un partido, el equipo se apunta 3 puntos, si no, el equipo se apunta 1 punto. Queremos aadir
+3 al valor de la columna B cuando el resultado de la columna C sea igual a 1; cuando el valor sea igual a 0,
aadiremos +1.

En VBA, se traduce del siguiente modo:

Sub Resultado_Partido()
If Cells(2, 3) = 1 Then
Cells(2, 2) = Cells(2, 2) + 3
Else
Cells(2, 2) = Cells(2, 2) + 1
End If
End Sub
3. Explicacin

La lnea Cells(2, 2) = Cells(2, 2) + 3 debe retrasarse ya que la celda B2 se presenta dos veces para
2 utilizaciones diferentes.

La parte de la derecha del signo = utiliza el valor de la celda B2 en la operacin. Es decir, 35 + 3. Aqu la celda
B2 se lee y su contenido se utiliza en un clculo.

La parte de la izquierda del signo = indica dnde guardamos el resultado. Por lo tanto, reutilizamos la celda B2
que aqu se utilizar como lugar de almacenamiento.

En resumen:

antes de la ejecucin de la lnea de comando, la celda B2 tiene el valor 35;


en la instruccin, este valor se utiliza en el clculo;
al final, la celda B2 vale 38.

4. Transformacin del cdigo

Para permitir a nuestro programa que se ejecute en todas las lneas, vamos a sustituir en cada instruccin Cells,
el ndice de la fila por una variable.

Sub Resultado_Partido()
Dim Nm_Fila as Long
Nm_Fila = 2
If Cells(Nm_Fila , 3) = 1 Then
Cells(Nm_Fila , 2) = Cells(Nm_Fila , 2) + 3
Else
Cells(Nm_Fila , 2) = Cells(Nm_Fila , 2) + 1
End If
End Sub

Ahora, basta con que cambie el nmero de lnea para aplicar este cdigo a todos los equipos:

Inicie su programa para Nm_Fila = 3.

Inicie su programa para Nm_Fila = 4.

Inicie su programa para Nm_Fila = 5.

Inicie su programa para Nm_Fila = 6.

Inicie su programa para Nm_Fila = 7.

Y el resultado en la pantalla pasa a ser:


5. Abreviatura de escritura

Como la instruccin IF es una de las funciones ms utilizadas en programacin, existe otra forma de escribirla.

Retomando el mismo ejemplo, si el resultado es una derrota sin ningn punto, ya no necesitamos la instruccin
Else. Aadir 0 al resultado anterior obviamente no tiene sentido. Por lo tanto, nuestro test se escribira:

If Cells(2, 3) = 1 Then
Cells(2, 3) = Cells(2, 3) + 3
End If

Pero en ese caso, tambin podramos haber escrito toda la instruccin en una sola lnea, colocando el resultado de la
condicin justo despus de la instruccin THEN:

If Cells(2, 3) = 1 Then Cells(2, 3) = Cells(2, 3) + 3

Una instruccin IF con Else tambin puede escribirse en una sola lnea. En ese caso, hay que utilizar la instruccin
lif que respeta la misma sintaxis que la funcin SI en Excel:

Iif(Test, Verdadero, Falso)

Cells(2, 3) = Iif( Cells(2, 3) = 1, Cells(2, 3) + 3, Cells(2, 3) + 1)

El resultado de esta funcin se copia en una celda o en una variable.

Aplicado a nuestro programa, el test pasa a ser:

Sub Resultado_Partido()
Dim Nm_Fila as Long
Nm_Fila = 2
Cells(Nm_Fila , 2) = Iif(Cells(Nm_Fila , 3) = 1, _
Cells(Nm_Fila , 2) + 3, Cells(Nm_Fila , 2) + 1)
End Sub

6. Condicin anidada

Como ya sabe, un partido puede ganarse o perderse, pero tambin puede haber un empate. Por tanto, debemos
modificar nuestra condicin para tener en cuenta este tercer elemento.

Una funcin IF slo puede tratar dos resultados, Verdadero o Falso. Para integrar a nuestra condicin IF un tercer
resultado, debemos crear otra instruccin IF en la parte Else de la primera condicin.

En caso de partido empatado, un equipo gana 2 puntos. La nueva tabla de resultados es la siguiente:
En lo que respecta al cdigo, vamos a retomar el programa anterior y vamos a aadir una nueva condicin: vamos a
reemplazar el caso en que el test sea Falso, por un nuevo test en el que trataremos los dos ltimos casos. El cdigo
ser el siguiente:

Sub Resultado_Partido()
Dim Nm_Fila as Long
Nm_Fila = 2
If Cells(Nm_Fila , 3) = 1 Then
Cells(Nm_Fila , 2) = Cells(Nm_Fila , 2) + 3
Else
If Cells(Nm_Fila, 3) = 0 Then
Cells(Nm_Fila , 2) = Cells(Nm_Fila , 2) + 1
Else
Cells(Nm_Fila , 2) = Cells(Nm_Fila , 2) + 2
End If
End If
End Sub

Tenemos nuestras tres posibilidades de resultados.

Como el nmero de casos que tratamos es importante, el nmero de funciones IF que


combinamos entre s, ser importante y el programa corre el riesgo de ser ilegible para usted, y
ms an para las personas que vayan a leerlo. En ese caso, es preferible buscar otro mtodo
distinto a la funcin IF.

La instruccin SELECT CASE


SELECT CASE Expresin
Case Valor1
Instruccin
Case Valor2
Instruccin
Case Valor...
Instruccin
Case Else
Instruccin
End Select

1. Presentacin

La instruccin SELECT CASE (traduccin de Segn el caso) comprobar un valor.

A diferencia de la instruccin IF que slo permite tratar dos casos (Verdadero o Falso), la instruccin SELECT
CASE le permite precisar todos los valores posibles. Los diferentes casos que va a enumerar se llaman
conexiones.

La conexin CASE ELSE se escribe siempre al final de la instruccin y se efecta cuando el valor que va
a comprobar no se encuentra en ninguna conexin anterior.

2. Ejemplo de utilizacin

a. Test a un solo valor

Es el caso ms simple. Puede crear una conexin para cada valor unitario posible.

Imaginemos que desea mostrar el nmero de votos obtenidos por tres candidatos. El nombre del candidato
figura en la celda A1 y el resultado, en la celda B1.

Sub Nmero_de_votos()
Select Case Cells(1, 1)
Case "Candidato A"
Cells(1, 2) = 542
Case "Candidato B"
Cells(1, 2) = 398
Case "Candidato C"
Cells(1, 2) = 621
End Select
End Sub

b. Test en varios valores no contiguos

Tambin puede especificar en una misma conexin, todos los valores no contiguos posibles que puede tomar el valor
verificado. Para ello, basta con separar cada uno de ellos con una coma.

Por ejemplo, quiere crear un test que muestre la palabra "Nmero primo" en B1 en funcin del valor contenido en
A1.

Sub Es_Primo()
Select Case Cells(1, 1)
Case 1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37,
Cells(1, 2) = "Nmero primo"
Case Else
Cells(1, 2) = "No es un nmero primo"
End Select
End Sub

c. Test en valores contiguos

Puede indicar que una conexin CASE debe ejecutarse para todos los valores comprendidos en un intervalo
mediante la instruccin To. Por ejemplo, si realiza un test que devuelva la calificacin en funcin del valor
contenido en A1. Su test se escribir de la siguiente forma:

Sub Resultado_Examen()
Select Case Cells(1, 1)
Case 0 To 4.99
Cells(1, 2) = "No aprobado"
Case 5 To 5.99
Cells(1, 2) = "Aprobado"
Case 6 To 6.99
Cells(1, 2) = "Aprobado. Bien"
Case 7 To 8.99
Cells(1, 2) = "Aprobado. Notable"
Case Else
Cells(1, 2) = "Aprobado. Sobresaliente"
End Select
End Sub

Observe que las diferentes conexiones no se solapan. Sin embargo, si se diese el caso, el programa no habra
detectado la anomala y habra devuelto el primer caso respondiendo al criterio de seleccin.

3. Reversibilidad

Hasta ahora, hemos realizado tests en el valor de una celda o de una variable. Pero la inversa tambin es
posible: la instruccin SELECT CASE permite verificar un valor y encontrar en qu caso se ha verificado ese test.

A modo de ejemplo, cojamos el siguiente libro (Ejemplo 6-C3):

Queremos aplicar un porcentaje de descuento en funcin del estado civil de un individuo.

Para ello, creamos una funcin llamada Estado_Civil.

Vamos a utilizar la instruccin SELECT CASE para verificar que una celda es igual a 1.

Function Estado_Civil
Select Case True
Case Cells(1, 2)
Estado_Civil = 5
Case Cells(2, 2)
Estado_Civil = 0
Case Cells(3, 2)
Estado_Civil = 10
Case Cells(4, 2)
Estado_Civil = 15
Case Else
Estado_Civil = Imposible
End Select

End Function

En la celda B6, escriba =Estado_Civil().

Observe que en caso de que tenga que verificar el valor 1 o 0, tambin puede verificar en valores True
(Verdadero) o False (Falso).

IF o SELECT CASE?
Hace algunos aos, la instruccin SELECT CASE desapareci de los programas ya que requera demasiada
memoria. Despus cambiaron las cosas y el problema de la memoria se volvi obsoleto. Sin embargo, las ideas
arraigadas son difciles de cambiar y la instruccin SELECT CASE no es muy popular entre los programadores.

Lejos de estas consideraciones, es ms coherente utilizar la funcin IF cuando slo hay una, dos o incluso tres
posibilidades. A partir de ah, es preferible utilizar la funcin SELECT CASE.

Los bucles

Introduccin
Los programas que hemos realizado hasta ahora slo pueden ejecutar una sola vez el tratamiento. Para evitar
tener que iniciar varias veces el mismo programa con distintos valores de variables, vamos a utilizar bucles que se
encargarn de reproducir varias veces las instrucciones y aumentar las variables.

La instruccin For ... Next


FOR ndice= Principio TO Fin [STEP paso]
[Instrucciones]
NEXT[ndice]

Con:

ndice: corresponde a la variable. Su valor evolucionar durante el bucle;


Principio: valor con el que empezar el bucle;
Fin: valor con el que acabar el bucle;
Paso: incremento del valor del bucle. Este valor es facultativo; por defecto, el valor del Paso es igual a 1.
Un bucle FOR ... NEXT se comprende muy fcilmente: el bucle empieza con el valor Principio y se termina cuando
el ndice alcance el valor Fin. Los bucles FOR ... NEXT se utilizan para un nmero conocido de repeticiones.

La variable ndice se inicializa automticamente cuando el bucle comienza; cada vez que la instruccin NEXT se
alcanza, la variable ndice se incrementa. El incremento va en funcin del valor del Paso (si el Paso se omite, el
incremento ser de una unidad).

1. Primer ejemplo de bucle

Vamos a retomar el ejemplo realizado en el captulo Las variables para ilustrar las variables y vamos a
completarlo para reproducir n veces los clculos. El programa pasa a ser:

Sub Programa_Principal()
Dim Val_Data As Long
For Val_Data = 1 To 10

Cells(Val_Data, 1) = Val_Data
Cells(Val_Data, 2) = Val_Data + Val_Data
Cells(Val_Data, 3) = Val_Data * Val_Data
Next Val_Data
End Sub

2. Explicacin del cdigo

Al iniciar el bucle, la variable Val_Data toma el valor 1.

A continuacin, el programa accede al bloque de instrucciones que se repetir; la variable Val_Data se utiliza
para efectuar un clculo y colocar el resultado en la primera fila. El programa escribir en la celda A1 el valor 1,
en A2, el resultado 1 + 1 es decir, 2 y en A3, el resultado 1 * 1 es decir, 1.

A continuacin, el programa llega a la instruccin NEXT que incrementar la variable Val_Data en una unidad. Al
mismo tiempo, se realiza un test para verificar que la variable Val_Data no ha alcanzado el valor mximo situado
despus de TO, es decir, 10 en nuestro ejemplo. Como en este momento, Val_Data vale 2, el programa volver a la
instruccin FOR. Y as sucesivamente, hasta que la variable Nm_Fila alcance el valor 10.

Al final del proceso, el resultado ser el siguiente en nuestra hoja de clculo:


3. Ejemplo de bucle con dos variables

Hasta ahora, hemos utilizado una sola variable para modificar la referencia de las filas de una celda. Pero como
ya sabe, la instruccin Cells se compone de la referencia de una fila y de una columna. Tambin es posible crear
un programa que haga variar el ndice de las filas y el ndice de las columnas.

En el ejemplo siguiente vamos a crear una tabla de multiplicacin 15x15. Y para que entienda bien la lgica de la
construccin del programa, vamos a desgranar cada etapa.

a. Etapa n 1

Para su primer programa, no trate de disear el problema entero. Empiece siempre su programa con una sola
celda: a continuacin, agregue los bucles y variables que permitan reproducir esta metodologa.

Empecemos, pues, por el clculo de la primera celda:

Sub Tabla_Multiplicacin()
Cells(1, 1) = 1 * 1
End Sub

b. Etapa n 2

Ahora introduzca el primer bucle que permita el incremento de filas: reemplazaremos el ndice de las filas por
una variable que servir en nuestro clculo. El cdigo pasa a ser:

Sub Tabla_Multiplicacin()
Dim Nm_Fila as Long
For Nm_Fila = 1 To 15
Cells(Nm_Fila, 1) = Nm_Fila * 1

Next
End Sub

Este programa completar las 15 primeras filas de la columna A dando los valores de 1x1 a
15x1.

c. Etapa n 3

Para finalizar, vamos a construir el bucle que permita hacer variar el ndice de las columnas:

Sub Tabla_Multiplicacin()
Dim Nm_Fila as Long
Dim Nm_Col as Long
For Nm_Col = 1 To 15
For Nm_Fila = 1 To 15
Cells(Nm_Fila, Nm_Col) = Nm_Fila * Nm_Col
Next
Next
End Sub

d. Sntesis
El encadenamiento de tareas es muy sencillo. El programa ejecuta, en primer lugar, el bucle de las columnas y
despus, el de las filas que se realiza 15 veces.

Cuando termina el bucle de las filas, incrementamos en una unidad la variable de las columnas para rellenar la
columna B. Y despus, volvemos a empezar el bucle de las filas partiendo del valor 1. Esta vez los resultados se
introducirn en la columna B para los valores que van de 2x1 a 2x15. Y as sucesivamente, hasta que el bucle
de las columnas llegue a 15.

Bucle segn condicin

1. While ... Wend

WHILE condicin
[Instruccin]
WEND

a. Principio

A diferencia de un bucle FOR ... NEXT en el que se impone especificar el nmero de veces que se ejecutar el
bucle, un bucle WHILE ... WEND se para cuando se verifica un test.

Por ejemplo, es posible hacer un test sobre el contenido de una celda (conocido o no); as, sea cual sea el
nmero de celdas no vacas de una columna, el bucle se detendr cuando el programa alcance la primera celda
vaca.

b. Ejemplo de aplicacin

Vamos a escribir un programa que recorrer todas las filas de la columna A hasta que lleguemos a la ltima celda y
que escribir en cada una de las filas el valor de la variable en la columna B.

Obtendremos el siguiente cdigo, pero as escrito, no puede funcionar:

Sub Programa_Principal()
Dim Fila_Leda As Long
While Cells(Fila_Leda, 1) <> ""
Cells(Nm_Fila, 2) = Nm_Fila
Wend
End Sub

c. Obligacin

A diferencia de un bucle FOR ... NEXT, un bucle WHILE impone inicializar el primer valor de la variable e
incrementar la variable en el programa.

El cdigo pasa a ser:

Sub Programa_Principal()
Dim Fila_Leda As Long
Fila_Leda = 2 Inicializacin de la variable
While Cells(Fila_Leda, 1) <> ""
Cells(Fila_Leda, 2) = Fila_Leda
Fila_Leda = Fila_Leda + 1 Incremento
Wend
End Sub

Por desgracia, frecuentemente olvidamos incrementar la variable del bucle, y como consecuencia, se bloquea
el programa. Para salir de esta situacin, pulse las teclas [Ctrl][Pausa] y podr volver a tener el control de
su programa.

2. Ejemplo de cdigo

Vamos a retomar el ejemplo del captulo Primer Programa - Primer ejercicio, que combina las celdas de un
mismo cliente. Recordemos que habamos creado el siguiente cdigo:

Sub Macro1()
With Selection
.HorizontalAlignment = xlLeft
.VerticalAlignment = xlCenter
.MergeCells = True
End With
End Sub

Para que este cdigo se pueda utilizar en todo el documento, hay que seleccionar un rango de celdas antes de
iniciar el programa. Gracias a los bucles, vamos a adaptar este cdigo para que funcione en todos los casos,
independientemente del nmero de filas a combinar.

Para poder seleccionar el rango de celdas correspondiente a un mismo cliente, debemos crear un programa con
dos variables:

una primera variable correspondiente a la fila de principio del rango de celdas (Nm_Fila).
una segunda variable correspondiente al nmero de fila de fin del rango de celdas (Fila_Fin).

La variable de los nmeros de fila servir, al mismo tiempo, para determinar la fila de partida de la combinacin
y para encontrar la ltima fila de nuestros valores para detener el bucle.

Por lo tanto, debemos hacer dos bucles:

El primero para recorrer el conjunto de filas de la columna A (hasta que encontremos una fila vaca).
El segundo se utilizar para encontrar la ltima fila del rango antes de cambiar el
nombre del cliente.

El primer bucle es clsico. Hay que leer en secuencia las celdas de la columna A hasta que se encuentre una celda
no conocida y as, acabar el programa.

Sub Macro1()
Dim Nm_Fila As Long

Nm_Fila = 2
While Cells(Nm_Fila, 1) <> ""
INSTRUCCIONES

Nm_Fila = Fila_Fin + 1
Wend

End Sub

El segundo bucle determina el rango de celdas que ser objeto de la combinacin. Para ello, debemos realizar un
bucle que verifique la igualdad entre los nombres de dos celdas contiguas.

En una primera variable, guardaremos la primera fila en la que haya igualdad de nombres. Hacemos bucles en los
nombres tantas veces como haya nombres iguales y cuando detectemos dos nombres distintos, recuperamos el
valor de la fila de la ltima fila leda. As, tendremos la primera y la ltima celda que corresponde a un mismo
cliente.

Sub Macro1()
Dim Nm_Fila As Long
Nm_Fila = 2
While Cells(Nm_Fila, 1) <> ""

Fila_Fin = Nm_Fila
While Cells(Fila_Fin, 1) = Cells(Fila_Fin + 1, 1)
Fila_Fin = Fila_Fin + 1
Wend

Nm_Fila = Fila_Fin + 1
Wend
End Sub

As, al final del segundo bucle tenemos en la variable Nm_Fila el valor de la primera celda del rango y, en la
variable Fila_Fin, el valor de la ltima celda del rango.

Ya slo nos faltara copiar el cdigo del formato despus de este segundo bucle para aplicar la combinacin en un
rango de celdas.

Sub Macro1()
Dim Nm_Fila As Long
Nm_Fila = 2

While Cells(Nm_Fila, 1) <> ""

Fila_Fin = Nm_Fila
While Cells(Fila_Fin, 1) = Cells(Fila_Fin + 1, 1)
Fila_Fin = Fila_Fin + 1
Wend
With Range(Cells(Nm_Fila, 1), Cells(Fila_Fin, 1))
.HorizontalAlignment = xlLeft
.VerticalAlignment = xlCenter
.MergeCells = True
End With

Nm_Fila = Fila_Fin + 1
Wend

End Sub

En este programa, no es posible gestionar los bucles con un FOR ... NEXT, ya que no conocemos de antemano el
nmero de filas que formarn parte del rango que vamos a combinar.

Para evitar la aparicin del mensaje de alerta en el momento de la combinacin, vamos a indicar a Excel que no
debe mostrar ningn mensaje durante la ejecucin del programa. Ahora agregamos la instruccin
Application.DisplayAlerts = False al principio del programa y despus, justo antes de dejar la macro,
volvemos a poner el parmetro en True para que Excel vuelva a mostrar los mensajes de error (cf. Captulo
Trabajar en un libro Excel - El objeto Application).

ste es el cdigo final que realiza las operaciones de combinacin para todo el documento:

Sub Macro1()
Dim Nm_Fila As Long
Nm_Fila = 2
Application.DisplayAlerts = False
While Cells(Nm_Fila, 1) <> ""
Fila_Fin = Nm_Fila
While Cells(Fila_Fin, 1) = Cells(Fila_Fin + 1, 1)
Fila_Fin = Fila_Fin + 1
Wend
With Range(Cells(Nm_Fila, 1), Cells(Fila_Fin, 1))
.HorizontalAlignment = xlLeft
.VerticalAlignment = xlCenter
.MergeCells = True
End With
Nm_Fila = Fila_Fin + 1
Wend
Application.DisplayAlerts = True

End Sub

Encontrar el cdigo correspondiente en el archivo Ejemplo 7-C2.


3. Do ... Loop

DO {while | Until} condicin


Instruccin
LOOP

O:

DO
Instruccin
LOOP {while | Until} condicin

a. Presentacin

Los bucles DO ... LOOP son similares a los bucles WHILE ... WEND: hay que inicializar la variable utilizada en
el bucle e incrementar dicha variable.

Es posible hacer el test con While (traduccin de Mientras) pero tambin con Until (traduccin de Hasta).
Adems, es posible hacer un test al principio del bucle o al final de ste.

b. Ejemplo de aplicacin

El siguiente documento se compone de dos columnas: la primera contiene las fechas y la segunda, los
nombres. El archivo correspondiente se llama Ejemplo 7-C3b.

Como habr comprobado, para la misma fecha, puede haber uno o varios nombres. Para
mejorar la legibilidad de este documento, quiere organizar su tabla presentando en la misma
fila, una fecha y todos los nombres correspondientes a esa fecha.
Para realizar esta permutacin, hemos escrito el siguiente programa:

Sub Main()
Dim Nm_Fila As Long
Dim Col_Escritura As Long
Dim Fil_Escritura As Long

Fil_Escritura = 1
Nm_Fila = 1
While Cells(Nm_Fila, 1) <> ""
Col_Escritura = 5
Do

Cells(Fil_Escritura, 4) = Cells(Nm_Fila, 1)
Cells(Fil_Escritura, Col_Escritura) = Cells(Nm_Fila, 2)
Col_Escritura = Col_Escritura + 1
Nm_Fila = Nm_Fila + 1
Loop While Cells(Nm_Fila - 1, 1) = Cells(Nm_Fila, 1)
Fil_Escritura = Fil_Escritura + 1
Wend
End Sub

c. Explicacin del cdigo

Empezamos inicializando la variable que leer las celdas de la columna A Nm_Fila y la que se utilizar para
escribir el resultado final (Fil_Escritura).

A continuacin, escribimos el bucle que leer todas las celdas hasta la ltima celda no vaca (bucle realizado
con la instruccin WHILE ... WEND).

Justo despus de iniciar el bucle, inicializamos la variable de la columna de escritura Col_Escritura. La


inicializacin se hace dentro del primer bucle ya que debemos volver a colocarnos en la columna D cuando
hayamos tratado todos los nombres asociados a la misma fecha (para una explicacin ms detallada, consulte
el captulo siguiente sobre la depuracin).

A continuacin, construimos nuestro segundo bucle (instruccin DO ... LOOP) que se parar cuando ya no
haya igualdad en el valor de la fecha entre dos filas. Cuando haya una igualdad, escribiremos el resultado en
una misma fila. Slo la variable que corresponde al nmero de columna se incrementar.

En cada bucle, incrementamos la variable de la fila a leer, pero no la de la fila para escribir. La variable
Fil_Escritura slo debe incrementarse despus del segundo bucle (cuando ya no haya igualdad de
fechas).

El test del segundo bucle se realiza al final del bucle. De este modo, el bucle se detendr justo despus de
haber incrementado la variable de lectura de la columna A.

d. Mejora del cdigo

Habr observado que en este programa, reescribimos la fecha cada vez que el programa trata una fila. Sera
ms sensato escribir la fecha una sola vez por fila de escritura haciendo un test para evitar tener que reescribir
este dato si ya se ha presentado. Hay distintos modos de hacer este test:

comprobar que la celda de la columna 5 est vaca,


comprobar que la variable Col_Escritura = 5.

El programa pasa a ser:

Sub Main()
Dim Nm_Fila As Long
Dim Col_Escritura As Long
Dim Fil_Ecritura As Long

Fil_Escritura = 1
Nm_Fila = 1
While Cells(Nm_Fila, 1) <> ""
Col_Escritura = 5
Do
If Col_Escritura = 5 Then
Cells(Fil_Escritura, 4) = Cells(Nm_Fila, 1)
End If

Cells(Fil_Escritura, Col_Escritura) = Cells(Nm_Fila, 2)


Col_Escritura = Col_Escritura + 1
Nm_Fila = Nm_Fila + 1
Loop While Cells(Nm_Fila - 1, 1) = Cells(Nm_Fila, 1)
Fil_Escritura = Fil_Escritura + 1
Wend
End Sub
Tambin habra sido posible escribir la fecha al salir del segundo bucle, y as evitamos realizar un test:

Sub Main()
Dim Nm_Fila As Long
Dim Col_Escritura As Long
Dim Fil_Escritura As Long

Fil_Escritura = 1
Nm_Fila = 1
While Cells(Nm_Fila, 1) <> ""
Col_Escritura = 5
Do
Cells(Fil_Escritura, Col_Escritura) = Cells(Nm_Fila, 2)
Col_Escritura = Col_Escritura + 1
Nm_Fila = Nm_Fila + 1
Loop While Cells(Nm_Fila - 1, 1) = Cells(Nm_Fila, 1)
Cells(Fil_Escritura, 4) = Cells(Nm_Fila - 1, 1)

Fil_Escritura = Fil_Escritura + 1
Wend
End Sub

En ese caso particular, es necesario devolver el valor de la fecha de la fila anterior. En efecto, en este momento
acabamos de terminar el test de igualdad de la fecha y, por tanto, al salir del bucle, el valor de la fila leda seala la
fecha siguiente. Vamos a escribir la fecha de la penltima fila leda, es decir Nm_Fila - 1.

Encontrar el cdigo correspondiente en el archivo del Ejemplo 7-C3d.

e. Trabajar con dos hojas

Seguimos queriendo leer los datos de hoja1 pero el resultado debe copiarse en hoja2 en la columna A. La tarea
puede parecer compleja, pero de hecho, es muy sencillo de codificar.

Partiendo del cdigo anterior, vamos a agregar a cada objeto Cells, el objeto Sheets.

Para las celdas ledas, agregamos el objeto Sheets("Hoja1") y para las celdas en las que vamos a escribir,
agregamos el objeto Sheets("Hoja2").

El cdigo pasa a ser:

Sub Main()
Dim Nm_Fila As Long
Dim Col_Escritura As Long
Dim Fil_Escritura As Long

Fil_Escritura = 1
Nm_Fila = 1
While Sheets("Hoja1").Cells(Nm_Fila, 1) <> ""
Col_Escritura = 2
Do
Sheets("Hoja2").Cells(Fil_Escritura, Col_Escritura) =
Sheets("Hoja1").Cells(Nm_Fila, 2)

Col_Escritura = Col_Escritura + 1
Nm_Fila = Nm_Fila + 1
Loop While
Sheets("Hoja1").Cells(Nm_Fila - 1, 1) =
Sheets("Hoja1").Cells(Nm_Fila, 1)
Sheets("Hoja2").Cells(Fil_Escritura, 1) =
Sheets("Hoja1").Cells(Nm_Fila - 1, 1)
Fil_Escritura = Fil_Escritura + 1
Wend
End Sub

Encontrar el cdigo completo en el archivo del Ejemplo 7-C3e.

Bucle en objetos Excel


FOR EACH variable IN Coleccin de Objetos
Instruccin
NEXT

1. Presentacin

Este nuevo bucle es una de las funciones ms interesantes de Excel. Gracias a ella, se pueden realizar bucles en
colecciones de objetos (como las hojas, los libros, etc.).

En el anexo Coleccin de objetos, encontrar las colecciones de objetos ms usuales de Excel.

A diferencia de los bucles anteriores, en los que las variables contenan valores numricos, aqu la variable
contiene el conjunto de propiedades del objeto.

La variable que se utilizar debe estar asociada a una propiedad o a un mtodo para poder explotarla.

Por ejemplo, desea extraer el nombre de todas las hojas de un libro para escribir el resultado en la columna A de la
hoja Hoja1. El cdigo es el siguiente:

Sub Bucle_Hoja()
Dim Objeto_Hoja As Object
Dim Escrit_Fila As Long

Escrit_Fila = 1
For Each Objeto_Hoja In Worksheets
Sheets("Hoja1").Cells(Escrit_Fila, 1) = Objeto_Hoja.Name
Escrit_Fila = Escrit_Fila + 1
Next
End Sub

2. Explicacin del cdigo

Mucha informacin est en la lnea FOR EACH: el trmino WorkSheets indica que el bucle se va a aplicar a la
coleccin de objetos Hoja: vamos a centrarnos en el objeto "Hoja de clculo" de nuestro libro y recorrer cada una
de ellas.

Es interesante puntualizar la diferencia entre WorkSheet y WorkSheets. El primer trmino (sin la s)


corresponde al Objeto Hoja, mientras que WorkSheets (con una s) corresponde a la Coleccin de Objetos
worksheets (el conjunto de hojas de un libro). Esto es aplicable para todos los Objetos/Colecciones de Objetos
(Row/Rows; Column/Columns; etc.) que utilice.

La lnea FOR EACH puede traducirse del siguiente modo: "Para cada hoja del libro, vamos a trasladar la totalidad
de propiedades de la hoja seleccionada a la variable Objeto_Hoja".

Por lo tanto, la variable Objeto_Hoja no contendr un valor, sino la totalidad de propiedades de la hoja sobre
la que se coloque el bucle. La siguiente imagen, que proviene de un depurador, muestra una parte de las
propiedades relacionadas con la hoja seleccionada:

En el captulo siguiente veremos cmo visualizar el conjunto de propiedades de un objeto. En nuestro ejemplo, slo
nos interesa la propiedad Name.

Al final, el programa se interpretar de la siguiente forma: "Para cada hoja de nuestro libro, escribimos su nombre
(propriedad Name del objeto) en una nueva celda (variable Escrit_Fila)".

En la pgina Informacin, encontrar el archivo Ejemplo 7-D que extrae el nombre de todas las hojas del libro y
que genera un ndice (gracias a la grabadora de macros).
Depuracin

Introduccin
Cuando est ante un programa que no funciona como usted deseara y no da con el origen de este error, no tiene
otra solucin que utilizar la herramienta de depuracin (llamada tambin el depurador) para encontrar el error.

Presentacin
La herramienta de depuracin presenta dos intereses principales:

controlar la ejecucin del programa paso a paso,


visualizar el contenido de las variables y de las condiciones durante la ejecucin.

Para explotar la herramienta de depuracin, vamos a retomar el cdigo que hemos utilizado en los bucles DO ...
LOOP para reorganizar una lista de nombres por fecha. El siguiente programa contiene voluntariamente dos
errores que vamos a intentar encontrar gracias a la herramienta de depuracin:

Sub Organizacin_Nombre()
Dim Nm_Fila As Long
Dim Col_Escrit As Long
Dim Fil_Escrit As Long

Fil_Escrit = 1
Nm_Fila = 1
While Cells(Nm_Fila, 1) <> ""
Col_Escrit = 5
Do
Cells(Fil_Escrit, Col_Escrit) = Cells(Nm_Fila, 2)
Col_Escrit = Col_Escrit + 1
Nm_Fila = Nm_Fila + 1
Loop While Cells(Nm_Fila - 1, 1) = Cells(Nm_Fila, 1)
Cells(Fil_Escrit, 4) = Cells(Nm_Fila, 1)
Fil_Escrit = Fil_Escrit + 1
Wend
End Sub

El cdigo correspondiente se encuentra en el archivo del Ejemplo 8-B.


Lectura "paso a paso"
Para controlar la ejecucin de su programa, puede iniciarlo en modo paso a paso pulsando la tecla [F8]:
inmediatamente ver aparecer una lnea amarilla al principio de su procedimiento.

La lnea amarilla indica la instruccin que se va a ejecutar.

Para hacer avanzar paso a paso el programa, basta con pulsar la tecla [F8]: cada vez que pulse la tecla [F8], la
lnea de cdigo en amarillo se ejecuta y pasa a la lnea siguiente.

En modo paso a paso, tambin puede mover la lnea amarilla deslizando con el ratn la flecha amarilla al
margen. De este modo, puede modificar el cdigo y recolocar la flecha de ejecucin para retomar sus cambios, y
todo ello, sin detener la ejecucin del programa.

Inspeccionar las variables


Ahora que controla el desarrollo del programa, vamos a visualizar el contenido de las variables durante la
ejecucin.

Seleccione con el ratn la variable que desea observar mediante un clic de arrastre y active el men Depuracin -
Inspeccin rpida...
Tambin puede activar la Inspeccin rpida mediante la combinacin de teclas [Mays][F9] o haciendo clic en el
icono .

Es necesario que la variable que va a inspeccionar est previamente seleccionada.

Aparecer el siguiente cuadro de dilogo:

Haga clic en el botn Agregar, la variable inspeccionada aparece en una nueva ventana llamada Inspecciones.

Вам также может понравиться