Escolar Documentos
Profissional Documentos
Cultura Documentos
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.
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.
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
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
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
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
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)
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.
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.
Tipo
devuelto
Cbool
Boolean
Cbyte
Ccur
Byte
Currenc
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.
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
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
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
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
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
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
37
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
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
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
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
Worksheets(hoja_elegida).Activate
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)
'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
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
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
60
61
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.
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.
64
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.
End Sub
Sub da()
MsgBox ("Hoy es " & Date & " para su informacin...")
End Sub
Sub Hora()
MsgBox ("Son las " & Time & " para su informacin...")
End Sub
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.
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
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.
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
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
76
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
el programa VBA es
79
80
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
82
83
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
86
Cdigo:
87
que significa: para cada celda del rango A1:D4 ejecutar el bloque
88
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 la que
89
90
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
91
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
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.
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
95
Sobresaliente= 10
se puede responder a estas preguntas aplicando este cdigo
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
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
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
101
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
Funcin Mid
Extrae partes de una cadena y recibe 3 parmetros.
104
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
108
109
110
DIRECTORIO TELEFONICO
111
112
113
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.
116
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
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
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
124
126
127
CODIGO DE ALTAS
128
129
CODIGO DE BAJAS
130
131
CODIGO DE MODIFICACIONES
132
133
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
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.
Call ThisWorkbook.Macro1
136