MACROS Avanzado For MacroAntoni

También podría gustarte

Está en la página 1de 68

CURSO: MACROS-BASICO By Antoni

__________________________________________________________________________________________________________

AVANZADO

__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
1
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________

MACROS EXCEL-CURSO AVANZADO

Objetivos del curso:

 Consolidar los conocimientos adquiridos en el curso anterior


 Que es una matriz
 Que son las dimensiones de una matriz
 Como se usa una matriz
 Ámbito de las variables
 i

__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
2
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________

1.-VISUAL BASIC FOR APPLICATIONS (VBA)


En esta sección vamos a seguir profundizando en nuestro conocimiento del lenguaje VBA.

1.1 VISUAL BASIC FOR APPLICATIONS (VBA) - Variables


Vamos a profundizar un poco mas sobre las tipos de variable.

A veces necesitamos guardar los valores serializados, es decir en grupos.

Por ejemplo, supongamos que tengamos que totalizar unos importes por meses.

Una solución consiste en definir 12 variables ImporteMes1, ImporteMes2, ImporteMes3…..

Esta solución es realmente engorrosa, ya que nos obliga a saber en que mes estamos para poder
acumular en la variable correspondiente:

If Mes=1 Then ImporteMes1 = ImporteMes1 + ImporteMes

If Mes=2 Then ImporteMes2 = ImporteMes2 + ImporteMes

…………………………………………………………………………………………….

If Mes=1 Then ImporteMes1 = ImporteMes1 + ImporteMes

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

Las matrices pueden ser de cualquier tipo de variable.

Aunque el número de dimensiones de una matriz es indeterminado, difícilmente usaremos mas de


tres.

Por ejemplo:

Para definir una matriz de 1 dimensión de 12 meses :

Dim ImporteMes(12) As Currency


Para definir una matriz de 2 dimensiones de 5 años por 12 meses:

Dim ImporteMes(5, 12) As Currency


Para definir una matriz de 3 dimensiones de 3 empleados por 5 años por 12 meses:

Dim ImporteMes(3, 5, 12) As Currency


__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
3
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________

1.1 VISUAL BASIC FOR APPLICATIONS (VBA) - Variables


De hecho no es del todo cierto lo expuesto anteriormente. ¿Porqué?, Porqué los elementos dentro
de cada una de las dimensiones se empiezan a numerar desde cero, por lo que todas las
dimensiones tienen un elemento mas del que indica la cifra especificada, así la matriz Importe(3, 5,
12) contiene realmente una matriz de 4 x 6 x 13 elementos.

Para evitar esto y poder referirnos a los elementos por el número ordinal disponemos de una
opción, Option Base.

 Option Base 0 Los elemento empiezan a numerarse desde cero (0)

Esta es la opción por defecto

 Option Base 1 Los elemento empiezan a numerarse desde uno (1)

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
__________________________________________________________________________________________________________

1.1 VISUAL BASIC FOR APPLICATIONS (VBA) - Variables


Veamos un ejemplo de cómo se trabaja con matrices

__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
5
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________

1.1 VISUAL BASIC FOR APPLICATIONS (VBA) - Variables


__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
6
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________

En el apartado de variables nos queda una cuestión muy importante:

El ámbito de las variables:


 Variables a nivel de procedimiento
 Variables a nivel de objeto
 Variables a nivel general

La variables a nivel de procedimiento son las variables que se definen dentro de un procedimiento.

Al finalizar el procedimiento se borran de forma automática.

Las variables a nivel objeto son las variables que se definen antes que cualquier procedimiento.

Al abandonar el objeto se borran de forma automática.

Las variables a nivel general son las variables definidas al principio de un Módulo como públicas.

Solo se borran al cerrar el libro.

__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
7
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________

1.1 VISUAL BASIC FOR APPLICATIONS (VBA) – Instrucciones básicas III


Vamos a completar el repertorio de las instrucciones básicas VBA con:

SELECT CASE / END SELECT

Funciones VBA de conversión de datos

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
__________________________________________________________________________________________________________

1.1 VISUAL BASIC FOR APPLICATIONS (VBA) – Instrucciones básicas III


El mismo ejemplo con la instrucción SELECT CASE/ END SELECT:

__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
9
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________

1.2 VISUAL BASIC FOR APPLICATIONS (VBA) – Funciones de conversión


Ya hemos comentado que Vba no es tan flexible como Excel a la hora del tratamiento de los datos.

A diferencia de Excel, Vba separa los datos de su formato de presentación.

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.

CBool(expresión) Convierte a la expresión a tipo Boolean

CByte(expresión) Convierte a la expresión a tipo Byte

CCur(expresión) Convierte a la expresión a tipo Currency

CDate(expresión) Convierte a la expresión a tipo Date

CDbl(expresión) Convierte a la expresión a tipo Double

CLng(expresión) Convierte a la expresión a tipo Long

CStr(expresión) Convierte a la expresión a tipo String

CVar(expresión) Convierte a la expresión a tipo Variant

__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
10
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________

1.2 VISUAL BASIC FOR APPLICATIONS (VBA) – Formatear datos


En el capítulo anterior ya hemos comentado que VBA separa el concepto dato del concepto
formato. Así, una variable formateada se convierte en una variable tipo String(Texto), por lo que es
conveniente usar distintas variables para guardar la información base y la información formateada.

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:

Error 13. No coinciden los tipos.


Es el Nº 1 en el “Top ten de los errores”.

Vamos a ver un poco por encima la instrucción FORMAT y FORMATNUMBER.

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.

Básicamente necesitaremos formatear números y fechas.

Usaremos FORMAT para formatear fechas o números con formato personalizado:

FORMAT(Expresión, Formato)

Usaremos FORMATNUMBER para formatear números:

FORMATNUMBER(Expresión [,Decimales])

__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
11
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________

2.-El Proyecto VBA – Seguridad


Es aconsejable proteger nuestro Proyecto VBA para evitar que sea manipulado por terceras
personan, con independencia de la buena o mala fe que tengan.

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.

Digamos que la seguridad en Excel no recibiría un premio a la fiabilidad, de hecho es relativamente


fácil desproteger el libro, las hojas y y el proyecto VBA.

Pero bueno, ante el usuario normal, nos podemos proteger de intromisiones en nuestro proyecto
VBA.

En el menú Herramientas\Propiedades de VBAProject:

__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
12
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________

2.-El Proyecto VBA – Seguridad


En la misma ficha podemos ponerle un nombre y una descripción a nuestro Proyecto VBA

El nombre del proyecto aparecerá en la ventana del proyecto en lugar de


VBAProject.

__________________________________________________________________________________________________________
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.

Los controles ActiveX que vamos a estudiar son:

 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
__________________________________________________________________________________________________________

Controles ActiveX mas habituales

3.-Controles ActiveX
Vamos a recordar que es un evento.

Un evento es un suceso en el tiempo de la vida de nuestros controles provocada voluntariamente ó


involuntariamente al interactuar con ellos.

A cada evento, habitualmente, hay asociado un procedimiento especifico que podemos programar
con código VBA.

Vamos a explicar los eventos mas habituales:

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.

Este evento se produce al presionar sobre la tecla.

Queda excluidas de este evento las teclas de función F1-F12.

KeyUp
Se produce cada vez que pulsamos una tecla sobre un control ActiveX.

Este evento se produce al dejar de presionar la tecla.

Queda excluidas de este evento las teclas de función F1-F12.


__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
15
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________

3.-Controles ActiveX

KeyPress
Se produce cada vez que pulsamos una tecla sobre un control ActiveX.

Queda excluidas de este evento las teclas de función F1-F12.

MousseDown
Se produce cada vez que pulsamos el mousse sobre un control ActiveX.

Este evento se produce al presionar sobre el botón del mousse.

MousseDown
Se produce cada vez que pulsamos el mousse sobre un control ActiveX.

Este evento se produce al dejar de presionar sobre el botón del mousse.

MousseMove
Se produce al mover el puntero del mousse sobre un control ActiveX.

Ejemplo de cómo crear el procedimiento para el evento Change de un control TextBox.

__________________________________________________________________________________________________________
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.

Sigue las normas de los nombres de las variables.

No puede estar repetido dentro de la misma hoja /formulario .

.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

Tipo de cursor que aparecerá al posicionarnos en el control.

Si no se especifica como personalizado, prevalece sobre la propiedad MousseIcon.

.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.

A continuación mostramos un ejemplo de la ventana de propiedades de un control Label (F4)

__________________________________________________________________________________________________________
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

Para introducir o variar el contenido de un Label utilizaremos la propiedad .Caption

El control TextBox
El control TextBox lo usaremos para recoger información a introducir por el usuario.

Suele ir acompañado de un Label que muestra la descripción del TextBox.

Para recuperar el contenido de un TetxBox utilizaremos la propiedad .Text

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.

Cuando el control está activado su valor es True, en caso contrario, es False.

Al pulsar sobre un control CheckBox se producen dos eventos asociados al control:

1º) El evento Change

__________________________________________________________________________________________________________
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.

Admite solamente dos valores True/False.

Cuando el control está activado su valor es True, en caso contrario, es False.

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.

El grupo de este tipo de controles viene determinado por la propiedad GropName.

__________________________________________________________________________________________________________
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.

Su funcionamiento es simple, tanto física como lógicamente.

De los eventos de este control, habitualmente, utilizaremos el evento Click.

El evento Click, como en todos los controles ActiveX, se produce al pulsar el botón izquierdo del
mouse.

De las propiedades casi siempre utilizaremos alguna de las siguientes:

 Caption Texto del botón


 ControlTipText Breve explicación
 Enabled Si podemos pulsar sobre el o no
 Picture Icono
 Visible Si se visualiza o no el botón
Las propiedades pueden fijarse a través de la ventana propiedades en tiempo de diseño, o por
medio de código en tiempo de ejecución, suponiendo que el nombre del botón es
CommanButton1:

__________________________________________________________________________________________________________
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.

 ColumnCount Número de columnas (Máximo 10)


 ColumnWidth Tamaño de las columnas
 MultiSelect Indica si se permite seleccionar varias filas o no

Ahora vamos a explicar una serie de propiedades que solo podemos configurar en tiempo de
ejecución.

ListCount Contiene en todo momento el número de filas u elementos

Es una propiedad de lectura, es decir, no podemos modificarla.

Listindex Contiene el número de fila seleccionada, empieza a partir de cero.

Si no hay ninguna fila seleccionada su valor es menos uno (-1).

Su valor, por tanto, oscilara entre -1 y el valor de Listcount -1.

Selected Nos indica si una fila está seleccionada o no.

Su valor puede ser True/false

__________________________________________________________________________________________________________
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.ListIndex = -1 Nº de fila seleccionada

Para añadir una fila utilizaremos el método AddItem:

Lista.Additem

Al añadir una fila se produce de forma automática:

Lista. ListCount = Lista. ListCount +1

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”

Y así sucesivamente hasta diciembre.

Pero supongamos que tenemos los meses en un rango, por ejemplo A1:C12, podríamos hacer:

Observad el desplazamiento de la fila del control respecto a la fila del rango.

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

También es habitual utilizar la propiedad ListCount en lugar de una variable.

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á:

Fila lista = Lista.ListCount – 1

__________________________________________________________________________________________________________
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:

 Debe tratarse de un rango fijo y continuo.


 No se puede modificar, ni añadir ni eliminar ningún valor, ni en el rango ni en la
lista, en tiempo de ejecución.
 Por el contrario, no existe la limitación de 10 columnas como máximo si la carga es
“manual” y la lista puede contener una fila de cabecera. Esta fila de cabecera es
solamente visual y no cuenta como fila añadida.

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”

De esta forma podríamos utilizar el mismo control para rangos distintos.

__________________________________________________________________________________________________________
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.

Esta propiedad nos permite básicamente 2 formas de selección:

 Selección simple, que solo permite seleccionar una fila


 Selección múltiple o de varias filas, dentro de este tipo de selección se nos permite
escoger entre la selección múltiple y la extendida, como ambas formas no afectan al
funcionamiento interno, nos referiremos a ella simplemente como Selección múltiple

Este control tiene la particularidad que se comporta de forma distinta en función del tipo de
selección escogida.

El problema viene dado por los automatismos del control.

Así, en su forma de selección simple al hacer click sobre el control se ejecutan los eventos:

 Lista_Change
 Lista_Click

También en su forma de selección simple, si modificamos la propiedad ListIndex, se ejecutan los


eventos

 Lista_Change
 Lista_Click

Y aparecerá el elemento seleccionado, resumiendo, modificar la propiedad Listindex equivale a


hacer click sobre la fila que indique dicha propiedad. Si hacemos:

Lista.Listindex = 3, se seleccionará la fila nº 4 (Recordad que se


empieza a contar desde cero)

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.

Esta propiedad puede fijarse tanto en tiempo de diseño como en tiempo de


ejecución.
No hemos hablado de una propiedad de este control que nos permite saber si una fila ha sido
seleccionada o no, se trata de la propiedad Selected, dicha propiedad se pone a True cada vez que
seleccionamos y a False cada vez que quitamos la selección a la fila.

Para averiguar si la fila está seleccionada preguntaremos por la propiedad Selected:

Poner la propiedad MultiSelect a fmMultiSelectMulti:

Si queremos seleccionar o quitar la selección a todas las filas:

__________________________________________________________________________________________________________
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.

Cuando modificamos la propiedad Selected o la propiedad Listindex, el control se comporta como


si hubiéramos hecho click sobre el control.

Resumiendo:

Al hacer click sobre el control se ejecutan los eventos:

 Lista_Change
 Lista_Click

Si modificamos la propiedad ListIndex, se ejecutan los eventos:

 Lista_Change
 Lista_Click

Si modificamos la propiedad Selected, se ejecutan los eventos:

 Lista_Change
 Lista_Click

Ejemplo de un control ListBox con Multiselect

__________________________________________________________________________________________________________
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.

La verdadera diferencia entre ambos controles empieza en el momento de introducir información


en el TextBox.

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.

Cada vez que seleccionamos una fila, se actualiza la propiedad Text.

El control Image
Utilizaremos este control para mostrar una imagen.

Utilizaremos la propiedad Picture para cargar la imagen.

Podemos hacerlo en tiempo de diseño o en tiempo de ejecución.

__________________________________________________________________________________________________________
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.

Es decir, solo podemos interactuar con un formulario, el formulario activo.

Existen dos formas de mostrar los formularios, ambas incompatibles entre si:

 Formulario modal (dependiente)


 Formulario no modal (independiente)
Esta característica viene determinada por la propiedad .ShowModal, que puede adoptar dos
valores True/False. La opción por defecto es True.

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.

También podemos crear nuestro formulario a través del menú Insertar.

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.

El grueso de VBA lo realizan otros programas ajenos a Excel y VBA.

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.

Estos archivos en \Windows\System32, en Archivos de programa\MicrosoftOffice o en directorios


de controles añadidos a nuestro proyecto procedentes de otros proveedores de objetos.

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.

En el menú Herramientas\Referencias aparece el cuadro de dialogo para mantener actualizadas las


Referencias. La imagen muestra las Referencias incorporadas por defecto.

__________________________________________________________________________________________________________
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.

Todos los controles ActiveX contenidos en nuestras Referencias seleccionadas aparecerán en la


lista de controles disponibles, y al igual que con ellas, algunos de los controles aparecerán
seleccionados por defecto.

A la lista de controles ActiveX, VBA la denomina Cuadro de Herramientas.

Para incorporar un control ActiveX en nuestro formulario debemos abrir el Cuadro de


herramientas. (Menú\Ver\Cuadro de herramientas).

__________________________________________________________________________________________________________
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.

Veamos en detalle el Cuadro de herramientas con los controles habituales::

__________________________________________________________________________________________________________
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.

Abramos, si no lo está, la ventana de propiedades con F4 o Menú Ver\Propiedades.

Seleccionar cada uno de los objetos y poner un nombre en la propiedad .Name

 Formulario MiForm
 Label MiLabel
 TextBox MiTexto
 CommandButton MiBoton

Observad que hemos redimensionado y alineado los objetos.

__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
46
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________

4.-Formularios
Pulsemos F5 para ejecutar el formulario.

Este debería ser el aspecto del formulario:

Cerremos el formulario para volver al Editor de VBA.

Para acceder a la ventana del Código VBA pulsar F7 o menú Ver\Código .

__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
47
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________

En la ventana del código VBA existen dos cuadros combinados:

 (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:

Todos los controles tienen un evento por defecto.

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.

El código asociado a un formulario es un texto libre y los procedimientos contenidos en él no tienen


ningún orden preestablecido.

Los procedimientos de evento pueden estar mezclados con los procedimientos normales.

El editor de Vba a través de los cuadros combinados (General) y (Declaraciones) simplemente


proporciona una ayuda para localizar y escribir los procedimientos.

Para facilitar la codificación, al añadir un procedimiento de evento, el editor de VBA lo coloca en


orden alfabético de nombre del procedimiento. De esta manera todos los procedimientos de un
control aparecerán juntos en la ventana del código, pero no tiene por que ser así, pudiéndolos
reordenar, copiar, editar y mover en cualquier orden.

__________________________________________________________________________________________________________
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
__________________________________________________________________________________________________________

5.-Objetos Excel en el proyecto VBA-Eventos


A diferencia de los Módulos y formulario, los objetos VBA correspondientes al libro y a las hojas
Excel no es necesario crearlos.

Las hojas dentro de nuestro proyecto VBA se crean de forma automática al crear una hoja nueva.

Al abrir un libro nuevo se crea de forma automática:

 Un proyecto VBA
 Un objeto correspondiente al libro
 Un objeto correspondiente a cada una de las hojas creadas

LOS OBJETOS EXCEL NO SON CONTROLES ACTIVEX, SIN EMBRAGO, SE


COMPORTAN DE UNA FORMA MUY PARECIDA, TAMBIÉN TIENEN
PROPIEDADES Y EVENTOS

__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
51
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________

5.-Objetos Excel en el proyecto VBA-Eventos

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
__________________________________________________________________________________________________________

5.-Objetos Excel en el proyecto VBA-Eventos

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
__________________________________________________________________________________________________________

5.-Objetos Excel en el proyecto VBA-Eventos

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.

UNA HOJA EXCEL NO ES UN FORMULARIO VBA, SIN EMBARGO, SE


COMPORTA DE UNA FORMA PARECIDA, ES CAPAZ DE CONTENER
CONTROLES ACTIVEX

__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
54
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________

5.-Objetos Excel en el proyecto VBA-Eventos

Parámetros
Muchos de los eventos, en el momento de producirse nos proporcionan información adicional.

Esta información adicional nos viene dada en forma de parámetros en el procedimiento.

Muchas veces no los utilizaremos para nada, pero en algunos eventos son indispensable.

Pongamos por ejemplo el evento Change de la Hoja1.

El evento Change de la hoja se produce al efectuar cualquier cambio en una celda.

Target es el nombre del rango que corresponde a la celda que ha cambiado.

 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
__________________________________________________________________________________________________________

5.-Objetos Excel en el proyecto VBA-Eventos

Bucles y Automatismos
Cuando trabajemos con eventos hemos de ser muy cuidadoso.

Hay eventos potencialmente “peligrosos”, en estos eventos pueden producirse ciertos


automatismos involuntarios que puede hacer que nuestras macro queden en un bucle de
instrucciones del que no sale jamás.

Recurramos nuevamente al evento Change, esta vez no de la hoja, si no de cualquier otro


objeto o control.

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%.

¿Porqué?. Cuando nosotros introduzcamos o modifiquemos un valor de cualquier celda de la


Hoja1, se producirá el evento Change de la hoja.

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á.

Debemos ser muy cuidadosos al utilizar los eventos en libros, hojas y


controles ActiveX porqué se pueden producir efectos no deseados.

__________________________________________________________________________________________________________
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.

En este punto es cuando intrucimos una nueva ventana:

La ventana Inmediato
A la ventana inmediato se accede a través del menú Ver\Ventana inmediato o con Ctrl+G.

La ventana inmediato aparecerá en la parte inferior derecha de la pantalla debajo de la vetana


correspondiente al código VBA.

Recordad:

Ctrl+R para ver la ventana Proyecto

F4 para ver la ventana Propiedades

F7 para ver la ventana Código


__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
57
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________

Ctrl+G para ver la ventana Inmediato

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.

Poniendo en la ventana inmediato un carácter de cerrar interrogación (?), a continuación la


variable o expresión y pulsando Intro, obtendremos el resultado en la línea siguiente.

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.

La ventaja de usar Debug.Print, es que no es necesario ejecutar el


procedimiento instrucción por instrucción, ya que la ventana inmediato no
se borra nunca.

__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
59
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________

7.-La tercera macro


Ya tenemos las nociones básicas de que es una macro, un objeto, un formulario…

En definitiva, ya estamos en condiciones de hacer un proyecto VBA con un mínimo de dificultad.

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
__________________________________________________________________________________________________________

7.-La tercera macro

Objetivos del proyecto:

Realizar un formulario para añadir filas a la hoja Agenda

Datos a ingresar:

Clave: Autonumérico Obligatorio Clave mas alta + 1

Nombre: Texto Obligatorio

Cargo: Texto Obligatorio A elegir de un cuadro combinado de la

columna A de la hoja Cargos

Telefono: Texto Obligatorio 9 digitos

Antes de lanzarnos como locos a diseñar el formulario, empezaremos por analizar los
requerimientos de proyecto:

¿ Cual es el requerimiento principal ?

 Añadir una fila nueva a la hoja Agenda

¿ Que necesitamos para poder añadir una filanueva ?

 Averiguar en que fila

¿ Que datos necesitamos ?

 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

¿ Necesitamos cumplir con algún requerimiento antes de mostrar el formulario ?

 Averiguar cual es la clave mas alta de la hoja Agenda


 Averiguar cual es la primera fila vacía de la hoja Agenda
 Cargar el cuadro combinado de Cargos

ANTES DE EMPEZAR A PROGRAMAR HEMOS DE ANALIZAR CON


DETENIMIENTO LOS REQUERIMIENTOS DEL PROYECTO

__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
61
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________

7.-La tercera macro


Ahora ya podemos dibujar el formulario:

Asignaremos los siguientes nombres a los controles:

 TextBox Clave xClave


 TextBox Nombre xNombre
 ComboBox Cargo xCargo
 TextBox Teléfono xTelefono
 CommandButton Insertar Insertar

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:

 Averiguar cual es la clave mas alta de la hoja Agenda


 Averiguar cual es la primera fila vacía de la hoja Agenda
 Cargar el cuadro combinado de Cargos

__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
62
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________

7.-La tercera macro


Este sería el código del evento Initialize del formulario:

__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
63
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________

Se aconseja poner la máxima cantidad de comentarios posible

7.-La tercera macro


Si ejecutamos el formulario (Clic sobre el formulario + F5), os debe aparecer:
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
64
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________

Ahora vamos a programar el evento click del CommanButton Insertar:

7.-La tercera macro


A continuación se muestra el código en formato para poder ser copiado
__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
65
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
__________________________________________________________________________________________________________

Do Until ActiveCell = ""


If ActiveCell > ClaveMasAlta Then
ClaveMasAlta = ActiveCell
End If
ActiveCell.Offset(1, 0).Select 'Seleccionamos la fila siguiente
Loop
ClaveMasAlta = ClaveMasAlta + 1 'Primera clave libre
xClave = ClaveMasAlta 'visualizamos la primera clave libre
 
'En este momento la celda activa es la primera celda en blanco
'por tanto se trata de la primera fila disponible
'-------------------------------------------------------------
Fila = ActiveCell.Row 'Guardamos el nº de fila
 
'Recorremos la hoja Cargos para cargar el combobox xCargo
'--------------------------------------------------------
Cargos.Activate 'Activamos la hoja Agenda
Cargos.Range("A2").Select 'seleccionamos la celda A2
Do Until ActiveCell = ""
xCargo.AddItem ActiveCell
ActiveCell.Offset(1, 0).Select 'Seleccionamos la fila siguiente
Loop
Agenda.Activate 'Activamos la hoja Agenda
End Sub

__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
67
CURSO: MACROS-BASICO By Antoni
__________________________________________________________________________________________________________

__________________________________________________________________________________________________________
10/01/2011 9:36:20 488360016.doc
68

También podría gustarte