Documentos de Académico
Documentos de Profesional
Documentos de Cultura
MACROS Avanzado For MacroAntoni
MACROS Avanzado For MacroAntoni
MACROS Avanzado For MacroAntoni
__________________________________________________________________________________________________________
AVANZADO
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
1
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
2
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
Por ejemplo, supongamos que tengamos que totalizar unos importes por meses.
Esta solución es realmente engorrosa, ya que nos obliga a saber en que mes estamos para poder
acumular en la variable correspondiente:
…………………………………………………………………………………………….
Ahora imaginad que debemos distinguir los últimos 5 años, esta solución además de engorrosa
empieza a ser inviable ya que necesitamos 5 x 12 variables.
Para resolver este tipo de problema, VBA nos proporciona las matrices
Por ejemplo:
Para evitar esto y poder referirnos a los elementos por el número ordinal disponemos de una
opción, Option Base.
Acordaros de Option Explicit, que nos obliga a definir todas las variables dentro de un
módulo, formulario, hoja o libro. De la misma forma, Option Base se especifica al principio
del objeto antes del primer procedimiento.
Para referirnos a un elemento dentro de una matriz hemos proporcionarle su posición dentro de
cada una de las dimensiones.
Todas las variables se inicializan vacías en función del tipo de variable incluidas las matrices.
De todas formas podemos borrar una matriz con la instrucción Erase matriz
De esta forma evitamos tener que recorrer toda la matriz con un bucle:.
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
4
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
5
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
La variables a nivel de procedimiento son las variables que se definen dentro de un procedimiento.
Las variables a nivel objeto son las variables que se definen antes que cualquier procedimiento.
Las variables a nivel general son las variables definidas al principio de un Módulo como públicas.
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
7
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
FORMAT /FORMATNUMBER
SELECT CASE / END SELECT es otra forma de hacer evaluaciones de expresiones a parte de la
instrucción IF / ENDIF.
Es, quizás, una forma mas clara de programar acciones para distintos valores de una expresión.
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
8
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
9
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
A menudo nos encontraremos con problemas a la hora de hacer cálculos porqué VBA requiere que
todas las variables que intervienen en él estén definidas como numéricas.
Incluso aunque una variable definida como String o Variant (Texto) contengan solo números, no
podrá ser usado en un cálculo o en una evaluación. Lo mismo sucede a otro nivel con las fechas.
Para evitar estos problemas, VBA pone a nuestra disposición una serie de funciones de conversión
de tipos de datos.
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
10
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
De esta manera, si se trata de variables de entrada y salida, nos evitaremos estar constantemente
convirtiendo los tipos de las variables. Recordad este error:
Ambas instrucciones son muy sencillas pero muy extensas, por lo que nos remitiremos a la Ayuda
de VBA para ver sus posibilidades cuando queramos formatear una variable.
FORMAT(Expresión, Formato)
FORMATNUMBER(Expresión [,Decimales])
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
11
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
Es increíble la capacidad que tienen los usuarios para realizar cosas que no deben.
Una mala manipulación del teclado puede llevarnos al desastre, estamos a un simple Alt+F11 de
dicho desastre.
Pero bueno, ante el usuario normal, nos podemos proteger de intromisiones en nuestro proyecto
VBA.
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
12
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
13
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
3.-Controles ActiveX
En el curso anterior ya comentamos que los controles ActiveX son aquellos que pueden asociarse
con eventos y cada evento con código VBA.
También dijimos que los controles ActiveX tiene propiedades y pueden incrustarse en hojas y en
formularios VBA.
Label Etiqueta
TextBox Caja de texto
CommandButton Botón de comando
CheckBox Casilla de verificación
OptionButton Opcion
ComboBox Cuadro combinado
ListBox Lista
Frame Marco
Image Imagen
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
14
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
3.-Controles ActiveX
Vamos a recordar que es un evento.
A cada evento, habitualmente, hay asociado un procedimiento especifico que podemos programar
con código VBA.
Click
Se produce al hacer Click sobre el control ActiveX.
Change
Se produce cada vez que se produce un cambio en el valor del control ActiveX.
Double Click
Se produce al hacer Doble Click sobre el control ActiveX.
Enter
Se produce cada vez que el control ActiveX recibe el foco.
Exit
Se produce cada vez que el control ActiveX pierde el foco.
KeyDown
Se produce cada vez que pulsamos una tecla sobre un control ActiveX.
KeyUp
Se produce cada vez que pulsamos una tecla sobre un control ActiveX.
3.-Controles ActiveX
KeyPress
Se produce cada vez que pulsamos una tecla sobre un control ActiveX.
MousseDown
Se produce cada vez que pulsamos el mousse sobre un control ActiveX.
MousseDown
Se produce cada vez que pulsamos el mousse sobre un control ActiveX.
MousseMove
Se produce al mover el puntero del mousse sobre un control ActiveX.
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
16
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
17
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
3.-Controles ActiveX
Pasemos ahora a las propiedades.
Recordemos que una propiedad es un atributo que modifica la apariencia del objeto, en este caso
un control ActiveX.
Al igual que con los eventps, existen un conjunto de propiedades que son comunes a la mayoría de
controles ActiveX:
.Name
Nombre del control.
.BackColor
Color de relleno.
.BackStyle
Indica la transparencia u opacidad del control.
.BorderColor
Color del borde.
.BorderStyle
Indica si el control tiene o no tiene borde.
.Caption
Texto que aparecerá en el cuerpo del control
.ControlTipText
Texto de ayuda que aparecerá al pasar el mousse por encima del control
.Enabled
Indica si el control está o no está disponible.
.Font
Fuente del texto
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
18
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
3.-Controles ActiveX
.Forecolor
Color del texto
.Height
Altura del control
.Left
Distancia del borde izquierdo de la ventana.
.MousseIcon
Icono que aparecerá al desplazar el mousse por encima del control
.MoussePointer
.Picture
Imagen del control
.PicturePosition
Posición de la imagen dentro del control
.TabIndex
Orden de desplazamiento del cursor al pulsar la tecla Tab (Avance campo)
.TabStop
Indica si el cursor debe detenerse o no detenerse sobre el control.
.Top
Distancia del borde superior de la ventana
.Value/Text
Valor del control
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
19
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
.Visible
Indica si el control se visualiza o no se visualiza.
3.-Controles ActiveX
.Width
.Anchura del control
Existen propiedades que son únicas para cada control, las analizaremos al detallar el
funcionamiento de cada control.
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
20
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
21
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
3.-Controles ActiveX
El control Label
El control Label lo usaremos para mostrar información
El control TextBox
El control TextBox lo usaremos para recoger información a introducir por el usuario.
El control CommandButton
El control CommanButton lo usaremos para realizar una acción a petición del usuario.
En el momento que el usuario hace click sobre un CommandButton, se ejecuta el código asociado
al evento Click del control.
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
22
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
3.-Controles ActiveX
El control CheckBox
Utilizaremos el control CheckBox cuando queramos remarcar o no una característica de la
funcionalidad que estemos ejecutando. Admite solo dos valores True/False.
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
23
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
2º El evento Click
3.-Controles ActiveX
El control CheckBox
Utilizaremos el control OptionButton cuando queramos que el usuario elija de entre una serie de
opciones.
Este control ActiveX va siempre en grupos, de manera que cuando marcamos uno de ellos, se
desmarcan los demás controles OptionButton del grupo de forma automática.
De esta forma, cuando hacemos Click sobre un control , se produce el evento Change del control
pulsado, el evento Click del control pulsado, y a continuación se ponen a False todos los demás
componentes del grupo, pero no se ejecuta ningún evento para estos últimos a pesar de haber
cambiado su valor.
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
24
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
Observando estos controles de forma individual, se comportan exactamente igual que un control
CheckBox.
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
25
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
3.-Controles ActiveX
El control CommandButton
Es el típico botón, es posiblemente el control mas usado que existe, se utiliza para realizar una
acción.
El evento Click, como en todos los controles ActiveX, se produce al pulsar el botón izquierdo del
mouse.
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
26
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
3.-Controles ActiveX
El control Frame
Utilizaremos este control ActiveX para agrupar otros controles ActiveX.
A parte de estructurar nuestros formularios, este control es muy útil ya que nos permite actuar en
grupos de controles en su conjunto lo que nos evita tener que repetir código para cada uno de los
controles que contiene, supongamos un Frame con el nombre Frame1 y título Opciones:
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
27
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
3.-Controles ActiveX
El control ListBox
Utilizaremos este control ActiveX para visualizar información y posibilitar al usuario la elección de
dicha información.
Es uno de los controles ActiveX más complejos que ahí dentro del conjunto de controles habituales.
Está organizado como una hoja Excel, es decir por filas y columnas, y ahí termina su parecido en
cuanto a su funcionamiento.
En cuanto a los eventos, no hay nada digno de mención, tiene los habituales.
Pero en relación a las propiedades aparecen un conjunto de propiedades exclusivas de este control,
y como veremos en su caso, con el control ComboBox.
Ahora vamos a explicar una serie de propiedades que solo podemos configurar en tiempo de
ejecución.
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
28
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
3.-Controles ActiveX
El control ListBox
Para explicar el funcionamiento de este control lo dividiremos en dos partes:
Carga
Selección
Carga
Si se muestra un formulario o se activa una hoja con un control ListBox llamado Lista vacío
tendremos lo siguiente:
Lista.ListCount = 0 Nº de filas
Lista.Additem
Ya tenemos una fila vacía, supongamos que hemos definido 3 columnas, y que en esas columnas
queremos informar el número del mes, el nombre y el nombre corto. En propiedades:
El control ListBox, empieza a numerar filas y columnas a partir de cero, por lo que la primera
“celda”, no será fila 1, columna 1 com en Excel, si no fila 0, columna 0. Lo que no deja de ser un
engorro, pero las cosas son como son.
Para referirnos a una “celda” en concreto utilizaremos el método List e informar de la fila y la
columna que queramos recuperar o modificar, así para informar el mes de Enero haríamos:
Lista.Additem
Lista.List(0, 0) = 1
Lista.List(0, 1) = “Enero”
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
29
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
Lista.List(0, 2) = “Ene”
3.-Controles ActiveX
El control ListBox
Para añadir febrero:
Lista.Additem
Lista.List(1 0) = 2
Lista.List(1, 1) = “Febrero”
Lista.List(1, 2) = “Feb”
Pero supongamos que tenemos los meses en un rango, por ejemplo A1:C12, podríamos hacer:
A la fila cero (0) de la lista le corresponde la fila uno (1) del rango.
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
30
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
3.-Controles ActiveX
El control ListBox
Otra manera podría ser:
O incluso:
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
31
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
32
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
3.-Controles ActiveX
El control ListBox
Al ejecutar cualquiera de los procedimientos descritos, aparecería
Dado que ListCount contiene el nº de elementos, siempre debemos referirnos a su valor menos 1 al
referirnos a la fila de la lista.
Así, después de añadir un nuevo elemento a nuestro listbox Lista, su fila correspondiente será:
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
33
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
3.-Controles ActiveX
El control ListBox
Hemos visto como se carga un control ListBox de forma “manual”.
Existe una forma automática de cargar un control ListBox a través de sus propiedades en tiempo de
diseño, pero con ciertas restricciones:
Para utilizar esta forma de cargar el control, debemos informar el rango en la la propiedad
RowSource, en nuestro ejemplo sería:
Lista.RowSource = ”A1:C12”
Para especificar si utilizaremos la primera fila del rango como cabecera, utilizaríamos la propiedad
ColumnHeads:
Lista.ColumnHeads = True
Aunque hemos dicho que los valores en el rango y en la lista no pueden ser alterados, si existe la
posibilidad de cambiar el rango en la propiedad RowSource:
Lista.RowSource = Empty
Lista.RowSource = ”B7:J23”
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
34
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
3.-Controles ActiveX
El control ListBox
Selección
Bien, hasta aquí la parte fácil, ahora vamos a utilizar los eventos del control ListBox.
Hemos comentado que existe una propiedad que nos permite indicar cual es la forma de
seleccionar ñas filas. Se trata de la propiedad MultiSelect.
Este control tiene la particularidad que se comporta de forma distinta en función del tipo de
selección escogida.
Así, en su forma de selección simple al hacer click sobre el control se ejecutan los eventos:
Lista_Change
Lista_Click
Lista_Change
Lista_Click
Todo lo expuesto para este control hasta este punto es válido para el
control ActiveX ComboBox, excepto que este no tiene la propiedad
MultiSelect.
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
35
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
3.-Controles ActiveX
El control ListBox
Con la propiedad MultiSelect a múltiple o extendida podemos seleccionar mas de una fila.
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
36
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
3.-Controles ActiveX
El control ListBox
Con la propiedad MultiSelect, cuando hacemos click sobre el control, se ejecutan el evento Change
y el evento Click, y la propiedad Listindex se actualiza con el número de fila seleccionada.
Resumiendo:
Lista_Change
Lista_Click
Lista_Change
Lista_Click
Lista_Change
Lista_Click
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
37
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
3.-Controles ActiveX
El control Combobox
En este tipo de control ActiveX tenemos la posibilidad de escoger información de una lista o
introducirla manualmente.
El control Combobox podríamos definirlo como la unión entre un control TextBox y un control
ListBox de selección simple. También los eventos generados se comportan como la unión de ambos
tipos de control.
Aunque al igual que el control ListBox, el control ComboBox pude contener mas de una columna,
normalmentre no utilizaremos esta posibilidad.
Cada vez que introduzcamos un carácter en él, se ejecutará el evento Change, y además si el valor
introducido hasta este momento coincide con alguno de los valores de la lista, se actualiza el valor
de la propiedad ListIndex y se seleccionará la fila correspondiente, lo que conlleva a ejecutar el
evento Click de forma automática.
El control Image
Utilizaremos este control para mostrar una imagen.
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
38
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
4.-Formularios
Un formulario es un tipo de objeto VBA.
Hasta ahora todos los ejemplos de código VBA lo habíamos realizado en objetos tipo Módulo.
El motivo de este hecho es que no tiene sentido hablar de formularios sin haber visto los controles
ActiveX, sus eventos y sus propiedades.
Un formulario es un objeto que contiene controles ActiveX y que se plantea como un cuadro de
dialogo con el usuario.
Puede haber varios formularios mostrados, pero solo uno de ellos está activo.
Existen dos formas de mostrar los formularios, ambas incompatibles entre si:
Cuando mostramos varios formulario modales solo está accesible el último mostrado y deben ser
descargados en orden inverso al de mostrado. En este tipo de formulario el libro Excel no esta
accesible al usuario.
En los formularios no modales, después de ser mostrados, están todos a disposición del usuario,
recordemos nuevamente que solo uno de ellos está activo en todo momento, y pueden ser
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
39
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
descargados en cualquier orden. En este tipo de formularios, el usuario tiene acceso libre al libro
Excel.
Determinar el tipo de mostrado de los formularios vendrá determinado por la lógica de nuestra
aplicación, o sea, de nuestro Proyecto VBA.
4.-Formularios
Un Formulario se crea de la misma forma que un Módulo, click derecho sobre el proyecto y a
continuación Insertar\UserForm.
Tal como se representa en la imagen, al añadir un formulario nos aparece una representación del
objeto en la ventana que habitualmente pertenece al código VBA.
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
40
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
Dando doble click sobre la imagen del formulario, o pulsando F7 podemos ver el código
correspondiente a nuestro formulario. Podemos obtener el mismo resultado con el menú Ver.
4.-Formularios
Antes de ver como añadir controles ActiveX a nuestro formulario hagamos un paréntesis para
hablar de las Referencias.
El lenguaje VBA incluido de forma estándar en Microsoft Office contiene las instrucciones básicas
de Visual Basic, y poco mas.
De hecho cada control ActiveX es un programa independiente en si mismo y que no está incluido en
VBA.
Para poder trabajar con los controles ActiveX y otros objetos, es donde aparecen la Referencias,
también llamadas Bibliotecas.
Nuestros controles ActiveX, indispensables para poder usar formularios, están contenidos
habitualmente en archivos tipo .OCX o .DLL.
En nuestro Proyecto VBA ya vienen incorporadas una serie de Referencias, que a menudo, no
incorporan la totalidad de los objetos necesarios para la realización de nuestras aplicaciones.
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
41
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
4.-Formularios
Después de este breve paréntesis en el que hemos aprendido que los controles ActiveX son
programas contenidos en unos archivos tipo OCX o DLL, denominados Referencias o Bibliotecas,
pasemos a explicar como incorporar un control ActiveX .
Para incorporar un control ActiveX a nuestro formulario, debemos escogerlo de una lista de
controles incorporados al proyecto VBA.
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
42
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
43
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
4.-Formularios
Para añadir mas controles a nuestro Cuadro de herramientas, Click derecho\Controles adicionales.
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
44
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
4.-Formularios
Vamos a incorporar tres controles ActiveX:
1 Label
1 TextBox
1 ComandButton
Seleccionar cada uno de los controles del Cuadro de herramientas , y dibujarlo dentro del
formulario:
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
45
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
4.-Formularios
Empezaremos por dar un nombre adecuado al formulario y a nuestros controles.
Formulario MiForm
Label MiLabel
TextBox MiTexto
CommandButton MiBoton
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
46
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
4.-Formularios
Pulsemos F5 para ejecutar el formulario.
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
47
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
(General)
(Declaraciones)
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
48
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
4.-Formularios
En el cuadro combinado (General) aparecerán todos los controles del formulario.
Seleccionaremos MiBoton:
Los controles que contienen valor, como el TextBox, el evento por defecto es el evento Change, los
controles que no contiene valor, como el CommandButton , el evento por defecto es el evento Clic.
Los procedimientos de evento pueden estar mezclados con los procedimientos normales.
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
49
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
4.-Formularios
Al abrir el cuadro combinado (Declaraciones), aparecerán todos los eventos disponibles para el
control seleccionado en el cuadro combinado (General):
Aquellos eventos que hayan sido utilizados aparecerán remarcados en negrita en el cuadro
combinado (Declaraciones).
Para ver los procedimientos no asociados a ningún objeto, abrir el cuadro (Declaraciones
estando visible “(General)” en el cuadro combinado (General)
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
50
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
Las hojas dentro de nuestro proyecto VBA se crean de forma automática al crear una hoja nueva.
Un proyecto VBA
Un objeto correspondiente al libro
Un objeto correspondiente a cada una de las hojas creadas
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
51
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
Libro
Al crear un libro nuevo se crea de forma automática con el nombre ThisWorkbook.
Existe un gran número de eventos asociados al libro, vamos a citar los mas importantes:
Open
Se produce al abrir el libro.
BeforeClose
Se produce inmediatamente antes de cerrar el libro.
BeforeSave
Se produce inmediatamente antes de cerrar el libro.
SheetActivate
Se produce al activar una hoja.
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
52
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
SheetBeforeDoubleClick
Se produce al hacer Doble click en cualquier celda.
SheetBeforeRightClick
Se produce al hacer Click derecho en cualquier celda.
SheetChange
Se produce al efectuar un cambio en cualquier celda.
SheetSelectionChange
Se produce al seleccionar cualquier rango.
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
53
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
Hoja
Al crear una hoja nueva se crea de forma automática con el nombre por defecto de Excel.
Existe un gran número de eventos asociados al libro, vamos a citar los mas importantes:
Activate
Se produce al activar la hoja.
BeforeDoubleClick
Se produce al hacer Doble click en cualquier celda de la hoja.
BeforeRightClick
Se produce al hacer Click derecho en cualquier celda de la hoja.
Change
Se produce al efectuar un cambio en cualquier celda de la hoja
SelectionChange
Se produce al seleccionar cualquier rango de la hoja.
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
54
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
Parámetros
Muchos de los eventos, en el momento de producirse nos proporcionan información adicional.
Muchas veces no los utilizaremos para nada, pero en algunos eventos son indispensable.
Target.Value Valor
Target.Row Fila
Target.Column Columna
Target.Address Dirección
Target.Formula Fórmula
Etc…
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
55
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
Bucles y Automatismos
Cuando trabajemos con eventos hemos de ser muy cuidadoso.
Esta instrucción, sin ninguna dificultad aparente, produce un bucle de memoria y colapsa la
memoria de nuestro PC con una ocupación del 100%.
En el evento Change de la hoja modificamos el valor de la celda A1, pero ¿Qué ocurre después
de modificar la celda A1?, pues que como se ha producido un cambio en la hoja se produce el
evento Change de la hoja nuevamente, y así hasta el infinito y mas allá.
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
56
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
6.-Herramientas de depuración
Hasta ahora sabemos ejecutar un procedimiento instrucción por instrucción, poner puntos de
interrupción y ver el contenido de las variables una a una posicionándonos encima de ella cuando
ejecutamos el procedimiento instrucción por instrucción, sin embargo a veces todo esto no es
suficiente para depurar correctamente nuestras macros.
La ventana Inmediato
A la ventana inmediato se accede a través del menú Ver\Ventana inmediato o con Ctrl+G.
Recordad:
6.-Herramientas de depuración
La ventana Inmediato nos proporciona además de la posibilidad de ver el contenido de cualquier
variable, nos proporciona la posibilidad de evaluar expresiones.
Ejecutamos hasta llegar al punto deseado ya sea, instrucción a instrucción pulsando repetidamente
F8, como en este caso, o por punto de interrupción pulsado F9 en el punto de interrupción y
pulsando F5 para ejecutar el procedimiento hasta ese punto.
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
58
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
6.-Herramientas de depuración
Y por último, para cerrar con la ventana Inmediato, analizaremos la instrucción
Debug.Print
Esta instrucción funciona de forma parecida a la instrucción MsgBox, pero en lugar de mostrar un
mensaje en la pantalla, lo muestra en la ventana Inmediato, esto que a simple vista es algo simple,
usada convenientemente se convierte en una potente herramienta de depuración.
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
59
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
Vamos a plantear como hacer un formulario de introducción de datos a nuestra hoja Excel.
En primer lugar crearemos un libro vacio con macros que se va a llamar Agenda.xlsm y va a tener
una hoja que se va a llamar Agenda y otra Cargos con el siguiente diseño:
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
60
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
Datos a ingresar:
Antes de lanzarnos como locos a diseñar el formulario, empezaremos por analizar los
requerimientos de proyecto:
Averiguar su clave
Comprobar que el Nombre esté informado y no esté duplicado en la hoja Agenda
Comprobar que el Cargo esté informado en el cuadro combinado de Cargos
Comprobar que si el teléfono esta informado este sea numérico de 9 dígitos
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
61
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
Es conveniente cambiar el nombre que viene por defecto en los controles por otros que den una
idea de su contenido o cometido.
Cuando ejecutamos un formulario, antes de mostrarlo, se ejecuta el evento Initialize del formulario.
Es en este momento cuando debemos aprovechar para realizar las acciones previas a su
visualización, en nuestro caso son:
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
62
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
63
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
Option Explicit
'Lista de variables para todo el formulario
Dim Fila As Integer 'Fila libre de la agenda
Dim Agenda As Worksheet 'Hoja Agenda
Dim Cargos As Worksheet 'Hoja Cargos
Dim ClaveMasAlta As Integer 'Clave mas alta de la Agenda
Private Sub Insertar_Click()
'Primero comprobamos los requerimientos de validación
'----------------------------------------------------
If xNombre.Text = "" Or _
xCargo.Text = "" Or _
Len(xTelefono) <> 9 Then 'La función Len de VBA nos devuelve la
longitud
MsgBox "Faltan datos"
Exit Sub
End If
'Colocamos la información en la hoja
Agenda.Cells(Fila, 1) = xClave.Text
Agenda.Cells(Fila, 2) = xNombre.Text
Agenda.Cells(Fila, 3) = xCargo.Text
Agenda.Cells(Fila, 4) = xTelefono.Text
'Preparamos la próxima entrada
Fila = Fila + 1
ClaveMasAlta = ClaveMasAlta + 1 'Primera clave libre
xClave = ClaveMasAlta 'visualizamos la primera clave libre
xNombre = ""
xCargo = ""
xTelefono = ""
End Sub
Private Sub UserForm_Initialize()
'Asignamos las hojas a variables para trabajar mas cómodos
'---------------------------------------------------------
Set Agenda = Worksheets("Agenda")
Set Cargos = Worksheets("Cargos")
'Recorremos la hoja Agenda para buscar la clave mas alta
'-------------------------------------------------------
Agenda.Activate 'Activamos la hoja Agenda
Agenda.Range("A2").Select 'seleccionamos la celda A2
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
66
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
67
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
68