Академический Документы
Профессиональный Документы
Культура Документы
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.
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.
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.
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.
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.
Para iniciar Visual Basic Editor, utilice el men Herramientas - Macro y haga clic en la opcin Editor de Visual
Basic o pulse [Alt][F11].
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.
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.
Para darle otro nombre, como por ejemplo Primer_Programa, escriba el nombre en la ventana de propiedades en
lugar de la palabra Mdulo1.
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.
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.
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.
1. Propiedad 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.
2. Mtodo de un objeto
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
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
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.
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.
1. La celda
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.
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.
Cuando se nombra una celda o un rango de celdas, puede recordar sus nombres en lugar de dar las referencias
de las celdas.
[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.
La informacin que est a la derecha del signo = se traslada hacia el elemento que est a la izquierda.
Cells(1,1) = 15
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).
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.
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.
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.
Aparecer un cuadro de dilogo que le pide que escoja un nombre para su macro.
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.
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).
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.
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
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.
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.
Sub Macro1()
With Selection
.HorizontalAlignment = xlLeft
.VerticalAlignment = xlCenter
.MergeCells = True
End With
End Sub
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
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.).
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.
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.
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.
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.
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.
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
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.
Sub Variable_Static()
Static Nm_Fila as Long
Nm_Fila = Nm_Fila +1
Cells(Nm_Fila , 1) = Nm_Fila
End Sub
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:
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.
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.
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.
Tambin podemos utilizar la variable Val_Data para reemplazar el parmetro del nmero de fila en la instruccin
Cells.
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.
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:
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.
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.
La instruccin Array
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.
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:
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:
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:
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.
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:
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.
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).
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 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 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.
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:
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:
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:
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:
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
1. Presentacin
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
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
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
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.
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
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.
Con:
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).
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
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.
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.
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.
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.
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.
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.
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
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
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
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).
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.
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:
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
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.
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").
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
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.).
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
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.
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:
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
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.
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 .
Haga clic en el botn Agregar, la variable inspeccionada aparece en una nueva ventana llamada Inspecciones.