Tema1 Macros
Tema1 Macros
(VBA) EN EXCEL
Cdigo 9679
Asignatura de libre opcin recomendada para CC. Actuariales y Financieras
Profesores
Juan M. Prez Salamero Gonzlez
Manuel Ventura Marco
CURSO 2005-2006
Macros
Pg. 1
Pg. 2
Pg. 3
1.2.1
Una vez detectada la necesidad de automatizar una tarea repetitiva en nuestro trabajo, se
plantea la conveniencia de crear una macro que ahorre tiempo y errores. Podemos acceder
a la grabadora de macros desde el men Herramientas/Macro/Grabar nueva macro.
Asignando un nombre a la macro la podremos identificar para su posterior utilizacin. Cabe
seleccionar asimismo su mbito de utilizacin mediante la opcin Guardar macro en.
Mtodo abreviado: Combinacin de teclas que ejecuta la macro. Hay que tener
precaucin de no elegir una combinacin ya asignada por Excel a sus comandos.
Este libro: Slo desde ese libro podremos ejecutar la macro
Material elaborado por Julia Suso, Manuel Ventura y Juan M. Prez-Salamero
Pg. 4
Libro de macros personal: Podremos ejecutar la macro desde cualquier libro. La macro
se guarda en un libro personal de macros que funciona como cualquier otro libro, salvo
que est oculto. El nombre de la macro ser PERSONAL.XLS!Macro1.
Al pulsar aceptar aparece una pequea ventana con un botn para detener la
grabacin. Mientras no pulsemos ese botn, Excel memorizar en una macro
todas las acciones que se vayan ejecutando.
En esa misma ventana aparece otro botn que permite que la grabacin de los movimientos
por las celdas sea relativa en lugar de absoluta, lo que tiene su importancia.
Ejemplo 2.1
Cree una macro con nombre FormatoMoneda y tecla de Mtodo Abreviado CTRL+K que d
el siguiente formato al rango seleccionado:
- Moneda, con dos decimales.
- Alineacin horizontal general y vertical centrar.
- Fuente o tipo de letra Arial, tamao 10, cursiva.
- Bordes de contorno.
- Trama naranja pastel (color 40).
Material elaborado por Julia Suso, Manuel Ventura y Juan M. Prez-Salamero
Pg. 5
Una vez finalizada la grabacin, para ejecutar la macro seguimos los siguientes pasos: men
Herramientas/Macro/Macros. Aparece una pantalla con las siguientes opciones:
Pg. 6
1.2.2
1.2.2.1
Pg. 7
En esta barra herramientas (al igual que en cualquiera de las definidas por Excel) podemos
agregar las herramientas situadas en el men Herramientas/Personalizar carpeta
Comandos. Estos comandos estn organizados por categoras.
Pg. 8
Pg. 9
Podemos cambiar el aspecto del botn a partir del ese mismo men contextual. Para que
este men aparezca tiene que estar abierta la ventana Herramientas/Personalizar.
Podemos realizar los cambios siguientes:
Nombre: Es la leyenda que aparece en las herramientas al pasar el ratn sobre ellas.
Cambiar imagen del botn: Podemos elegir una de las que nos aparecen predeterminadas.
Modificar imagen: Podemos realizar modificaciones personalizadas:
Pg. 10
1.2.2.2
Asignar una macro a un objeto grfico.
Podemos asignar una macro a un objeto grfico obtenido con la barra de dibujo. Esto nos
permite colocar el objeto grfico en el lugar de la hoja de clculo que ms nos interese.
Para ello, hacemos visible la barra de dibujo con el men
Ver/Barra_de_Herramientas/Dibujo.
A continuacin trazamos cualquier
objeto, por ejemplo un rectngulo,
pulsamos el botn derecho del ratn y
nos aparece un men contextual con la
opcin de Asignar macro.
Con la herramienta Seleccionador de
objetos, representada por una flecha,
podemos modificar el aspecto del objeto.
Para poder ejecutar la macro a travs
del objeto, el Seleccionador de objetos
debe estar desactivado.
Pg. 11
1.2.2.3
Tambin podemos crear nuestro propio men desplegable e incluir en l las macros que
vayamos creando. Para ello accedemos al men Herramientas/Personalizar/Comandos.
Elegimos Nuevo men y lo arrastramos hasta la barra de mens desplegables. Con el botn
de la derecha abrimos un men contextual que nos permite cambiar el nombre del men.
Material elaborado por Julia Suso, Manuel Ventura y Juan M. Prez-Salamero
Pg. 12
Pg. 13
1.2.3
Pg. 14
Pg. 15
La Macro est escrita en VBA y cumple las normas de Visual Basic. Comienza con la palabra
Sub , abreviatura de Subrutina, seguida del nombre de la Macro, FormatoMoneda y dos
parntesis que encerrarn, en otros casos, posibles argumentos de funciones y
procedimientos diseados en VBA. La ltima lnea siempre es End Sub, que indica la
finalizacin de la Macro.
Las sentencias intermedias son las que dan rdenes y realizan el trabajo de la macro. Como
regla general, para interpretar una instruccin en VBA, se debe leer la sentencia de
derecha a izquierda, pero ya se profundizar en dicha interpretacin en los temas
siguientes. VBA es un lenguaje de programacin orientado a objetos (libros, hojas, rangos,
grficos, ventanas, etc.), por lo que primero hay que establecer el objeto con el que
trabajar y despus se efecta algo con l.
En el prximo tema se explicar con mayor detalle los elementos del Editor de Visual Basic.
Ahora, con ayuda de algunos ejemplos se va a analizar la necesidad de depurar una Macro
generada por el grabador de Macros dadas sus limitaciones.
Pg. 16
1.2.4
Necesidad de depuracin de una macro.
Hay varios motivos por los que una Macro debe ser depurada. Si no se ha hecho un estudio
previo de lo que se requiere de la Macro a la hora de disearla, se detectarn los
problemas cuando se ejecute varias veces y se compruebe que no efecta correctamente
las tareas para que se deseaban inicialmente.
Uno de los problemas habituales que ocasionan el mal funcionamiento es el uso de
referencias absolutas en lugar de relativas, o al contrario.
La rigidez en el manejo de datos externos, por ejemplo, o en la comunicacin con el usuario
que deseara dar instrucciones durante la ejecucin de una macro, es otro elemento que
hace necesaria la depuracin de una macro.
Otro problema est en la imposibilidad de efectuar mediante Excel todos los clculos o
instrucciones deseados, y por tanto, la grabacin de una macro no va a proporcionar todo lo
que se quiere ejecutar. Programando con VBA se puede completar lo efectuado con el
grabador de macros y obtener finalmente un programa que desempee correctamente
todas las tareas.
Otra circunstancia que aconseja la depuracin es la generacin de cdigo innecesario por el
grabador de Macros, lo que alarga la extensin complicando su lectura y por tanto, la
comprensin de qu acciones efecta una Macro. Veamos unos ejemplos de la necesidad de
depurar las macros y mejorarlas.
Material elaborado por Julia Suso, Manuel Ventura y Juan M. Prez-Salamero
Pg. 17
La necesidad de crear un proyecto complejo que realice varias acciones a la vez obligar a
la depuracin de una macro con muchas sentencias, lo que complica el trabajo, o a una
opcin ms correcta, a descomponer el proyecto en pequeas macros que tras depurarlas
individualmente, puedan unirse en una nica macro.
1.2.4.1
Cuando se graba una macro por primera vez, aparece una barra con el botn de detener la
grabacin y otro para seleccionar si se desean referencias relativas o absolutas. Los
efectos de ejecucin de una macro con unas referencias equivocadas son un resultado
incorrecto.
Ejemplo 2.2
Grabe dos macros, BajarAbs y BajarRel que seleccionen la celda inferior, copie el
contenido de la celda superior y la sombree de amarillo. Grbela con referencias absolutas
y con referencias relativas y ejectelas seleccionando con el ratn distintas celdas de la
hoja de clculo.
Material elaborado por Julia Suso, Manuel Ventura y Juan M. Prez-Salamero
Pg. 18
Sub BajarAbs()
'
' BajarAbs Macro
' Macro grabada el 14/10/2005 por Juanma
'
'
ActiveCell.Select
Range("A2").Select
With Selection.Interior
.ColorIndex = 27
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
End With
Range("A1").Select
Selection.Copy
Range("A2").Select
Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
End Sub
Sub BajarRel()
Material elaborado por Julia Suso, Manuel Ventura y Juan M. Prez-Salamero
Pg. 19
'
' BajarRel Macro
' Macro grabada el 14/10/2005 por Juanma
'
'
ActiveCell.Offset(1, 0).Range("A1").Select
Application.CutCopyMode = False
With Selection.Interior
.ColorIndex = 27
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
End With
ActiveCell.Offset(-1, 0).Range("A1").Select
Selection.Copy
ActiveCell.Offset(1, 0).Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
End Sub
Pg. 20
1.2.4.2
Generacin de cdigo innecesario.
Cuando se graba una macro se genera cdigo innecesario, lo que alarga la extensin del
programa, por lo que conviene depurarlo eliminando las sentencias innecesarias. Un ejemplo
de las mismas las apreciamos en el Ejemplo 2.1 en las opciones de formato por defecto que
el grabador considera, pero que el usuario no haba marcado. Se pueden eliminar desde el
editor sin que se resienta el buen funcionamiento de la Macro. Por ejemplo, se pueden
eliminar las sentencias correspondientes al Formato que da el valor de Falso 0 a distintas
propiedades de la seleccin de Alineacin (pestaa).
Sub FormatoMoneda()
'
' FormatoMoneda Macro
' Macro grabada el 14/10/2005 por Juanma
'
' Acceso directo: CTRL+k
'
Selection.NumberFormat = "#,##0.00 $"
With Selection
.HorizontalAlignment = xlGeneral
.VerticalAlignment = xlCenter
Material elaborado por Julia Suso, Manuel Ventura y Juan M. Prez-Salamero
Pg. 21
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
With Selection.Font
.Name = "Arial"
.FontStyle = "Cursiva"
.Size = 10
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
Material elaborado por Julia Suso, Manuel Ventura y Juan M. Prez-Salamero
Pg. 22
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThin
Material elaborado por Julia Suso, Manuel Ventura y Juan M. Prez-Salamero
Pg. 23
.ColorIndex = xlAutomatic
End With
With Selection.Interior
.ColorIndex = 40
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
End With
End Sub
1.2.4.3
Otras causas.
Otras causas que aconsejan la depuracin de una macro se han comentado antes y ahora
se va a dar dos ejemplos de la rigidez en la comunicacin con el usuario.
Abrir-importar archivos: El primero es un ejemplo de importacin de un fichero de
datos. Al grabar la Macro se graba el nombre del fichero, si en prximas ocasiones que
se desee ejecutar la Macro el fichero a recuperar tiene otro nombre, la macro grabada
no servir. Hay que depurarla incorporando desde el Editor de VBA la posibilidad de que
el usuario le indique qu fichero debe Abrir.
Material elaborado por Julia Suso, Manuel Ventura y Juan M. Prez-Salamero
Pg. 24
Ejemplo 2.3
Cree una Macro con nombre ImportarDatos que abra un fichero de texto de datos,
Datos, y lo pegue al final de la ltima lnea de datos existente en la hoja. Ejecute dos
veces la Macro para recuperar primero el fichero Datos y despus Datos2 y compruebe
su funcionamiento para apreciar la necesidad de depuracin de la macro. No habr
manera de introducirle el nuevo fichero si no es mediante el uso del Editor de VB.
Sub ImportarDatos()
'
' ImportarDatos Macro
' Macro grabada el 14/10/2005 por Juanma
'
'
Workbooks.OpenText Filename:= _
"C:\Juanma\Facultad\Docencia\VisualBasic\20052006\Excel\Aplicaciones
VBAExcel\Tema1\datos.txt" _
, Origin:=xlMSDOS, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _
xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, _
Comma:=False, Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1), _
Array(2, 1), Array(3, 1)), TrailingMinusNumbers:=True
Selection.CurrentRegion.Select
Selection.Copy
Material elaborado por Julia Suso, Manuel Ventura y Juan M. Prez-Salamero
Pg. 25
Windows("Ejemplo2_3.xls").Activate
Range("A1").Select
Selection.CurrentRegion.Select
Selection.End(xlDown).Select
ActiveCell.Offset(1, 0).Range("A1").Select
ActiveSheet.Paste
Windows("datos.txt").Activate
Application.CutCopyMode = False
ActiveWindow.Close
Selection.End(xlDown).Select
ActiveCell.Offset(1, 0).Range("A1").Select
End Sub
Utilizacin de mensajes
Para mejorar la comunicacin con el usuario se pueden introducir mensajes interactivos que
permitan interactuar y hacer ms dinmica la Macro. Se pueden aadir mensajes que den
informacin de qu, cundo o cmo se va a realizar una determinada accin.
Incluso podremos decidir ejecutar o no parte de las instrucciones de la macro en funcin
de la respuesta a alguno de estos mensajes (lo veremos ms adelante).
Para introducir de forma sencilla un mensaje se utiliza la funcin de Visual Basic MsgBox.
Material elaborado por Julia Suso, Manuel Ventura y Juan M. Prez-Salamero
Pg. 26
(La sintaxis de esta funcin se ver con ms detalle en el siguiente tema). Como ejemplo: Si
aadimos al principio de una macro la lnea
MsgBox Desea iniciar ya la macro?
Al ejecutar la macro aparece la ventana:
Al pulsar el botn Aceptar, se cerrar la ventana y seguirn
ejecutndose las instrucciones de la macro.
Pg. 27
1.2.5
Pg. 28
Para firmar Macros personales hay que aadir una firma al proyecto que previamente se
haya creado ejecutando el programa selfcert que se encuentra en la carpeta de Office,
Simples (si no habra que buscarlo), preguntar el nombre y crear la firma personal.
Pg. 29
Pg. 30