Você está na página 1de 136

Aplicaciones en Visual Basic

Vocabulario
Aplicacin o Programa:
Conjunto de bloques de instrucciones y de objetos de control que
realizan una funcin o tarea. Se divide en mdulos.
Mdulo:
Pueden ser de tres clases (Formulario Estndar, Clase):
Formulario:
Ventanas que sirven de interfaz de la aplicacin. Contiene controles,
eventos, declaraciones de variables y procedimientos.
Estndar:
Contiene declaraciones de variables y procedimientos.
Clase:
Contiene definiciones de nuevos objetos con sus mtodos y
propiedades.
Procedimiento:
Conjunto de instrucciones que forman el cdigo. Pueden ser
subrutinas o funciones.
Objeto:
Combinacin de cdigo y datos que se pueden tratar como una
unidad, por ejemplo, un control, un formulario o un componente de
una aplicacin
Se agrupan por clases:
Objetos del sistema: objetos especiales del sistema operativo
(Err, Printer, Debug, etc.).
Objetos de formulario: Contiene el propio formulario y todos
los controles contenidos en l.
Objetos de Excel: Representa un elemento de una aplicacin,
como una hoja de clculo, una celda, un diagrama, etc.
Coleccin:
Una coleccin es un objeto que contiene varios objetos que
normalmente, pero no siempre, son del mismo tipo.
En Microsoft Excel, por ejemplo, el objeto Workbooks contiene
todos los objetos Workbook abiertos.
Evento:
Cdigo que se ejecuta cada vez que se realiza una accin sobre un
objeto: clic, doble clic, arrastrar, cargar, modificar, etc.
Los eventos pueden ocurrir como resultado de una accin del
usuario o del cdigo del programa, tambin pueden ser originados
por el sistema.
Propiedad:
Atributo de un objeto (nombre, color, fuente, posicin, etc) que
define una de las caractersticas del objeto, tal como su tamao,
color o localizacin en la pantalla, o un aspecto de su
comportamiento, por ejemplo si est visible o activado.
Para cambiar las caractersticas de un objeto, se cambia el valor de
sus propiedades.
Mtodo:
Un procedimiento que se aplica a un objeto.
Devolver objetos:
Cada aplicacin tiene una forma de devolver los objetos que
contiene.
1

Macro:
Una macro permite la automatizacin de tareas de uso frecuente.
Por lo tanto una macro consiste en una serie de comandos y
funciones, que se almacenan en un mdulo de Visual Basic y que
puede ejecutarse siempre que sea necesario realizar la tarea.
Editor de Visual Basic:
Con el Editor de Visual Basic, se pueden modificar macros, copiar
macros de un mdulo en otro, copiar macros entre diferentes libros,
cambiar de nombre a los mdulos que almacenan macros o cambiar
de nombre a las macros.
Objetos de Excel
Algunos de los objetos que se encuentran en Excel son: WorkSheet
(Objeto hoja de clculo) o Range (Objeto casilla o rango de casillas).
Un objeto Range est definido por una clase donde se definen sus
propiedades. Entre las propiedades de un objeto Range estn: Value
, que contiene el valor de la casilla , Column y Row que contienen
respectivamente la fila y la columna de la casilla, Font que contiene
la fuente de los caracteres que muestra la casilla.
Range , como objeto, tambin tiene mtodos; Por ejemplo el
mtodo Activate , hace activa una celda determinada, Clear , borra
el contenido de una celda o rango de celdas, Copy , copia el
contenido de la celda o rango de celdas en el portapapeles.
Range, es un elemento del Conjunto WorkSheets; dentro de un libro
de trabajo puede existir ms de una hoja ( WorkSheet ), todas las
hojas de un libro de trabajo forman un conjunto, el conjunto
WorkSheets .
Cada elemento individual de un conjunto se referencia por un ndice,
de esta forma, la primera, segunda y tercera hoja de un libro de
trabajo, se referenciarn por WorkSheets(1), WorkSheets(2) y
WorkSheets(3).
Objetos de Objetos.
Es muy habitual que una propiedad de un objeto sea otro objeto.
En este trabajo, se utilizarn objetos ya definidos por la aplicacin
Excel como WorkSheets, Range u otros. S se definirn sus
propiedades y mtodos de aplicacin.
Editor de Visual Basic.
El editor de Visual Basic es la aplicacin que utilizaremos para
construir las macros que interactuarn junto con los libros de
trabajo.
A continuacin, prepararemos un archivo en el que escribiremos las
primeras instrucciones en Visual Basic.
Preparar un archivo nuevo de Excel.
Para entrar en el editor de Visual Basic, ejecute los siguientes
pasos:
Active opcin Herramientas/ Macro/ Editor de Visual Bsic.

Se abrir la siguiente ventana:

Maximice la ventana para trabajar ms cmodamente, e intente


tener activa la ventana Explorador de proyectos y la ventana
Propiedades ( Ver/ Explorador de proyectos y Ver/ Ventana
propiedades ).

Insertar un nuevo mdulo.


Un mdulo, sirve para agrupar procedimientos y funciones; siendo
que el procedimiento y la funcin, son entidades de programacin
compuestas por instrucciones de cdigo que realizan una accin
concreta.
Mdulo estndar
Es un mdulo que contiene solamente declaraciones y definiciones
de procedimiento, tipo y datos. Las declaraciones y definiciones a
nivel de mdulo, de un mdulo estndar, son Public de manera
predeterminada.
En versiones anteriores de Visual Basic un mdulo estndar se
denomina mdulo de cdigo.
El cdigo dentro de un mdulo se organiza en procedimientos; y un
procedimiento le comunica a la aplicacin cmo ejecutar una tarea
especfica.
Utilice procedimientos para dividir tareas de cdigo complejas, en
unidades ms manipulables.
Procedimiento
Es una secuencia, con nombre, de instrucciones que se ejecutan
como una unidad.
Por ejemplo, Function, Property y Sub son todos tipos de
procedimientos.
Un nombre de procedimiento, siempre se define a nivel de mdulo.
Todo el cdigo ejecutable debe estar contenido en un procedimiento.
Los procedimientos no se pueden anidar dentro de otros
procedimientos.
Para insertar un mdulo active opcin del men Insertar/ Mdulo.

Se activar una nueva ventana, si aparece demasiado pequea,


maximcela.
Insertar un procedimiento.
Recordemos que un procedimiento es un bloque de instrucciones de
cdigo, que sirven para llevar a cabo alguna tarea especfica.
Un procedimiento empieza siempre con la instruccin Sub
Nombre_Procedimiento; Y termina con la instruccin End Sub .
A continuacin crearemos un procedimiento para sumar dos valores,
que se encuentran en la hoja1 del libro 1 de nuestro archivo Excel.
El primer trmino de la operacin se encuentra en la celda A1 el
segundo el la celda A2 y la operacin, se suma, se encuentra en A3.

Ejemplo 1

Observe el cdigo:
Range ("A3"). Formula = "=A1+A2"
En esta lnea estamos indicando que trabajamos con un objeto
Range.
Para indicarle que nos referimos al rango A3, encerramos entre
parntesis esta referencia.
De este objeto Range ("A3"), indicamos que queremos establecer
una frmula para la propiedad Formula, observe que para separar
el objeto de su propiedad utilizamos la notacin punto "." .
6

Application
Application es el objeto superior, que en nuestro caso representa la
aplicacin Excel.
As, el primer ejemplo, siguiendo toda la jerarqua de objetos
quedara de la forma siguiente:
Sub suma()
Application.Workbooks(1).Worksheets(1).Range("A3").Formula =
"=A1+A2"
End Sub
Application, no siempre es necesario especificarlo; ser necesario
implementarlo, si en las macros se trabaja con diferentes libros de
trabajo (diferentes archivos).
Ejecutar un procedimiento o funcin.
Para ejecutar el primer procedimiento del ejemplo suma.
1.Site el cursor dentro del procedimiento.

2. Active de la barra de herramientas: Ejecutar/ Ejecutar Sub


Userform .

Tambin puede hacer clic sobre el botn correspondiente en la barra


de asistente o pulsar la tecla "F5" .

Para ejecutar el procedimiento desde la hoja de clculo, debe estar


en una hoja del Libro de Excel.
1.Active opcin de la barra de mens Herramientas/ Macro/ Macros .

Se despliega una ventana que muestra una lista donde ests todas
las macros incluidas en el libro de trabajo.
2.Seleccione la macro de la lista y pulse sobre el botn Ejecutar .

Formas
En este segundo ejemplo se ampliar la funcionalidad de la macro
del ejemplo anterior.
Adems de escribir la funcin "=A1+A2" en el rango A3 , se le
aplicar:
Formato del tipo moneda
el signo pesos
la propiedad de Negrita y Color Azul .
Para asignar la Negrita y color, se aplica la propiedad Bold y Color
del objeto Font .
Ejemplo 2:
Public Sub forma()
Range("A3").Formula = "=A1 + A2"
Selection.NumberFormat = "#,## 0$"
Range("A3").Font.Bold = True
Range("A3").Font.Color = RGB(0, 0, 255)
End Sub
El valor True , indica que la propiedad Bold est activada; para
desactivarla, basta con igualarla al valor False .
Para establecer el color de la propiedad se utiliza la funcin RGB
(Red , Green , Blue ), los tres argumentos para esta funcin son
valores de que van de 0 a 255 y que corresponden a la intensidad
de los respectivos colores Rojo, Verde y Azul.
Referenciar un rango de celdas.
Slo tiene que cambiar a la forma Celda_Inicial:Celda_Final .
Ejemplo 3:
Public Sub forma()
Range("A3").Formula = "=A1 + A2"
Selection.NumberFormat = "#,## 0$"
Range("A1:A3").Font.Bold = True
Range("A1:A3").Font.Color = RGB(0, 0, 255)
End Sub
Variables.
A continuacin se realizar un programa que solicita al usuario, por
medio de una ventana, ingresar un valor desde el teclado y el
programa guarda a ese valor en una celda.
El programa utilizar una variable para poder registrar el valor (que
el usuario ingresa por teclado), en la celda respectiva.
Siendo que una variable es simplemente una parte de memoria que,
la funcin o procedimiento, se reserva para guardar datos.
La forma general de declarar una variable es:
Dim variable AS tipo .
Siendo variable el nombre que se asigna a la misma y Tipo el tipo
de datos que se guardarn (nmeros, texto, fecha, booleanos,...).
En el ejemplo, se declarar la variable de tipo String (tipo texto), y
se realizar de la siguiente forma:
Dim Texto As String

As se est indicando que se reserve parte de la memoria que se


llama Texto y que el tipo de datos que se guardarn ah sern
caracteres.
La Funcin InputBox .
Esta funcin muestra una ventana para que el usuario pueda teclear
datos. Cuando se pulsa sobre el botn Aceptar , los datos entrados
pasan a la variable a la que se ha igualado la funcin.
Vea la siguiente lnea .
Texto = InputBox ("Introduzca el texto", "Entrada de datos").
En este caso, si en la ventana que muestra InputBox pulsa sobre el
botn Aceptar, los datos tecleados se guardarn el la variable Texto.
Sintaxis de InputBox: InputBox ( Mensaje , Ttulo , Valor por defecto
, Posicin horizontal , Posicin Vertical , Archivo ayuda , Nmero de
contexto para la ayuda ).
Mensaje : Es el mensaje que se muestra en la ventana. Si
desea poner ms de una lnea ponga Chr(13) para cada nueva
lnea, vea el ejemplo siguiente.
Ttulo : Es el ttulo para la ventana InputBox . Es un
parmetro opcional.
Valor por defecto : Es el valor que mostrar por defecto el
cuadro donde el usuario entra el valor. Parmetro opcional.
Posicin Horizontal : La posicin X de la pantalla donde se
mostrar el cuadro, concretamente es la posicin para la
parte izquierda. Si se omite el cuadro se presenta
horizontalmente centrado a la pantalla.
Posicin Vertical : La posicin Y de la pantalla donde se
mostrar el cuadro, concretamente es la posicin para la
parte superior. Si se omite el cuadro se presenta
verticalmente centrado a la pantalla.
Archivo Ayuda: Es el archivo que contiene la ayuda para el
cuadro. Parmetro opcional.
Nmero de contexto para la ayuda: Nmero asignado que
corresponde al identificador del archivo de ayuda, sirve para
localizar el texto que se debe mostrar. Si se especifica este
parmetro, debe especificarse obligatoriamente el parmetro
Archivo Ayuda.
Ejemplo 4
Sub precio_impuesto()
Dim precio As Single
'Chr(13) sirve para que el mensaje se muestre en dos lneas
precio = InputBox("Introduzca precio sin impuesto" & Chr(13) & "El
resultado se guardar en la casilla A1", "Entrada de datos")
ActiveSheet.Range("A1").Value = (precio * (1 + (0.21)))
End Sub
Ejemplo 5
En este ejemplo, mediante un segundo Inputbox , el usuario decide
en que celda se entran los datos del primer Inputbox.
Sern necesarias dos variables, una para guardar la celda destino
escogida por el usuario y otra para guardar el valor.

10

Option Explicit
Sub precio_impuesto()
Dim celda As String
Dim precio As Single
celda = InputBox("En que celda quiere registrar el valor" & Chr(13)
& "indicar letra de columna y nmero de fila", "Entrar Celda")
precio = InputBox("Ingrece el precio sin impuesto" & Chr(13) & "El
resultado se guardar en la celda " & celda, "Entrada de datos")
ActiveSheet.Range(celda).Value = (precio * (1 + (0.21)))
End Sub
La sentencia Option Explicit.
En Visual Basic no es necesario declarar las variables, por ejemplo,
en el programa anterior se hubiera podido prescindir de las lneas:
Dim celda As String
Dim precio As Single.
A pesar de ello, es recomendable que siempre se declaren las
variables a utilizar; de esta forma se sabr cuales son las variables
que utiliza el procedimiento y que tipo de datos guarda cada una.
A medida que se vayan creando procedimientos ms complicados y
que requieran el uso de ms variables, si no declara las variables al
principio del procedimiento ocurrirn dos cosas:
Primero, las variables no declaradas sern asumidas como
tipo Variant; este es un tipo de datos que puede almacenar
cualquier valor, nmero, fechas, texto, etc. pero tenga en
cuenta que ocupa 20 Bytes y para guardar una referencia a
una casilla, la edad de alguien, etc. y puede que no sean
necesarios tantos bytes
Segundo, reducir considerablemente la legibilidad de los
procedimientos ya que las variables se irn colocando a
medida que se precisen, esto complicar la correccin o
modificacin del procedimiento.
Volviendo a la cuestin central, la sentencia Option Explicit al
principio del mdulo fuerza a que se declaren todas las variables.
Si al ejecutar el programa, se encuentra alguna variable sin declarar
se producir un error y no se podr ejecutar el programa hasta que
se declare.
El siguiente ejemplo muestra dos procedimientos con el mismo
objetivo, en el primero no son declaradas las variables; y en el
segundo s se procede a la declaracin de las variables.
Preste atencin a las palabras "Texto" y "Testo", que simularn un
error al teclear.
Ejemplo 6
Sub Entrar_Valor()
Texto = InputBox("Introducir un texto " & Chr(13) & "Para la celda
A1", "Entrada de datos")
ActiveSheet.Range("A1").Value = Testo
End Sub
Observe que el programa no hace lo que se pretende, pues Texto y
Testo son dos variables diferentes y como no se ha declarado
ninguna variable, ni se ha utilizado Option Explicit Visual Basic no da
11

ningn tipo de error. Est ejecutando el programa pero no ingresa


ningn valor.
Ahora el Mdulo cuenta con Option Explicit.
Option Explicit
Sub Entrar_Valor()
Dim Texto As String
Texto = InputBox("Introducir un texto " & Chr(13) & "Para la celda
A1", "Entrada de datos")
ActiveSheet.Range("A1").Value = Testo
End Sub
Observe que el programa no se ejecuta, al poner Option Explicit ,
forzamos a que se declaren todas las variables.
Visual Basic detecta que la variable Testo no ha sido declarada y as
lo indica mostrando Error.

Entonces se puede detectar la existencia de un error y proceder a


su modificacin.

Tipos de datos en Visual Basic para Excel .


Byte

1 byte

0 a 255

Boolean

2
bytes

True o False

Integer

2
bytes

-32.768 a 32.767

Long(entero
largo)

4
bytes

-2.147.483.648 a
2.147.483.647

Single (coma
flotante/precisi
nsimple)

4
bytes

-3,402823E38 a -1,401298E45 para valores negativos;


1,401298E-45 a 3,402823E38
12

para valores positivos

8
bytes

-1,79769313486232E308 a
-4,94065645841247E-324
para valores negativos;
4,94065645841247E-324 a
1,79769313486232E308 para
valores positivos

Currency (entero 8
a escala)
bytes

-922.337.203.685.477,5808
a 922.337.203.685.477,5807

Decimal

14
bytes

+/79.228.162.514.264.337.593
.543.950.335 sin punto
decimal; +/7,9228162514264337593543
950335 con 28 posiciones a
la derecha del signo decimal;
el nmero ms pequeo
distinto de cero es+/0,0000000000000000000000
000001

Date

8
bytes

1 de enero de 100 a 31 de
diciembre de 9999

Object

4
bytes

Cualquier referencia a tipo


Object

String(longitud
variable)

10
bytes+
longitu Desde 0 a 2.000 millones
d de la
cadena

String(longitud
fija)

Longit
ud de
Desde 1 a 65.400
la
aproximadamente
cadena

Variant(con
nmeros)

16
bytes

Variant (con
caracteres)

22
bytes
El mismo intervalo que para
+
un tipo String de longitud
longitu
variable
d de
cadena

Double (coma
flotante/precisi
n doble)

Cualquier valor numrico


hasta el intervalo de un tipo
Double

Definido por el
Nmer El intervalo de cada elemento
usuario(utilizand o
es el mismo que el intervalo
o Type)
requeri de su tipo de datos.
do por
los
13

eleme
ntos
Ejemplo 7
Option Explicit
Sub tipo_dato()
Dim c As Integer
Dim t As Integer
Dim i As Integer
c = InputBox("Entrar el Capital Inicial", "Entrada de datos")
t = InputBox("Entrar el Tiempo", "Entrada de datos")
i = InputBox("Entrar el Inters", "Entrada de datos")
ActiveSheet.Range("A1").Value = (c * (1 + i) * t)
End Sub
Vuelva a ejecutar el programa y cuando se le pide el primer valor
teclee "Hola". Observe que el programa se detiene indicando un
error en el tipo de datos.

Efectivamente, la funcin InputBox devuelve siempre datos tipo


String.
En el primer ejemplo no ha habido ningn problema, al entrar
caracteres numricos , estos pueden asignarse a variables tipo
Integer porque Visual Basic hace automticamente la conversin;
pero al entrar texto e intentarlo asignar a una variable Integer
Visual Basic muestra un error, indicando que la variable no es
adecuada para los datos que se desean guardar.
Para solucionar estos problemas, se deben utilizar funciones de
conversin de tipo.
Estas funciones, como su nombre lo indica, convierten datos de un
tipo a otro, de String a Integer, de Integer a String, de Date a
String,...
As el procedimiento anterior quedara.
14

Sub convertir()
Dim c As Integer
Dim t As Integer
Dim i As Integer
c = val(InputBox("Entrar el Capital Inicia", "Entrada de datos"))
t = val(InputBox("Entrar el Tiempo", "Entrada de datos"))
i = val(InputBox("Entrar el Inters", "Entrada de datos"))
ActiveSheet.Range("A1").Value = (c * (1 + i) * t)
End Sub
La funcin Val(Dato String), devuelve los nmeros contenidos en
una cadena como un valor numrico del tipo adecuado.
Si la cadena a convertir contiene algn carcter no numrico
devuelve 0.
As, si al pedir un valor se teclea "Hola", la funcin Val devolver un
cero.
Conversin de Tipos de datos.
Ejemplo 8
En el siguiente ejemplo se piden dos nmeros, se suman y se
guardan en la celda A1 de la hoja activa.
Option Explicit
Sub Sumar()
Dim Numero1 As Integer
Dim Numero2 As Integer
Numero1 = InputBox("Entrar el primer valor", "Entrada de datos")
Numero2 = InputBox("Entrar el primer valor", "Entrada de datos")
ActiveSheet.Range("A1").Value = Numero1 + Numero2
End Sub
Al ejecutar el procedimiento ingrese, en cada ventana, los valores
25 y 25 respectivamente.
En la celda A1 de la hoja activa aparece un registro con valor igual a
50.
Ahora, vuelva a ejecutar el programa y cuando se pide el primer
valor teclee "Hola".
Con este nuevo evento el programa se detiene e indica un error en
el tipo de datos.

Esto ocurre porque la funcin InputBox devuelve siempre datos tipo


String.
En el primer caso del presente ejemplo, no se presentaron
problemas al entrar caracteres numricos. stos pueden asignarse a
variables tipo Integer, porque Visual Basic hace automticamente la
conversin.
15

Pero al entrar texto e intentar asignarlo a una variable Integer,


Visual Basic muestra un error indicando que la variable no es
adecuada para los datos que se desean guardar.
Para solucionar este tipo de problemas se deben utilizar funciones
de conversin de tipo.
Estas funciones, como su nombre indica, convierten datos de un tipo
a otro, de String a Integer , de Integer a String , de Date a
String ,...
As el procedimiento anterior quedara.
Option Explicit
Sub Sumar()
Dim Numero1 As Integer
Dim Numero2 As Integer
Numero1 = Val(InputBox("Entrar el primer valor", "Entrada de
datos"))
Numero2 = Val(InputBox("Entrar el primer valor", "Entrada de
datos"))
ActiveSheet.Range("A1").Value = Numero1 + Numero2
End Sub
La funcin Val (Dato String), convierte una cadena de caracteres a
valor numrico.
Si la cadena a convertir contiene algn carcter no numrico
devuelve 0.
As, si al pedir un valor se teclea "Hola", la funcin Val, devolver un
cero.
Funciones de conversin de tipos.
(Tabla copiada del ayudante de Office en lnea de Referencia de
Visual Basic para Excel).
Val (Cadena).
Convierte la cadena a un valor numrico.
Str (Nmero). Convierte el nmero a una expresin cadena.
Las siguientes funciones tienen la forma Funcin (Expresin).
1 Tenga en cuenta que para los ordenadores no es lo mismo el
nmero 1 que el carcter "1".
En los lenguajes de programacin actuales la conversin de carcter
"1" a nmero 1 se hace automticamente en muchos casos, esto es
bueno y es malo.
Es bueno porque nos ahorra tener que hacer las conversiones y es
malo porque es ms difcil controlar ciertos casos.
Siga con los ejemplos y entender de lo que estamos hablando.
Slo para su informacin, el ordenador guarda el nmero 1 de la
siguiente manera 00000001,mientras que el carcter "1" se guarda
como 00110000 (el nmero 48 del cdigo ASCII).
Funcin

Tipo
devuelto

Cbool

Boolean

Cbyte
Ccur

Byte
Currenc

Intervalo del argumento expresin


Cualquier expresin de cadena o numrica
vlida.
0 a 255.
-922.337.203.685.477,5808 a
16

Cdate

y
Date

CDbl

Double

Cdec

Decimal

CInt

Integer

CLng

Long

CSng

Single

CVar

Variant

CStr

String

922.337.203.685.477,5807.
Cualquier expresin de fecha.
-4,94065645841247E-324 para valores
negativos;
4,94065645841247E-324 a
1,79769313486232E308
para valores positivos.
+/-7,9228162514264337593543950335.
La menor posicin para un nmero que no
sea cero es
0,0000000000000000000000000001.
-32.768 a 32.767; las fracciones se
redondean.
-2.147.483.648 a 2.147.483.647;
las fracciones se redondean.
-3,402823E38 a -1,401298E-45 para valores
negativos;
1,401298E-45 a 3,402823E38 para valores
positivos.
El mismo intervalo que Double para valores
numricos.
El mismo intervalo que String para valores no
numricos
El valor de retorno de CStr depende del
argumento expresin.

Objetos y Propiedades de uso frecuente.


Objeto Cells(fila, columna).
Sirve, como el objeto range, para referenciar una celda o rango de
celdas, pero en lugar de utilizar la referencia de la forma A1, B1,
X320,... utiliza la fila y la columna que ocupa la celda dentro de la
hoja (objeto WorkSheet).
Por ejemplo, para poner Hola en la celda A1 de la hoja activa seria:
ActiveSheet.Cells(1,1).Value="Hola"
Utilizar Cells para referenciar un rango.
seria el equivalente a Range("Celda_Inicial:Celda_Final").
La forma que se obtiene utilizando Cells es un poco ms larga, pero
se ver que a veces resulta mucho ms funcional que utilizando
nicamente range.
Para referirnos al rango A1:B8, pondremos:
Range(Cells(1, 1), Cells(8, 2)).Value = "Hola"
Otra forma interesante de Cells es la siguiente:
Range("A5:B10").Cells(2, 1).Value = "Hola"
Pondr en la celda A6 el valor "Hola", observe que en este ejemplo
Cells comienza a contar filas y columnas a partir del rango
especificado en el objeto Range.
Variables de Objetos.
17

Una variable objeto sirve para hacer referencia a un objeto, esto


significa que podremos acceder a las propiedades de un objeto e
invocar a sus mtodos a travs de la variable en lugar de hacerlo
directamente a travs del objeto.
Esta clase de variables se utilizan en estructuras For Each ... Next ,
o cuando es necesario construir funciones que devuelvan rangos o
referencias a hojas.
Para declarar una variable objeto se utiliza tambin la palabra
Dim de la siguiente forma:
Dim Var_Objeto As Objeto
Dim R As Range
Dim Hoja As WorkSheet
Para asignar un objeto a una variable debe utilizar la
instruccin Set .
Set Variable_Objeto = Objeto
Set R= ActiveSheet.Range("A1:B10")
Set Hoja = ActiveSheet
Set Hoja = WorkSheets(1)
Ejemplo de cmo utilizar este tipo de variables.
Ejemplo 9.
Llenar el rango de A1 a B10 con la palabra "Hola" y despus poner
negrita.
Primero se asigna una variable objeto al objeto y luego se trabaja
con esa variable de la misma forma que trabajara directamente
sobre el objeto.
Sub obj()
Dim R As Range
Set R = ActiveSheet.Range("A1:B10")
R.Value = "Hola"
R.Font.Bold = True
End Sub
El valor Nothing.
Cuando sea necesario desasignar una variable del objeto al cual
hace referencia, deber igualar la variable al valor Nothing de la
siguiente forma :
Set Variable_Objeto = Nothing
Habitualmente se utiliza Nothing en una estructura condicional para
comprobar si la variable objeto est asignada.
Observe que si se utiliza una variable objeto a la cual todava no se
le ha hecho ninguna asignacin, el programa dar error y detendr
su ejecucin.
Es de buena prctica hacer este tipo de comprobaciones antes de
trabajar con variables objeto.
Veremos un ejemplo de esto en el siguiente tema.
Estructuras condicionales.
Las estructuras condicionales son instrucciones de programacin que
permiten controlar la ejecucin de un fragmento de cdigo, en
funcin de si se cumple o no una condicin.
18

Instruccin if Condicin then .. End if ( Si Condicin Entonces ...


Fin Si )
La estructura condicional que se construye con la instruccin Si
Condicin Entonces ... Fin Si tiene la forma siguiente:
Si Condicin Entonces
Sentncia1
Sentncia2 . .
SentnciaN
Fin Si
Cuando el programa llega a la instruccin Si Condicin Entonces , se
evala la condicin, si esta se cumple (es verdadera), se ejecutan
todas las sentencias que estn encerradas en el bloque, si no se
cumple la condicin (es falsa), se saltan estas sentencias.
Esta estructura en Visual Basic tiene la sintaxis siguiente:
If Condicin Then
Sentncia1
Sentncia2
SentnciaN
End If
Ejemplo 10 :
Entrar un valor por el teclado con la instruccin InputBox y
guardarlo en la celda A1 de la hoja activa.
Si el valor entrado desde el teclado (y guardado en A1) es superior
a 1000, aplicar un descuento con otro InputBox y guardarlo en la
celda A2 de la hoja activa.
Calcular en A3, el precio de A1 menos el descuento de A2.
Sub Condicional()
ActiveSheet.Range("A1").Value = 0
' Poner las casillas donde se guardan los valores 0 .
ActiveSheet.Range("A2").Value = 0
ActiveSheet.Range("A3").Value = 0
ActiveSheet.Range("A1").Value = Val(InputBox("Entrar el valor",
"Entrar"))
' Si el valor de la celda A1 es mayor que 1000, entonces, aplicar
descuento
If ActiveSheet.Range("A1").Value > 1000 Then
ActiveSheet.Range("A2").Value = Val(InputBox("Entrar Descuento",
"Entrar"))
End If
ActiveSheet.Range("A3").Value = ActiveSheet.Range("A1").Value ActiveSheet.Range("A2").Value
End Sub
Ejemplo 11.
Aplicando variables.
Option Explicit
Sub Condicional()
Dim valor As String
Dim descuento As String
valor = 0
descuento = 0
valor = Val(InputBox("Entrar el valor", "Entrar"))
19

' Si el valor de la variable es mayor que 1000, entonces, pedir


descuento
If valor > 1000 Then
descuento = Val(InputBox("Entrar Descuento", "Entrar"))
End If
ActiveSheet.Range("A1").Value = valor
ActiveSheet.Range("A2").Value = descuento
ActiveSheet.Range("A3").Value = valor - descuento
End Sub
Esta ltima alternativa es mas recomendable que la anterior pues
las variables, aunque muchas veces "innecesarias", dejan a los
programas ms legibles y claros.
Esta buena prctica quedar evidenciada al momento de tener que
realizar mantenimientos o modificaciones en el o los programas.
Ejemplo 12.
Macro que compara los valores de las casillas A1 y A2 de la hoja
activa.
Si son iguales pone el color de la fuente de ambas en azul.
Sub Condicional2()
If ActiveSheet.Range("A1").Value = ActiveSheet.Range("A2").Value
Then
ActiveSheet.Range("A1").Font.Color = RGB(0, 0, 255)
ActiveSheet.Range("A2").Font.Color = RGB(0, 0, 255)
End If
End Sub
Estructura If..Else
Esta estructura se utiliza cuando se requiere una respuesta
alternativa a una condicin.
Su estructura es la siguiente:
Si Condicin Entonces
Sentencia 1
Sentencia 2
Sentencia N
Sino
Sentencia 1
Sentencia 2
Sentencia N
Fin Si
Si se cumple la condicin , se ejecuta el bloque de sentencias
delimitado por Si Condicin Entonces y Si no se cumple la condicin,
se ejecuta el bloque delimitado por Sino y Fin Si .
En Visual Basic la instruccin Si Condicin Entonces ... Sino ... Fin Si
se expresa con las instrucciones siguientes:
If Condicin Then
Sentencia 1
Sentencia 2
Sentencia N
Else
Sentencia 1
Sentencia 2
20

Sentencia N
End If
Ejemplo 13.
Entrar un valor por el teclado con la instruccin InputBox y
guardarlo en la celda A1 de la hoja activa.
Si el valor entrado desde el teclado (y guardado en A1) es superior
a 1000, aplicar un descuento del 10% sino aplicar un descuento del
5%, el descuento se guarda en la celda A2 de la hoja activa.
Colocar en A3, el total descuento y en A4 el total menos el
descuento.
Sub Condicional_Else()
Dim valor As Single
Dim descuento As Single
valor = 0
valor = Val(InputBox("Entrar el valor", "Entrar"))
' Si el valor de la variable es mayor que 1000, entonces, aplicar
descuento del 10%
If valor > 1000 Then
descuento = valor * (10 / 100)
ActiveSheet.Range("A2").Value = 0.1
Else
' Sino Aplicar descuento del 5%
descuento = valor * (5 / 100)
ActiveSheet.Range("A2").Value = 0.05
End If
ActiveSheet.Range("A1").Value = valor
ActiveSheet.Range("A3").Value = descuento
ActiveSheet.Range("A4").Value = valor - descuento
End Sub
Ejemplo 14
Restar los valores de las celda A1 y A2.
Guardar el resultado en A3.
Si el resultado es:
o positivo o cero, poner la fuente de A3 en azul ,
o si es negativo poner la fuente A3 en rojo .
Sub Condicional_Else2()
Range("A3").Value = Range("A1").Value - Range("A2").Value
If Range("A3").Value < 0 Then
Range("A3").Font.Color = RGB(255, 0, 0)
Else: Range("A3").Font.Color = RGB(0, 0, 255)
End If
End Sub
Estructuras If anidadas.
If...Then...Else se pueden anidar en tantos niveles como sea
necesario
Ejemplo 15.
Comparar los valores de las celda A1 y A2 de la hoja activa.

21

o
o
o

Si son iguales, escribir en A3 "Los valores de A1 y A2


son iguales" ,
Si el valor de A1 es mayor que A2, escribir "A1 mayor
que A2" ,
Si el valor de A1 es menor que A2 "A2 mayor que A1" .

Sub Condicional()
If Range("A1").Value = Range("A2").Value Then
Range("A3").Value = "Los Valores de A1 y A2 son iguales"
Else
If Range("A1").Value > Range("A2").Value Then
Range("A3").Value = "A1 mayor que A2"
Else
Range("A3").Value = "A2 mayor que A1"
End If
End If
End Sub
La segunda estructura
If ..
Else ..
End If
queda dentro del Else de la primera estructura.
Esta es una regla general, cuando pone un End If , este cierra
siempre el ltimo If ( o Else ) abierto.
Operadores lgicos.
Estos operadores lgicos, se utilizan cuando es preciso evaluar dos o
ms condiciones para decidir si se ejecutan o no determinadas
acciones.
Operador Lgico And (Y).
Este operador se utiliza cuando: para ejecutar un bloque de
instrucciones se cumpla ms de una condicin. Para que el bloque
de instrucciones pueda ejecutarse se debern cumplir todas las
condiciones.
Ejemplo 16.
Entrar desde teclado:
o el Nombre de un producto,
o la cantidad requerida y
o el precio del producto
Guardar en:
o A1 el Nombre,
o A2 la Cantidad requerida y
o A3 el Precio del producto.
Calcular el total y guardarlo en A4.
Si el total es superior a 10.000 y el nombre del producto es
"Papa":
o pedir un descuento,
o calcular el total descuento
o guardarlo en A5,
o restar el descuento del total y
22

guardarlo en A6.

Sub Ejemplo_16()
Dim Producto As String
Dim Cantidad As Integer
Dim Precio As Single
Dim Total As Single
Dim Descuento As Single
Dim Total_Descuento As Single
Precio = 0
Producto = InputBox("Entrar Nombre del Producto", "Entrar")
Precio = Val(InputBox("Entrar el precio", "Entrar"))
Cantidad = Val(InputBox("Entrar la cantidad", "Entrar"))
Total = Precio * Cantidad
ActiveSheet.Range("A1").Value = Producto
ActiveSheet.Range("A2").Value = Precio
ActiveSheet.Range("A3").Value = Cantidad
ActiveSheet.Range("A4").Value = Total
' Si total mayor que 10.000 y el producto es Papa, aplicar
descuento.
If Total > 10000 And Producto = "Papa" Then
Descuento = Val(InputBox("Entrar Descuento", "Entrar"))
Total_Descuento = Total * (Descuento / 100)
Total = Total - Total_Descuento
ActiveSheet.Range("A5").Value = Total_Descuento
ActiveSheet.Range("A6").Value = Total
End If
End Sub
Para que se ejecute el bloque de instrucciones entre If ... End If,
deben cumplirse las dos condiciones que se evalan; basta que no
se cumpla una de ellas para que no se ejecute dicho bloque.
Operador Lgico Or (O).
Con este operador, para ejecutar un bloque de instrucciones es
preciso que se cumpla, con por lo menos, alguna de una serie de
condiciones.
Ejemplo 17.
Entrar desde el teclado:
o el Nombre,
o la Cantidad y
o e l Precio
Guardar en:
o A1 el Nombre,
o A2 la Cantidad y
o A3 el Precio.
Calcular el total y guardarlo en A4.
Si el total es superior a 10.000 o el nombre del producto el
"Papa":
o pedir un descuento,
o calcular el total descuento
o guardarlo en A5,
23

o
o

restar el descuento del total y


guardarlo en A6.

Sub Ejemplo_17()
Dim Producto As String
Dim Cantidad As Integer
Dim Precio As Single
Dim Total As Single
Dim Descuento As Single
Dim Total_Descuento As Single
Precio = 0
Producto = InputBox("Entrar Nombre del Producto", "Entrar")
Precio = Val(InputBox("Entrar el precio", "Entrar"))
Cantidad = Val(InputBox("Entrar la cantidad", "Entrar"))
Total = Precio * Cantidad
ActiveSheet.Range("A1").Value = Producto
ActiveSheet.Range("A2").Value = Precio
ActiveSheet.Range("A3").Value = Cantidad
ActiveSheet.Range("A4").Value = Total
'Si total mayor que 10.000 o el producto es Papa, aplicar descuento
If Total > 10000 Or Producto = "Papa" Then
Descuento = Val(InputBox("Entrar Descuento", "Entrar"))
Total_Descuento = Total * (Descuento)
Total = Total - Total_Descuento
ActiveSheet.Range("A5").Value = Total_Descuento
ActiveSheet.Range("A6").Value = Total
End If
End Sub
Observe que para que se ejecute el bloque de instrucciones entre
If ... End If, slo es necesario que se cumpla alguna de las dos
condiciones que se evalan (o las dos a la vez); slo cuando no se
cumple ninguna de las dos no se ejecutan las instrucciones del
bloque.
Operador Lgico Not (no).
El operador lgico Not, se utiliza para ver si NO se cumple una
condicin.
Ejemplo 18.
Entrar un valor, por el teclado, con la instruccin InputBox
guardar el valor en la celda A1 de la hoja activa.
Si el valor entrado desde el teclado es superior a 1000,
o aplicar un descuento con otro InputBox
o guardar el descuento en la celda A2 de la hoja activa.
Calcular en A3, el precio de A1 menos el descuento de A2.
Sub Ejemplo_18()
Dim Valor As Single
Dim Descuento As Single
Valor = 0
Descuento = 0
Valor = Val(InputBox("Entrar el Valor", "Entrar"))
24

' Si el valor de la variable NO es menor igual 1000, entonces, aplicar


descuento
If Not (Valor <= 1000) Then
Descuento = Val(InputBox("Entrar Descuento", "Entrar"))
End If
ActiveSheet.Range("A1").Value = Valor
ActiveSheet.Range("A2").Value = Descuento
ActiveSheet.Range("A3").Value = Valor - Descuento
End Sub
Estructura Select Case.
Ejecuta uno de varios grupos de instrucciones, dependiendo del
valor de una expresin.
Ejemplo 19.
Macro que suma, resta, multiplica o divide los valores de las
casillas A1 y A2 dependiendo de que si B1 contiene el
signo +, -, x, :.
El resultado lo registra en A3.
Si en B1 no hay ninguno de los signos anteriores en A3 debe
dejarse un 0.
Sub Ejemplo_19()
Dim Signo As String
Dim Valor1 As Integer
Dim Valor2 As Integer
Dim Total As Integer
Valor1 = ActiveSheet.Range("A1").Value
Valor2 = ActiveSheet.Range("A2").Value
Signo = ActiveSheet.Range("B1").Value
Total = 0
If Signo = "+" Then
Total = Valor1 + Valor2
End If
If Signo = "-" Then
Total = Valor1 - Valor2
End If
If Signo = "x" Then
Total = Valor1 * Valor2
End If
If Signo = ":" Then
Total = Valor1 / Valor2
End If
ActiveCell.Range("A3").Value = Total
End Sub
En este ejemplo todas las instrucciones if evalan la misma variable.
Con el objetivo de lograr una mejor legibilidad, se debe utilizar la
instruccin Select Case.
Select Case tiene la sintaxis siguiente, Select Case Expresin Case
valores :
Instrucciones.
Case valores : Instrucciones
25

Case valores: Instrucciones.


Case Else
Instrucciones en caso que no sean ninguno de los valores
anteriores.
End Select.
Ejemplo 20.
Sub Ejemplo_20()
Dim Signo As String
Dim Valor1 As Integer
Dim Valor2 As Integer
Dim Total As Integer
Valor1 = ActiveSheet.Range("A1").Value
Valor2 = ActiveSheet.Range("A2").Value
Signo = ActiveSheet.Range("B1").Value
Select Case Signo
Case "+"
Total = Valor1 + Valor2
Case "-"
Total = Valor1 - Valor2
Case "x"
Total = Valor1 * Valor2
Case ":"
Total = Valor1 / Valor2
Case Else
Total = 0
End Select
ActiveCell.Range("A3").Value = Total
End Sub
En el prximo ejemplo cada sentencia Case evala un rango de
valores.
Ejemplo 21.
En este programa se programa se pide:
Tres notas de un alumno mediante la funcin InputBox.
Las notas van a parar a las casillas A1, A2 y A3 de la hoja
activa.
El programa calcula la media y la deja en A4.
o Si la media est entre 0 y 2 deja en A5 el mensaje
"Muy deficiente",
o si la nota es 3 deja en A5 el mensaje "Deficiente",
o si la nota es 4 deja "Insuficiente",
o si es 5 "Suficiente",
o si es 6 "Bien",
o si est entre 7 y 8 deja "Notable",
o si es mayor que 8 deja "Sobresaliente".
Sub Ejemplo_21()
Dim Nota1 As Integer
Dim Nota2 As Integer
Dim Nota3 As Integer
26

Dim Media As Single


Nota1 = Val(InputBox("Entrar Nota primera evaluacin", "Nota"))
Nota2 = Val(InputBox("Entrar Nota Segunda evaluacin", "Nota"))
Nota3 = Val(InputBox("Entrar Nota Tercera evaluacin", "Nota"))
Media = (Nota1 + Nota2 + Nota3) / 3
ActiveSheet.Range("A1").Value = Nota1
ActiveSheet.Range("A2").Value = Nota2
ActiveSheet.Range("A3").Value = Nota3
ActiveSheet.Range("A4").Value = Media
Select Case Media
Case 0 To 2
ActiveSheet.Range("A5").Value = "Muy deficiente"
Case 3
ActiveSheet.Range("A5").Value = "Deficiente"
Case 4
ActiveSheet.Range("A5").Value = "Insuficiente"
Case 5
ActiveSheet.Range("A5").Value = "Suficiente"
Case 6
ActiveSheet.Range("A5").Value = "Bien"
Case 7 To 8
ActiveSheet.Range("A5").Value = "Notable"
Case Is > 8
ActiveSheet.Range("A5").Value = "Sobresaliente"
End Select
End Sub
Funciones de comprobacin.
Funciones que son tiles para comprobar o validar el tipo de datos
entrados desde teclado, o los datos contenidos en una casilla.
Ejemplo 22.
Sub Ejemplo_22()
Dim Signo As String
Dim Valor1 As Integer
Dim Valor2 As Integer
Dim Total As Integer
Valor1 = ActiveSheet.Range("A1").Value
Valor2 = ActiveSheet.Range("A2").Value
Signo = ActiveSheet.Range("B1").Value
Select Case Signo
Case "+"
Total = Valor1 + Valor2
Case "-"
Total = Valor1 - Valor2
Case "x"
Total = Valor1 * Valor2
Case ":"
Total = Valor1 / Valor2
Case Else
Total = 0
End Select
27

ActiveCell.Range("A3").Value = Total
End Sub
Si en alguna de las casillas que se deben operar no hubiera ningn
valor o bien datos alfanumricos, al ejecutar la macro se producir
un error.
Aunque con Visual Basic se puede controlar el flujo del programa
cuando se produce un error imprevisto, para solucionar este
problema se utiliza una funcin de comprobacin que indica si en las
casillas A1 y A2 hay valores adecuados (en nuestro caso numricos)
para proseguir con la ejecucin de la macro, en caso contrario se
mostrar un error y no se ejecutar ninguna de las operaciones.
La funcin que utilizaremos es IsNumeric (expresin), esta funcin
devuelve un valor True si la expresin que se evala es un valor
numrico, en caso contrario devuelve False .
Tambin se utiliza la funcin IsEmpty para comprobar si en B1 hay
algo, IsEmpty (Expresin) evala si expresin est vaca, devuelve
True si es as y False en caso contrario.
Ahora lo aplicamos al programa del Ejemplo 22.
Ejemplo 23.
Sub Ejemplo_23()
Dim Signo As String
Dim Valor1 As String
Dim Valor2 As String
Dim Total As String
Dim Continuar As Boolean
Valor1 = ActiveSheet.Range("A1").Value
Valor2 = ActiveSheet.Range("A2").Value
Signo = ActiveSheet.Range("B1").Value
Continuar = True
' Si en la celda A1 no hay un valor numrico
If Not IsNumeric(ActiveSheet.Range("A1")) Then
MsgBox Prompt:="En la celda A1 no hay ningn valor numrico",
Title:="ERROR"
Continuar = False
End If
' Si en la celda A2 no hay un valor numrico
If Not IsNumeric(ActiveSheet.Range("A2")) Then
MsgBox Prompt:="En la celda A2 no hay ningn valor numrico",
Title:="ERROR"
Continuar = False
End If
If IsEmpty(ActiveSheet.Range("B1")) Then
MsgBox Prompt:="En la celda B1 no hay ningn operador (+,-,x,:)",
Title:="ERROR"
End If
End Sub
En lugar de los tres If de comprobacin se puede aplicar el operador
OR, de la manera siguientes:
Ejemplo 24
28

Sub Ejemplo_24()
Dim Signo As String
Dim Valor1 As String
Dim Valor2 As String
Dim Total As String
Dim Continuar As Boolean
Valor1 = ActiveSheet.Range("A1").Value
Valor2 = ActiveSheet.Range("A2").Value
Signo = ActiveSheet.Range("B1").Value
Continuar = True
' Si en la celda A1 no hay un valor numrico
If Not IsNumeric(ActiveSheet.Range("A1")) Or Not
IsNumeric(ActiveSheet.Range("A2")) Or
IsEmpty(ActiveSheet.Range("B1")) Then
MsgBox Prompt:="Debe entrar nmeros en A1 y A2 y un signo
(+,-,x, : ) en B1", Title:="ERROR"
Else
' Instrucciones de las operaciones .......
End If
End Sub
Lista de Funciones de Comprobacin.
IsNumric (Expresin): Comprueba si expresin tiene un valor que
se puede interpretar como numrico.
IsDate (Expresin): Comprueba si expresin tiene un valor que se
puede interpretar como tipo fecha.
IsEmpty (Expresin): Comprueba que expresin tenga algn valor,
que se haya inicializado.
IsError (Expresin): Comprueba si expresin devuelve algn valor
de error.
IsArray (Expresin): Comprueba si expresin (una variable) es un
array o no.
IsObject (Expresin): Comprueba si expresin (una variable)
representa una variable tipo objeto.
IsNull (Expresin): Comprueba si expresin contiene un valor nulo
debido a datos no vlidos.
Nothing: No es propiamente una funcin, sirve para comprobar si
una variable objeto esta asociada a un objeto antes de hacer
cualquier operacin con ella.
Para trabajar con una variable objeto antes debe asignarse a uno
mediante la instruccin Set , en caso contrario se producir un error
en el programa cuando utilice el objeto y se detendr su ejecucin.
Ejemplo 25
Sub Obj()
Dim R As Range
' Si la variable R es Nothing es que no ha sido asignada, no se
puede trabajar con ella
If R Is Nothing Then
MsgBox Prompt:="La variable Objeto no ha sido asignada",
Buttons:=vbOK, Title:="Error"
Else
R.Value = "Hola"
29

End If
End Sub
Para trabajar con una variable objeto debe asignarse a uno,
mediante la instruccin Set
Ejemplo 26
Sub Obj()
Dim R As Range
Set R = ActiveSheet.Range("A1")
' Si la variable R es Nothing es que no ha sido asignada, no se
puede trabajar con ella
If R Is Nothing Then
MsgBox Prompt:="La variable Objeto no ha sido asignada",
Buttons:=vbOK, Title:="Error"
Else
R.Value = "Hola"
End If
End Sub
La funcin MsgBox.
Esta funcin muestra un mensaje en un cuadro de dilogo hasta que
el usuario pulse un botn.
La funcin devuelve un dato tipo Integer en funcin del botn
pulsado por el usuario.
A la hora de invocar est funcin, se permiten diferentes tipos de
botones.
Sintxis de MsgBox. MsgBox ( Mensaje, Botones, Ttulo, Archivo de
ayuda, contexto)
Mensaje: Obligatorio, es el mensaje que se muestra dentro del
cuadro de dilogo.
Botones: Opcional. Es un nmero o una suma de nmeros o
constantes (vea tabla Valores para botones e Iconos), que sirve para
mostrar determinados botones e iconos dentro del cuadro de
dilogo.
Si se omite este argumento asume valor 0 que corresponde a un
nico Botn OK.
Ttulo: Opcional. Es el texto que se mostrar en la barra del ttulo
del cuadro de dilogo.
Archivo de Ayuda : Opcional. Si ha asignado un texto de ayuda al
cuadro de dilogo, aqu debe especificar el nombre del archivo de
ayuda donde est el texto.
Context: Opcional. Es el nmero que sirve para identificar el texto al
tema de ayuda correspondiente que estar contenido en el archivo
especificado en el parmetro
Archivo de Ayuda.
Tabla para botones e iconos del cuadro MsgBox . (Tabla copiada del
archivo de ayuda de Microsoft Excel).
Constante Valor Descripcin VbOKOnly 0 Muestra solamente el
botn Aceptar.
VbOKCancel 1 Muestra los botones Aceptar y Cancelar.
VbAbortRetryIgnore 2 Muestra los botones Anular, Reintentar e
Ignorar.
VbYesNoCancel 3 Muestra los botones S, No y Cancelar.
30

VbYesNo 4 Muestra los botones S y No.


VbRetryCancel 5 Muestra los botones Reintentar y Cancelar.
VbCritical 16 Muestra el icono de mensaje crtico.
VbQuestion 32 Muestra el icono de pregunta de advertencia.
VbExclamation 48 Muestra el icono de mensaje de advertencia.
VbInformation 64 Muestra el icono de mensaje de informacin.
VbDefaultButton1 0 El primer botn es el predeterminado.
VbDefaultButton2 256 El segundo botn es el predeterminado.
VbDefaultButton3 512 El tercer botn es el predeterminado.
VbDefaultButton4 768 El cuarto botn es el predeterminado.
VbApplicationModal 0 Aplicacin modal; el usuario debe responder al
cuadro de mensajes antes de poder seguir trabajando en la
aplicacin actual.
VbSystemModal 4096 Sistema modal; se suspenden todas las
aplicaciones hasta que el usuario responda al cuadro de mensajes.
El primer grupo de valores (0 a 5) describe el nmero y el tipo de
los botones mostrados en el cuadro de dilogo; el segundo grupo
(16, 32, 48, 64) describe el estilo del icono, el tercer grupo (0, 256,
512) determina el botn predeterminado y el cuarto grupo (0, 4096)
determina la modalidad del cuadro de mensajes.
Cuando se suman nmeros para obtener el valor final del argumento
buttons, se utiliza solamente un nmero de cada grupo.
Nota: Estas constantes las especifica Visual Basic for
Applications.Por lo tanto, el nombre de las mismas puede utilizarse
en cualquier lugar del cdigo en vez de sus valores reales.
Los valores que puede devolver la funcin msgbox en funcin del
botn que pulse el usuario se muestran en la tabla siguiente.
Tabla de valores que puede devolver MsgBox. (Tabla copiada del
archivo de ayuda de Microsoft Visual Basic para aplicaciones).
Constante Valor Descripcin VbOK 1 Aceptar VbCancel 2 Anular
VbAbort 3 Cancelar VbRetry 4 Reintentar VbIgnore 5 Ignorar VbYes
6 S VbNo 7 No
Ejemplos de MsgBox.
Ejemplo 27.
En referencia a un producto:
entrar desde el teclado:
o El nombre,
o la cantidad y
o el precio.
guardarlos en
o A1 el nombre,
o A2 la cantidad y
o A3 el precio.
Calcular el total y
registrar el total en A4.
Pedir un descuento, si el total es:
o superior a 10.000 o
o el nombre del producto el "papa",
o calcularlo el total descuento y
o guardarlo en A5,
o restar el descuentodel total y
31

guardarlo en A6.

Sub Ejemplo_27()
Dim Producto As String
Dim Cantidad As Single
Dim Precio As Single
Dim Total As Single
Dim Descuento As Single
Dim Total_Descuento As Single
Precio = 0
Producto = InputBox("Entrar Nombre del Producto", "Entrar")
Precio = Val(InputBox("Entrar el precio", "Entrar"))
Cantidad = Val(InputBox("Entrar la cantidad", "Entrar"))
Total = Precio * Cantidad
With ActiveSheet
Range("A1").Value = Producto
Range("A2").Value = Precio
Range("A3").Value = Cantidad
Range("A4").Value = Total
End With
' Si total mayor que 10.000 o el producto es papa, aplicar
descuento.
If Total > 10000 Or Producto = "papa" Then
Descuento = Val(InputBox("Entrar Descuento", "Entrar"))
Total_Descuento = Total * (Descuento / 100)
Total = Total - Total_Descuento
With ActiveSheet
Range("A5").Value = Total_Descuento
Range("A6").Value = Total
End With
End If
End Sub
Estructuras Repetitivas.
Este tipo de estructuras permiten ejecutar ms de una vez el mismo
bloque de sentencias.
Ejemplo 28.
Realizar un programa que:
Ingrese las notas de una clase de 5 alumnos
guardar las notas en las celdas A1 a A5 respectivamente, de
la hoja activa.
Despus hacer la media
gurardar la media en A6.
Con las estructuras vistas hasta ahora, podramos hacer:
Sub Ejemplo_28()
Dim Nota As Integer
Dim Media As Single
Media = 0
Nota = Val(InputBox("Entrar la 1 Nota : ", "Entrar Nota"))
ActiveSheet.Range("A1").Value = Nota
Media = Media + Nota
32

Nota = Val(InputBox("Entrar la 2 Nota : ", "Entrar Nota"))


ActiveSheet.Range("A2").Value = Nota
Media = Media + Nota
Nota = Val(InputBox("Entrar la 3 Nota : ", "Entrar Nota"))
ActiveSheet.Range("A3").Value = Nota
Media = Media + Nota
Nota = Val(InputBox("Entrar la 4 Nota : ", "Entrar Nota"))
ActiveSheet.Range("A4").Value = Nota
Media = Media + Nota
Nota = Val(InputBox("Entrar la 5 Nota : ", "Entrar Nota"))
ActiveSheet.Range("A5").Value = Nota
Media = Media + Nota
Media = Media / 5
ActiveSheet.Range("A6").Value = Media
End Sub
Observe que este programa repite el siguiente bloque de sentencias,
5 veces.
Nota = Val(InputBox("Entrar la __ Nota : ","Entrar Nota"))
ActiveSheet.Range("A __ ").Value = Nota
Media = Media + Nota
Para evitar esta tipo de repeticiones de cdigo, los lenguajes de
programacin incorporan instrucciones que permiten la repeticin de
bloques de cdigo.
Estructura repetitiva Para (for).
Esta estructura repite un grupo de instrucciones un nmero
especificado de veces.
La estructura es la siguiente:
Para var =Valor_Inicial Hasta Valor_Final Paso Incremento Hacer
Inicio
Sentencia 1
Sentencia 2
Sentencia N
Fin
Var es una variable que la primera vez que se entra en el bucle se
iguala a Valor_Inicial , las sentencias del bucle se ejecutan hasta
que Var llega al Valor_Final , cada vez que se ejecutan el bloque de
instrucciones Var se incrementa segn el valor de Incremento .
En Visual Basic para Excel la estructura Para se implementa con la
instruccin For ... Next .
For Varible = Valor_Inicial To Valor_Final Step Incremento
Sentencia 1
Sentencia 2
Sentencia N
Next Variable
* Si el incremento es 1, no hace falta poner Step 1.
Ejemplo 29.
Entrar 10 valores utilizando la funcin InputBox,
sumarlos y
guardar el resultado en la celda A1 de la hoja activa.
Sub Ejemplo_29()
Dim i As Integer
33

Dim Total As Integer


Dim Valor As Integer
For i = 1 To 10
Valor = Val(InputBox("Entrar un valor", "Entrada"))
Total = Total + Valor
Next i
ActiveCell.Range("A1").Value = Total
End Sub
Recorrer casillas de una hoja de clculo.
Una operacin bastante habitual cuando se trabaja con Excel es el
recorrido de rangos de casillas para llenarlas con valores, mirar su
contenido, etc.
Las estructuras repetitivas son imprescindibles para recorrer grupos
de celdas o rangos.
En los siguientes ejemplos se podr observar la utilizacin de
estructuras repetitivas para recorrer rangos de casillas, observe la
utilizacin de las propiedades Cells y Offset .
Propiedad Cells.
Esta propiedad, sirve para referenciar una celda o un rango de
celdas segn coordenadas de fila y columna.
Ejemplo 30
Llenar el rango de las casillas A1..A5 con valores pares
consecutivos empezando por el 2.
Sub Ejemplo_30()
Dim Fila As Integer
Dim i As Integer
Fila = 1
For i = 2 To 10 Step 2
ActiveSheet.Cells(Fila, 1).Value = i
Fila = Fila + 1
Next i
End Sub
Ejemplo 31.
Llenar un rango de filas, empezando por una celda, que se
debe especificar desde teclado, con una serie de 10 valores
correlativos (comenzando por el 1).
Sub Ejemplo_31()
Dim Celda_Inicial As String
Dim i As Integer
Dim Fila As Integer
Dim Columna As Integer
Celda_Inicial = InputBox("Introducir la celda Inicial (Letra de
columna y Nmero de Fila): ", "Celda Inicial")
ActiveSheet.Range(Celda_Inicial).Activate
' Tomar el valor de fila de la celda activa sobre la variable Fila
Fila = ActiveCell.Row
' Tomar el valor de columna de la celda activa sobre la variable Fila
Columna = ActiveCell.Column
For i = 1 To 10
ActiveSheet.Cells(Fila, Columna).Value = i
Fila = Fila + 1
34

Next i
End Sub
Propiedades ROW y COLUMN.
Como habr deducido del ejemplo anterior devuelven la fila y la
columna de un objeto range.
En el ejemplo anterior se utilizaban concretamente para obtener la
fila y la columna de la celda activa.
Otra forma de solucionar el ejemplo anterior seria.
Ejemplo 32
Sub Ejemplo_32()
Dim Celda_Inicial As String
Dim i As Integer
Dim Fila As Integer
Dim Columna As Integer
Celda_Inicial = InputBox("Introducir la celda Inicial (Letra de la
Columna y Nmero de la Fila): ", "Celda Inicial")
ActiveSheet.Range(Celda_Inicial).Activate
Fila = 1
For i = 1 To 10
ActiveSheet.Range(Celda_Inicial).Cells(Fila, 1).Value = i
Fila = Fila + 1
Next i
End Sub
** Recuerde que cuando utilizamos Cells como propiedad de un
rango (Objeto Range), Cells empieza a contar a partir de la celda
referenciada por Range .
Ejemplo 33.
Utilizando el for y propiedad Cells
Sub Ejemplo_33()
Dim Nota As Integer
Dim Media As Single
Dim Fila As Integer
Media = 0
For Fila = 1 To 5
Nota = Val(InputBox("Entrar la " & Fila & " Nota : ", "Entrar Nota"))
ActiveSheet.Cells(Fila, 1) = Nota
Media = Media + Nota
Next Fila
End Sub
Propiedad Offset.
Devuelve un objeto Range que representa un rango desplazado con
respecto al rango especificado. Es de slo lectura.
Ejemplo 34.
Sub Ejemplo_34()
Dim Nota As Integer
Dim Media As Single
Dim Fila As Integer
Media = 0
ActiveSheet.Range("A1").Activate
For Fila = 0 To 4
35

Nota = Val(InputBox("Entrar la " & Fila + 1 & " Nota : ", "Entrar
Nota"))
ActiveCell.Offset(Fila, 0).Value = Nota
Media = Media + Nota
Next Fila
Media = Media / 5
ActiveCell.Offset(6, 1).Value = Media
End Sub
Ejemplo 35.
Ahora se cambia de celda activa.
Sub Ejemplo_35()
Dim Nota As Integer
Dim Media As Single
Dim i As Integer
Media = 0
ActiveSheet.Range("A1").Activate
For i = 1 To 5
Nota = Val(InputBox("Entrar la " & i & " Nota : ", "Entrar Nota"))
ActiveCell.Value = Nota
Media = Media + Nota
'Hacer activa la celda situada una fila por debajo de la actual
ActiveCell.Offset(1, 0).Activate
Next
Media = Media / 5
ActiveCell.Value = Media
End Sub
Los ejemplos 34 y 35, utilizan la propiedad Offset de forma
diferente.
En el ejemplo 34 la celda activa siempre es la misma A1.
Offset se utiliza para referenciar una celda a partir de sta.
En el ejemplo 35 se va cambiando de celda activa cada vez,
de forma que cuando termina la ejecucin del programa, la
celda activa es A6.
Estructura repetitiva Do While..Loop (Hacer Mientras).
Do While ...Loop repite un bloque de instrucciones cuando una
condicin es verdadera, o hasta que una condicin se convierta en
falsa.
Para las situaciones en que se sabe previamente el nmero de veces
que se ha de repetir un proceso, la estructura repetitiva for resulta
conveniente.
Pero cuando previamente no se sabe el nmero de veces que se
debe repetir un proceso, deberemos recurrir a la sentencia Do While
... Loop en alguna de sus formas.
Esta estructura repetitiva, Do While .. Loop, est controlada por una
o varias condiciones; la repeticin del bloque de sentencias
depender, de si se va cumpliendo la condicin o las condiciones.
Ejemplo36
Construir, en Excel, una tabla que contenga los siguientes campos:
Nombre , Ciudad , Edad , Fecha .
36

Programa para entrar registros en la tabla.


Cada campo se entra con InputBox.
El programa va pidiendo datos mientras se entre un valor en el
InputBox correspondiente al Nombre.
Cuando al preguntar el Nombre no se entre ningn valor, terminar
la ejecucin del bloque encerrado entre Do While ... Loop.
Sub Ejemplo_36()
Dim Nombre As String
Dim Ciudad As String
Dim Edad As Integer
Dim fecha As Date
' Activar hoja1
Worksheets("Hoja1").Activate
'Activar celda A2
ActiveSheet.Range("A2").Activate
Nombre = InputBox("Entre el Nombre (Return para Terminar) : ",
"Nombre")
' Mientras la variable Nombre sea diferente a cadena vaca
Do While Nombre <> ""
Ciudad = InputBox("Entre la Ciudad : ", "Ciudad")
Edad = Val(InputBox("Entre la Edad : ", "Edad"))
fecha = CDate(InputBox("Entra la Fecha (dd-mm-aa) : ", "Fecha"))
' Copiar los datos en las casillas correspondientes
With ActiveCell
.Value = Nombre
.Offset(0, 1).Value = Ciudad
.Offset(0, 2).Value = Edad
.Offset(0, 3).Value = fecha
End With
'Hacer activa la celda de la fila siguiente a la actual
ActiveCell.Offset(1, 0).Activate
Nombre = InputBox("Entre el Nombre (Return para Terminar) : ",
"Nombre")
Loop
End Sub

37

En este ejemplo, siempre se empieza a llenar el rango a partir de la


celda A2, consecuentemente, la segunda vez que ejecute la macro
destruir los datos registrados anteriormente.
La estructura del ejemplo 37 recorrer una fila de celdas a partir de
A1 hasta encontrar una vaca y dejar a esta como celda activa para
que la entrada de datos comience a partir de ella.
Ejemplo 37.
Sub Ejemplo_37()
'Activar hoja1
Worksheets("Hoja1").Activate
'Activar celda A2
ActiveSheet.Range("A1").Activate
' Mientras la celda activa no est vaca
Do While Not IsEmpty(ActiveCell)
' Hacer activa la celda situada una fila por debajo de la actual
ActiveCell.Offset(1, 0).Activate
Loop
End Sub
Ejemplo 38.
Aplicar la estructura del ejemplo 37 a la tabla del ejemplo 36.
Sub Ejemplo_38()
Dim Nombre As String
Dim Ciudad As String
Dim Edad As Integer
Dim fecha As Date
Worksheets("Hoja1").Activate
ActiveSheet.Range("A1").Activate
' Buscar la primera celda vaca de la columna A y convertirla en
activa
Do While Not IsEmpty(ActiveCell)
ActiveCell.Offset(1, 0).Activate
Loop
Nombre = InputBox("Entre el Nombre (Return para Terminar) : ",
"Nombre")
' Mientras la variable Nombre sea diferente a cadena vaca
Do While Nombre <> ""
Ciudad = InputBox("Entre la Ciudad : ", "Ciudad")
Edad = Val(InputBox("Entre la Edad : ", "Edad"))
fecha = CDate(InputBox("Entra la Fecha (dd-mm-aa) : ", "Fecha"))
With ActiveCell
.Value = Nombre
.Offset(0, 1).Value = Ciudad
.Offset(0, 2).Value = Edad
.Offset(0, 3).Value = fecha
End With
ActiveCell.Offset(1, 0).Activate
Nombre = InputBox("Entre el Nombre (Return para Terminar) : ",
"Nombre")
Loop
End Sub
Ejemplo 39
38

Si se prefiere que el programa pregunte si existen mas datos para


registrar
Sub Ejemplo_39()
Dim Nombre As String
Dim Ciudad As String
Dim Edad As Integer
Dim fecha As Date
Dim Mas_datos As Integer
Worksheets("Hoja1").Activate
ActiveSheet.Range("A1").Activate
' Buscar la primera celda vaca de la columna A y convertirla en
activa
Do While Not IsEmpty(ActiveCell)
ActiveCell.Offset(1, 0).Activate
Loop
Mas_datos = vbYes
Do While Mas_datos = vbYes
Nombre = InputBox("Entre el Nombre (Return para Terminar) : ",
"Nombre")
Ciudad = InputBox("Entre la Ciudad : ", "Ciudad")
Edad = Val(InputBox("Entre la Edad : ", "Edad"))
fecha = CDate(InputBox("Entra la Fecha (dd-mm-aa): ", "Fecha"))
With ActiveCell
.Value = Nombre
.Offset(0, 1).Value = Ciudad
.Offset(0, 2).Value = Edad
.Offset(0, 3).Value = fecha
End With
ActiveCell.Offset(1, 0).Activate
' Preguntar al usuario si desea entrar otro registro.
Mas_datos = MsgBox("Otro registro ?", vbYesNo + vbQuestion,
"Entrada de datos")
Loop
End Sub
Es preciso incorporar la variable Mas_datos, que es una variable, de
tipo Integer .
Estructura Do...Loop While.
Esta estructura, repite un bloque de instrucciones cuando una
condicin es verdadera, o hasta que una condicin se convierta en
falsa; la condicin se evala al final; consecuentemente las
instrucciones del cuerpo del bucle se ejecutaran al menos una vez .
Ejemplo 40
Sub Ejemplo_40()
Dim
Dim
Dim
Dim
Dim

Nombre As String
Ciudad As String
Edad As Integer
fecha As Date
Mas_datos As Integer
39

Worksheets("Hoja1").Activate
ActiveSheet.Range("A1").Activate
' Buscar la primera celda vaca de la columna A y convertirla en
activa
Do While Not IsEmpty(ActiveCell)
ActiveCell.Offset(1, 0).Activate
Loop
Do
Nombre = InputBox("Entre el Nombre (Return para Terminar) : ",
"Nombre")
Ciudad = InputBox("Entre la Ciudad : ", "Ciudad")
Edad = Val(InputBox("Entre la Edad : ", "Edad"))
fecha = CDate(InputBox("Entra la Fecha : ", "Fecha"))
With ActiveCell
.Value = Nombre
.Offset(0, 1).Value = Ciudad
.Offset(0, 2).Value = Edad
.Offset(0, 3).Value = fecha
End With
ActiveCell.Offset(1, 0).Activate
Mas_datos = MsgBox("Otro registro ?", vbYesNo + vbQuestion,
"Entrada de datos")
'Mientras Mas_Datos = vbYes
Loop While Mas_datos = vbYes
End Sub
No es precisa la lnea "Mas_Datos = vbYes" antes de Do para forzar
la entrada en el bucle, pues la condicin va al final.
Estructura Do...Loop Until (Hacer.. Hasta que se cumpla la
condicin).
Repite instrucciones hasta que una condicin llegue a ser verdadera.
Hay dos formas de utilizar la palabra clave Until para comprobar el
estado de una condicin en una instruccin Do...Loop:
Se puede comprobar la condicin antes de entrar en el bucle
(como muestra el procedimiento ComPrimeroUntil),
o se pueden comprobar despus de que el bucle se haya
ejecutado al menos una vez (como muestra el procedimiento
ComFinalUntil). El bucle sigue ejecutndose mientras la
condicin siga siendo Falsa.
La entrada de datos con este bucle quedara
Ejemplo 41:
Sub Ejemplo_41()
Dim
Dim
Dim
Dim
Dim

Nombre As String
Ciudad As String
Edad As Integer
fecha As Date
Mas_datos As Integer
40

Worksheets("Hoja1").Activate
ActiveSheet.Range("A1").Activate
' Buscar la primera celda vaca de la columna A y convertirla en
activa
Do While Not IsEmpty(ActiveCell)
ActiveCell.Offset(1, 0).Activate
Loop
Do
Nombre = InputBox("Entre el Nombre (Return para Terminar) : ",
"Nombre")
Ciudad = InputBox("Entre la Ciudad : ", "Ciudad")
Edad = Val(InputBox("Entre la Edad : ", "Edad"))
fecha = CDate(InputBox("Entra la Fecha : ", "Fecha"))
With ActiveCell
.Value = Nombre
.Offset(0, 1).Value = Ciudad
.Offset(0, 2).Value = Edad
.Offset(0, 3).Value = fecha
End With
ActiveCell.Offset(1, 0).Activate
Mas_datos = MsgBox("Otro registro ?", vbYesNo + vbQuestion,
"Entrada de datos")
'Hasta que Mas_Datos sea igual a vbNo
Loop Until Mas_datos = vbNo
End Sub
Estructura For Each.
Este bucle se utiliza bsicamente para ejecutar un grupo de
sentencias con los elementos de una coleccin o una matriz (pronto
veremos los que es).
Recuerde que una coleccin es un conjunto de objetos, hojas,
rangos, etc.
Vea el ejemplo siguiente que se utiliza para cambiar los nombres de
las hojas de un libro de trabajo.
Ejemplo 42.
Programa que pregunta el nombre para cada hoja de un libro de
trabajo, si no se pone nombre a la hoja, queda el que tiene.
Sub Ejemplo_42()
Dim Nuevo_Nombre As String
Dim Hoja As Worksheet
' Para cada hoja del conjunto Worksheets
For Each Hoja In Worksheets
Nuevo_Nombre = InputBox("Nombre de la Hoja : " & Hoja.Name,
"Nombrar Hojas")
If Nueva_Nombre <> "" Then
Hoja.Name = Nuevo_Nombre
End If
Next
End Sub
** Hoja va referenciando cada una de las hojas del conjunto
WorkSheets a cada paso de bucle.
41

Procedimientos y funciones.
Se define como procedimiento o funcin a un bloque de cdigo que
realiza alguna tarea. Hasta ahora, se han construido los programas
utilizando un nico procedimiento, pero a medida que los programas
(y los problemas) crecen se va haciendo necesaria la inclusin de
ms procedimientos.
Podra fcilmente caer en la tentacin de utilizar, como hasta ahora,
un nico procedimiento por programa pero se dar cuenta
rpidamente de que este mtodo no es nada prctico ya que
grandes bloques de cdigo implican mayor complicacin del mismo,
repeticin de sentencias y lo que es ms grave, mayores problemas
de seguimiento a la hora de depurar errores, ampliar
funcionalidades o incluir modificaciones.
La filosofa de utilizar procedimientos es la antigua frmula del
"divide y vencers", es decir, con los procedimientos podremos
tratar cada problema o tarea de forma ms o menos aislada de
forma que construiremos el programa paso a paso evitando tener
que resolver o controlar mltiples cosas a la vez.
Cada tarea la realizar un procedimiento, si esta tarea implica la
ejecucin de otras tareas, cada una se implementar y solucionar
en su correspondiente procedimiento de manera que cada uno haga
una cosa concreta. As, los diferentes pasos que se deben ejecutar
para que un programa haga algo, quedaran bien definidos cada uno
en su correspondiente procedimiento, si el programa falla, fallar a
partir de un procedimiento y de esta forma podremos localizar el
error ms rpidamente.
Los procedimientos son tambin un eficaz mecanismo para evitar la
repeticin de cdigo en un mismo programa e incluso en diferentes
programas. Suponemos que habr intuido que hay muchas tareas
que se repiten en casi todos los programas, veremos como los
procedimientos que ejecutan estas tareas se pueden incluir en un
mdulo de forma que este sea exportable a otros programas y de
esta manera ganar tiempo que, como dice el tpico, es precioso.
Definir un procedimiento.
Nuevamente repitamos este procedimiento
Sub Nombre_Procedimento
Sentencias.
End Sub.
Llamar a un procedimiento.
Para llamar un procedimiento desde otro se utiliza la instruccin Call
Nombre_Procedimiento.
Sub P_Uno
Sentencias.
.
Call P_Dos
.
Sentencias
.
End Sub
42

Las secuencias del procedimiento P_Uno se ejecutan hasta llegar a


la lnea Call P_Dos, entonces se salta al procedimiento P_Dos, se
ejecutan todas las sentencias de este procedimiento y el programa
continua ejecutndose en el procedimiento P_Uno a partir de la
sentencia que sigue a Call P_Dos.
Ejemplo 43.
En este ejemplo, el cdigo que salta casilla hasta que se encuentra
una vaca se implementa en un procedimiento llamado,
Saltar_Celdas_Llenas. Observe que para entrar valores se ha
sustituido Do While..Loop por Do.. Loop While.
Sub Ejemplo_43()
Dim Nombre As String
Dim Ciudad As String
Dim Edad As Integer
Dim fecha As Date
' Llamada a la funcin Saltar_Celdas_Llenas, el programa salta aqu
a ejecutar las
'instrucciones de este procedimiento y luego vuelve para continuar
la ejecucin a partir de la
'instruccin Do
Call Saltar_Celdas_Llenas
Do
Nombre = InputBox("Entre el Nombre : ", "Nombre")
Ciudad = InputBox("Entre la Ciudad : ", "Ciudad")
Edad = Val(InputBox("Entre la Edad : ", "Edad"))
Fecha=Cdate(InputBox("Entra la Fecha : ", "Fecha"))
With ActiveCell
.Value = Nombre
.Offset(0,1).Value = Ciudad
.Offset(0,2).Value = Edad
.Offset(0,3).value = fecha
End With
ActiveCell.Offset(1,0).Activate
Mas_datos = MsgBox("Otro registro ?",
vbYesNo+vbQuestion,"Entrada de datos")
Loop While Mas_Datos = vbYes
End Sub
' Funcin que salta celdas de una misma columna. Sirve para
encontrar la primera celda vaca de la
' columna
Sub Saltar_Celdas_Llenas()
WorkSheets("Hoja1").Activate
ActiveSheet.Range("A1").Activate
Do While not IsEmpty(ActiveCell)
ActiveCell.Offset(1,0).Activate
Loop
End Sub
Generalizar una funcin.
Observe que para saltar un rango de casillas llenas slo necesitar
llamar a la funcin Saltar_Celdas_Llenas, pero, siempre y cuando
este rango est en una hoja llamada "Hoja1" y empiece en la casilla
43

A1, el procedimiento es poco prctico ya que su mbito de


funcionamiento es limitado. En la siguiente seccin modificaremos el
procedimiento de manera que sirva para recorrer un rango que
empiece en cualquier casilla de cualquier hoja.
Parmetros.
Los parmetros son el mecanismo por el cual un procedimiento
puede pasarle valores a otro y de esta forma condicionar, moldear,
etc. las acciones que ejecuta. El procedimiento llamado gana
entonces en flexibilidad. La sintaxis de llamada de un procedimiento
es la siguiente, Call Procedimiento (Parmetro1, Parmetro2,...,
ParmetroN).
Los parmetros pueden ser valores o variables.
La sintaxis para el procedimiento llamado es la siguiente,
Sub Procedimiento(Parmetro1 as Tipo, Parmetro2 As Tipo,...,
Parmetro3 As Tipo)
Observe que aqu los parmetros son variables que recibirn los
valores, evidentemente debe haber coincidencia de tipo.
Por ejemplo, si el primer parmetro es una variable tipo Integer, el
primer valor que se le debe pasar al procedimiento cuando se llama
tambin ha de ser de tipo Integer (recuerde que puede ser un valor
directamente o una variable).
Ejemplo 44.
Ahora la funcin Saltar_Celdas_Llenas tiene dos parmetros Hoja y
Casilla_Inicial que reciben respectivamente la hoja donde est el
rango a recorrer y la casilla inicial del rango.
Sub Ejemplo_44()
Dim Nombre As String
Dim Ciudad As String
Dim Edad As Integer
Dim fecha As Date
' Llamada a la funcin Saltar_Celdas_Llenas, observar que mediante
dos parmetros se indica
' al procedimiento en que hoja est el rango a saltar y en la casilla
donde debe empezar.
Call Saltar_Celdas_Llenas("Hoja1", "A1")
Do
Nombre = InputBox("Entre el Nombre (Return para Terminar) : ",
"Nombre")
Ciudad = InputBox("Entre la Ciudad : ", "Ciudad")
Edad = Val(InputBox("Entre la Edad : ", "Edad"))
Fecha=Cdate(InputBox("Entre la Fecha : ", "Fecha"))
With ActiveCell
.Value = Nombre
.Offset(0,1).Value = Ciudad
.Offset(0,2).Value = Edad
.Offset(0,3).value = fecha
End With
ActiveCell.Offset(1,0).Activate
Mas_datos = MsgBox("Otro registro ?",
vbYesNo+vbQuestion,"Entrada de datos")
Loop While Mas_Datos = vbYes
44

End Sub
'
' Procedimiento Saltar_Celdas_Llenas.
' Sirve para Saltar celdas llenas de una columna hasta encontrar una
vaca que se convierte en activa
' Parmetros :
' Hoja : Hoja donde est el rango a saltar.
' Casilla_Inicial : Casilla Inicial de la columna
Sub Saltar_Celdas_Llenas(Hoja As String, Casilla_Inicial As String)
WorkSheets(Hoja).Activate
ActiveSheet.Range(Casilla_Inicial).Activate
Do While not IsEmpty(ActiveCell)
ActiveCell.Offset(1,0).Activate
Loop
End Sub
Observe que ahora el procedimiento Saltar_Celdas_Llenas sirve para
recorrer cualquier rango en cualquier hoja.
Observe que al procedimiento se le pasan dos valores directamente,
recuerde, y esto es quizs lo ms habitual, que
tambin pueden pasarse variables, por ejemplo.
Sub Ejemplo_45
.
Dim Hoja As String
Dim Casilla_Inicial As String
Hoja = InputBox("En que hoja est la base de datos : ", "Entrar
Nombre de Hoja")
Casilla_Inicial = InputBox("En que casilla comienza la base de
datos","Casilla Inicial")
' Observe que los parmetros son dos variables cuyo valor se ha
entrado desde teclado en
' las dos instrucciones InputBox anteriores.
Call Saltar_Celdas_Llenas(Hoja, Casilla_Inicial)
End Sub
Variables locales y variables Globales.
El mbito de una variable declarada dentro de una funcin es la
propia funcin, es decir no podr utilizares fuera de dicha
funcin. As, el siguiente programa que debera sumar las cinco filas
siguientes a partir de la casilla activa y guardar el resultado en la
sexta es incorrecto.
Sub Alguna_Cosa()
Call Sumar_Cinco_Siguientes
ActiveCell.Offset(6,0).Value = Suma
End Sub
Sub Sumar_Cinco_Siguientes()
Dim i As Integer
Dim Suma As Single
Suma=0
For i=1 To 5
Suma = Suma+ActiveCell.Offset(i,0).Value
Next i
End Sub
45

Es incorrecto porque tanto las variable i como la variable Suma


estn declaradas dentro del procedimiento Sumar_Cinco_Siguientes
consecuentemente, su mbito de accin es este procedimiento. Por
tanto, la instruccin ActiveCell.Offset(6,0).Value = Suma del
procedimiento Alguna_Cosa, generara un error (con Option Explicit
activado) ya que la variable Suma no est declarado dentro de l. Si
piensa en declarar la variable Suma dentro del procedimiento
Hacer_Algo, no solucionar nada porque esta ser local a dicho
procedimiento, en este caso tendra dos variables llamadas Suma
pero cada una de ellas local a su propio procedimient o y
consecuentemente con el mbito de accin restringido a ellos.
Una solucin, que a nosotros no nos gusta, seria declarar suma
como variable global. Una variable global se declara fuera de todos
los procedimientos y es reconocida por todos los procedimientos del
mdulo,
Option Explicit
' Suma es una variable global reconocida por todos los
procedimientos del mdulo.
Dim Suma As Single
Sub Alguna_Cosa()
Call Sumar_Cinco_Siguientes
ActiveCell.Offset(6,0).Value = Suma
End Sub
Sub Sumar_Cinco_Siguientes()
Dim i As Integer
Suma=0
For i=1 To 5
Suma = Suma+ActiveCell.Offset(i,0).Value
Next i
End Sub
Las variables globales son perfectas en cierta ocasiones, para este
caso seria mejor declarar Suma en la funcin
Hacer_Algo y pasarla como parmetro al procedimiento
Sumar_Cinco_Siguientes.
Sub Alguna_Cosa()
Dim Suma As Single
' Llamada a la funcin Sumar_Cinco_Siguientes pasndole la
variable Suma
Call Sumar_Cinco_Siguientes(Suma)
ActiveCell.Offset(6,0).Value = Suma
End Sub
Sub Sumar_Cinco_Siguientes(S As Single)
Dim i As Integer
Suma=0
For i=1 To 5
S = S+ActiveCell.Offset(i,0).Value
Next i
End Sub
Esto le funcionaria porque la variable parmetro S (y se le ha
cambiado el nombre adrede) de Sumar_Cinco_Siguientes es la
variable Suma declarada en Hacer_Algo. Funcionar porque en
46

Visual Basic, a menos que se indique lo contrario, el paso de


parmetros es por referencia, vea la siguiente seccin.
Paso por referencia y paso por valor.
No entraremos en detalles sobre como funciona el paso de
parmetros por valor y el paso de parmetros por referencia, slo
indicaremos que en el :
a) paso por valor, la variable parmetro del procedimiento, recibe el
valor de la variable (o directamente el valor) de su parmetro
correspondiente de la instruccin de llamada y
b) paso por referencia, la variable parmetro del procedimiento, es
la misma que su parmetro correspondiente de la instruccin de
llamada, es decir, la declarada en el procedimiento desde el que se
hace la llamada.
Por defecto, y siempre que en la instruccin de llamada se utilicen
variables, las llamadas son por referencia. Si desea que el paso de
parmetros sea por valor, debe anteponer a la variable parmetro la
palabra reservada ByVal, por ejemplo,
Sub Saltar_Celdas_Llenas(ByVal Hoja As String, ByVal Casilla_Inicial
As String)
Aunque lo elegante y efectivo por razones de memoria seria pasar
siempre que sea posible por valor, es poco habitual que as se haga
en Visual Basic, seguramente esto ocurre por comodidad. Como
suponemos que har como la mayora, es decir, pasar por
referencia, tenga cuidado con los (indeseables) efectos laterales.
Copie y ejecute este programa y descubrir que son los efectos
laterales.
Ejemplo Efecto_Lateral.
Antes de copiar el programa, active una hoja en blanco y ponga
valores del 1 al 15 distribuidos de la forma siguiente, en el rango
A1:A5 valores del 1 al 5, en el rango B1:B5 valores del 6 al 10, en el
rango C1:C5 valores del 11 al 15.
El siguiente programa debe recorrer cada una de tres las columnas
de valores, sumarlos y poner el resultado en las filas 6 de cada
columna. Entonces, segn los valores que ha entrado en cada una
de las columnas, cuando haya acabado la ejecucin del programa
debe haber los siguientes resultados, A6 = 15, B6=40, C6=65.
Para llevar a cabo la suma de los valores de cada columna se llama
a la funcin Recorrer_Sumar tres veces, una para cada columna,
esta funcin recibe en el parmetro F el valor de la fila donde debe
empezar a sumar, sobre el parmetro C el valor de la columna a
sumar y sobre el parmetro Q la cantidad de filas que ha de
recorrer.
El programa utiliza la propiedad Cells para referenciar las filas y
columnas de los rangos. Observe atentamente los valores que ir
cogiendo la variable Fila ya que esta ser la que sufra el efecto
lateral.
Sub Efecto_Lateral()
Dim Fila As Integer
Fila = 1
Call Recorrer_Sumar(Fila, 1,5) ' Columna A
Call Recorrer_Sumar(Fila, 2,5) ' Columna B
47

Call Recorrer_Sumar(Fila, 3,5) ' Columna C


End Sub
Sub Recorrer_Sumar(F As Integer, C As Integer, Q As Integer)
Dim i As Integer
Dim Total As Integer
Total = 0
For i =1 To Q
Total = Total + ActiveSheet.Cells(F, C).Value
F=F+1 ' OJO con esta asignacin, recuerde que F es la variable Fila
declarada en
' el procedimiento Efecto_Lateral
Next i
ActiveSheet.Cells(F, C) = Total
End Sub
Cuando ejecute el programa se producir la salida siguiente, en A6
habr un 15, hasta aqu todo correcto, pero observe que en la
segunda columna aparece un 0 en B12 y en la tercera columna
aparece un 0 en C18, veamos que ha pasado.
La primera vez que se llama la funcin, la variable F vale 1 ya que
este es el valor que tiene su parmetro correspondiente (Fila) en la
instruccin Call.
Observe que F se va incrementando una unidad a cada paso de
bucle For, RECUERDE que F es realmente la variable Fila declarada
en el procedimiento Efecto_Lateral, por tanto cuando finaliza el
procedimiento Recorrer_Sumar y vuelve el control al procedimiento
Efecto_Lateral Fila vale 6, y este es el valor que se pasar a
Recorrer_Suma la segunda vez que se llama, a partir de ah todo ir
mal ya que se empezar el recorrido de filas por la 6.
Una de las soluciones a este problema para hacer que cada vez que
se llame Recorrer_Sumar la variable F reciba el valor 1, es utilizar
un paso por valor, es decir que F reciba el valor de Fila, no que sea
la variable Fila, observe que entonces, si
F no es la variable Fila, cuando incremente F no se incrementar
Fila, esta siempre conservar el valor 1.
Para hacer que F sea un parmetro por valor, simplemente ponga la
palabra ByVal antes de F en la declaracin del procedimiento.
Vuelva a ejecutar el programa, ver como ahora funciona
correctamente.
Insistimos de nuevo en que tenga cuidado con estas cosas. Al
menos ahora ya est sobre aviso, cuando un programa no haga lo
que ha previsto una de las cosas que deber repasar es el paso de
parmetros a los procedimientos.
** Para finalizar, observe que en muchas ocasiones le hemos
indicado que en el paso por referencia la variable del procedimiento
llamado es la variable declarada en el procedimiento que llama. En
este ltimo ejemplo, le hemos dicho que F era la variable Fila, pues
bien, esto no es cierto Fila es una variable y F es otra variable,
ahora es lgico que se pregunte por qu entonces F acta como si
fuera Fila, este es un tema que no entra en el mbito de este
manual, si alguna vez programa en C y llega al tema de los punteros
entender que es lo que sucede realmente en el paso por parmetro
y en el paso por valor. Si ya conoce los punteros de C o Pascal
48

entonces ya habr intuido que el paso por valor en nuestro ejemplo


equivaldra a,
Recorrer_Fila(F, C, Q);
void Recorrer_Fila(int F, int C, int Q)
Y un paso por referencia a
Recorrer_Fila(&F, C, Q);
Void Recorrer_Fila(int *F, int C, int Q)
Funciones.
Una funcin es lo mismo que un procedimiento con la salvedad que
este devuelve un valor al procedimiento o funcin que lo llama. Vea
el siguiente ejemplo, es una funcin muy sencilla ya que
simplemente suma dos nmeros y devuelve el resultado.
Ejemplo 46.
Funcin que devuelve la suma de dos valores que se le pasan como
parmetros.
Observe las diferentes formas en como se llama la funcin.
Sub Ejemplo_46()
Dim x As Integer
Dim n1 As Integer, n2 As Integer
X = Suma(5, 5)
n1= Val ( InputBox("Entrar un nmero : ", "Entrada"))
n2= Val ( InputBox("Entrar otro nmero : ", "Entrada"))
X= suma(n1,n2)
ActiveCell.Value = Suma(ActiveSheet.Range("A1").Value ,
ActiveSheet.Range("A2").Value)
X = Suma(5, 4) + Suma (n1, n2)
End Sub
Function Suma(V1 As Integer, V2 As Integer) As Integer
Dim Total As Integer
Total = V1 + V2
Suma = Total
End Function
Observe la sintaxis de la cabecera de funcin,
Function Suma(V1 As Integer, V2 As Integer) As Integer
La estructura general seria, Function Nombre_Funcion(par1 As Tipo,
par2 As Tipo,..., parN As Tipo) As Tipo.
La sintaxis es similar a la cabecera de un procedimiento, slo que
una funcin tiene tipo, esto tiene su lgica, ya que una funcin
devuelve un valor, ese valor ser de un tipo determinado. As, en
nuestro ejemplo de Function Suma, esta funcin es de tipo Integer,
o dicho de otra manera, la funcin ejecuta sus sentencias y
devuelve un valor hacia el procedimiento o la funcin que la llam,
el valor devuelto se establece igualando el nombre de la funcin a
algo,
Nombre_Funcin = ....
En el ejemplo de Function Suma,
Suma = Total
Observe tambin la sintaxis de la llamada a la funcin, en el
ejemplo hemos utilizado unas cuantas formas de llamarla, lo que
debe tener siempre presente es que en cualquier expresin
49

aritmtica o de clculo, el ordenador realiza un mnimo de dos


operaciones, una de clculo y otra de asignacin.
Por ejemplo, A= B+C El ordenador primero calcula el resultado de
sumar B+C luego asigna ese resultado a la variable A. En cualquier
llamada a una funcin, cojamos por caso, X= suma(n1,n2) Primero
se ejecutan todas las sentencias de la funcin Suma, luego se
asigna el clculo de la funcin a la variable X. De otro vistazo a la
funcin de ejemplo y vea lo que realiza cada sentencia en la que se
llama a la funcin Suma.
Veamos a continuacin unos cuantos ejemplos de funciones. Antes
recordarle que todo lo referente a parmetros por valor y referencia,
variables locales y globales, etc. que estudiamos en los
procedimientos es lo mismo para las funciones.
Ejemplo 47.
Funcin que devuelve la direccin de la primera celda vaca de un
rango. La funcin es de tipo String ya que devuelve la casilla en la
forma "FilaColumna ", por ejemplo "A10". Utilizaremos la propiedad
Address del objeto range, esta propiedad devuelve un string que
contiene la referencia "FilaColumna" de una casilla o rango de
casillas. En el caso de un rango devuelve,
"FilaColumna_Inicial:FilaColumna_Final", por ejemplo "A1:C10"
Sub Ejemplo_47()
Dim Casilla As String
Casilla = Casilla_Vacia("A1")
End Sub
' Funcin Casilla_Vacia de Tipo String
' Sirve para Recorrer las filas de una columna hasta encontrar una
vaca.
' Parmetros :
' Casilla_Inicio : Casilla donde debe empezar a buscar.
' Devuelve Un string que contiene la referencia de la primera casilla
Function Casilla_Vacia(Casilla_Inicio As String) As String
ActiveSheet.Range(Casilla_Inicio).Activate
Do While Not IsEmpty(ActiveCell)
ActiveCell.Offset(1, 0).Activate
Loop
Casilla_Vacia = ActiveCell.Address
End Function
Ejemplo 48.
Similar al anterior. Es la tpica bsqueda secuencial de un valor en
un rango de casillas, en esta funcin solo se avanzar a travs de
una fila. La funcin devuelve la direccin (address) de la casilla
donde est el valor buscado, en caso que el valor no est en el
rango de filas, devuelve una cadena vaca ("").
Sub Ejemplo_48()
Dim Casilla As String
Casilla = Buscar_Valor("A1", 25)
' Si valor no encontrado
If Casilla = "" Then
Else 'Valor encontrado
End if
End Sub
50

' Funcin Buscar de Tipo String


' Sirve para Recorrer las filas de una columna hasta encontrar el
valor buscado o una de vaca.
' Parmetros :
' Casilla_Inicial : Casilla donde debe empezar a buscar.
' Valor_Buscado : Valor que se debe encontrar
' Devuelve Un string que contiene la referencia de la casilla donde se
ha encontrado el valor.
' Tambin puede devolver "" en caso que el valor buscado no est.
Function Buscar(Casilla_Inicial As String, Valor_Buscado As Integer)
As String
ActiveSheet.Range(Casilla_Inicial).Activate
' Mientras casilla no vaca Y valor de casilla diferente al buscado
Do While Not IsEmpty(ActiveCell) And ActiveCell.Value <>
Valor_Buscado
ActiveCell.Offset(1, 0).Activate
Loop
' Si la casilla donde se ha detenido la bsqueda NO EST VACA es
que se ha encontrado
'el valor.
If Not IsEmpty(ActiveCell) Then
Buscar = ActiveCell.Address ' Devolver la casilla donde se ha
encontrado el valor
Else ' La casilla est vaca, NO se ha encontrado el valor buscado
Buscar="" ' Devolver una cadema vaca
End if
End Function
Ejemplo 49.
Similar al anterior. Bsqueda secuencial de un valor en un rango de
casillas, en esta funcin se avanzar a travs de filas y columnas. La
funcin devuelve la direccin (address) de la casilla donde est el
valor buscado, en caso que el valor no est en el rango, devuelve
una cadena vaca ("").
Sub Ejemplo_49()
Dim Casilla As String
Casilla = Buscar_Valor("A1", 25)
If Casilla = "" Then
Else
End if
End Sub
Function Buscar(Casilla_Inicial As String, Valor_Buscado As Integer)
As String
Dim Incremento_Columna As Integer
Dim Continuar As Boolean
ActiveSheet.Range(Casilla_Inicial).Activate
Continuar = True
Do While Continuar
Incremento_Columna = 0
' Buscar el valor por las columnas hasta encontrarlo o encontrar una
celda vaca.
Do While Not IsEmpty(ActiveCell.Offset(0, Incremento_Columna)
And
51

ActiveCell. Offset(0, Incremento_Columna.Value <> Valor_Buscado


' Siguiente columna
Incremento_Columna = Incremento_Columna + 1
Loop
' Si no est vaca la casilla entonces parar la bsqueda, se ha
encontrado el valor
If Not IsEmpty(ActiveCell.OffSet(0, Incremento_Columna)) Then
Continuar=False
Else ' La casilla est vaca, no se ha encontrado el valor
ActiveCell.Offset(1, 0).Activate ' Saltar a una nueva fila
If IsEmpty(ActiveCell) Then ' Si la casilla de la nueva fila est vaca
Continuar=False ' Parar la bsqueda, no hay ms casilla a recorrer
End if
End if
Loop
' Si la casilla donde se ha detenido la bsqueda NO EST VACA es
que se ha encontrado
'el valor.
If Not IsEmpty(ActiveCell) Then
Buscar = ActiveCell(0, Incremento_Columna).Address ' Devolver la
casilla donde se
'ha encontrado el valor
Else ' La casilla est vaca, NO se ha encontrado el valor buscado
Buscar="" ' Devolver una cadema vaca
End if
End Function
La clusula Private.
Puede anteponer la clusula private a todos los procedimientos y
funciones que sean llamados slo desde el mismo mdulo, es una
forma de ahorrar memoria y hacer que el programa corra un poco
ms rpido. Si necesita llamar un procedimiento o funcin desde
otro mdulo, nunca debe precederlo por la clusula private,
recuerde que esta clusula restringe el mbito de utilizacin de un
procedimiento a su propio mdulo. Supongamos el ejemplo
siguiente.
' Mdulo 1
Sub General
....
End Sub
Private Sub Privado
....
End Sub
' Mdulo 2
Sub Procedimiento_de_modulo2
' Esto es correcto. Llama al procedimiento General definido en
Mdulo1
Call General
' Esto no es correcto. Llama al procedimiento Privado definido en
Mdulo 1, este
' procedimiento va precedido pro la clusula Private, por tanto slo
puede ser llamado
' desde procedimientos de su propio mdulo
52

Call Privado
End Sub
Vamos a ver a continuacin tres ejemplos ms sobre funciones. Es
importante que los cree en un libro de trabajo nuevo y los ponga en
un mismo mdulo, al final del captulo utilizaremos las opciones de
exportar e importar mdulos de procedimientos y funciones. En
todos los ejemplos ver el procedimiento Procedimiento_Llamador,
es para mostrar de que forma se debe llamar al procedimiento o
funcin. Los procedimientos implementados son, por llamarlo de
alguna manera, de tipo general, es decir, son procedimientos que
podr utilizar en muchas aplicaciones.
Ejemplo 50.
Procedimiento que abre un cuador MsgBox y muestra el texto que se
le paso como parmetro.
Sub Procedimiento_Llamador()
Call mAviso("Esto es el mensaje de aviso", "Esto es el Ttulo")
End Sub
' Procedimiento mAviso
' Funcin Mostrar el cuadro de funcin MsgBox, con el icono
informacin y el botn OK (Aceptar).
' Se utiliza para mostrar avisos.
' Parmetros:
' Texto = Texto que muestra el cuadro
' Titulo = Ttulo del cuadro
'
Sub mAviso(Texto As String, Titulo As String)
MsgBox Prompt:=Texto, Buttons:=vbOKOnly + vbInformation,
Title:=Titulo
End Sub
Ejemplo 51.
Funcin tipo range que devuelve un rango. Observe como la funcin
se iguala a una variable tipo Range, recuerde que con esta variable
podr acceder a todas las propiedades e invocar todos los mtodos
propios de los objetos Range.
En este ejemplo en concreto se utilizan las variables para Copiar un
grupo de celdas de un rango hacia otro, se utilizan los mtodos
Copy y Paste del objeto Range.
Sub Procedimiento_Llamador()
Dim Rango_Origen As Range
Dim Rango_Destino As Range
Set Rango_Origen=Coger_Rango(A1,5,5)
Rango_Origen.Copy
Set Rango_Destino=Coger_Rango(G1,5,5)
Rango_Destino.Paste PasteSpecial:=xlPasteAll
End Sub
' Funcin que devuelve un rango a una variable de este tipo
' Parmetros
' Casilla = casilla inicial del rango
' Filas = nmero' de filas
' Columnas = nmero de columnas del rango
Function Coger_Rango(Casilla As String, Filas As Integer, Columnas
As Integer) As Range
53

Dim Casilla_Final As String


ActiveSheet.Range(Casilla).Activate
ActiveCell.Cells(Filas, Columnas).Activate
Casilla_Final = ActiveCell.Address
ActiveSheet.Range(Casilla & ":" & Casilla_Final).Select
Set Coger_Rango = ActiveSheet.Range(Casilla & ":" & Casilla_FInal)
End Function
Ejemplo 52.
Funcin para comprobar el tipo de datos. Es una funcin de
comprobacin que se puede utilizar para validar los datos que se
entran desde un cuadro InputBox o desde los cuadros de texto de
formularios. La funcin es de tipo Booleano, devuelve True (cierto) o
False en funcin de si el dato pasado es correcto. En esta funcin se
evalan slo datos numricos y datos tipo Fecha, puede ampliarla
para que se comprueben ms tipos.
Sub Procedimiento_Llamador()
Dim Cantidad As Integer
Dim Fecha As Date
Dim Datos As String
Datos = InputBox("Entrar una Cantidad : ", "Entrar")
If Not Comprobar_Tipo(Datos,"N") Then
mAviso("Los datos introducido no son numricos", "Error")
Else
Cantidad = Val(Datos)
End If
Datos=InputBox("Entrar Fecha","Entrar")
If Not Comprobar_Tipo(Datos,"F") Then
mAviso("Los fecha introducida no es correcta", "Error")
Else
Fecha = Val(Datos)
End If
End Sub
' Funcin que evala si el tipo de datos que se le pasan son
correctos o no. Si son correctos devuelve
' TRUE , en caso contrario devuelve FALSE
' Parmetros
' Valor =valor que se debe comprobar, de tipo String
' Tipo = tipo a comprobar, "N" --> Numrico, "F", tipo fecha
Function Comprobar_Tipo(Valor As String, Tipo As String) As
Boolean
Dim Valido As Boolean
Valido = True
Select Case Tipo
' Comprueba si es un valor numrico vlido
Case "N"
If Not IsNumeric(Valor) Then
Valido = False
End If
' Comprueba si es un valor fecha vlido
Case "F"
If Not IsDate(Valor) Then
Valido = False
54

End If
End Select
Comprobar_Tipo = Valido
End Function
Importar y Exportar mdulos.
Los ltimos tres ejemplos que hemos visto, como le hemos indicado,
son procedimientos que pueden ser utilizados en multitud de
ocasiones o situaciones, seria interesante tenerlos disponibles en
cualquiera de las hojas que confeccionemos.
Podra pensar en utilizar las opciones de copiar y pegar para pasar
procedimientos de una hoja a otra, es un mtodo totalmente vlido
y efectivo, pero le proponemos a continuacin otro mtodo ms
"profesional", por llamarlo de otra manera, e igual de efectivo. Este
mtodo consiste en guardar los procedimientos de un mdulo en un
archivo aparte, es decir, independiente de cualquier hoja de clculo,
luego, cuando en una nueva hoja necesite estas funciones, solo
deber importar este archivo para incorporarlo.
Exportar un mdulo. Guardar un mdulo en un archivo.
Como ejemplo, abra la hoja donde puso los tres ltimos
procedimientos.
1. Pase al editor de visual basic y active el mdulo a exportar.
2. Active opcin de la barra de mens Archivo/ Exportar archivo.
Aparece un cuadro de dilogo.
3. En cuadro de edicin Nombre de Archivo, teclee el nombre para el
archivo donde se guardar el mdulo, por ejemplo "General.Bas",
observe que .BAS es la extensin de estos archivos.
4. Pulse sobre el botn Guardar.
Importar un mdulo.
Si est siguiendo el ejemplo, cierre todos los archivos de Excel y
abra uno nuevo.
1. Active el editor Visual Basic.
2. Active opcin de la barra de mens Archivo/ Importar Archivo.
Aparece un cuadro de dilogo.
3. Seleccione en la lista Buscar en: la carpeta donde tiene ubicado el
archivo a importar (la carpeta donde est General.Bas si est
siguiendo el ejemplo).
4. Una vez localizada la carpeta, seleccione el archivo a importar
(General.Bas en el ejemplo) y pulse sobre Abrir.
Observe como en la ventana de proyecto se ha incorporado un
nuevo mdulo que contiene todos los procedimientos y
funciones del archivo importado.
Terminamos aqu el tema de procedimientos y funciones, djenos
insistir de nuevo en que es muy importante que construya sus
programas utilizando todas las ventajas que le ofrece la
programacin modular. Como ltimo consejo, agrupe todas las
funciones que usted considere de utilizacin general en uno o dos
mdulos y luego utilice las opciones de importacin y exportacin
para incorporarlos a sus programas.

55

Ir a hoja de calculo segn combobox


Private Sub ComboBox1_Change()
Sheets(ActiveSheet.ComboBox1.Value).Select
End Sub
Private Sub Worksheet_Activate()
ActiveSheet.ComboBox1.Clear
For Each hoja In ActiveWorkbook.Sheets
If UCase(hoja.Name) <> "INICIO" Then
ActiveSheet.ComboBox1.AddItem hoja.Name
End If
Next

Si ya tienes el nombre de la hoja elegida, ya tienes lo ms difcil.


ahora basta con activar esa hoja

Worksheets(hoja_elegida).Activate

sustituye ese hoja_elegida por lo que hayas elegido en tu combobox


Entonces lo que deberas hacer es referir todas las operaciones que tengas que
hacer en la hoja del cliente elegido a su hoja
puedes hacerlo por ejemplo con un bloque WITH

With Worksheets(hoja_elegida)
'aqu escribes los pasos que hay que realizar en esta hoja
.Range("A1").Value="Hola"

End With
Abrir un archivo desde un ComboBox (correccin de la pregunta)

bien, utilizaremos el api ShellExecute


56

'4c7569735f50
en un modulo ( no de clase) pegas esto:
Option Explicit
' Declaracin del api ShellExecute
Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long
'Constantre para el modo en que se abre la ventana: Normal
Public Const SW_SHOWNORMAL = 1

Sub abrir(archivo As String)


On Error Resume Next
ShellExecute Application.hwnd, "Open", archivo, _
vbNullString, _
vbNullString, _
SW_SHOWNORMAL
End Sub
** el macro se llama abrir(archivo) y comopuedes ver necesita como argumento la ruta
completa del archivo a abrir. la llamada seria:
call abrir("C:\TODO\Docu\misarchivos.doc")
ahora solo necesitas utilizar el evento click del combo y pasarle el item del combo
como argumento a la sub abrir
Private Sub ComboBox1_Click()
Call abrir(ComboBox1.Text)
End Sub

Listar contenido de una carpeta en combobox


Private Sub ListBox1_Click()
Workbooks.Open (ThisWorkbook.Path & "\" & ListBox1)
Unload Me

57

End Sub
Sub Userform_Activate()
Set fso = CreateObject("Scripting.FileSystemObject")
Ruta = ThisWorkbook.Path
Set Carpeta = fso.GetFolder(Ruta)
Set ficheros = Carpeta.Files
For Each archivo In ficheros
If Right(archivo.Name, 5) = ".xlsm" Then ListBox1.AddItem archivo.Name
Next archivo
End Sub

Exportar un libro al formato PDF

Hola a tod@s.
Hacemos un alto en el camino para atender una peticin que me llego hace unos das,
me preguntaban si era posible exportar un archivo Excel o la hoja activa al formato
PDF, pues bien lo he estado probando en Excel 2010 y 2007 y funciona
perfectamente, os dejo el cdigo para que lo probis.
Es muy sencillo y fcil de entender por eso no veo necesario extenderme ms, si os
surge alguna duda me comentis.
Sub ExporPdf()
ThisWorkbook.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:="Prueba", includedocproperties:=True, openafterpublish:=True
End Sub

El Objeto Workbooks
El objeto Workbook representa un libro Microsoft Excel. La coleccin Workbooks
contiene todos los Workbook objetos abiertos en Microsoft Excel.
Ejemplos de mtodos:
Use el mtodo Open para abrir un archivo. As se crea un libro nuevo para el archivo
abierto. En el siguiente ejemplo se abre el archivo Prueba.xls como un libro de slo
lectura.
Workbooks.Open FileName:="Prueba.xls", ReadOnly:=True
Use el mtodo Add para crear un nuevo libro vaco y agregarlo a la coleccin. En el
siguiente ejemplo se agrega un libro nuevo vaco a Microsoft Excel.
58

Workbooks.Add
Use el mtodo Close para cerrar el libro. En el siguiente ejemplo se cierran todos los
libros abiertos.
Workbooks.Close
Ejemplos de Propiedades:
Use la propiedad Name para que nos devuelva el nombre del libro.
Workbooks.Name
Use la propiedad Path para que nos devuelva la ruta de acceso al archivo del libro.
Workbooks.Path
Use la propiedad Author para que nos devuelva el autor del libro.
Workbooks.Author
Probemos ahora a exportar un libro Excel a formato pdf.
Sub pdf()
ThisWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:="Prueba",
includedocproperties:=True, openafterpublish:=True
End Sub

Instrucciones usadas con los Objetos.


La instruccin With:
Ejecuta una serie de instrucciones sobre un mismo objeto, ofrece varias ventajas, la
primera es que ganas tiempo en escritura y la segunda que mejora la legibilidad del
cdigo.
With ActiveSheet
.Name = Presupuesto
.Range (A1) = "Presupuesto ao 2011"
End With
La instruccin For EachNext:
Las instrucciones For Each...Next repiten un bloque de instrucciones para cada uno
de los objetos de una coleccin.
Queremos borrar todo el contenido de cada hoja antes de cerrar un libro.
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim Hoja As Worksheet
59

For Each Hoja In ThisWorkbook.Sheets


Hoja.Cells.Clear
Next Hoja
End Sub
Se puede salir de un bucle For Each...Next mediante la instruccin Exit For antes de
que finalice.
Sub BuscaNumeros()
For Each miObjeto In MiColeccion
If IsNumeric(miObjeto.Value) = False Then
MsgBox "El objeto contiene un valor no numrico."
Exit For
End If
Next c
End Sub
La instruccin If TypeOf:
La instruccin If TypeOf permite comprobar el tipo de objeto.
Sub ControlProcessor(MiControl As Control)
If TypeOf MiControl Is CommandButton Then
Debug.Print "Ha pasado un " & TypeName(MiControl)
ElseIf TypeOf MiControl Is CheckBox Then
Debug.Print "Ha pasado un " & TypeName(MiControl)
ElseIf TypeOf MiControl Is TextBox Then
Debug.Print "Ha pasado un " & TypeName(MiControl)
End If
End Sub
La instruccin Set:
La instruccin Set nos permite atribuir la referencia de un objeto a una variable,
llamada variable objeto.
Sub ModificarHoja()
Dim Libro As Workbook
Dim Hoja As Worksheet
Set Libro = Application.Workbooks![Presupuesto.xls]
Set Hoja = Libro.Worksheets![Presupuesto2011]
With Hoja
.Name = "Ventas 2011"
.Range("A2") = "Ventas del ao 2011"
End With
Set Hoja = Nothing
End Sub

60

Los Objetos en Excel.


Los objetos se organizan jerrquicamente, ciertos objetos contienen otros objetos que
pueden contener otros. Estos objetos se llaman contenedores.
Un conjunto de objetos del mismo tipo constituyen una coleccin. La posicin de un
objeto en la coleccin puede cambiar cada vez que se produzca un cambio en la
coleccin; por lo tanto, la posicin de un objeto especfico de la coleccin puede variar.
El siguiente ejemplo activa la hoja de clculo Hoja1 del libro Presupuesto. El cdigo
usa las colecciones Workbooks y Worksheets.
Workbooks.Open Filename:="Presupuesto.xls"
Worksheeks("Hoja1").Activate
Si queremos imprimir la hoja activa...
Sub ImprimirRango()
Workbooks("Presupuesto.Xls").Sheets("Hoja1").PrintOut
End Sub
Cada objeto de Microsoft tiene alguna combinacin de propiedades, eventos y
mtodos que puede utilizar para hacer que su aplicacin funcione como deseas. Los
objetos de la misma clase heredan sistemticamente todas las propiedades y eventos
de su clase.
EL editor de VBA dispone de una tecnologa que ayuda en el empleo de objetos.
Cuando escribimos el nombre de un objeto seguido de un punto, se despliega una lista
con mtodos y propiedades.

En la prxima publicacin instrucciones usadas en los objetos..

61

Estructuras de Bucle o Ciclo

Los bucles significan repeticiones de un bloque de sentencias. Algunos bucles se


repiten un nmero concreto de veces, mientras que otros continan en ejecucin hasta
que cumplen una condicin determinada. El VBA ofrece tres tipos de estructura de
bucle:
La sentencia Do Loop.
La sentencia While . Wend.
La sentencia For . Next / For Each. Next
Do Loop y While . Wend repiten las operaciones en funcin de una condicin,
mientras queFor . Next repite las operaciones una cantidad de veces por contador.
For Each. Next permite recorrer los elementos de una coleccion.
El siguiente ejemplo repite la sentencia MsgBox y muestra el valor hasta que alcanza
el valor 10.
Sub Do_pruebas()
Dim Valor As Integer
Valor = 1
Do Until Valor = 10
MsgBox Valor
Valor = Valor + 1
Loop
End Sub
Advertencia: Incremente el valor o reduzca siempre la variable dentro del bucle, si lo
olvida, el bucle se ejecutara sin fin.
Este ejemplo establece 10 repeticiones, con incremento negativo de 2 en la hoja Excel
activa.
Sub for_pruebas()
Dim X As Integer
For X = 10 To 1 Step -2
Cells(X,1) = X
Next X
End Sub
Por lo general la instruccin For Each.. Next suele utilizarse para evaluar rangos y u
hojas, como se ve en el siguiente ejemplo:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Dim Hoja As Worksheet
For Each Hoja In ThisWorkbook.Sheets
Hoja.PageSetup.LeftFooter = "Jose Luis"
Next Hoja
End Sub
Con este ejemplo colocamos en el encabezado de cada hoja mi nombre.

Estructuras de Decisin
En lenguaje de VBA incorpora estructuras de decisin que permiten controlar el flujo
de ejecucin de un programa.
Si no existen tales estructuras en su cdigo, ste se ejecutar de izquierda a derecha
y de arriba a abajo segn lo haya escrito.
62

Sin embargo, en muchas ocasiones deseamos ejecutar una lnea u otra dependiendo
de cierta condicin. En estos casos la introduccin de las estructuras de control
modifica el flujo normal de la ejecucin.
La instruccin If-Then-Else es la estructura clsica de decisin y presenta la siguiente
sintaxis:
If condicin1 Then
[instrucciones1]
[ElseIf condicin2 Then
[instrucciones2]]

[Else
[instruccionesN]]
End If
Cuando el programa llega a la instruccin If Condicin Then , se evala la condicin, si
esta se cumple (es cierta), se ejecutan todas las sentencias que estn encerradas en
el bloque, si no se cumple la condicin, se saltan estas sentencias.
Veamos un ejemplo:
If IsEmpty(Cells(1, 1)) Then Beep: MsgBox "Olvido el titulo"
Cuando existe un gran nmero de condiciones evaluar, es posible que la instruccin IfThen-Else se complique de gran manera. En estos casos Visual Basic permite el uso
de otra estructura de decisin: la instruccin Select Case.
Select Case Variable_A_Verificar
Case "Opcion1"
Case "Opcion2"
Case Else "Si no se cumple cualquier Opcin
End Select
Para la siguiente publicacin tocaremos las estructuras de ciclo.
Variables Objeto
Una variable objeto representa un objeto Excel, como puede ser un grupo de
resultados, un libro, hoja, etc.
Las variables objeto se declaran de la misma forma que cualquier otra variable.
Ejemplo:
Dim Test As Object
El tipo Object se declara cuando el tipo de objeto no se conoce.
Dim Nombre As Worksheet
Dim Imprimir As Chart
Para asignarle a una variable un objeto, usamos la instruccin Set
Dim Zona As Range
Set Zona = Range("A1:B10")
La sentencia Set tiene relacionada la palabra clave Nothing.
Nothing rompe la conexin entre la variable y el objeto y cualquier objeto especfico,
por ejemplo cuando hemos terminado de utilizar el rango asignado
utilizamos Nothing para eliminarlo:
Set Zona = Nothing
Para la siguiente publicacin tocaremos las estructuras de decisin.
El Objeto Range.

EL objeto Range representa un rango de celdas y pude estar constituido por:


Una celda.
Una fila.
63

Una Columna.
Un rango de celdas contiguas o no.
Un rango 3D.
Esto nos puede dar una idea de que nos encontramos frente al objeto ms importante
de Excel.

Los siguientes mtodos y propiedades devuelven un objeto Range:


Propiedad Range
Propiedad Cells
Range y Cells
Propiedad Offset (representa un rango desplazado con respecto al rango
especificado)
Mtodo Union (Devuelve la unin de dos o ms rangos)
El ejemplo siguiente modifica el contenido y el color de celdas.
Sub llenado()
Dim celda As Range
Application.Cells(1, 2) = "Enero"
Application.Range("A1:G10").Cells(2, 2) = "Febrero"
Application.Cells(3, 2) = "Marzo"
For Each celda In Range("C1:D3")
celda.Interior.Color = vbRed
Next celda
End Sub
No profundizaremos ms ya que este objeto nos lo iremos encontrando en cada uno
de los ejemplos que desarrollaremos.
EL Objeto Application
El objeto Application representa la aplicacin de Microsoft Excel activa. Es el objeto
por defecto y, por lo tanto, es generalmente opcional.
Las principales opciones de Excel pueden ser definidas a partir de propiedades del
objetoApplication la mayora de estas propiedades son de lectura.
Application es el objeto superior, as el primer ejemplo, siguiendo toda la jerarqua de
objetos quedara de la siguiente forma:
Sub Hola ()
Application.WorkBooks(1).WorkSheets(1).Range("A1").Value = "Hola"
End Sub

Las propiedades del objeto Application se divide en cuatro grupos:


Propiedades que controlan el estado
Propiedades que controlan la presentacin
Propiedades que devuelven objetos
Propiedades que controlan la manipulacin de los archivos
Las propiedades que controlan el estado definen el ambiente donde se ejecuta el
Excel.

64

Toquemos un poquito el interfaz


Sub Interfaz()
With Application
.Caption = "Aplicacin " & .Name _
& " Versin: " & .Version
.StatusBar = "VB para Aplicaciones (Excel)"
.WindowState = xlMaximized
.StandardFont = "Verdana"
.StandardFontSize = 12
End With
End Sub

Procedimientos.
Ya hemos dicho que un procedimiento es un bloque de instrucciones de cdigo que
sirven para llevar a cabo alguna tarea especfica.
En VBE existen tres tipos de procedimientos: Sub, Function y Property. Los
procedimientos Function se distinguen de los Sub porque siempre devuelven un valor
asociado al nombre del procedimiento. Este valor puede ser usado por el cdigo que lo
ha llamado. Los procedimientos Property sirven para crear y manipular propiedades
personalizadas de los objetos.
El alcance de los procedimientos determina la extensin de su uso.
Un procedimiento Public puede ser llamado desde todos los mdulos de todos los
proyectos Excel.
El procedimiento Prvate solamente puede ser llamado desde un procedimiento dentro
el mismo modulo.
Si no indicamos Public o Private, los procedimientos son pblicos por defecto.

Para llamar a un procedimiento sub lo podemos hacer de la siguiente forma:


Call NombreSub (parmetros)
La llamada al procedimiento ser como una instruccin ms del lenguaje, donde se
especifica el nombre del procedimiento seguido sin parntesis, de una lnea de
argumentos que deber coincidir en nmero y tipo con los parmetros de la definicin
y que darn valor a los parmetros para que se ejecute el cuerpo del procedimiento.
Una vez se llega a la instruccin End Sub o Function o Property del procedimiento el
flujo de ejecucin vuelve a la lnea siguiente a la que ocasion la llamada.
Ejemplo:
Sub LlamadaMasiva()
Call da
MsgBox "Final del Procedimiento Da..."
Call Hora
MsgBox "Final del Procedimiento Hora..."
65

End Sub
Sub da()
MsgBox ("Hoy es " & Date & " para su informacin...")
End Sub
Sub Hora()
MsgBox ("Son las " & Time & " para su informacin...")
End Sub

Una vez copiado y guardado en un libro estos procedimientos vamos a ejecutarlos a


ver cmo responde a lo expuesto anteriormente.
Nos vamos a ficha programador pulsamos Macros y nos aparecer el
administrador de macros.

Se despliega la ventana que muestra todas las macros incluidas en el libro de trabajo.
Seleccione la macro LlamadaMasiva de la lista y pulse sobre el botn Ejecutar.

66

Mi primera macro.
Como vimos en la anterior publicacin generamos una macro con nuestra grabadora
de macros, veamos ahora el cdigo generado automticamente.
Nos vamos a ficha programador pulsamos Macros y nos aparecer el administrado de
macros.

Seleccionamos nuestra macro y pulsamos modificar.


Nos aparecer nuestro editor de VBE con el cdigo generado por nuestra macro.

Todas las macros que grabes se aadirn en la carpeta de Mdulos, despliega la


carpeta de Mdulos y vers que hay una lnea que se llama Mdulo1
Al hacer doble click sobre Mdulo1 vers el cdigo
Si todo ha ido correctamente veremos cdigo similar a este:
Sub MiPrimeraMacro()
Range("A1").Select
ActiveCell.FormulaR1C1 = "CRISIS"
67

Range("A2").Select
End Sub
Todo cdigo que generemos ira dentro de un procedimiento, que son un conjunto de
tareas breves que nos permite organizar el cdigo.
Generalmente al iniciar el procedimiento lo haremos con la palabra Sub (por subrutina)
seguidamente con el nombre del procedimiento, y siempre se finalizara con End Sub
Range("A1").Select (nos indica que seleccionamos la celda A1 de nuestra hoja)
ActiveCell.FormulaR1C1 = "CRISIS" (nos indica que en la celda seleccionada le
damos el valor de CRISIS)
Range("A2").Select (con esta lnea seleccionamos la celda A2 de nuestra hoja)
Antes de entrar ms en profundidad en el cdigo os copiare una serie de macros para
que las copiis y podis trabajar con ellas, al mismo tiempo os aconsejo que
practiquis modificndolas para ver como se comportan.
Esta macro muestra un texto en una ventana emergente:
Sub MostrarTexto()
Msgbox "Manual de Macros TodoExcel"
End Sub
Esta macro oculta las lneas de divisin de las celdas:
Sub OcultarLineas()
ActiveWindow.DisplayGridlines = False
End Sub
Comenzando a trabajar

Hola a todos,
He iniciado este blog para intentar explicar de un modo simple el lenguaje de
programacin Visual Basic para aplicaciones, que en el caso que nos ocupa es solo
para Excel aunque es un lenguaje comn a todas las aplicaciones del paquete
de Microsoft Office.
Trabajando con Excel el uso del lenguaje VBA nos permite:
Automatizar acciones repetitivas
Interactuar sobre los libros de Excel.
Crear formularios personalizados.
Personalizar el interfaz de Excel.
Modificar las opciones de Excel.
Comunicar Excel con otras aplicaciones de Microsoft Office.
En este ejemplo se cierra la primera ventana que est abierta u oculta en Microsoft
Excel.
Visual Basic para aplicaciones
Application.Windows(1).Close
Escritura del cdigo VBA.
Hay dos maneras de crear un procedimiento VBA:
1.
Generar automticamente el cdigo a partir de la grabadora de macros.
2.
Escribir directamente el cdigo del procedimiento en el editor de VB.
Ms adelante explicaremos estas dos formas de crear cdigo, de momento
explicaremos algunas definiciones sobre palabrotas que vamos soltando y que
posiblemente no sepamos lo que queremos transmitir.
Proyecto:
Cada libro de Excel tiene asociado un proyecto que contiene todos los modulos de
cdigos VBA agrupados en categoras.
Mdulos:
Los mdulos contienen las macros grabadas y sus propios procedimientos y funciones
escritos en VBA.
Procedimientos:
68

Los procedimientos son subprogramas escritos en Vba. Cada macro grabada genera
un procedimiento con el mismo nombre de la macro.
Funcin:
Las funciones son procedimientos que devuelven un valor. Para crear una funcin se
debe de utilizar la instruccin Function.
En la siguiente publicacin desarrollaremos como crear una macro automticamente

69

CODIGOS MAS SIMPLES PARA EMPEZAR


1-Seleccionar una Celda
Range("A1").Select
2-Escribir en la celda que est seleccionada en el momento actual
Activecell.FormulaR1C1="Pedro"
la combinacin los cdigos 1 y 2 es equivalente a esta sola lnea:
Range("A1").Value=" pedro"
El uso de FormulaR1C1 sera explicado mas adelante
3-Letra Negrita
Selection.Font.Bold = True
4-Letra Cursiva
Selection.Font.Italic = True
5-Letra Subrayada
Selection.Font.Underline = xlUnderlineStyleSingle
6-Centrar Texto
With Selection
.HorizontalAlignment = xlCenter
End With
7-Alinear a la izquierda
With Selection
.HorizontalAlignment = xlLeft
End With
8-Alinear a la Derecha
With Selection

70

.HorizontalAlignment = xlRight
End With
9-Tipo de Letra(Fuente)
With Selection
.Font .Name = "Arial"
End With
10-Tamao de Letra(Tamao de Fuente)
With Selection.Font .Size = 12
End With
11-Copiar
Selection.Copy
12-Pegar
ActiveSheet.Paste
13-Cortar
Selection.Cut
14-Ordenar Ascendente
Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
15-Orden Descendente
Selection.Sort Key1:=Range("A1"), Order1:=xlDescending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
16-Buscar
Cells.Find(What:="Csar", After:=ActiveCell, LookIn:=xlFormulas,
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=
_ False).Activate
17-Insertar Fila
Selection.EntireRow.Insert
71

18-Eliminar Fila
Selection.EntireRow.Delete
19-Insertar Columna
Selection.EntireColumn.Insert
20-Eliminar Columna
Selection.EntireColumn.Delete
21-Abrir un Libro
Workbooks.Open Filename:="C:\Mis documentos\Tablas dinamicas.xls"
22-Grabar un Libro
ActiveWorkbook.SaveAs Filename:="C:\Mis documentos\tablas.xls", FileFormat
_ :=xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=
_ False, CreateBackup:=False
La mayoria de estos cdigos se pueden verificar con la grabadora de Macros.

Significado de la FORMULA R1C1


La FORMULA R1C1 se emplea para colocar el resultado de una lnea de cdigo
en la celda que actualmente est activa.
Veamos el siguiente caso

supongamos que queremos sumar los nmeros de de la columna D y que el


resultado aparezca en la celda F6 que es la que est seleccionada, el cdigo que
se debera escribir es el siguiente
72

El parntesis destacado en rojo tiene por objetivo cubrir el tango donde estn
los nmeros a sumar, o sea, desplazarme 2 columnas a la izquierda [-2] con 5 y 2
filas hacia arriba es decir
[-5] y [-2]. Se entiende que R significan filas y C columnas y que anteponemos
un - si nos desplazamos hacia la izquierda o hacia arriba. Cuando escribimos
una funcin, como en el caso anterior, siempre debe ser escrita
ActiveCell.FormulaR1C1 = "=SUM(R[]C[]:R[]C[])", pues el segundo igual es que
caracteriza a la funcin y el parntesis el rango donde se aplica. Lo que se
acaba de hacer es lo mismo que dolocar =SUMA(D1:D3) en la celda F6
Hasta ahora hemos hecho una breve intrcduccion a la programacion VBA , pero
una cosa fundamental es entender las estructuras de control de flujo de
programa, lo que haremos mediante ejemplos
Estructuras de iteracion
Frecuentemente algunas lneas de cdigo se repiten muchas veces con el
consiguiente aumento del tamao del programa. Esto se solucionado mediante
los llamados estructuras de iteracin, tambin llamadas ciclos de repeticin o
bucles.
Estos son:
While - Wend
Do - While - Loop
Do - Until --Loop
For - Next
For-Each-in-Next
Estructuras de desicion:
.If - Then - Else
Select - Case
Tipos de datos, funciones y subrutinas:
73

Tipos de datos
Funciones
Funciones propias de VBA
Eventos
Metodos
Macros
GRAFICOS EN VBA

74

Estructura de iteracin Wile - Wend

INTRODUCCION:
Esta es una iteracin en la que no sabemos de antemano cuantas veces se
repetir el ciclo por lo tanto debe haber una condicin para salir de el ya que en
caso contrario el ciclo se repetira en forma indefinida.
Para explicar While - Wend me parece que lo mejor es dar un ejemplo en el que
iremos analizando cada lnea de cdigo.
Vamos a sumar un rango de nmeros que estn ubicados en una columna. En la
hoja de clculo solo debemos poner los nmeros (sin dejar espacios en
blanco) . Luego de aplicar la macro el resultado deber quedar en la primera
celda vaca.
En este caso sumaremos una cantidad indefinida de nmeros naturales los que
introducimos en la columna "D" empezando por la "D1" y finalizando con la
introduccin del N 283226 como se ve en la figura

el programa VBA es

75

Explicacin del cdigo (los nmeros representan las lneas de cdigo)


1- Siempre se empieza con Sub seguida del nombre de la macro y 2 parntesis
(Sum()).
2- Seleccionamos la celda superior. "D1".
3- Asignamos a la variable sum (que es en la que quedar contenido el
resultado) el valor de la celda superior.
4- Esta lnea es la condicin para entrar o salir del While y quiere decir "mientras
la celda activa no este vaca",
5- Aqu ya entramos en el While donde hay 2 lneas que se repiten hasta que la
condicin no se cumpla.
6- La primera lnea dentro del While hace bajar una posicin la celda
seleccionada, de esta forma podemos acceder a su contenido y la segunda
agrega este contenido a la variable "sum".
7-Con Wend salimos o volvemos a entrar al ciclo segn se cumpla o no la
condicin
8- Una vez que salimos del ciclo colocamos el resultado queda en una celda
activa.
9-Tanbien mostramos el resultado mediante un MsgBox (caja de mensajes)
10- Con esta lnea se cierra el programa

76

Finalmente una vez que aplicamos la macro, la hoja nos queda

Se puede ver que los resultados en la celda activa y en la caja de mensajes


coinciden.

Estructura de iteracin Do-While-Loop

INTRODUCCION:
Esta es una iteracin en la que no sabemos de antemano cuantas veces se
repetir el ciclo al igual en la estructura While-Wend y como en esta debe haber
una condicin para salir de el ya que en caso contrario este se repetira en forma
indefinida. La evaluacin de la condicin se produce antes de entrar al ciclo.
Para explicar Do-Wile-Loop utilizaremos el mismo ejemplo que en la
estructura While-Wend.
Vamos a sumar un rango de nmeros que estn ubicados en una columna. En la
hoja de clculo solo debemos poner los nmeros (sin dejar espacios en
77

blanco) . Luego de aplicar la macro el resultado deber quedar en la primera


celda vaca.
En este caso sumaremos una cantidad indefinida de nmeros naturales los que
introducimos en la columna "D" empezando por la "D1" y finalizando con la
introduccin del N 283226 como se ve en la figura

el programa VBA es

Explicacin del cdigo (los nmeros representan las lneas de cdigo)


78

1- Siempre se empieza con Sub seguida del nombre de la macro y 2 parntesis


(SumColumna()).
2- Seleccionamos la celda superior. "D1".
3- Asignamos a la variable sum (que es en la que quedar contenido el
resultado) el valor de la celda superior.
4- Esta lnea es la condicin para entrar o salir del While y quiere decir "hacer
mientras la celda activa no este vaca",
5- Aqu ya entramos en el Do-While donde hay 2 lneas que se repiten hasta que
la condicin no se cumpla.
6- La primera lnea dentro del While hace bajar una posicin la celda
seleccionada, de esta forma podemos acceder a su contenido y la segunda
agrega este contenido a la variable "sum".
7-Con Loop salimos o volvemos a entrar al ciclo segn se cumpla o no la
condicin.
8- Una vez que salimos del ciclo colocamos el resultado queda en una celda
activa.
9-Tanbien mostramos el resultado mediante un MsgBox (caja de mensajes).
10- Con esta lnea se cierra el programa.

Cdigo para copiar y pegar


Sub SumaColumna()
Range("D1").Select
Sum = Range("D1")
Do While ActiveCell.Value <> ""
ActiveCell.Offset(1, 0).Select
Sum = Sum + ActiveCell.Value
Loop
ActiveCell.Value = Sum
MsgBox Sum
End Sub

Finalmente una vez que aplicamos la macro, la hoja nos queda

79

Se puede ver que los resultados en la celda activa y en la caja de mensajes


coinciden y lgicamenteal dan el mismo resultado que usando la
estructura Wile-Wend.

80

Estructura de iteracin Do-Until-Loop

INTRODUCCION:
Do-Until-Loop es similar a Do-While-Loop y a While-Wend, la diferencia esta en
la en la forma en que expresamos la condicion: por ejemplo en Do-WhileLoop y While-Wend la condicion podria ser " ejecutar el codigo mientras que la
celda no este vacia" y en Do-Until-Loop seria "ejecutar el codigo hasta que la
celda este vacia".
Para comparar con Do-While-Loop y While-Wend vamos a sumar un rango de
nmeros que estn ubicados en una columna. En la hoja de clculo solo
debemos poner los nmeros (sin dejar espacios en blanco) . Luego de aplicar la
macro el resultado deber quedar en la primera celda vaca.
Tambien en este caso sumaremos los mismos nmeros que en los ejemplos
de Do-While-Loop y While-Wend que introducimos en la columna "D"
empezando por la "D1" y finalizando con la introduccin del N 283226 como se
ve en la figura

el programa VBA es

81

Explicacin del cdigo (los nmeros representan las lneas de cdigo)


1- Siempre se empieza con Sub seguida del nombre de la macro y 2 parntesis
(SumaColumna2()).
2- Seleccionamos la celda superior. "D1".
3- Asignamos a la variable sum (que es en la que quedar contenido el
resultado) el valor de la celda superior.
4- Esta lnea es la condicin para entrar o salir del While y quiere decir "ejecutar
el codigo hasta que la celda este vacia",
5- Aqu ya entramos en el While donde hay 2 lneas que se repiten hasta que la
condicin no se cumpla.
6- La primera lnea dentro del While hace bajar una posicin la celda
seleccionada, de esta forma podemos acceder a su contenido y la segunda
agrega este contenido a la variable "sum".
7-Con Wend Loop salimos o volvemos a entrar al ciclo segn se cumpla o no la
condicin
8- Una vez que salimos del ciclo colocamos el resultado que queda en una celda
activa.
9-Tanbien mostramos el resultado mediante un MsgBox (caja de mensajes)
10- Con esta lnea se cierra el programa

Finalmente una vez que aplicamos la macro, la hoja nos queda

82

Se puede ver que los resultados en la celda activa y en la caja de mensajes


coinciden.

83

Estructura de iteracin For-Next

INTRODUCCION:
Esta es una iteracin en la que sabemos de antemano cuantas veces se repetir
el ciclo, por lo tanto no hace falta una condicin para salir del mismo.
Para explicar For daremos un ejemplo muy simple:
Vamos a sumar los primeros 10 nmeros naturales. En la hoja de clculo solo
debemos poner los nmeros (sin dejar espacios en blanco) en una columna, que
en este caso ser la D. Luego de aplicar la macro el resultado deber quedar en
la primera celda vaca , este debe ser 55 como se puede verificar haciendo la
suma manualmente.
Aprovechando las propiedades de For podemos poner los nmeros desde el
cdigo

el programa VBA es

84

Explicacin del cdigo (los nmeros representan las lneas de cdigo)


1- Siempre se empieza con Sub seguida del nombre de la macro y 2 parntesis
(Sum()).
2- El primer For es para colocar en la columna D los diez primeros nmeros
naturales y significa: para la variable i yendo de 1 hasta 10
3-Se coloca en la celda (i,4) el valor actual de i que se repite al entrar
nuevamente en el For
4- Con Next i se incrementa i en 1 y se vuelve a entrar al For
5-Se selecciona la celda "D1"
6- Se coloca en la variable sum el contenido de la celda "D1" ( Sum acumula la
suma de los 10 primeros n narutales)
7-Se entra al 2 For
8 y 9-Dentro del For la primera lnea hace bajar una posicin la celda
seleccionada, de esta forma podemos acceder a su contenido y la segunda
agrega este contenido a la variable "sum".
10-En esta lnea podemos salir o volver a entrar al For segn se haya llegado a
10 o no.
11- En la celda activa colocamos el valor de sum.
12-Tambien mostramos el resultado mediante un MsgBox.
85

13-Se termina el programa.

Quedando la hoja de calculo como se ve abajo

86

Estructura de iteracin For-Each-In-Next

Hay dos variantes de esta estructura


1-En el primer tipo debemos especificar el rango en el que se realiza la iteracin
Como ejemplo hallaremos el promedio del rango A1:D4,dejando el resultado en
la celda C7, para este ejemplo pondremos valores enteros

Cdigo:

La parte ms importante del cdigo es

87

que significa: para cada celda del rango A1:D4 ejecutar el bloque

y cuando se llega a la ltima celda del rango, automticamente se hace la cuenta

luego se coloca el resultado en la celda C8

Cdigo para copiar y pegar


Sub PromedioRango()
Dim cell As range
Dim sum As Integer
Dim cant As Integer
Dim prom As Variant
For Each cell In range("A1:D4").cells
sum = sum + cell.Value
cant = cant + 1
Next cell
prom = sum / cant
range("C8").Select
ActiveCell.Value = prom
End Sub
2-El segundo tipo utiliza la propiedad CurrentRegion, esta propiedad es muy
interesante pues nos permite seleccionar un rango cuyos lmites no se conocen
ya que CurrentRegion devuelve el rango que rodea a una celda seleccionada.
Podemos decir que CurrentRegion es un rango rodeado por filas y columnas en
blanco. En la figura se puede ver dos regiones de este tipo.

88

Utilizaremos estas regiones para obtener el promedio de las mismas, para lo


cual empleamos el cdigo

Este cdigo sirve para las dos regiones, siempre y cuando se seleccione una
celda de una u otra de acuerdo en cual se quiera calcular el promedio. Por
ejemplo si queremos calcular el promedio del rango de la zona de contorno
verde el resultado seria

En este caso hemos seleccionado la celda H3, pero se podra haber


seleccionado cualquier otra

La diferencia con el caso 1 es

en la que

89

devuelve el rango de la regin actual.


Cdigo para copiar y pegar
Sub PromedioRegion()
Dim cell As range
Dim sum As Integer
Dim cant As Integer
Dim prom As Variant
For Each cell In ActiveCell.CurrentRegion.cells
sum = sum + cell.Value
cant = cant + 1
Next
prom = sum / cant
range("D8").Select
ActiveCell.Value = prom
End Sub

90

Estructura de decisin If - Then - Else

INTRODUCCION:
La estructura de decisin se llama as pues puede, luego de evaluar una
condicin, ejecutar un bloque de cdigo u otro.
Vamos a ver algunos ejemplos;
1- Comparar 2 nmeros ubicados en 2 celdas, y responder, en una tercera celda,
si son iguales o no
Compararemos los N 59 y 63 ubicados en las celdas D1 y E1 respectivamente

para responder a la pregunta utilizaremos el siguiente cdigo

Explicacin del cdigo


1-Ttulo.
2-Si el valor del N que est en la celda "D1" es igual al que est en la celda
"E1" , entonces se ejercita el cdigo de la lnea 3.

91

3-Se coloca en la celda "D4" el texto "Los valores de D1 y E1 son iguales"..


4-Sino se da la condicin de la lnea 2 se ejecuta el cdigo de la lnea 5.
5 -Se coloca en la celda "D4" el texto "D1 es distinto que E1".
6-Se cierra el If.
7-Se cierra el Sub
Cdigo para copiar y pegar
Sub Condicional()
If ActiveSheet.Range("D1").Value = ActiveSheet.Range("E1").Value Then
ActiveSheet.Range("D4").Value = "Los Valores de D1 y E1 son iguales"
Else
ActiveSheet.Range("D4").Value = "D1 es distinto que E1"
End If
End Sub
En nuestro caso el resultado se tiene que ver como en la figura

Esta estructura puede anidarse, lo que quiere decir poner otro If en la lnea 3, 5 o
ambas. Esto es necesario al querer averiguar si los N son mayores, iguales o
distintos, para hacerlo generamos otra macro en el mismo libro que llamaremos,
por ejemplo, Anidamiento

Cdigo:

92

Notar que el segundo If se puso en la parte correspondiente al Else y se cierra


antes que el primer If. Se puede tambin ver que hemos identado el cdigo para
mayor claridad (cosa que recomiendo enfticamente)
Resultado

Cdigo para copiar y pegar:

Sub Anidamiento()
If ActiveSheet.Range("D1").Value = ActiveSheet.Range("E1").Value Then
ActiveSheet.Range("D4").Value = "Los Valores de D1 y E1 son iguales"
93

Else
If ActiveSheet.Range("D1").Value > ActiveSheet.Range("E1").Value Then
ActiveSheet.Range("D4").Value = "D1 es mayor que E1"
Else
ActiveSheet.Range("D4").Value = "E1 es mayor que D1"
End If
End If
End Sub

Se puede ver que este cdigo no est identado por lo que sugiero hacerlo como
ejercicio.

Estructura de desicin Select-Case

INTRODUCCION:
La estructura de decisin If-Then-Else puede anidarse y como este anidamiento
se puede repetir tantas veces como el problema lo exija, a veces el cdigo suele
hacerse confuso y frecuentemente da lugar a errores, en estos casos se puede
recurrir a la estructura de decisin Select-Case.
En primer lugar veremos que funciona igual que If-Then-Else, para lo que
utilizaremos el mismo ejemplo que If-Then-Else en la parte en que
comparbamos 2 nmeros ubicados en las celdas D1 y E1 y el programa deba
responder si estos son iguales, mayores o menores, ubicando la respuesta en la
celda D4
El cdigo es

94

escencialmente este cdigo evala el valor actual de la celda "D1" y se escribe


un cdigo diferente de acuerdo al caso de que este valor sea = , > o < que el
valor actual de la celda "E1"
CODIGO PARA COPIAR Y PEGAR
Sub SelectCase()
A1 = Range("E1").Value
Select Case Range("D1").Value
Case Is = A1
ActiveSheet.Range("D4").Value = "Los Valores de D1 y E1 son iguales"
Case Is > A1
ActiveSheet.Range("D4").Value = "D1 es mayor que E1"
Case Is < A1
ActiveSheet.Range("D4").Value = "E1 es mayor que D1"
End Select
End Sub

La utilidad esencial de esta estructura se manifiesta cuando los casos que se


evalan son mas numerosos como veremos en el siguiente ejemplo.
Introducir en una celda la nota de un alumno y en otra una leyenda que diga si
esta aplazado, aprobado y en caso de estar aprobado si su nota fue buena, muy
buena, distinguida o sobresaliente, teniendo en cuenta que:
Aplazado= 1,2,3
Aprobado= 4,5
Bueno= 6,7
Muy bueno= 8
Distinguido= 9

95

Sobresaliente= 10
se puede responder a estas preguntas aplicando este cdigo

CODIGO PARA COPIAR Y PEGAR


Sub SelectCase()
a = Range("A2").Value
Select Case a
Case 1 To 3
ActiveSheet.Range("B2").Value = "APLAZADO"
Range("E1").Select
Case 4 To 5
ActiveSheet.Range("B2").Value = "APROBADO"
Range("E1").Select
Case 6 To 7
ActiveSheet.Range("B2").Value = "BUENO"
Range("E1").Select
Case 8
ActiveSheet.Range("B2").Value = "MUY BUENO"
Range("E1").Select
96

Case 9
ActiveSheet.Range("B2").Value = "DISTINGUIDO"
Range("E1").Select
Case 10
ActiveSheet.Range("B2").Value = "SOBRESALIENTE"
Range("E1").Select
End Select
End Sub
El resultado final queda como se ve en la figura, en este caso hemos agregado
un botn para disparar la macro, el cual esta sealado por la flecha roja

Variables simples y Tipos de datos

INTRODUCCION:
Una variable simple es una porcin de memoria donde se puede almacenar un
valor y se les debe dar un nombre para identificarlas entre s, tambin estn
asociados a un tipo de dato.
Un tipo de dato es el rango de valores que las variables pueden aceptar o, dicho
de otra manera, la cantidad de memoria que se reserva para albergar dicho
rango. Por ejemplo la variable de tipo Integer, puede guardar valores en un
entorno de -32.768 a +32.787 ocupando 2 bytes.
Todos los tipos de datos se resumen en la tabla de abajo.

97

98

Funciones

INTRODUCCION:
Las funciones son un trozo de cdigo inserto en el programa principal que
recibe uno, muchos o ningn valor (parmetros o argumentos) y que a
diferencia de las subrutinas devuelven un nico valor, por esta razn se debe
especificar( aunque no es obligatorio)de qu tipo de dato es dicho valor. Las
funciones deben tener un nombre que las identifique y as poder ser llamadas
por el programa principal. Tambin nos permiten ampliar el listado de las
funciones que ya vienen por defecto en Excel, estas funciones estn asociadas
a un libro o una hoja de Excel y las denominamos Funciones personalizadas,
son muy tiles,entre otras cosas, cuando la frmula que se requiere para
resolver un problema usando las funciones propias de las hojas Excel resulta
muy larga y complicada, haciendo casi imposible su comprensin.
Funciones personalizadas:
Empezaremos dando un ejemplo trivial de una funcin personalizada que
podramos resolver sin recurrir a ellas, este ejemplo es solo para mostrar como
funcionan.
Supongamos que queremos multiplicar 2 nmeros enteros (en la figura el entero
12 y el 2)que estn en las celdas A1 y C1 y que el resultado se devuelva en la
celda B3, que obviamente se resuelve con la frmula =A1*C1 ubicada en la celda
B3, mentalmente podemos decir que el resultado es 24

pero lo haremos con una funcin definida por nosotros programada con VBA
que llamaremos MULTIPLICA()

99

Esta funcin ya esta disponible junto con las dems,(solamente en la hoja


donde la definimos) como se puede ver en el recuadro rojo, tambin puede
verse que su definicin est entre Function y End Function

la usamos poniendo dos nmeros como argumento, tal como puede verse

Ahora daremos un ejemplo de una funcin definida por el usuario que tiene ms
utilidad.
La ferretera EL BULON hace el 20% de descuento si las ventas superan las 100
unidades.
Esto se puede resolver con la funcin SI, como se puede ver en la siguiente
figura

100

Resolveremos el mismo problema definiendo una funcin, que llamaremos


DESCUENTO, con el siguiente cdigo

ya definida la funcin DESCUENTO() la podemos aplicar

101

Se ve que el resultado es el mismo, pero si definimos la funcin DESCUENTO el


proceso es mas rpido.
Como se habr notado en el ejemplo anterior, est permitido omitir el tipo de
dato, pero es una buena costumbre ponerlos, ya que nos puede ahorrar muchos
problemas principalmente en la depuracin del cdigo en programas largos (En
otros idiomas, como en C, esto es obligatorio) por surte VBA tiene la posibilidad
de forzar el hecho de tener que poner obligatoriamente los tipos de datos con la
instruccin Opcin xplicit al principio de cada mdulo y mejor an, se puede
configurar el editor de VBA para que se ponga automticamente esta instruccin
en todos los nuevos mdulos, esto se hace yendo a Herramientas->Opciones>Solapa Editor y en ella tildando la casilla Requerir declaracin de variables,
como se puede ver en la siguiente imagen

102

Ahora dar un ejemplo, que si bien puede resolverse con funciones (mas
precisamente funciones matriciales) les puedo asegurar que la solucin es muy
complicada y es aqu donde se ve la verdadera utilidad de las funciones
personalizadas. Se trata de la obtencin de las iniciarles de un nombre
completo.
Su cdigo es el siguiente:

103

usaremos la funcion recien definida en la siguiente tabla

Llegando a este punto debemos hacer algunas aclaraciones del cdigo


En primer lugar podemos ver que se usan las funciones de librera de VBA
(funciones que ya estn definidas), ms precisamente las funciones de cadena
Len(), Asc() y Mid(). Una cadena es una serie de caracteres tratados como una
misma unidad, estos caracteres pueden ser letras, nmeros o caracteres
especiales, como pueden ser /, *, &, %, @ y otros muchos incluido el espacio. A
todos estos caracteres les corresponde un cdigo numrico llamado ASCII .
Estas funciones sirven para el manejo de cadenas, hay otras que iremos
analizando cuando sea necesario.
Funcin Len
Esta funcin nos devuelve el nmero de caracteres de una cadena, por lo tanto
retorna un nmero entero y recibe un parmetro que es un tipo de dato string.
Su sintaxis es: Len([cadena de caracteres])
Ejemplo: Si Texto="hola como estas" Len(Texto) devuelve el valor 15.
Funcin Asc
Con la funcin Asc podemos obtener el cdigo ASCII de un caracter

Funcin Mid
Extrae partes de una cadena y recibe 3 parmetros.
104

Sintaxis: Mid(cadena, inicio, longitud)


El parmetro cadena es la cadena a extraer caracteres.
inicio es el carcter desde donde se comienza la extraccin.
longitud es la cantidad de caracteres devueltos a partir del carcter de inicio.
Dicho esto el cdigo se puede entender mas claramente
1 Function INICIALES(Texto As String) As String
2 Dim strLong As Long, i As Long
3 Dim textTemp As String
5 strLong = Len(Texto)
7 For i = 1 To strLong
8 If Asc(Mid(Texto, i, 1)) >= 65 And Asc(Mid(Texto, i, 1)) <= 90 Then
9 textTemp = textTemp & Mid(Texto, i, 1)
9 End If
10 Next i
12 INICIALES = textTemp
14 End Function
Lnea 1: se da el nombre a la funcin (INICIALES) y se define el nombre (Texto) y
el tipo del parmetro que recibe.

Lneas 2 y 3: se declaran las variables que se van a usar.


Lnea 5: se asigna a la variable strLong la longitud del string Texto, o sea que se
cuentan cuantos caracteres hay en la celda que contiene el nombre
Lnea 7: se entra en un ciclo for-Next que recorre el string Texto, o sea que
comienza desde 1 y termina en strLong.
Lnea 8: esta es la lnea ms importante. ya que en cada ciclo se evala cada
carcter y determina si es una letra mayscula (Asc>=65 o Asc<=90).
Lnea 9: Si es mayscula agrega el carcter a la variable strTemp.
Lnea 12: Al terminar la rutina, la funcin INICIALES recibe el valor de strTemp
que es donde se guardan las iniciales.
Para comprobar que funciona dejo el cdigo para copiar y pegar
105

Function INICIALES(Texto As String) As String


Dim strLong As Long, i As Long
Dim textTemp As String
strLong = Len(Texto)
For i = 1 To strLong
If Asc(Mid(Texto, i, 1)) >= 65 And Asc(Mid(Texto, i, 1)) <= 90 Then
textTemp = textTemp & Mid(Texto, i, 1)
End If
Next i
INICIALES = textTemp
End Function
FUNCIONES DE HOJA( NATIVAS):
Para definir funciones personalizadas, a dems de las funciones propias de VBA
, se pueden usar las llamadas funciones de hoja ( Work Sheet Functions en
ingles) tambin llamadas funciones nativas, es decir las funciones que
normalmente estn disponibles en las hojas de Excel, como son , SUMA,
BUSCARV, MAX, PROMEDIO, COINCIDIR, por nombras algunas. Para usarlas
debemos anteponer al nombre de la funcin( que debe estar en ingles) la
expresin Application.WorkSheetFunction.[nombre de la funcin](parmetros).Si
queremos usar la funcin BUACARV, la expresin debe ser:

Application.WorkSheetFunction.VLookup(Valor a buscar, Matriz de bsqueda;


Columna, Valor lgico)
Alternativamente:
WorkSheetFunction.VLookup() o Function.VLookup()
Como se puede ver los parmetros de la funcin son los mismos que los de las
funciones nativas
Empezaremos dando un ejemplo en el que se usa la funcin DESREF que en
ingles es Match. Como todos sabemos la funcin BUACARV solo puede traer
valores que estn en la misma fila del valor buscado pero en columnas a la
derecha de este, el problema se podria resolver con un anidamiento de las
funciones INDICE y COINCIDIR, nuestro objetivo es definir una funcin muy
parecida a BUSCARV pero que busque hacia la izquierda, a esta funcin la
llamaremos BUSCARVIZQ
Supongamos que tenemos la siguiente tabla
106

y queremos:
A) Introducir la tabla en una hoja se Excel
B) Que dado el cdigo de producto se devuelva en dos celdas la herramienta y
el precio de la misma
C) No emplear anidamiento de funciones
Como vemos el cdigo del artculo se encuentra en la columna central, por lo
tanto para responder debemos hacer una bsqueda a la izquierda y otra a la
derecha, por lo tanto debemos recurrir a BUSCARV y a una UDF( funcin
definida por el usuario) que como ya dijimos llamaremos BUSCARIZQ que
definimos con el siguiente cdigo:
Function BUSCARVIZQ(valor_a_buscar, matriz_de_busqueda As Range,
indice_de_Col As Integer, ValorExacto As Boolean)
Dim NrFila As Long
NrFila = Application.WorksheetFunction.Match(valor_a_buscar,
matriz_de_busqueda.Resize( , 1), ValorExacto)
BUSCARVIZQ = matriz_de_busqueda(NrFila, 1).Offset(0, indice_de_Col)
End Function
ya estamos en condiciones de itroducir la frmula BUSCARIZQ con sus
parmetros

que ubicamos en la celda D16 y BUSCARV


107

que ubicamos en la celda D15, haciendo esto podemos reponder al punto B)


como puede verse en la figura

marcamos con un recuadro rojo la frmula y el rango introducido, que como se


ve es el mismo para ambas frmulas, no as la columna que para BUSCARIZQ es
-1
EXPLICACION DEL CODIGO
Function BUSCARVIZQ(valor_a_buscar, matriz_de_busqueda As Range,
indice_de_Col As Integer, ValorExacto As Boolean)
se da el nombre a la funcin y los parmetros, proporcionando el tipo de dato.
Notar que no se da el tipo de dato del parmetro valor_a_buscar ya que este
puede ser una cadena de caracteres, un nmero o una combinacin de ambos.
Lo mismo podemos decir del parmetro que devuelve la funcin

Dim NrFila As Long


Se define la variable NrFila
NrFila = Application.WorksheetFunction.Match(valor_a_buscar,
matriz_de_busqueda.Resize( , 1), ValorExacto)

108

Se asigna a NrFila lo que devuelve la funcion Match (COINCIDIR) donde se


redimenciona lamatriz_de_busqueda con Recize
matriz_de_busqueda.Resize( , 1)
esto se hace para que la matriz de bsqueda seleccionada, que es rectangular,
se transforme en una matriz columna, ya que Match solo busca en rangos
columna.
Veamos cono funciona:
Selection.Resize(12,4).Select
si el rango seleccionado inicialmente es C4:E12 , o sea 8 filas y 3 columnas,
luego aplicar Resize el Rango queda con 12 filas y 4 columnas
en nuestro caso el rango seleccionado es 11 filas y 2 columnas, como a las filas
las queremos dejar igual no se pone nada como primer parmetro y si,ademas,
queremos que el rango final sea de una columna se pone( ,1) as, el rango
seleccionado queda un rango columna
Se podra haber omitido el Resize seleccionando solo el rango central, esto se
hizo para que los parmetros sean iguales a los de la funcin BUSCADV, salvo
por el -1 de indice_de_Col
finalmente el cdigo
BUSCARVIZQ = matriz_de_busqueda(NrFila, 1).Offset(0, indice_de_Col)
asigna a BUSCARVIZQ el valor que est en la celda
activa matriz_de_busqueda(NrFila, 1)desplazada una celda a la
izquierda(indice_de_Col ). Esto se logra con la PROPIEDAD Offset que seleciona
celdas a cierta distancia de la celda activa
por ejemplo:
ActiveCell.Offset(-5,2).Select
selecciona la celda que se encuentra 5 filas hacia arriba y 2 columnas a la
derecha de la celda activa.
de otra manera:
Sheets(1).Range("C2").Offset(2,4).Select
a partir de C2 selecciona 2 filas hacia abajo y 4 columnas a la derecha, es decir
C2 pasa a ser G4(C2 = G4), tener en cuenta que 2 es fila y 4 columna.

109

como se ve Offset hace lo mismo que DESREF.


La programacin VBA tiene sus propias funciones como Mid y Len, que ya se
describieron, estas permiten trabajar con cadenas de caracteres, con nmeros,
fechas, horas, mostrar mensajes por pantalla y muchas otras que podemos
listar por categoras, como sigue:
1-Funciones de conversin de tipos (Conversion)
2-Funciones Financieras (Financial)
3-Funciones de cadenas (Strings)
4-Funciones matemticas (Math)
5-Funciones de comprobacin (Information)
6-Funciones de Interaccin(Interaction)
7-Funciones de Fecha y Hora (DateTime)
8-funciones del sistema (FileSystem)

110

DIRECTORIO TELEFONICO

Este directorio telefnico se har sin recurrir a formularios, simplemente


pasaremos los datos que introducimos en tres celdas en la Hoja1 y los
pasaremos a la Hoja2, que llamaremos DIRECTORIO

Colocamos los rtulos verticalmente en las celdas coloreadas en azul y en las


celdas F6,F7,F8 los datos que sern pasados a la Hoja DIRECTIRIO pero
colocados horizontalmente, luego de aplicar la macro, disparada con el botn
INTRODUCIR DATOS, todo debe quedar como se ve en la figura de abajo

A medida que se van agregando datos, se va formando el directorio


para hacer esto utilizaremos la siguiente macro en el mdulo 1

111

Para consultar el telfono y la direccin de alguna persona, en esta ocasin lo


haremos utilizando frmulas

colocamos en la celda B6, el apellido y nombre de la persona cuyos datos


queremos obtener y en la celda B7 la frmula

para obtener el telfono y para la direccin la frmula

112

si la persona no est en el directorio aparece la leyenda "NO ESTA EN EL


DIRECTORIO" como muestra la figura

Descargar DIRECTORIO TELEFONICO

113

DIRECTORIO TELEFONICO (usando formularios)

Este directorio telefnico se har usando FORMULARIOS


Esta manera de encarar el problema tiene ms ventajas ya que con un solo
formulario podremos introducir los datos de nuestros contactos, consultarlos y
darlos de baja. Por otro lado se puede dar al formulario un aspecto ms
profesional, lo que ser de mucha utilidad cuando se encaren problemas ms
complejos
Accedemos al formulario entrando al editor VBA (Alt+F11) luego vamos a
Insertar y en el men desplegable que se abre pulsamos en UserForm

y aparece el formulario y los controles con los que podemos configurarlo

114

Para nuestro formulario vamos a utilizar los comandos: Etiqueta ( Label) Cuadro
de texto (TextBox) y botn de comando ( CommandButton) marcados en rojo en
la imagen, estos comandos estn numerados segun el orden en que los
`pnemos

115

con cada uno de ellos se insertan objetos cuyas propiedades se pueden cambiar
en el explorador de propiedades ( tambin puede hacerse con cdigo), Para que
aparezca las propiedades de cada objeto solo debemos pulsar en ellos, por
ejemplo en la figura pueden verse las propiedades de un botn al que se le han
cambiado las propiedades Name y Caption, cada una de ellas tiene un nombres
por defecto; por ejemplo en la propiedad Caption pusimos" INSERTAR" (pues
con este botn insertaremos los datos) y en nombre "cmdInsertar" . Esto es
muy importante a la hora de programar porque ayuda la claridad del cdigo
(aunque ahora que lo pienso, hubiera sido ms claro poner "btnInsertar", esto
es a nuestro criterio), hemos hecho lo mismo son los otros controles por
ejemplo al TextBox1 lo cambiamos por txtApellidoNombre.

Como el formulario en si mismo tambin es un objeto le cambiamos el nombre


por "usfDirectorio" al que le cambiamos la propiedad Caption por "DIRECTORIO
TELEFONICO" .

116

Tambin nos har falta insertar un mdulo al que llamaremos "


MostrarFormulario" en el que pondremos este cdigo

se asignar a un botn en la Hoja1

que disparar la macro Iniciar_Captura y como consecuencia se mostrara el


formulario de la figura

117

Ahora lo que nos resta hacer es programar todos los botones, que como puede
verse no nos hemos privado a la hora de ponerlos, la razn es que este
directorio se puede adaptar para llenar y mantener una base de datos.
Debemos notar que solo hemos usado tres controles.
Para que los botones funcionen hay que hacer Click en ellos, entonces debeos
programar el evento Click y para hacerlo hay dos maneras: hacer doble click en
el objeto "cmdInsertar" o pulsar en este mismo objeto, con el botn derecho del
mouse para que aparezca men en el que apretamos la tecla ver cdigo

118

en ambos casos vamos a la siguiente pantalla

donde podemos ver en la parte superior, el nombre del botn y el evento Click y
el nombre de la macro "cmdInsertar_Click" lista para que la programemos. Hay
otros eventos a los que podramos acceder

119

pero en este caso nos interesa el evento Cick. Tambin podemos ver haciendo
doble click en el formulario( o con el botn derecho del mouse) todos los
objetos que tenemos dentro del mismo

de esta manera haciendo doble Click en cada uno de los 6 botones podemos
programarlos como puede verse abajo

En programacin no hay una sola forma de hacer las cosas, y es probable que
haya otro algoritmo ms eficiente, el que est arriba me pareci fcil de
entender, pero ms adelante haremos otra versin

120

121

Descargar DIRECTORIO CON FORMULARIOS

ALTAS, BAJAS Y MODIFICACIONES

No se me ocurre que una empresa puede no necesitar una aplicacin de ALTAS,


BAJAS Y MODIFICACIONES, en nuestro caso continuaremos con la empresa de
renta de autos, que apropsito se llama RODANDO RENTA CAR.
La descripcin de la aplicacin consiste en cuatro botones que al oprimirlos
hacen surgir cuatro pantallas (formularios), el primero muestra en que situacin
se encuentra cada vehculo en el momento presente. El segundo es el formulario
de ALTAS, el tercero el de MODIFICACIONES y por ltimo el de BAJAS, como se
muestra

FLOTA DE VEHICULOS (consulta)

122

En esta pantalla se busca la marca y modelo del vehculo que aparece en una
lista ordenada alfabticamente en forma descendente en un comboBox, luego
de seleccionar un vehculo, aparecen algunas caractersticas del mismo que le
pueden interesar al cliente; entre otras, una foto y si esta disponible para ser
alquilado( textBox DISPONIBLE) etc.
AGREGAR VEHICULOS
En esta pantalla se agregan nuevas unidades, en este punto se existe la
posibilidad de agregar una misma marca y modelo, pudiendo surgir un problema
si no se los diferencia de alguna manera ya que al buscarlos y querer hacer una
consulta sobre ellos, solo aparecer el primero que este en la lista. La solucin
es muy simple, tomemos como ejemplo el SALEEN S331, si quisiramos agrega
el mismo modelo podramos diferenciarlo ponindole el nombre SALEEN S3312, como se ve en la imagen

123

.de esta manera aparecen las dos unidades.


CAMBIAR ESTADO DE UN VEHICULO

124

Aqu el vehculo ha cambiado el estado de estar en disposicin de ser alquilado


a lo contrario.

SACAR VEHICULO DE LA FLOTA

Esta es la pantalla en la que por mltiples motivos se considera que el vehculo


ya no puede pertenecer a la flota (destruccin total, mucho kilometraje, modelo
antiguo, etc.)
125

Es de fundamental importancia que cuando se haga algn cambio en las


pantallas de ALTAS, BAJAS o MODIFICACIONES, este se actualice
inmediatamente en cualquiera de los formularios. Tambin hay una advertencia
en la pantalla de altas que nos alerta si algn campo quedo sin llenar, otra
advertencia en la pantalla de modificaciones que tambin nos advierte si
estamos seguros de las modificaciones que hicimos y por ltimo una
advertencia en la pantalla de bajas que nos dice si estamos seguros de la
eliminacin.
Debo aclarar que las fotos de los autos se deben colocar en este caso en una
carpeta junto con el archivo de la aplicacin, esto no sera necesario si ponemos
la ruta completa donde se encuentra la carpeta con los vehculos siendo muy
sencilla la modificacin del cdigo.
Por ltimo podramos insertar la totalidad de la flota desde el formulario de
ALTAS.
Ahora vamos a mostrar los cdigos correspondientes a cada uno de los
FORMULARIOS, con algunos comentarios
CODIGO DE FLOTA DE VEHICULOS (INFORME)

126

127

CODIGO DE ALTAS

128

129

CODIGO DE BAJAS

130

131

CODIGO DE MODIFICACIONES

132

133

Como ya se dijo, al descargar el archivo, poner las imgenes en la misma


carpeta que la aplicacin. He puesto muchas imgines para que se puedan
agregar y eliminar.
Hasta el prximo tutorial.

134

BORDE
Usa la siguiente instruccion para el objeto de excel
With obEx
.Range(.Cells(5, 2), .Cells(5, 10)).Borders.LineStyle = xlContinuous
End With

Ejecutar macros de otro archivo de


Excel con Run y Call
Published on 22 October, 2013 by Sergio Alejandro Campos in Excel vba

Para este artculo vamos a hacer uso del mtodo Application.Run y de la


instruccin Call. Las dos nos servirn para mandar llamar procedimientos o
funciones de otro libro de Excel o de un mdulo en especfico dentro del mismo.

Figura1. IDE de vba.

Application.Run (Mtodo)
Este mtodo ejecuta una macro o manda llamar a una funcin. Se puede usar
para ejecutar una macro de Visual Basic o incluso de una funcin dentro de
una DLL.

135

Call (Instruccin)
Esta instruccin transfiere el control a un procedimiento o una funcin. Aunque
realmente esta instruccin es opcional. Si conocemos el nombre del
procedimiento basta con escribirlo en una lnea y se ejecuta. Pero es
recomendable para cuestiones de lectura de cdigo.

Ejecutar macros de otro libro


de Excel
Para ejecutar una macro que se encuentre en otro libro de Excel usamos el
mtudo Run antes mencionado.
Vamos a suponer que tenemos un Libro2.xlsm el cual contiene un macro
llamada Macro1. Usaremos el siguiente cdigo.
Application.Run Libro2.xlsm!Macro1
El ejemplo anterior es tomando en cuenta que tenemos en el Libro2 slo una
Macro1. Pero qu sucede si tenemos otra Macro1 en otro mdulo? Para eso
definimos el nombre del mdulo donde est la macro.
Application.Run Libro2.xlsm!Mdulo1.Macro1

Ejecutar macros de otro


mdulo del mismo archivo
Como vimos en el ejemplo anterior, para llamar una macro del otro mdulo,
basta con anteponer el nombre de dicho mdulo y despus el nombre de la
macro o funcin.
Podremos usar la instruccin Call de manera opcional.
Call Mdulo2.Macro1

Call ThisWorkbook.Macro1

136

Você também pode gostar