Sie sind auf Seite 1von 144

Ms.

Excel VBA - Nivel II

Contenido

Programacin orientada a objetos


El cdigo en Visual Basic para Excel
Sentencias de declaracin, Sentencias de asignacin, Tipos de
objetos
Control de flujo del programa
Sentencias de bifurcacin, Sentencias de repeticin o bucle
Sentencias: De ejecucin mltiple, Goto, Call , Exit
Manejo de archivos
Abrir un archivo, Abri un archivo de texto como hoja de clculo
Abrir un archivo elegido por el usuario, Cerrar, eliminar archivos
Verificar si un archivo existe, Verificar si un libro est abierto
Manejo de hojas
Insertar, nombrar, eliminar, ocultar, mostrar, proteger,
desproteger hojas
Manejo de rangos
Mover y copiar rangos, Nombrar rangos
Obtener la interseccin de rangos, Proteger y desproteger
ramgos
Uso de arreglos
Declarar un arreglo, Arreglos multidimensionales
Convertir una lista en un arreglo, Redimensionar un arreglo
Formularios avanzados
Inicializar formularios, Formularios de fichas mltiples
Formularios para el ingreso de fechas con calendario
Formulario para ingreso de usuario con contrasea
Crear funciones personalizadas
Manejo de eventos de Excel
Macros autoexecutables
Manejo de mdulos
Insertar, eliminar, ocultar mdulos (contrasea)
Control del tiempo al ejecutar sentencias
Application. Wait, Application.OnTime
Control de errores
On error resume next, on error goto, Err.numbre, err.description
Control de mensajes de alerta (DisplayAlert)
Control de actualizacin en pantalla (Screen. Updating)

Elaborado por: Dennis Pichilingue R Pgina: 1


Ms. Excel VBA - Nivel II

1. Programacin orientada a objetos


La programacin en Office se basa en la tcnica de programacin orientada a
objetos.
Cada producto de Office (Excel, Word, PowerPoint, Access, Project, etc.) cuenta con
su propio modelo de objetos. A cada objeto le corresponden unos eventos (Acciones
a los que responde el objeto)

Propiedades

Procedimientos

Semejanzas entre Visual Basic 6.0 y Visual Basic For


Applications
Visual Basic For Applications (VBA) es un subconjunto del lenguaje de programacin
Visual Basic (VB). VBA se emplea para automatizar una aplicacin existente de
Excel.
La programacin es similar en ambos.

Pgina: 2 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

2. El cdigo en Visual Basic para Excel


2.1 Constantes y variables
Constantes simblicas
Una constante, es un valor que no cambia durante la ejecucin de un programa.
A menudo utilizamos constantes una y otra vez en el cdigo, o bien el cdigo depende
de ciertos nmeros difciles de recordar. En estos casos, la mejor solucin es definir
estos valores como constantes simblicas y utilizar a partir de entonces los nombres
que identifican estas constantes.
Para definir una constante simblica, se utiliza la siguiente sintaxis:
[Public | Private] Const constante [As tipo] = expresin
Variables
Es un objeto del cdigo cuya misin consiste en almacenar un valor que puede
modificarse a lo largo de la ejecucin del programa.
Cada variable tiene:
Nombre: comienza por una letra y puede tener hasta 40 caracteres de longitud.
Se utiliza para hacer referencia a su contenido en cualquier parte del programa.
No se pueden emplear palabras reservadas.
Tipo: Determina la clase de valores que puede guardar la variable, as como el
nmero de bytes que emplea en la memoria.
Alcance: Indica dnde se puede utilizar la variable dentro del programa.
Establece el mbito donde el contenido de la variable tiene validez.
Antes de utilizar una variable, es un buen hbito declarar su tipo
Comentarios
Cuando una frase va precedida de una comilla simple (), Visual interpreta que es un
comentario y no ejecuta accin alguna sobre ella. Por ejemplo:
Calculo de la velocidad media
suma = 0
Nombres de variables
El nombre de una variable tiene que comenzar por una letra, puede tener hasta
255 caracteres de longitud y debe ser nico dentro de su mbito.
Los caracteres pueden ser letras, dgitos, el carcter de subrayado y los
caracteres de declaracin de tipo de la variable (%, &, !, #, @ y $).
No se puede utilizar el punto ni otros caracteres que tienen un significado
especial para Visual; por ejemplo, los parntesis.
Una palabra reservada tiene un significado especial para Visual Basic For Excel.
Son palabras reservadas: las sentencias, redefinidas, los nombres de las
funciones, los mtodos, las propiedades, los tipos, los operadores.
No se pueden utilizar palabras reservadas como nombres de variables.

Elaborado por: Dennis Pichilingue R Pgina: 3


Ms. Excel VBA - Nivel II

Las variables se pueden clasificar segn diversos


criterios
1. Segn su Uso
Constantes Son variables que tienen datos que no se modificarn en el
programa y su empleo facilita la modificacin de la aplicacin.
Variables Cuyo contenido si se modifica en el programa.

2. Segn su contenido
Tipo de Tamao de
datos almacenamiento Intervalo
Byte 1 byte 0 a 255
Boolean 2 bytes True o False
Integer 2 bytes -32,768 a 32,767
Long 4 bytes -2,147,483,648 a 2,147,483,647
(entero
largo)
Single 4 bytes -3,402823E38 a 1,401298E-45 para
(coma valores negativos; 1,401298E-45 a
flotante/ 3,402823E38 para valores positivos
precisin
simple)
Double 8 bytes -1.79769313486231E308 a
(coma -4,94065645841247E-324 para valores
flotante/ negativos; 4,94065645841247E-324 a
precisin 1,79769313486232E308 para valores
doble) positivos
Currency 8 bytes -922.337.203.685.477,5808 a
(entero a 922.337.203.685.477,5807
escala)
Decimal 14 bytes +/-
79.228.162.514.264.337.593.543.950.335
sin punto decimal;
+/-7,9228162514264337593543950335
con 28 posiciones a la derecha del signo
decimal; el nmero ms pequeo distinto
de cero es
+/-0,0000000000000000000000000001
Date 8 bytes 1 de enero de 100 a 31 de diciembre de
9999

Pgina: 4 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Object 4 bytes Cualquier referencia a tipo Object


String 10 bytes + Desde 0 a 2.000 millones
(longitud longitud de la
variable) cadena
String Longitud de la Desde 1 a 65.400 aproximadamente
(longitud cadena
fija)
Variant 16 bytes Cualquier valor numrico hasta el
(con intervalo de un tipo Double
nmeros)
Variant 22 bytes + El mismo intervalo que para un tipo String
(con longitud de la de longitud variable
caracteres) cadena
Definido por Nmero El intervalo de cada elemento es el
el usuario requerido por los mismo que el intervalo de su tipo de
(utilizando elementos datos.
Type)

3. Segn su alcance

TIPO DECLARA DESCRIPCIN


Local Dim, Se reconoce solamente en el procedimiento o subrutina
Static, donde est definida. Fuera de este entorno, la variable no
Redim es conocida; por tanto, su contenido se reinicializa cada
vez que se ejecuta el procedimiento donde tiene definido
su mbito. Para evitar la reinicializacin se debe definir la
variable como ESTTICA.
Formulario Dim Las variables de mbito formulario se pueden emplear en
cualquier procedimiento definido en el mdulo. Estas
variables se deben declarar en la seccin de declaraciones
del formulario o mdulo.
Global Global Su mbito es toda la aplicacin, por lo que se puede usar
en cualquier parte y, por ello, no se pueden declarar en un
procedimiento o formulario.

Segn se puede observar en la figura, hay cuatro lugares donde se pueden


definir las variables: Global, Formulario o Mdulo y Procedimientos. (En el
formulario se incluyen controles y cdigo mientras que en el mdulo slo puede
incluirse cdigo).
Se pueden definir variables con el mismo nombre en niveles diferentes, aunque
no es aconsejable por la ambigedad que esto supone, pero no son la misma
variable. En estos casos, el procedimiento usa la variable de nivel ms cercano.
(local-formulario-global).

Elaborado por: Dennis Pichilingue R Pgina: 5


Ms. Excel VBA - Nivel II

2.2 Sentencias de declaracin


Antes de utilizar una variable, es un buen hbito declarar su tipo. Una forma de hacer
esto es utilizando la sentencia Dim (o una de las palabras Public, Private o Static).
Cualquier declaracin de stas inicializa las variables numricas con el valor cero y
las variables alfanumricas con el carcter nulo.

Ejemplo1:
Dim I As Integer
Dim R As Double
Dim Nombre As String
Dim Etiquetas As String * 10
Dim F As Currency
Dim K As Long, S, X As Currency
Las sentencias anteriores declaran I como una variable entera, R como una variable
real de precisin doble, Nombre como una variable para contener una cadena de
caracteres de longitud variable fraccionaria, L como una variable entera larga y X
como una variable fraccionaria.
Observad como en una sentencia Dim se puede realizar ms de una declaraci

Ejemplo2:
Dim A, B As Integer
La sentencia anterior puede inducir a pensar que A y B son del tipo entero, lo cual
no es cierto; A es del tipo Variant (por defecto) y B es del tipo Integer.
Otra forma de declarar una variable es utilizando los caracteres de declaracin de
tipo.

Declaracin explcita
En Visual no es necesario declarar una variable antes de utilizarla pero esta forma
de trabajar puede dar lugar a errores.

Por ejemplo:
Dim M As Integer, N As Integer
VarTemp = M ...
N = VarTemp

Option Explicit
Esta sentencia opera slo en el formulario o mdulo donde se especifica. Para tener
la opcin activa para todo el cdigo de la aplicacin, debemos acudir al men
Herramientas, seleccionar Opciones,
Del cuadro de dialogo presentado activar "Requerir Declaracin de variables".

Pgina: 6 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Variables locales
Una variable local se reconoce solamente en el procedimiento en el que est
definida. Fuera de l, la variable no es conocida. Su utilizacin ms comn es
intervenir en clculos intermedios.
Para declarar una variable local a un procedimiento utilizamos Dim.

Por ejemplo:
Private Sub Grados_C_KeyPress(KeyAscii As Integer)
Dim GradosFahr As Double
If(KeyAscii = 13) Then
GradosFahr = Val(Grados_C.Text) * 9 / 5 + 32
Grados_F.Text = Format$(GradosFahr)
End If
End Sub
Una variable local es reinicializada cada vez que se entra en el procedimiento. Es
decir, no conserva su valor entre una llamada al procedimiento y la siguiente.

Variable esttica
Para hacer que esto no suceda, hay que declarar la variable como esttica. Visual
reinicializa una variable esttica solamente la primera vez que se llama al
procedimiento. Para declarar una variable como esttica se utiliza la palabra clave
Static en lugar de Dim.

Por ejemplo:
Static var_ent As Integer

Variables utilizadas dentro del mdulo


Una variable que es declarada a nivel de mdulo (formulario, mdulo estndar o
clase) puede ser compartida por todos los procedimientos de ese mdulo.
Las variables de este tipo hay que declararlas como Dim o con Private en la seccin
de declaraciones del mdulo (seccin General).
La forma de crear un nuevo mdulo es ejecutando la orden Formulario para un
formulario, Mdulo para un mdulo estndar o Mdulo de clase para una clase, del
men Insertar.
Este tipo de variable son por defecto estticas.

Variables globales
Una variable global es una variable declarada a nivel de mdulo pero que puede
ser accedida desde cualquier otro mdulo. Para hacer que sea global o pblica hay
que declararla Public (Global en versiones anteriores) en la seccin de
declaraciones del mdulo.

Elaborado por: Dennis Pichilingue R Pgina: 7


Ms. Excel VBA - Nivel II

Por ejemplo:
Public var1_global As Souble, var2_global As String
Cuando una variable Public, por ejemplo var1_global, se declara en un formulario,
por ejemplo Mi_Formulario, para acceder a ella desde otro mdulo es necesario
especificar su pertenencia; esto es, de qu objeto es dato miembro dicha variable.

2.3 Sentencias de asignacin


Se utiliza para asignar o almacenar valores a variables o constantes. Es una
operacin que sita un valor determinado en una posicin de memoria. La
operacin de asignacin se denota con el signo =
Reglas de las sentencias de asignacion
1. Una variable al lado derecho de la sentencia de asignacion debe de tener
un valor antes de que la sentencia se ejecute. Hasta que un programa le de
un valor a una variable, esa variable no tiene valor.
Ejemplo: C = A + 1
Si la variable A no tiene valor antes de ejecutarse la expresin, se producir un
error lgico.
2. En la izquierda de una sentencia de asignacin solo pueden existir
identificadores.
Ejemplo:
A = 10
Pi = 3.1416
NSueldo = Sueldo + aumento
No es vlido lo siguiente:
Sueldo - Descuentos = 425
5=B
3. La operacin de asignacin es destructiva debido a que el valor almacenado
en una variable se pierde o se destruye y se sustituye por el nuevo valor de la
sentencia de asignacin.
4. Es posible utilizar el mismo nombre de identificador en ambos lados del
operador de asignacin.
Ejemplo:
N=2
N=N+4

Pgina: 8 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Asignacin por su Contenido:


1. Asignacin aritmtica:
La expresin que se evala es de tipo aritmtico y es aquella en la cual se
almacenan valores enteros o reales.
Ejemplos: Suma = 3+14+8
Igv = 0.18
Promedio = (N1 + N2 + N3) / 3
2. Asignacin Alfanumrica:
La expresin que se evala es de tipo carcter y esta formada por caracteres
alfanumricos (letras, numricos y caracteres especiales).
Ejemplo: X = 28 de julio 1922"
3. Asignacin lgica
La expresin que se evala es de tipo lgico y solo puede tomar uno de dos valores
falso o verdadero. Estos representan el resultado de una comparacin entre otros
datos.
Ejemplos: M=8>5 El valor lgico de M es verdadero.
Y = 3 > 2 AND 10 <= 5 El valor lgico de Y es Falso

Entender el comportamiento de una variable local.


Disee el siguiente formulario

Private Sub CommandButton1_Click()


Dim a As Integer
a=5
Text1 = a
End Sub

Elaborado por: Dennis Pichilingue R Pgina: 9


Ms. Excel VBA - Nivel II

Private Sub CommandButton2_Click()


Text1 = a
End Sub

La variable a es un variable local para el control command1 (Varlocal1). Como nos


damos cuenta de esto. Si usted edita el cdigo y ejecuta el programa ver que
cuando presiona el botn de command1, en el Text1 se muestra el valor 5.
Si usted presiona el botn command2 en el Text1 se muestra el valor nulo, ya que
la variable a asignada a Text1 en el commnad2 es diferente a la variable a
declarada en el command1.
Conclusin:
a es una variable local en command1, evento click y tiene como mbito slo el
command1, evento click.
La variable a asignada en el command2 es otra variable que ocupa otra posicin
de memoria a pesar que tengan el mismo nombre.

Entender el comportamiento de una variable a nivel de formulario


1. Disee el siguiente formulario

General Declaraciones
Dim b As Integer

Private Sub CommandButton1_Click()


b=5
Text1 = b
End Sub

Private Sub CommandButton2_Click().


Text1 = b + 2
End Sub

La variable b es un variable a nivel de formulario esto quiere decir que tiene como
mbito todo el formulario, sus controles y eventos. Como nos damos cuenta de esto.
Si usted edita el cdigo y ejecuta el programa ver que cuando presiona el botn
de command1, en el Text1 se muestra el valor 5.

Pgina: 10 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Si usted presiona el botn command2 en el Text1 se muestra el valor 7, ya que la


variable b asignada a Text1 en el commnad2 es la misma variable b utilizada en
el command1.
Conclusin:
Si usted declara una variable en el objeto General, procedimiento Declaraciones,
esta variable se comportar como una variable a nivel de formulario y tiene como
mbito todo el formulario.
La variable b declarada en el objeto General, procedimiento declaraciones, es la
misma variable b utilizada en el command1 y command2.

Entender el comportamiento de una variable static.

Private Sub CommandButton2_Click()


Static c As Integer
c = c + 3 Contador
Text1 = c
End Sub

La variable c es un variable static, esto quiere decir que retiene su valor cada vez
que ejecuta el evento click en el command1. Como nos damos cuenta de esto. Si
usted edita el cdigo y ejecuta el programa ver que cuando presiona el botn
command1, en el Text1 se muestra el valor 3, si vuelve a presionarlo el botn
command1 en el Text1 se muestra el valor 6, si vuelve a presionar el botn
command1 en el Text1 se muestra el valor 9, se comporta como un contador.
Conclusin:
c es una variable static, no se reinicia, retiene su valor, esto hace que se comporte
como un contador. Una variable static, slo se puede declarar en eventos de los
controles mas no en el objeto General, evento Declaraciones.

Elaborado por: Dennis Pichilingue R Pgina: 11


Ms. Excel VBA - Nivel II

Entender el comportamiento de una variable declarada en un


mdulo.

Private Sub Command1_Click()


d=d+5
Text1 = d
End Sub

Private Sub Command2_Click()


Form2.Show
End Sub

Private Sub Command1_Click()


d=d+3
Text1 = d
End Sub

La variable d es una variable pblica a nivel de mdulo, esto quiere decir que tiene
como mbito todos los formularios del proyecto.
Como nos damos cuenta de esto. Si usted edita el cdigo y ejecuta el programa
ver que cuando presiona el botn command1 del form1, en el Text1 se muestra el
valor 5, si vuelve a presionarlo el botn command1 en el Text1 se muestra el valor
10, se comporta como un contador.
Cuando pasa al segundo Form2 y presiona el botn Command1 en el Text1 se
muestra el valor 13. Pasa el valor de la variable d del form1 al form2.

Pgina: 12 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Conclusin:
c es una variable static, no se reinicia, retiene su valor, esto hace que se comporte
como un contador..
Una variable static, slo se puede declarar en eventos de los controles mas no en
el objeto General, evento Declaraciones

Mtodos de bsqueda (Elaborado por Daniel Zavaleta)


1. Diseo de la hoja

Elaborado por: Dennis Pichilingue R Pgina: 13


Ms. Excel VBA - Nivel II

3. Nombres de rango

2. Programa
Sub Busca1()
T = Timer
Range("Valor").ClearContents
Range("Tiempo").ClearContents
Application.ScreenUpdating = False
Range("Lista").Select
While ActiveCell <> Range("Dato")
ActiveCell.Offset(1, 0).Select
Wend
Range("Valor") = ActiveCell.Offset(0, 1)
Range("Valor").Select
Application.ScreenUpdating = True
Range("Tiempo") = Timer - T
End Sub

Pgina: 14 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Sub Busca2()
T = Timer
Range("Valor").ClearContents
Range("Tiempo").ClearContents
Application.ScreenUpdating = False
Dato = Range("Dato")
Range("Lista").Select
Cells.Find(What:=Dato, After:=ActiveCell, LookIn:=xlValues, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate
Range("Valor") = ActiveCell.Offset(0, 1)
Range("Valor").Select
Application.ScreenUpdating = True
Range("Tiempo") = Timer - T
End Sub
Sub Busca3()
T = Timer
Range("Valor").ClearContents
Range("Tiempo").ClearContents
Dato = Range("Dato")
Set c = Range("Lista").Find(Dato, LookIn:=xlValues)
If Not c Is Nothing Then
Celda = c.Address
Range("Valor") = Range(Celda).Offset(0, 1)
End If
Range("Valor").Select
Range("Tiempo") = Timer - T
End Sub
Sub Busca4()
T = Timer
Range("Valor").ClearContents
Range("Tiempo").ClearContents
Dato = Range("Dato")
Range("Valor") = Range("Lista").Cells.Find(Dato, , , xlWhole).Offset(0, 1)
Range("Tiempo") = Timer - T
End Sub
Elaborado por: Dennis Pichilingue R Pgina: 15
Ms. Excel VBA - Nivel II

Sub Busca5()
T = Timer
Range("Valor").ClearContents
Range("Tiempo").ClearContents
Dato = Range("Dato")
Range("Valor") = Application.Evaluate("=vlookup(Dato,Cuadro,2,0)")
Range("Tiempo") = Timer - T
End Sub
Sub Borrar()
Range("Valor").ClearContents
Range("Tiempo").ClearContents
End Sub

2.4 Tipos de objetos


Los objetos permiten automatizar y personalizar el trabajo diario. A continuacin se
describe algunos objetos:
- Application. Es el objeto superior y representa a Excel. a travs de este
objeto podremos acceder a las opciones que da Excel como: Hacer visible Excel,
manipular la creacin barras de herramientas o el asistente de Excel, elegir si el
clculo es manual o automtico, o cada cuantos minutos se auto guardar el libro,
etc.
- Workbok. Se refiere a los
libros. A travs de este objeto
podremos abrir libros de trabajos,
guardarlos, protegerlos, mandar a
imprimir, etc.
- WorkSheet. Brinda acceso a
todo lo que conocemos de las
hojas, podemos nombrarlas,
crearlas, borrarlas, protegerlas,
ordenarlas, ocultarlas, colorearlas,
etc
- Range. Es una celda o rango de celdas, as como las columnas y filas, los
subrangos que queramos tomar, las reas, selecciones sobre celdas, y rangos
con nombre, etc.
Range nos permite introducir valores, realizar operaciones, dar formatos, insertar
celdas, borrarlas, colorearlas etc.

Pgina: 16 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Conectamos un objeto con sus propiedades y mtodos a


travs de un punto.

Objetos Propiedad

Worksheets(1).Cells(1).Font.Size = 15

Objetos Propiedad

Application.ActiveWorkbook.Worksheets("Hoja1").Range ("A1").Value = 5

Los objetos de Excel clases y jerarqua


Los objetos de Excel se clasifican en Clases y estas se ordenan en Jerarqua.
Las colecciones son el conjunto de objetos similares que pertenecen a la misma
clase.
Referencia a la hoja forma 1.
Conjunto de hojas forman una coleccin del objeto Worksheets
Ejemplo: Worksheets(Hoja1)
Objeto

Referencia a la hoja forma 2.


Conjunto de hojas forman una coleccin del objeto Worksheets
Ejemplo: Worksheets(1)
Objeto

Las jerarquas
Nos ayuda hacer referencia a los objetos segn su posicin en la jerarqua de objetos.
Utilice un punto para separar los objetos. Ejemplo.

Aplicacin Libro Hoja celda

Application.Workbooks(datos.xlsx).Worksheets(Hoja1). Range(A1)

Elaborado por: Dennis Pichilingue R Pgina: 17


Ms. Excel VBA - Nivel II

Si el libro active es datos.xlsx podemos resumir la referencia a:


Worksheets(Hoja1). Range(A1)

Objeto Range
El objeto Range est contenido dentro del objeto Worksheet y consta de una o varias
celdas.
Application.Workbooks(datos.xlsx).Worksheets(Hoja1).
Range(A1).value=1
Worksheets(Hoja1). Range(Input).value=1
Worksheets(Hoja1). Range(A1,B10).value=1

Pgina: 18 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Modelo de objetos de Excel

Elaborado por: Dennis Pichilingue R Pgina: 19


Ms. Excel VBA - Nivel II

El examinador de objetos
Muestra los eventos, mtodos y propiedades asociados a cada objeto.

Hay tres paneles que a continuacin se describe

Panel Objetos, los iconos identifican las estructuras jerrquicas como


componentes .NET Framework y COM, espacios de nombres, bibliotecas de tipos,
interfaces, enumeraciones y clases. Puede expandir estas estructuras para
mostrar listas ordenadas de sus miembros.

Panel Miembros se muestran propiedades, mtodos, eventos, variables,


constantes y otros elementos contenidos.

Panel Descripcin se muestran detalles sobre el elemento seleccionado en el


panel Objetos o Miembros.

Estando en el editor de Visual Basic seleccionar men Ver, Examinador de


objetos
Se presenta la siguiente pantalla.

Propiedades

Mtodos

Evento

En la caja de texto escriba el nombre del objeto a examinar sus eventos, en el


cuadro miembros de se mostraran sus eventos

Pgina: 20 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

La ventana inmediato
Es una herramienta para probar instrucciones, expresiones VBA, propiedades y
mtodos. El resultado se muestra inmediatamente
Presionar las teclas Crtl + G para mostrar la ventana inmediato.

Ejecutar comandos
Presione las teclas Ctrl + Barra espaciadora para mostrar la lista de objetos
Ejemplos.
1: Workbooks.add Agrega un nuevo libro
2: Workbooks(1).close Cierra el libro activo
3: Workbooks(libro3).Activate Activa el libro3
4: Worksheets(2).Delete Elimina la hoja2
5: Worksheets(2).Activate Activa la hoja2
6: Worksheets.Add.Name = Ene Agrega una hoja con el nombre Ene
7: Worksheets(Array(1,2,3)).Select Selecciona la hoja 1,2 y 3

Mostrar los valores de las propiedades


Para averiguar lo que hace una propiedad escriba:
Interrogacin ?, luego el nombre del objeto, seguido del punto, luego el nombre de
la propiedad
Ejemplos:
1: ? Workbooks.count Muestra la cantidad de libros abiertos
2: ? Workbooks.item(1).name Muestra el nombre del libro activo
? Workbooks. (1).name Muestra el nombre del libro activo
3: ? Worksheets(2).Name Muestra nombre de la hoja

Elaborado por: Dennis Pichilingue R Pgina: 21


Ms. Excel VBA - Nivel II

3. Control de flujo del programa


3.1 Sentencia de bifurcacin
Permite que se ejecuten conjuntos distintos de instrucciones en funcin de que se
verifique o no una determinada condicin.

Expresiones lgicas
Imprescindibles para verificar condiciones son las expresiones lgicas, expresiones
cuya evaluacin produce un valor lgico.
a. Operadores de relacin
Se utiliza para establecer una relacin, entre un valor numrico con sus
respectiva variable o entre expresiones matemticas. Entre los operadores de
relacin tenemos:
= igualdad
< Menor que
<= menor o igual que
> Mayor que
>= mayor o igual que
< > Diferente
Is Compara dos variables de referencia a objetos
Objeto Is Var resulta en True suponiendo que Objeto sea igual a X y que
X igual a Var
Like Compara dos secuencias de caracteres. FnnnF Like F*F resulta en
True.
Ejemplos
1. Verificar si es verdadero o falso
Relacin Resultados
5>3 es verdadero
3=2 es falso

2. Dado las siguientes variables A=3, B=4 y C=3 entonces evaluar los
resultados:
A=B falso ; A<B verdadero
A=C verdadero ; A <= C verdadero

Pgina: 22 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

b. Operadores lgicos.
Se utiliza para establecer condiciones entre expresiones. Entre los operadores
lgicos tenemos:
not No lgico
and Y lgico
or O lgico.

c. Tablas de verdad
Negacin (not)
Invierte la condicin de la expresin.
P not P
V F
F V

Conjuncin (and)
Es verdadero (true), si todas las comparaciones son verdaderas. Si alguna es
falsa el resultado es falso (false)

p q p and q
V V V
V F F
F V F
F F F
Disyuncin (or)
Es verdadera si una de las dos comparaciones lo es. Si ambas, son falsas, el
resultado es falso.

p q p or q
V V V
V F V
F V V
F F F

Elaborado por: Dennis Pichilingue R Pgina: 23


Ms. Excel VBA - Nivel II

Ejemplos:
1. (1 > 0) AND (3 = 3) verdadero
2. (0 < 7) OR (0 > 7) verdadero
3. Defina una expresin lgica que evalu si un nmero se encuentra en el
rango de nmeros 48 y 57. Sea n el nmero
(n >= 48 and n <= 57)
4. Defina una expresin lgica que evalu si un nmero se encuentra en el
rango de nmeros 65 y 90, o en el rango 95 y 122. Sea n el nmero.
(n >= 65 and n <= 90) or (n >= 95 and n <= 122)
5. Defina una expresin lgica que evalu si un nmero se encuentra entre el
siguiente listado de nmeros 8, 32, 13, 25,27, 42. Sea n el nmero.
(n = 8 or n=32 or n=13 or n=25 or n=27 or n=42)
6. Formas de representar una negacin lgica:
Not True = False
7. La expresin "NO a es igual a b" not(a) =b
Es verdadera si a es distinto de b, y es falsa si a es igual a b.
8. La expresin " NO a es menor que b not(a) < b
Es falsa si (a<b) es verdadero, y es verdadera si la comparacin es falsa.
Por tanto, el operador NOT actuando sobre (a<b) es equivalente a (a>=b)

3.1.1 If...Then
Use la estructura If...Then para ejecutar una o ms instrucciones basadas en una
expresin lgica. Puede utilizar la sintaxis de una lnea o un bloque de varias lneas:

Sintaxis 1:
If expresin lgica Then Sentencias
Sintaxis 2:
If expresin lgica Then
Sentencias
End If
Si condicin es True, Visual Basic ejecuta todas las sentencias que siguen a la
palabra clave Then.

Pgina: 24 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Ejemplo 1
Utilizando If Then en una lnea
Sub elimina1()
Rem si la celda B2 contiene una u en su texto, eliminamos la fila 2
If Cells(2, 2) Like "*u*" Then Rows(2).Delete
End Sub

Ejemplo 2
Colocando las instrucciones debajo del then
Sub elimina2()
If Cells(2, 2) Like "*u*" Then
Rows(2).Delete
End If
End Sub

3.1.2 If...Then...Else
Utilice un bloque IF...THEN...ELSE para definir dos bloques de sentencias, uno de
los cuales se ejecutar. VBA evala primero la expresin lgica
Si es verdadero ejecuta el bloque de cdigo que sigue a Then.
Si es falso ejecuta el bloque de cdigo que sigue a Else.
Sintaxis:
If expresin lgica Then
Instrucciones 1
Else
Instrucciones 2
End If

Ejemplo.
Calcular el impuesto por 4ta. Categora

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger,


ByVal Shift As Integer)
If (KeyCode > 47 And KeyCode < 58) Or KeyCode = 8 Or KeyCode = 32 Or KeyCode
= 13 Then
If KeyCode = 13 Then
If Val(TextBox1) >= 3500 Then
Elaborado por: Dennis Pichilingue R Pgina: 25
Ms. Excel VBA - Nivel II

TextBox2.Text = 0.1 * (Val(TextBox1) - 3500)


Else
TextBox2.Text = 0
End If
End If
Else
KeyCode = 0
End If
End Sub

3.1.3 If...Then...ElseIF
Utilice un bloque If...The...Else para definir varios bloques de sentencias, uno de los
cuales se ejecutar:
Sintaxis:
If expresin lgica1 Then
[bloque de sentencias 1]
[ElseIf expresin lgica2 Then
[bloque de sentencias 2]] ...
[Else
[bloque de sentencias n]]
End If
Visual Basic evala primero la expresin lgica1. Si es False, Visual Basic procede
a evaluar la expresin lgica2 y as sucesivamente, hasta que encuentre una
condicin True.
Cuando encuentra una condicin True, Visual Basic ejecuta el bloque de
instrucciones correspondientes y despus ejecuta el cdigo que sigue a End If.
Opcionalmente, puede incluir un bloque de instrucciones Else, que Visual Basic
ejecutar sin ninguna de las condiciones es True.
Nota.
El evento KeyPress ocurre cuando presiona:
Un carcter del teclado
La tecla CTRL en combinacin con una tecla alfabtica
La tecla CTRL en combinacin con un carcter especial
BACKSPACE.
ESC.
El evento KeyPress no ocurre cuando presiona:
TAB.
ENTER.
Teclas flechas

Pgina: 26 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Ejemplo
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger,
ByVal Shift As Integer)
If KeyCode = 13 Then
If TextBox1 = "ALFA" Then
MsgBox ("Bienvenido al sistema")
Else
MsgBox ("Clave errada")
End If
End If
End Sub

Utilizacin de If...Then...ElseIf . Para verificar el estado aprobado o desaprobado,


segn la nota de un alumno
1. Disee el siguiente formulario

2. Edite el siguiente programa


Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger,
ByVal Shift As Integer)
If KeyCode = vbKeyReturn Then ' Si presiona la tecla Enter
If Val(TextBox1) <= 10 Then
MsgBox "Desaprobado"
ElseIf Val(TextBox1) > 10 And Val(TextBox1) <= 20 Then
MsgBox "Aprobado"
Else
MsgBox "Ingrese una nota vlida"
End If
End If
End Sub

3.2 Seleccin mltiple: Select Case


Ejecuta uno de varios grupos de instrucciones, dependiendo del valor de una
expresin. La instruccin Select Case se utiliza como alternativa a las instrucciones
ElseIf en instrucciones If...Then...Else cuando se compara una expresin con varios
valores diferentes. Mientras que las instrucciones If...Then...Else pueden comparar
una expresin distinta para cada instruccin ElseIf, la instruccin Select Case compara
nicamente la expresin que evala al comienzo de la estructura de control. Las
instrucciones Select Case se pueden anidar. Cada instruccin Select Case debe tener
su correspondiente instruccin End Select.
Elaborado por: Dennis Pichilingue R Pgina: 27
Ms. Excel VBA - Nivel II

Sintaxis
Select Case expresin_prueba
Case lista_expresion-n
instrucciones-n...
Case Else
instrucciones_else
End Select

Donde:
Expresin_prueba . Expresin numrica o expresin de cadena.
Lista_expresin-n . Lista delimitada por comas de una o ms de las formas
siguientes: expresin, expresin To expresin, Is operador_de_comparacin
expresin.
Instrucciones-n. Una o ms instrucciones
Instrucciones_else. Instrucciones que se ejecuten si expresin_prueba no coincide
con ninguna de las clusulas Case.

Como usar las instrucciones Select Case


En el siguiente ejemplo, la instruccin Select Case evala el argumento rendimiento
que se pasa al procedimiento. Observe que cada instruccin Case puede contener
ms de un valor, una gama de valores, o una combinacin de valores y operadores de
comparacin. La instruccin opcional Case Else se ejecuta si la instruccin Select
Case no encuentra ninguna igualdad con los valores de la instrucciones Case.

Sub Pago()
Sueldo = Range("C4")
Select Case Sueldo
Case Is <1500
Aumento = Sueldo * 0.20
Case Is <2000
Aumento = Sueldo * 0.15
Case Is <3000
Aumento = Sueldo * 0.10
Case 3000 To 4000
Aumento = Sueldo * 0.05
Case Else
Aumento = 0
End Select
Range("C5") = Aumento
End Sub

Pgina: 28 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

1- Comparar 2 nmeros ubicados en 2 celdas, y responder, en una tercera


celda, si son iguales o no
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

2. Verificar si dos nmeros ubicados en las celdas D1 y E1 son iguales, mayores


o menores, ubicando la respuesta en la celda D4 utilizandom if .. then

Sub Anidamiento ()
If ActiveSheet.Range("D1").Value = ActiveSheet.Range("E1").Value Then
ActiveSheet.Range("D4").Value = "Los Valores de D1 y E1 son iguales"
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

3. Verificar si dos nmeros ubicados en las celdas D1 y E1 son iguales, mayores


o menores, ubicando la respuesta en la celda D4 utilizando select .. case

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

4. 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
Elaborado por: Dennis Pichilingue R Pgina: 29
Ms. Excel VBA - Nivel II

Distinguido= 9
Sobresaliente= 10

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
Case 9
ActiveSheet.Range("B2").Value = "DISTINGUIDO"
Range("E1").Select
Case 10
ActiveSheet.Range("B2").Value = "SOBRESALIENTE"
Range("E1").Select
End Select
End Sub

3.3 Sentencia With


Ejecuta una serie de instrucciones sobre un nico objeto.
Sintaxis
With objeto
Instrucciones
End With
Donde:
Objeto. Nombre de un objeto.
Instrucciones. Una o ms instrucciones que se van a ejecutar sobre el objeto.
La instruccin With permite realizar una serie de instrucciones sobre un objeto
especificado sin volver a calificar el nombre del objeto. Por ejemplo, para cambiar un
nmero de propiedades diferentes en un nico objeto, es ms conveniente colocar las
instrucciones de asignacin de las propiedades en la estructura de control With,
haciendo referencia al objeto una vez, en lugar de hacerlo con cada asignacin de
propiedad.

Como usar las instrucciones With


La instruccin With permite especificar una vez un objeto o tipo definido por el usuario
en una serie entera de instrucciones. Las instrucciones With aceleran la ejecucin de
los procedimientos y ayudan a evitar el tener que escribir repetidas veces las mismas
palabras.
Pgina: 30 Elaborado por: Dennis Pichilingue R
Ms. Excel VBA - Nivel II

El siguiente ejemplo introduce en un rango de celdas el nmero 30, aplica a esas


celdas un formato en negrita y hace que su color de fondo sea el amarillo.
Si se deseara seleccionar la celda A1 de la Hoja2 y luego modificar en ella lo siguiente;
Ancho de columna = 50, Altura de fila = 20, Letra negrita, Tamao de
fuente 20 puntos, Color de fuente Roja, Centrado en la celda
Podramos escribir las siguientes instrucciones:

Sub Titulo ()
Worksheets("Hoja2").Range("A1").Select
Selection.ColumnWidth = 50
Selection.RowHeight = 20
Selection.Font.Bold = True
Selection.Size = 20
Selection.Font.ColorIndex = 3
Selection.HorizontalAlignment = xlCenter
End Sub
El siguiente ejemplo realiza lo mismo que el caso anterior e ilustra el uso de la
instruccin With para asignar valores a varias propiedades del mismo objeto.
Sub Titulo ()
Range("A1").Select
With Selection
.ColumnWidth = 50
.RowHeight = 20
.Font.Bold = True
.Size = 20
.Font.ColorIndex = 3
.HorizontalAlignment = xlCenter
End With
End Sub

Las instrucciones With se pueden anidar para aumentar su eficiencia.


El siguiente ejemplo inserta una formula en la celda C4 que obtiene la raz cuadrada
de 200 y selecciona a continuacin el tipo de letra. Luego modifica el ancho de la
columna. (Note que se especifica que C4 se encuentra dentro de la hoja Clientes del
archivo Pagos.xls. De no hacerse as la macro supondra que se trata de la celda C4
de la hoja y libro activos en ese instante.)

Sub RaizCuadrada ()
With Workbooks("Pagos.xls").Worksheets("Clientes").Range("C4")
.Formula = "=SQRT(200)"
With .Font
.Name = "Arial"
.Bold = True
.Size = 8
End With
.ColumnWidth = 20
End With
End Sub

Elaborado por: Dennis Pichilingue R Pgina: 31


Ms. Excel VBA - Nivel II

3.4 Sentencia de repeticin o bucle


a. While...Wend
Ejecuta una serie de instrucciones mientras una condicin dada sea True. Los bucles
While...Wend se pueden anidar a cualquier nivel. Cada Wend coincide con el While
ms reciente.
Donde:
Condicin. Expresin numrica o expresin de cadena cuyo valor es Verdadero o
Falso. Si condicin es Null, condicin se considera Falso.
Instrucciones. Una o ms instrucciones que se ejecutan mientras la condicin es
Verdadera, todas las instrucciones se ejecutan hasta que se encuentra la instruccin
Wend.
Sintaxis
While condicin
Intrucciones
Wend
Ejemplo. La siguiente macro busca a partir de la celda B3 hacia abajo una celda que
se encuentre vaca.
Sub BuscaBlanco ()
Range("B3").select
While ActiveCell <> Empty
ActiveCell.Offset(1,0).Activate
Wend
End Sub

b. For...Next
Repite un grupo de instrucciones un nmero especfico de veces. Se pueden anidar
bucles For...Next, colocando un bucle For...Next dentro de otro.
Sintaxis
For contador = inicio To fin Step incremento
Instrucciones
Exit For
Instrucciones
Next contador
Donde:
Contador. Variable numrica que se utiliza como contador de bucle.
Inicio. Valor inicial del contador.
Fin. Valor final del contador.
Incremento. Cantidad en la que cambia el contador cada vez que se ejecuta el bucle.
Si no se especifica, el valor predeterminado de incremento es uno.
Exit for. Sale del ciclo repetitive for .. next.

Pgina: 32 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Como usar las instrucciones For...Next


Las instrucciones For...Next se pueden utilizar para repetir un bloque de instrucciones
un nmero determinado de veces. Los bucles For usan una variable contador cuyo
valor se aumenta o disminuye cada vez que se ejecuta el bucle.
El siguiente procedimiento hace que el equipo emita un sonido 50 veces. La instruccin
For determina la variable contador x y sus valores inicial y final. La instruccin Next
incrementa el valor de la variable contador en 1.
Sub Bips()
For x = 1 To 50
Beep
Next x
End Sub

Mediante la palabra clave Step, se puede aumentar o disminuir la variable contador en


el valor que se desee. En el siguiente ejemplo TotalPares, la variable contador N se
incrementa en 2 cada vez que se repite la ejecucin del bucle. Cuando el bucle deja
de ejecutarse, Total representa la suma de 2, 4, 6, 8 y 10.
Sub TotalPares ()
For Num = 2 To 10 Step 2
Total = Total + Num
Next Num
MsgBox "El total es " & Total
End Sub

Para disminuir la variable contador utilice un valor negativo en Step. Para disminuir la
variable contador es preciso especificar un valor final que sea menor que el valor inicial.
En el siguiente ejemplo OtroTotal, la variable contador Cant se disminuye en 2 cada
vez que se repite el bucle. Cuando termina la ejecucin del bucle, Total representa la
suma de 16, 14, 12, 10, 8, 6, 4 y 2.

Sub OtroTotal ()
For Cant = 16 To 2 Step -2
Total = Total + Cant
Next Cant
MsgBox "El total es " & total
End Sub

c. Do...Loop
Repite un bloque de instrucciones cuando una condicin es Verdadera o hasta que
una condicin se convierta en Falsa. Utilice instrucciones Exit Do para salir de este
ciclo repetitivo, la instruccin Exit Do transfiere el control a la instruccin que sigue
inmediatamente a la instruccin Loop.
Cuando se utiliza con instrucciones anidadas DoLoop, la instruccin Exit Do
transfiere control al bucle que est anidado un nivel por encima del bucle donde
ocurre.

Elaborado por: Dennis Pichilingue R Pgina: 33


Ms. Excel VBA - Nivel II

Sintaxis 1 Sintaxis 2
Do While | Until condicin Do
instrucciones instrucciones
Exit Do Exit Do
instrucciones instrucciones
Loop Loop While | Until condici

Donde:
Condicin. Expresin numrica o expresin de cadena que es Verdadera o Falsa. Si
la condicin es Null, la condicin se considera Falsa.
Instrucciones. Una o ms instrucciones que se repiten mientras (While) o hasta que
(Until) la condicin sea Verdadera

Como usar las instrucciones Do...Loop


Se pueden usar instrucciones Do...Loop para ejecutar un bloque de instrucciones un
nmero indefinido de veces. Las instrucciones se repiten mientras (While) una
condicin sea Verdadera o hasta (Until) que llegue a ser Verdadera.

a. Repetir instrucciones mientras una condicin es Verdadera


Hay dos formas de utilizar la palabra clave While (Mientras) para comprobar el estado
de una condicin en una instruccin Do...Loop. Se puede comprobar la condicin antes
de entrar en el bucle, o despus de que el bucle se haya ejecutado al menos una
vez.En el siguiente procedimiento WhileInicial, la condicin se comprueba antes de
entrar en el bucle. Mientras la Nota es menor a que 10, aumentar la Nota en 1.Si Nota
es mayor que 10, las instrucciones contenidas en el bucle no se ejecutarn nunca. En
el procedimiento WhileFinal, las instrucciones contenidas en el bucle al menos se
ejecutarn una vez y aumentarn la Nota en 1, antes de comprobarse que la condicin
es Falsa.

Sub WhileInicial()
Contador = 0
Nota = Range("D4")
Do While Nota < 10
Nota = Nota + 1
Contador = contador + 1
Loop
MsgBox "El bucle se ha repetido " & Contador & " veces."
End Sub

Sub WhileFinal()
Contador = 0
Nota = Range("D4")
Do
Nota = Nota + 1
Contador = contador + 1
Loop While Nota < 10
MsgBox "El bucle se ha repetido " & Contador & " veces."
End Su
Pgina: 34 Elaborado por: Dennis Pichilingue R
Ms. Excel VBA - Nivel II

b. Para repetir instrucciones hasta que una condicin llegue a ser


Verdadera
Hay dos formas de utilizar la palabra clave Until (Hasta que) 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 UntilInicial) o se pueden
comprobar despus de que el bucle se haya ejecutado al menos una vez (como
muestra el procedimiento UntilFinal). El bucle seguir ejecutndose mientras la
condicin siga siendo Falsa.

Sub UntilInicial()
Contador = 0
Nota = Range("D4")
Do Until Nota = 10
Nota = Nota + 1
Contador = Contador + 1
Loop
MsgBox "El bucle se ha repetido " & Contador & " veces."
End Sub

Sub UntilFinal()
Contador = 0
Nota = Range("D4")
Do
Nota = Nota + 1
Contador = Contador + 1
Loop Until Nota = 10
MsgBox "El bucle se ha repetido " & Contador & " veces."
End Sub

c. Para salir de Do...Loop desde dentro del bucle


Es posible salir de Do...Loop usando la instruccin Exit Do. Por ejemplo, para salir de
un bucle sin fin, se puede usar la instruccin Exit Do en el bloque de instrucciones
True de una instruccin If...Then...Else o Select Case. Si la condicin es False, el bucle
seguir ejecutndose normalmente.
En el siguiente ejemplo, si se asigna a Edad un valor que crea un bucle sin fin, por
ejemplo si la Edad escrita en D4 es menor que 25. La instruccin If...Then...Else
comprueba esa condicin y ejecuta entonces la salida, evitando as el bucle sin fin.
Sub EjemploSalida()
Contador = 0
Edad = Range("E4")
Do Until Edad = 25
Edad = Edad - 1
Contador = contador + 1
If Edad < 25 Then Exit Do
Loop
MsgBox "El bucle se ha repetido " & Contador & " veces."
End Sub

Elaborado por: Dennis Pichilingue R Pgina: 35


Ms. Excel VBA - Nivel II

d. For Each...Next
Repite un grupo de instrucciones para cada elemento de una matriz o coleccin. La
entrada al bloque For Each se produce si hay al menos un elemento en grupo. Una
vez que se ha entrado en el bucle, todas las instrucciones en el bucle se ejecutan para
el primer elemento en grupo. Despus, mientras haya ms elementos en grupo, las
instrucciones en el bucle continan ejecutndose para cada elemento. Cuando no hay
ms elementos en el grupo, se sale del bucle y la ejecucin contina con la instruccin
que sigue a la instruccin Next.
Puede anidar bucles For Each...Next, colocando un bucle For Each...Next dentro de
otro. Sin embargo, cada elemento del bucle debe ser nico.
Sintaxis
For Each elemento In grupo
instrucciones
Exit For
instrucciones
Next elemento

Donde:
Elemento. Variable (Variant, object) que se utiliza para iterar por los elementos del
conjunto o matriz.
Grupo. Nombre de un conjunto de objetos o de una matriz.
Instrucciones. Una o ms instrucciones que se ejecutan para cada elemento de un
grupo.

Como usar las instrucciones For Each...Next


Las instrucciones For Each...Next repiten un bloque de instrucciones para cada uno
de los objetos de una coleccin o para cada elemento de una matriz. Visual Basic
asigna valor automticamente a una variable cada vez que se ejecuta el bucle.

a. Para recorrer un conjunto de celdas


Se puede usar el bucle For Each...Next para recorrer las celdas pertenecientes a un
rango determinado.
El siguiente ejemplo vuelve negrita todas aquellas celdas dentro del rango C4:C20 que
sean mayores que 10. (La palabra Casilla es el nombre que se le ha dado a cada
elemento del rango. Puede usarse cualquier otro nombre si se desea.)

Sub a()
For Each Casilla In Range("C4:C20")
If Casilla > 10 Then Casilla.Font.Bold = True
Next
End Sub
El cdigo siguiente recorre todas las celdas de un rango, asignado a la variable Cuadro
con la instruccin Set, e introduce el valor de la variable P en aquellas celdas cuyos
contenidos son menores o iguales a 10.

Pgina: 36 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Sub Escribe()
P = Range("B1")
Set Cuadro = Range("C4:C20")
For Each Cel In Cuadro
If Cel <= 10 Then Cel.Value = P
Next
End Sub
El siguiente ejemplo recorre las celdas del rango B3:B15 y convierte cualquier valor
absoluto menor de 0.01 en 0 (cero).

Sub ValeCero()
Set Lecturas = Range("B3:B15")
For Each Dato in Lecturas
If Abs(Dato.Value) < 0.01 Then Dato.Value = 0
Next
End Sub

El siguiente procedimiento cierra todos los formularios excepto el que contiene al


procedimiento que se est ejecutando.
Sub CierraFormularios()
For Each Ficha In Application.Forms
If Ficha.Caption <> Screen.ActiveForm.Caption Then Ficha.Close
Next
End Sub

Este otro ejemplo agrega tantas hojas nuevas al libro activo como textos hay en el
rango B1:B5, y a continuacin nombra a estas hojas con los textos que va encontrando.
Sub CreaHojas()
For Each Nombre In Range("B1:B5")
If Nombre <> Empty Then
Set NewSheet = Worksheets.Add
NewSheet.Name = Nombre
End If
Next
End Sub

Este ltimo ejemplo muestra el nombre de cada una de las hojas de clculo del libro
activo.
Sub VerHojas()
For Each Hoja In Worksheets
MsgBox Hoja.Name
Next
End Sub

b. Para salir de un bucle For Each...Next antes de que finalice


El siguiente ejemplo detecta la primera celda del rango C3:C30 que no contiene un
nmero. Si se encuentra una celda en esas condiciones, se selecciona dicha celda y
se presenta un mensaje en pantalla, luego Exit For abandona el bucle.

Elaborado por: Dennis Pichilingue R Pgina: 37


Ms. Excel VBA - Nivel II

Sub EncuentraTexto()
For Each Celda In Range("C3:C30")
If Not IsNumeric(Celda) Then
Celda.Select
MsgBox "El objeto contiene un valor no numrico."
Exit For
End If
Next
End Sub

1.
1. Sumar un rango de nmeros
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
2. Mostrar el nombre UNI en diagonal
Sub Macro1()
Dim a As Integer
Dim j As Integer
Hoja1.Cells(1, 1) = "UNI"
For a = 2 To 8
For b = 1 To a
If ((a + b) Mod 2) = 0 Then
Hoja1.Cells(a, b) = Hoja1.Cells(1, 1)
End If
Next
Next
End Sub

Pgina: 38 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

3. Generar la serie Fibonacci y cambiar de color a la celda


Sub Macro1()
Dim i As Integer
Hoja1.Cells(1, 2) = Int(Rnd() * 10)
Hoja1.Cells(2, 2) = Int(Rnd() * 10)
i=1
Do While i < 21
Hoja1.Cells(i + 2, 2) = Hoja1.Cells(i, 2) + Hoja1.Cells(i + 1, 2)
Hoja1.Cells(i, 2).Select
With Selection.Interior
.ColorIndex = Int(Rnd() * 10)
.Pattern = xlSolid
End With
i=i+1
Loop
End Sub
4. Convertir pesetas a euro
Sub Convertir()
Set Area = Selection
For Each Cell In Area
z = Round(Cell / 166.386, 2)
Cell.Value = z
Cell.NumberFormat = "#,##0.00"
Next Cell
End Sub
5. Dos decimales
Sub DosDec()
Dim Area As Range
Set Area = Selection
For Each Cell In Area
z = Round(Cell, 2)
Cell.Value = z
Cell.NumberFormat = "#,##0.00"
Next Cell
End Sub
6. Suprimir filas vacas
Sub SuprimirFilasVacias()
LastRow = ActiveSheet.UsedRange.Row - 1 + _
ActiveSheet.UsedRange.Rows.Count
For r = LastRow To 1 Step -1
If Application.CountA(Rows(r)) = 0 Then
Rows(r).Delete
End If
Next r
End Sub

Elaborado por: Dennis Pichilingue R Pgina: 39


Ms. Excel VBA - Nivel II

7. Recorrer celdas de una hoja 2


Automtic

8. Recorrer celdas de una hoja 2

3.5 Instruccin GoTo


La instruccin GoTo permite que una instruccin especificada por una etiqueta de
lnea sea ejecutada, ignorando otras posibles instrucciones en el flujo normal de los
procedimientos. Podemos especificar etiquetas de lnea para cualquier fila del
cdigo, solo se debe insertar un nombre alfanumrico que empiece con una letra y
termine en dos puntos (:).

En el siguiente ejemplo de cdigo, cuando una condicin sea atendida, la


instruccin GoTo ser utilizada para ejecutar la instruccin identificada con la
etiqueta de lnea Errologin:
Sub GoToTest()
Dim UserName as String
UserName = InputBox (Escriba su nombre: )
If UserName <> Juliano Corinto Then
GoTo Errologin
Endif
MsgBox ( Hola, Juliano!)
..[Secuencia del cdigo]...
Exit Sub

Pgina: 40 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Errologin:
MsgBox Acceso denegado. Solo Juliano Corinto tiene permiso para acceder.
End Sub

3.6 Call
Call en VBA nos permite invocar la macro desde otro procedimiento (Sub o
Function) como si fuera un procedimiento cualquiera.
Al utilizar Call para llamar a tal procedimiento requerir que los argumentos estn
encerrados en parntesis, si este procedimiento no tuviera argumentos no se
colocaran.
Ejemplo del modo de uso, tenemos dos procedimientos diferentes pero que
cumplen la misma funcin, Proc1 uno no recibe parmetros mientras que Proc2 si
recibe parmetros.

Sub Proc1()
MsgBox Hola mundo
End Sub
Sub Proc2(mensaje As String)
MsgBox mensaje
End Sub

En el caso del Proc1


Si se desea llamar el procedimiento con Call se realizara de la siguiente forma:

Sub principal1()
Call Proc1
End Sub

Si se obviara Call simplemente se llamara de la siguiente forma:


Sub principal2()
Proc1
End Sub

Elaborado por: Dennis Pichilingue R Pgina: 41


Ms. Excel VBA - Nivel II

Registro DE UNA FACTURA

1. Diseo de la hoja OrdeDeCompra

2. Diseo de la hoja Lista de eproductos

Pgina: 42 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

3. Nombres de rango

4. Diseo del formulario

5. Programa

Elaborado por: Dennis Pichilingue R Pgina: 43


Ms. Excel VBA - Nivel II

Private Sub cmbid_Change()


If Trim(cmbid.Text) = "" Then Exit Sub
txtcategoria.Text = Range("productosid").Cells.Find(cmbid, , , xlWhole).Offset(0, 1)
txtprecio.Text = Range("productosid").Cells.Find(cmbid, , , xlWhole).Offset(0, 3)
End Sub

Private Sub cmbid_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)


If KeyAscii >= 32 Then KeyAscii = 0
End Sub

Sub limpiar()
Range("b11").Select
a=0
While ActiveCell <> ""
ActiveCell.Offset(1, 0).Select
a=a+1
If a > 5 Then
MsgBox "ya no puede agregar mas datos"
Range("registro").ClearContents
End If
Wend
cmbid.SetFocus
End Sub

Private Sub UserForm_Initialize()


txtfecha.Text = Date
cmbid.RowSource = "productosid"
txtmet.Text = Range("b8")
txtinc.Text = Range("d8")
txtins.Text = Range("f8")
txtpo.Text = Range("g4")
cmbid.SetFocus
End Sub

Pgina: 44 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Private Sub cmdcerrar_Click()


Unload Me
End Sub

Private Sub cmdregistrar_Click()


If cmbid.ListIndex = -1 Then
MsgBox "Debe seleccionar un articulo"
cmbid.SetFocus
Exit Sub
End If
If Val(txtcantidad.Text) <= 0 Then
MsgBox "Debe ingresar un No. entero mayor que cero"
txtcantidad.SetFocus
Exit Sub
End If
rpta = MsgBox("Registrar ", vbYesNo + vbQuestion)
If rpta = vbNo Then Exit Sub
Sheets("orden de compra").Select
Range("b10").Select
While ActiveCell <> ""
ActiveCell.Offset(1, 0).Select
Wend
ActiveCell = txtcantidad
ActiveCell.Offset(0, 1) = cmbid
ActiveCell.Offset(0, 2) = txtcategoria
ActiveCell.Offset(0, 4) = txtprecio
Call limpiar
End Sub

4. Manejo de archivos

Mtodo GetOpenFilename
El mtodo GetOpenFilename permite simplificar el acceso a archivos, lo que garantiza
que el nombre y la ruta del archivo estn correctos.
Abre el cuadro de dilogo Abrir y retorna una secuencia de caracteres el nombre del
archivo que el usuario selecciona

Elaborado por: Dennis Pichilingue R Pgina: 45


Ms. Excel VBA - Nivel II

Sintaxis:
Application.GetOpenFilename

Mtodo GetSaveAsFilename
Abre un cuadro de dilogo igual al cuadro de Guardar como de Excel y obtiene el
nombre de ruta del archivo pero sin que se realice cualquier accin con estas
informaciones.
Sintaxis:
object.GetSaveAsFilename ( [initialFilename], [fileFilter], [filterIndex], [title],
[buttonText] )
Donde:
InitialFilename: Este argumento determina cul ser el nombre patrn que se muestra
en el cuadro antes que el usuario seleccione otro archivo;
FileFilter: Con este argumento podemos determinar qu tipos de archivos se
encontrarn disponibles en el cuadro de dilogo para que el usuario seleccione;
Title: Este argumento determina el texto que se va a mostrar en la barra de ttulos del
cuadro de dilogo.
Ejemplo: Mostrar la ruta y nombre del archivo en un cuadro de dilogo:
MsgBox Application.GetSaveAsFilename

Procedimiento para abrir un archivo


(Elaborado por: Daniel Zegarra Zavaleta)
Sub AbrirArchivo()
'Elegir un archivo para abrirlo
ChDrive Left(ActiveWorkbook.Path, 1)
ChDir ActiveWorkbook.Path
Archivo = Application.GetOpenFilename("Archivos del Excel (*.xls*),*.xls*", , "Elija
el Archivo")
On Error GoTo Sale
Workbooks.Open Archivo
Archivo = ActiveWorkbook.Name
Rpta = MsgBox("El archivo: " & Archivo & " ha sido cargado" & vbNewLine &
"Desea cerrarlo?", vbYesNo)
If Rpta = vbNo Then Exit Sub
Application.DisplayAlerts = False
ActiveWorkbook.Close
Sale:
End Sub.

Pgina: 46 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Procedimiento que verifica si un Libro est abierto


(Elaborado por: Daniel Zegarra Zavaleta)

Utiliza el mandato For eachnext para recorrer por los libros abiertos y verificar si un
cierto archivo ya ha sido abierto anteriormente. Si no es as, abre el archivo, sino, activa
la ventana del archivo ya existente en la memoria.

Sub AbrirLibro2()
Ruta = ActiveWorkbook.Path
Archivo = InputBox("Nombre del archivo a abrir (Ej: Lista.xls Lista.xlsx)")
If Archivo = "" Then Exit Sub
For Each Libro In Application.Workbooks
If UCase(Libro.Name) = UCase(Archivo) Then
Windows(Archivo).Activate
Exit Sub
End If
Next

On Error GoTo NoHay

Workbooks.Open Ruta & "\" & Archivo


Exit Sub

NoHay:
MsgBox ("El archivo " & Archivo & " no existe en la carpeta actual")
End Sub

Elaborado por: Dennis Pichilingue R Pgina: 47


Ms. Excel VBA - Nivel II

Procedimiento que importa archivo de texto separado por tab


Archivo: textoConTab.txt
Valor
Ms mdio Conta
Esta Agnci abertura da depsito cheque
do Cidade a Cliente Conta conta s especial Gerente
Zueira Indstria e 355.343
PR Curitiba 700 Comrcio -8 Abril 578 0 Sim Jaime
355.567
PR Curitiba 700 Carne Boa S/A. -7 Junho 865 0 Sim Jaime
Primeiro Mundo 344.654
PR Curitiba 700 Magazine -8 Junho 870 0 No Jaime
Porto Companhia. 356.789
RS Alegre 950 Flokos -7 Fevereiro 700 0 No Perez
Porto 355.654
RS Alegre 955 Metalrgica Prego -9 Janeiro 720 0 No Vilma
Florian Amim Indstria 244.675 Antonio
SC polis 800 Ltda. -9 Abril 560 0 Sim Dias
Florian Tubaro Produtos 244.897
SC polis 800 Alimentcios -0 Outubro 955 0 Sim Mrcia

Mdulo1.
General Declaraciones
Private Caminho As String
Private NomeArq As String
Private CamiArq As String
Private Arq As String
Private App As Application

Sub Importa_Archivo_de_Texto()
'Importa un archivo de texto e inserta una hoja de clculo despus de la primera para
recibir los datos
Set App = Application 'Define el objeto application

'Define los estados de application


App.ScreenUpdating = False
App.DisplayAlerts = False

'Define el nombre y ruta de los archivos involucrados


Caminho = ActiveWorkbook.Path
NomeArq = " textoConTab.txt"
CamiArq = Caminho & "\" & NomeArq

'Verifica si las carpetas estn como una sla hoja de clculo.


'Si existe ms de una hoja de clculo elimina las excedentes
n = Sheets.Count

Pgina: 48 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Do Until n = 1
Sheets(n).Delete
n=n-1
Loop
On Error Resume Next

'Abre el archivo txt


Workbooks.OpenText Filename:=CamiArq, DataType:=xlDelimited, _
TextQualifier:=xlTextQualifierDoubleQuote, Tab:=False, Semicolon:=False, _
Comma:=True, Space:=False

'Crea una segunda hoja de clculo y transfiere los datos


ActiveSheet.Move After:=Workbooks(Arq).Sheets(1)

'Ajusta el tamao de las columnas


Sheets(2).Cells.Columns.AutoFit

'Devuelve los estados por defecto de application


App.DisplayAlerts = True
App.ScreenUpdating = True
End Sub

FileSystemObject
El objeto FileSystemObject, habilita el acceso al sistema de todos los archivos de nuestros
PC.

FileSystemObject proporciona una estructura no jerrquica para manipular, leer y crear


archivos de texto ASCII y Unicode. Esta estructura es muy diferente de la estructura
jerrquica de la implementacin original de E/S de archivo de Visual Basic.

FileSystemObject no admite el acceso a archivos binarios, de modo que an debe usar el


modelo original E/S de archivos de Visual Basic para ello.

Elaborado por: Dennis Pichilingue R Pgina: 49


Ms. Excel VBA - Nivel II

Funcin que verifica si existe un archivo


Function fileExists(strFileFullPath As String) As Boolean
Dim objFSO As Object
Set objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.fileExists(strFileFullPath) Then fileExists = True
Set objFSO = Nothing
End Function

Private Sub CommandButton1_Click()


a = fileExists("Libro1.xlsm")
MsgBox a Si devuelve True quiere decir que existe
End Sub

Procedimiento que copia un archivo


Sub TestFSO()
Dim fso As Object ' Scripting.FileSystemObject
Set fso = GetFSO
If fso Is Nothing Then
Exit Sub
End If

' Copia archivo


fso.CopyFile "C:\My Files\*.xlsx", "C:\My Backup Folder\"
End Sub

Procedimiento con argumentos que copia un archivo


Sub FSOCopyFile(fso As Object, sourceFolder As String, _
destinationFolder As String, Optional overwrite As Boolean = True)
fso.CopyFile sourceFolder, destinationFolder, overwrite
End Sub

Procedimiento que crea una carpeta


Set fldr = fso.CreateFolder("C:\Prueba\")
End Sub

Procedimiento que elimina un archivo


Sub TestFSO()
Dim fso As Object ' Scripting.FileSystemObject
Set fso = GetFSO
If fso Is Nothing Then
Exit Sub
End If

fso.DeleteFile "C:\my files\*.docx"


End Sub

Pgina: 50 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Procedimiento con argumentos que elimina un archivo


Sub FSODeleteFile(fso As Object, filespec As String, Optional forceDelete As Boolean)
On Error Resume Next
fso.DeleteFile filespec, forceDelete
End Sub

5. Manejo del libro: WorkBook


Propiedades del objeto Workbooks:

Name: Esta propiedad cambia el nombre del archivo. Es una propiedad de solo
lectura.

El ejemplo a continuacin inserta el nombre del archivo en la celda activa:

ActiveCell = ActiveWorkbook.Name

FullName: Esta propiedad devuelve la ruta completa del archivo en el disco.


Es una propiedad de solo lectura. Imaginemos que existe un archivo llamado
Datos.xlsx, en la carpeta Valores, en la unidad C. El ejemplo siguiente definir el
valor de NombreTot como C:\Valores\Datos.xlsx:

NombreTot = Workbooks(Datos.xlsx).FullName

El mismo resultado se podr obtener con el uso del comando siguiente:

NombreTot = Activeworkbook.Fullname

Saved: Para los archivos guardados, esta propiedad devuelve el valor True;
para los archivos que no estuviesen guardados, les da el valor False.

Mtodos del objeto WorkBook


Algunos de los mtodos para el objeto Workbooks son los siguientes:

Close: Este mtodo cierra el archivo. A continuacin tenemos la representacin


de su sintaxis y, luego, la descripcin de cada uno de sus elementos:
Close(SaveChanges,FileName,RouteWorkbooks)

SaveChanges: Determina si el archivo debe o no ser guardado, por lo tanto,


se le puede definir como True o False;

Elaborado por: Dennis Pichilingue R Pgina: 51


Ms. Excel VBA - Nivel II

FileName: Es el nombre del archivo;

RouteWorkbooks: Determina si el archivo se debe dirigir o no destinatario


de circulacin.

Open: Se debe usar este mtodo para abrir un archivo. A


continuacin, tenemos la representacin de la sintaxis:
Workbooks.Open FileName:=Ruta del archivo
El ejemplo siguiente de la lnea de cdigo que abre un archivo es el siguiente:

Workbooks.Open Filename:=C:\documentos\RelMensal.xlsx

Save: Este mtodo guarda el archivo. A continuacin, tenemos la representacin


de su sintaxis:

Workbooks(<nombre del archivo>).Save

El ejemplo siguiente de la lnea de cdigo que guarda un archivo es el siguiente:


Workbooks(RelMensal.xlsx).Save

Protect: Se usa este mtodo para proteger el libro de trabajo y tiene una
funcin igual al comando Herramientas / Proteger / Proteger el libro de trabajo. La
sintaxis para ese mtodo es la siguiente:

Protect(Password,Structure,Windows)

Unprotect: Este mtodo elimina la proteccin del libro de trabajo. Su sintaxis


es la siguiente:

Unprotect(Password)

Ejemplo:

Workbooks(prueba1.xlsx).Unprotect 123Contrasea

6. Manejo de la hoja: WorkSheet


Las Worksheets son las hojas de un archivo. Se llama coleccin de Worksheets al
conjunto de hojas de un libro de trabajo. Cada una de las hojas es un objeto de la
coleccin. En algunos casos, a los objetos tambin se les llama Sheets.

Pgina: 52 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Propiedades de la hoja
A continuacin, se presentan las propiedades de Worksheets

Count: Esta propiedad cuenta la cantidad de hojas que existe en un


determinado archivo. Su sintaxis es la siguiente:

Worksheets.Count

Ejemplo:
Msgbox El archivo tiene & sheets.count & hoja(s)

Visible: Por medio de esta propiedad, se puede controlar la muestra de una


hoja, ya que True es el valor que la mantiene visible y False es el valor que la
mantiene oculta. El ejemplo siguiente muestra cmo ocultar la hoja Plan1:
Worksheets(Plan1).Visible = False

ScrollArea: Por medio de esta propiedad, se pueden definir los lmites de


desplazamiento por la hoja, ya que su funcin es dar o definir el rea de
desplazamiento. El ejemplo siguiente libera el desplazamiento entre A1 y L11 de
una hoja. En ese caso, no ser posible seleccionar otras celdas que no pertenecen
a esa regin.

WorkSheets(Plan1).ScrollArea = A1:L11

Para liberar la navegacin en todas las celdas de la hoja, solo es necesario digitar
el comando siguiente:
WorkSheets(Plan1).ScrollArea =

EnableSelection: Con esta propiedad, se puede determinar qu celdas


pueden seleccionarse cuando la hoja estuviese protegida, por medio de uno de los
valores siguientes:

xlNoRestrictions: Todas las celdas podrn seleccionarse;

xlNoSelection: Ninguna celda podr seleccionarse;

xlUnlockedCells: Solo se podr seleccionar las celdas que no


estuvieron protegidas cuando se protegi la hoja.

Elaborado por: Dennis Pichilingue R Pgina: 53


Ms. Excel VBA - Nivel II

El ejemplo siguiente no permite seleccionar las celdas de la hoja Plan1:

Worksheets(Plan1).EnableSelection = xlNoSelection

Mtodos de la hoja
A continuacin, se describen los mtodos del objeto Worksheets:

Add(Before,After,Count,Type)

Add: Por medio de este mtodo, se puede aadir hojas de clculo, macro de
Excel 4.0 o un grfico a un libro de trabajo. Su sintaxis se muestra a continuacin
y, luego se encuentra la descripcin de cada uno de sus elementos:
Before: Hoja antes de que se inserte la nueva;
After: Hoja despus de que se inserte la nueva;
Count: Cantidad de hojas que se insertarn;
Type: Tipo de la hoja que se insertar. Se puede usar el tipo xlWordSheet, que
corresponde a la planilla predeterminada, o xlExcel4MacroSheet, que corresponde
a la hoja de macro de Excel 4.0

En el siguiente ejemplo, se insertan dos hojas luego de la ltima hoja del libro de
trabajo:

Sheets.Add , Sheets(Sheets.Count)

Delete: Este mtodo no incluye las hojas del cuaderno de trabajo. La hoja que
se excluir puede indicarse por su nombre o por la posicin que ocupa en el
archivo. El ejemplo siguiente excluye la quinta hoja del archivo:

Sheets(4).Delete

Copy: Este mtodo copia una hoja a otra ubicacin en el archivo. La sintaxis
de este mtodo es la siguiente:

Copy(After,Before)

El ejemplo siguiente hace una copia de Hoja2 y la coloca despus de


Hoja3.
Sheets(Hoja2).Copy , Sheets(Hoja3)

Pgina: 54 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Move: Este mtodo mueve la hoja a otra ubicacin del archivo. Su sintaxis es
la siguiente:

Move(Before,After)

El ejemplo siguiente mueve la hoja Plan1 a la ltima ubicacin en el cuaderno de


trabajo.
Sheets(Plan1).Move , Sheets(Sheets.Count

Select: Para seleccionar una hoja, se debe usar este mtodo. La lnea siguiente
puede usarse para seleccionar la hoja Plan1:

Sheets(Plan1).Select

Protect: Este mtodo se utiliza para proteger la hoja y tiene una funcin igual
al comando de proteccin de hoja pero con un cuarto argumento. La sintaxis de
este mtodo es la siguiente:

Protect(Password,DrawingObjects,Contents,Scenarios,UserInter

Argumento Descripcin
Password Opcional.
DrawingObjects True o False: Se usa para proteger las formas (el valor
predeterminado es true).
Contents True o False: Se usa para proteger el contenido
(el valor predeterminado es true).
Scenarios True o False: Se usa para proteger escenarios (el valor
predeterminado es true).
Se usa para proteger la interface del usuario, sin

Sheets(Hoja2).Protect 1234

Unprotect: Este mtodo retira la proteccin de la hoja. El ejemplo siguiente


retira la proteccin de la hoja Hoja1, que posee una contrasea:

Sheets(Hoja1).Unprotect contrasea

Elaborado por: Dennis Pichilingue R Pgina: 55


Ms. Excel VBA - Nivel II

7. Manejo de rangos (Range)


Este objeto representa las celdas de una hoja. Puede representar solamente una
celda o ms celdas de forma simultnea.

Propiedades objeto Range


Value: Esta es la propiedad predeterminada de Range. Con ella, se puede dar
o definir el valor de una o ms celdas. Las celdas pueden indicarse no solamente
por su posicin, sino tambin por su nombre.
Para insertar la palabra Impacto en la celda A10, se usa el siguiente comando:

Range (A10).Value = Impacto


Para insertar un valor en la celda B4 y tambin en el intervalo de celdas desde la
C2 hasta la C10, se considera el siguiente comando:
Range(b4,c2:c10) = 10

Row: Esta propiedad proporciona el nmero de lnea de una celda. El ejemplo


siguiente inserta una celda activa al nmero de la lnea de la celda B5:
ActiveCell = Range(B5).Row
Column: Esta propiedad proporciona el nmero de columna de una celda, el
cual puede variar entre 1, referente a la columna A, y 256, referente a la columna
IV. El ejemplo siguiente inserta en la celda A2 el nmero de la columna C3:

Range(A2).Value = Range(C3).Column

Name: Esta propiedad proporciona nombre a una o ms celdas. El ejemplo


siguiente coloca en la celda A3 el nombre Precios:

Range(A3).Name = Precios

Mtodos del objeto Range


Select: Este mtodo sirve para seleccionar celdas. Se puede seleccionar solo
una celda, o un intervalo de celdas, o una o ms celdas, y ms de un intervalo, etc.
Se pueden seleccionar diversas celdas independientemente de la posicin de la
hoja donde se encuentra. Si se usa la siguiente lnea, se seleccionar la celda A5
de la hoja activa:

Range(A5).Select

El prximo ejemplo selecciona el intervalo entre la celda activa y la celda


B6:
Range(ActiveCell, B6).Select
Pgina: 56 Elaborado por: Dennis Pichilingue R
Ms. Excel VBA - Nivel II

Copy: El mtodo Copy copia las celdas, y el lugar donde quedar la copia
cambia segn la sintaxis. Para hacer una copia al clipboard, se debe usar la
siguiente sintaxis:
Copy
Range(a2:c4).copy

Para que la copia se pegue automticamente en el destino, la sintaxis es la


siguiente:
Copy(Destination)

En el ejemplo siguiente, se copiar el contenido del intervalo de las celdas


C2 a la C4 desde la posicin de la celda E6.
Range(c2:c4).Copy Range(e6)

Cut: Este mtodo recorta celdas. El lugar donde se ubican las celdas recortadas
depende de la sintaxis usada. El ejemplo siguiente recorta las celdas B2:E14 y las
pega en G7:

Range(B2:E14).Cut Range (G7)

Clear: Este mtodo equivale al comando Limpiar / Limpiar todo, es decir, limpia
todo lo que hay en las celdas. El ejemplo siguiente limpia el contenido de las celdas
presentes en el intervalo B2:B20:

Range(B2:B20).Clear

ClearContents: Este mtodo limpia solo el contenido de la celda y mantiene


las dems propiedades. Equivale a seleccionar la celda y presionar DELETE. El
ejemplo siguiente limpia el contenido de las celdas en el intervalo B2:B20:

Range(B2:B20).ClearContents

ClearFormats: Este mtodo limpia solo el formato de la celda y mantiene el


contenido. El ejemplo siguiente limpia solo el formato de las celdas en el intervalo
C2:C4:

Range(c2:c4).ClearFormats

Delete: Este mtodo es usado para eliminar las celdas de la hoja. En su sintaxis,
mostrada a continuacin, el argumento Shift no es obligatorio y sirve para definir

Elaborado por: Dennis Pichilingue R Pgina: 57


Ms. Excel VBA - Nivel II

el lugar donde se movern las celdas; si se quiere para la izquierda, se debe usar
xlShiftToLeft, y si es para arriba, xlShiftUp:
Delete(Shift)
El ejemplo a continuacin elimina las celdas contenidas en el intervalo y desplaza
las dems hacia la izquierda:
Range(c2:c4).Delete xlToLeft

Insert: Este mtodo inserta las celdas en la hoja. En su sintaxis, mostrada a


continuacin, el argumento Shift no es obligatorio sirve para indicar el lugar donde
se movern las celdas; si se desea para la derecha, se debe usar xlShiftToRight,
si es hacia abajo, XlShiftDown:
Insert(Shift)
El ejemplo a continuacin inserta las celdas contenidas en el intervalo y desplaza a
las dems hacia abajo:
Range(c2:c6).Insert xldown

Mantenimiento de almacn de un alibrera (Desarrollado por Kiara Gagliuffi)

1. Diseo de la hoja Base

Pgina: 58 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

2. Diseo de la hoja Registro

3. Diseo de la hoja Caja

Elaborado por: Dennis Pichilingue R Pgina: 59


Ms. Excel VBA - Nivel II

4. Tabla de nombres de rangops

5. Diseo del formulario

6. Programa
Pgina: 60 Elaborado por: Dennis Pichilingue R
Ms. Excel VBA - Nivel II

Private Sub cmbCerrar_Click()


Unload Me
End Sub
Private Sub cmbOk_Click()
If txtCantidad.Text = "" Then
MsgBox "Usted tiene que escribir la cantidad que desea"
Exit Sub
End If
If optIngreso.Value = False And OptSalida.Value = False Then
MsgBox "Usted debe seleccionar si es un ingreso o una salida"
Exit Sub
End If
If optIngreso.Value = True Or OptSalida.Value = True Then
txtPrecioTotal.Text = Val(txtCantidad.Text) * Val(txtPrecioUnitario.Text)
If optIngreso.Value = True Then
txtStockFinal = Val(txtCantidad.Text) + Val(txtStock.Text)
End If
If OptSalida.Value = True Then
txtStockFinal = Val(txtStock.Text) - Val(txtCantidad.Text)
End If
If Val(txtStockFinal.Text) < 0 Then
StockInsuficiente.Visible = True
Else: StockInsuficiente.Visible = False
End If
cmbRegistrar.SetFocus
End If
End Sub

Private Sub cmbRegistrar_Click()


If optIngreso.Value = False And OptSalida.Value = False Or txtStockFinal = ""
Then
MsgBox "Usted tiene que presionar OK para poder registrar"
Exit Sub
End If
If Val(txtStockFinal.Text) < 0 Then
MsgBox "Elija una cantidad menor"
Exit Sub
End If

If Val(txtStockFinal.Text) >= 0 Then


R = MsgBox("Est seguro que desea registrar?", vbYesNo)
If R = vbNo Then Exit Sub

Elaborado por: Dennis Pichilingue R Pgina: 61


Ms. Excel VBA - Nivel II

Sheets(2).Select
Range("a4").Select
While ActiveCell <> ""
ActiveCell.Offset(1, 0).Select
Wend

ActiveCell = txtFecha.Text
ActiveCell.Offset(0, 1) = cmbProducto.Text
ActiveCell.Offset(0, 2) = txtCodigo.Text

If optIngreso.Value = True Then


ActiveCell.Offset(0, 3) = Val(txtCantidad.Text)
End If
If OptSalida.Value = True Then
ActiveCell.Offset(0, 4) = Val(txtCantidad.Text)
End If
Sheets(1).Select
Range("a4").Select
While ActiveCell <> cmbProducto.Text
ActiveCell.Offset(1, 0).Select
Wend
ActiveCell.Offset(0, 4) = Val(txtStockFinal.Text)
If OptSalida.Value = True Then
Sheets(3).Select
Range("a4").Select
While ActiveCell <> ""
ActiveCell.Offset(1, 0).Select
Wend

ActiveCell = txtFecha.Text
ActiveCell.Offset(0, 1) = cmbProducto.Text
ActiveCell.Offset(0, 2) = txtCodigo.Text
If OptSalida.Value = True Then
ActiveCell.Offset(0, 3) = Val(txtPrecioTotal.Text)
End If
End If
MsgBox "Listo"
cmbProducto = ""
txtCodigo = ""
txtDescripcion.Text = ""
txtPrecioUnitario.Text = ""
txtStock = ""
txtCantidad = ""
Foto.Picture = Nothing
Pgina: 62 Elaborado por: Dennis Pichilingue R
Ms. Excel VBA - Nivel II

optIngreso.Value = False
OptSalida.Value = False
txtPrecioTotal = ""
txtStockFinal = ""
End If
End Sub

Private Sub txtCantidad_Change()


If txtCantidad.Text = "" Then
optIngreso.Value = False
OptSalida.Value = False
txtPrecioTotal.Text = ""
txtStockFinal.Text = ""
End If
End Sub
Private Sub txtCantidad_KeyDown(ByVal KeyCode As
MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode >= 48 And KeyCode <= 57 Or KeyCode = 8 Or KeyCode = 13 Then
If KeyCode = 13 Then
End If
Else
KeyCode = 0
End If
End Sub
Private Sub UserForm_Initialize()
txtFecha = Date
cmbProducto.RowSource = "Producto"
cmbProducto.SetFocus
End Sub

Private Sub cmbProducto_Change()


If Trim(cmbProducto.Text) = "" Then Exit Sub
txtCodigo.Text = Range("Producto").Cells.Find(cmbProducto, , ,
xlWhole).Offset(0, 2)
txtDescripcion.Text = Range("Producto").Cells.Find(cmbProducto, , ,
xlWhole).Offset(0, 1)
txtStock.Text = Range("Producto").Cells.Find(cmbProducto, , ,
xlWhole).Offset(0, 4)
txtPrecioUnitario.Text = Range("Producto").Cells.Find(cmbProducto, , ,
xlWhole).Offset(0, 3)
Foto.Picture = Nothing
On Error Resume Next 'Activa rutina de errores y pasa a la siguiente instruccin

Elaborado por: Dennis Pichilingue R Pgina: 63


Ms. Excel VBA - Nivel II

Foto.Picture = LoadPicture(ActiveWorkbook.Path & "\" & cmbProducto.Text &


".jpg")
txtCantidad.SetFocus
End Sub

Private Sub cmbProducto_KeyPress(ByVal KeyAscii As


MSForms.ReturnInteger)
If KeyAscii > 32 Then KeyAscii = 0
End Sub

8. Arreglos unidimensionales
Es un conjunto finito de elementos del mismo tipo, que tienen un mismo nombre. El
nombre va acompaado de un ndice que indica el nmero de orden del elemento
dentro del arreglo.

Si tenemos un arreglo con el nombre de variable X, de n elementos, que almacena


nmeros, este arreglo se denota como sigue:

X(1), X(2), X(3), X(4) X(n) que son las referencias a los elementos del arreglo.
Grficamente se representa, como se muestra en la grfica

Ejemplo Grfico

Inicio del Vector 1 12


2 4
3 5
4 77 Vector X para
5 -8 n valores

Final del Vector N 15

Valores
ndices del almacenados
vector X en el vector X

8.1 Presentacin de un arreglo unidimensional


Supongamos que tenemos un arreglo unidimensional al que se le ha denominado
Deporte, el cual tiene 5 elementos, y guarda datos de tipo texto. Este arreglo puede
dibujarse como se muestra en la grfica.

Pgina: 64 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Representacin de los arreglos lineales en


memoria
Siguiendo con el ejemplo anterior como se muestra un arreglo lineal almacenado en la
memoria del computador. La memoria de un computador consiste en una secuencia
de celdas direccionables. Si el siguiente cuadro fuera la memoria podemos observar
que un arreglo se almacena en direcciones consecutivas.

Arreglos Valor de la variable

Nombre de la variable

Del grfico se observan:


Los arreglos: Deporte, Fruta y Pais.
Las variables: A, B, C, D, E

8.2 Declaracin de un arreglo unidimensional


La declaracin de un arreglo permite definir la estructura que tendr el arreglo, tipo de
arreglo, tipo de dato del arreglo y nmero de elementos del arreglo. Para indicar la
cantidad de elementos del arreglo usted puede especificar el lmite inferior y superior.
Sintaxis:

Elaborado por: Dennis Pichilingue R Pgina: 65


Ms. Excel VBA - Nivel II

Dim Nombre ( Dimensin) As TipoDeDato

Donde
Nombre: Es el nombre del arreglo
Dimensin: Define el nmero de elementos del arreglo
TipodeDato: Define el tipo de dato: Integer, string, date, etc.

Ejemplo:
Dim sueldo(10) as single
Dim apellidos(10) as string
Tambin puede declarar

Dim Nombre ( Li to Ls) As TipoDeDato

Dnde:
Li. Es el lmite inferior del arreglo
Ls. Es el lmite superior del arreglo
Si no define el lmite inferior del arreglo por defecto es cero.

Los nombres de arreglos deben ser diferentes de los nombres de variables.

Ejemplo:
Dim sueldo (0 to 10) as single
Dim apellidos(0 to 10) as string

Ejemplo:
Declara un arreglo X de 11 elementos tipo entero:
Dim X (10) As Integer

X(0), X(1), X(2), , X(10)

El tipo de dato para todos los elementos del arreglo es entero. Grficamente se
muestra como sigue:

Ejemplo:
Declara un arreglo Z de 5 elementos tipo texto, denotados como:
Dim Z(1 to 5) as string

Z(1), Z(2), Z(3),Z(4),Z(5)

El tipo de dato para todos los elementos del arreglo es cadena. Grficamente se
muestra como sigue:

Pgina: 66 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Ejemplo:
Declara un arreglo A de 5 elementos tipo texto, denotados como:
Dim A(4 to 8) as string

A(4), A(5), A(6),A(7),A(8)

El tipo de dato para todos los elementos del arreglo es cadena. Grficamente se
muestra como sigue:

8.3 Operaciones sobre las Estructuras Lineales


Las operaciones que se realizan sobre los arrays son: Entrada/salida,
Lectura/Escritura

8.3.1 Asignacin.-
Asigna el valor de 25 al elemento 10 del array A
Ejm1: A(10) = 25

Asigna el dato Andre Fernndez al elemento 2 del array Nombre


Ejm2: Nombre (2) = Andre Fernndez

Utiliza un ciclo repetitivo para inicializar los elementos del array A


Ejm3: For I = 1 TO 10
A(i) = 0
Next

8.3.2 Lectura/Escritura
Lectura/Escritura. Permite dar o mostrar los valores de un array
Acumula los valores de un array en una Imprime los valores de un array en el
variable formulario

Ejm1: For i = 1 TO 10 Ejm2: For i = 1 TO 10


B = B + A( i ) Print A( i )
Next Next

Elaborado por: Dennis Pichilingue R Pgina: 67


Ms. Excel VBA - Nivel II

Carga y lectura de un array utilizando ciclos repetitivos: Do .. While y For


Next
1. Diseo del formulario

2. Edite el siguiente programa


Private Sub RecorridoconDoWhile_Click()
Dim a(0 To 5) As Integer 'Declara un array de 6 elementos
ListBox1.Clear 'Limpia el list1
j=0
Do While j < 6
a(j) = Int(Rnd * 5) + 2 'Carga el array con valores aleatorios entre 2 y 7
ListBox1.AddItem a(j) 'Agrega el array como elemento del control list1
j=j+1
Loop

i=0
Do While i < 6
b = b + a(i) 'Acumula los elementos del array en la variable b
i=i+1
Loop
TextBox1 = b
End Sub
Private Sub RecorridoConForNext_Click()
Dim a(5) As Integer 'Declara un array con 6 elementos
ListBox2.Clear 'Limpia el list2

For j = 0 To 5
a(j) = Int(Rnd * 5) + 2 'Carga el array con valores aleatorios entre 2 y 7
ListBox2.AddItem a(j) 'Agrega el array como elemento del control list2
Next
Pgina: 68 Elaborado por: Dennis Pichilingue R
Ms. Excel VBA - Nivel II

For i = 0 To 5
b = b + a(i) 'Acumula los elementos del array en la variable b
Next
TextBox2 = b
End Sub

Multiplicar los valores del array por un escalar

Private Sub MultiplicaArrayExcalar_Click()


Dim a(5) As Integer 'Declara un array de 6 elementos

For j = 0 To 5
a(j) = Int(Rnd * 5) + 2 'carga el array con valores aleatorios entre 2 y 7
Next

ListBox3.Clear 'Limpa el list3


For i = 0 To 5
a(i) = a(i) * 5 'mltiplica el array por un escalar
ListBox3.AddItem a(i) 'agrega el array como elemento del control list3
b = b + a(i) 'Acumula los valores del array
Next
TextBox3 = b
End Sub

Sumar los elementos de dos array para obtener un tercer array.


1. diseo del formulario

2. Edite el siguiente programa


Private Sub SumaArray_Click()
Dim a(5) As Integer 'Declara un array con 6 elementos
Dim ss(5) As Integer 'Declara un array con 6 elementos
ListBox1.Clear 'Limpia el list1
Elaborado por: Dennis Pichilingue R Pgina: 69
Ms. Excel VBA - Nivel II

ListBox2.Clear 'Limpia el list2


ListBox3.Clear

'Carga los dos primeros array


For j = 0 To 5
a(j) = Int(Rnd * 5) + 2 'Carga el array con valores aleatorios entre 2 y 7
ListBox1.AddItem a(j) 'Agrega el array como elemento del control list1
ListBox2.AddItem a(j) * 2
'Agrega el array multiplicado por un escalar como elemento del control list2
b = b + a(j) 'Acumula los elementos del 1er. array en la variable b
c = c + a(j) * 2 'Acumula los elementos del 2do. array en la variable c
Next
TextBox1 = b
TextBox2 = c

'Sumar los elementos de dos arrays A y B para obtener un tercer array


For i = 0 To 5
ss(i) = a(i) + a(i) * 2
ListBox3.AddItem ss(i)
d = d + ss(i) 'Acumula los elementos del 3er. array en la variable d
Next
TextBox3 = d
End Sub

Multiplica los elementos de dos array para obtener un tercer array.


1. Diseo del formulario

2. Edite el siguiente programa


Private Sub MultiplicaArray_Click()
Dim a(5) As Integer 'Declara un array con 6 elementos
Dim ss(5) As Integer 'Declara un array con 6 elementos
ListBox1.Clear 'Limpia el list1
ListBox2.Clear 'Limpia el list2
ListBox3.Clear

Pgina: 70 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

'Carga los dos primeros array


For j = 0 To 5
a(j) = Int(Rnd * 5) + 2 'Carga el array con valores aleatorios entre 2 y 7
ListBox1.AddItem a(j) 'Agrega el array como elemento del control list1
ListBox2.AddItem a(j) * 2
'Agrega el array multiplicado por un escalar como elemento del control list1
b = b + a(j) 'Acumula los elementos del array en la variable b
c = c + a(j) * 2 'Acumula los elementos del array en la variable c
Next
TextBox1 = b
TextBox2 = c

For i = 0 To 5
'Sumar los elementos de dos arrays A y B para obtener un tercer array
ss(i) = a(i) * a(i) * 2
ListBox3.AddItem ss(i)
d = d + ss(i) 'Acumula los elementos del 3er. array en la variable d
Next
TextBox3 = d
End Sub

8.3.3 Funciones UBound y LBound.


UBound devuelve el mayor subndice disponible para la dimensin indicada de
una matriz.
Sintaxis: UBound(nombredelamatriz[, dimensin])
LBound devuelve el mayor subndice disponible para la dimensin indicada de
una matriz.
Sintaxis: LBound(nombredelamatriz[, dimensin])

8.3.4 Operaciones de Actualizacin:


Insercin. Adicin de un nuevo elemento a la lista
Borrado. Eliminacin de un elemento de la lista.

Insercin
La insercin al final del array es sencilla si el espacio de memoria reservado por el
ARRAY es mayor que el utilizado hasta el momento. Pero si es a la mitad del Array
entonces la mitad deber desplazarse hacia abajo para colocar el nuevo elemento y
que los dems conserven el orden relativo entre ellos

Elaborado por: Dennis Pichilingue R Pgina: 71


Ms. Excel VBA - Nivel II

Insertar un elemento al array.


1. Diseo del formulario

2. Edite el siguiente programa


General Declaraciones
Dim a() As Integer 'Arreglo dinamico No. +/-

Private Sub cmdcargaarreglo_Click()


ListBox1.Clear 'Limpia el list1
Dim j As Integer
j = 0 'incializar la variable j
ReDim a(5) 'Redimensionar el arreglo con 6 elementos
Do While j < 6 'Hacer mientras j sea menor que 6
a(j) = Int(Rnd * 5) + 2 'Carga el array con valores aleatorios entre 2 y 7
ListBox1.AddItem a(j) 'Agrega el array como elemento del control list1
j = j + 1 'Contador
Loop
End Sub
Private Sub cmdinsertar_Click()
Dim i As Integer
ReDim Preserve a(UBound(a) + 1)
'Redim preserve redimensiona un arreglo preservando sus datos
'La funcin Ubound devuelve el indice mayor de un arreglo
'a(UBound(a) + 1) aumenta un elemento al arreglo
For i = UBound(a) - 1 To Val(txtposinsercion) - 1 Step -1

Pgina: 72 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

'Lee desde el ultimo elemento hasta la posicion de insercion


a(i + 1) = a(i)
Next
a(Val(txtposinsercion) - 1) = Val(txtdato)

ListBox2.Clear
For i = LBound(a) To UBound(a)
'Lbound(a) devuelve el indice menor del arreglo
'ubound(a) devuelve el indice mayo del arreglo
ListBox2.AddItem a(i)
Next
End Sub

Borrado
Para borrar un elemento de un array debe especificar el ndice del elemento a
eliminar.

Borrar un elemento al array.

1. Diseo del formulario

2. Edite el siguiente programa

General declaraciones
Dim a() As Integer 'Arreglo dinamico No. +/-
Private Sub cmdcargaarreglo_Click()
ListBox1.Clear 'Limpia el list1
Dim j As Integer

Elaborado por: Dennis Pichilingue R Pgina: 73


Ms. Excel VBA - Nivel II

j = 0 'incializar la variable j
ReDim a(5) 'Redimensionar el arreglo con 6 elementos
Do While j < 6 'Hacer mientras j sea menor que 6
a(j) = Int(Rnd * 5) + 2 'Carga el array con valores aleatorios entre 2 y 7
ListBox1.AddItem a(j) 'Agrega el array como elemento del control list1
j = j + 1 'Contador
Loop
End Sub
Private Sub cmdeliminar_Click()
For i = Val(txtposeliminacion) - 1 To UBound(a) - 1
a(i) = a(i + 1) 'Posicion actual es reemplazada por posicion siguiente
Next
ReDim Preserve a(UBound(a) - 1) 'Redimensiona array
'a(UBound(a) - 1) elimina un elemento del arreglo
ListBox2.Clear
For i = LBound(a) To UBound(a) 'Carga el nuevo array
ListBox2.AddItem a(i)
Next
End Sub

Ordenacin
Organizacin de los elementos de la lista de acuerdo con algn tipo de orden. Ejm.
ordenar de mayor a menor, en orden alfabtico, etc.
Este proceso permite ordenar un conjunto de objetos en un orden especfico. Esto
se hace por lo general para facilitar la bsqueda de los elementos del array. As se
clasifica en: los diccionarios, agendas telefnicas, en los casilleros de bibliotecas,
relacin de amigos, etc.

Pgina: 74 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Ordenamiento por el mtodo de burbuja


Ordenar por el mtodo de burbuja el array Datos. Comparamos A ( j ) > A( j +1) si es
verdad intercambiamos

1. Diseo del formulario

2. Edite el siguiente programa


General Declaraciones
Dim a() As Integer 'Declara un array de 6 elementos

Private Sub Form_Load()


CommandButton1_Click
End Sub

Private Sub CommandButton1_Click()


For i = LBound(a) To UBound(a) - 1 'Lazo ExternoNumero de pasos = N-1
For j = 1 To UBound(a) - LBound(a) 'Lazo Interno No. de comparaciones que
depende del No. de paso
If a(j) > a(j + 1) Then 'Intercambiamos Datos[J] y Datos[J+1]
Aux = a(j)
a(j) = a(j + 1)
a(j + 1) = Aux
End If
Next
Next

Elaborado por: Dennis Pichilingue R Pgina: 75


Ms. Excel VBA - Nivel II

ListBox2.Clear
For i = LBound(a) To UBound(a)
ListBox2.AddItem a(i)
resultado = resultado + a(i)
Next
TextBox2 = resultado
End Sub

Private Sub CommandButton2_Click()


ListBox1.Clear 'Limpia el list1
ReDim a(1 To 5)
j=1
Do While j <= 5
a(j) = Int(Rnd * 5) + 2 'Carga el array con valores aleatorios entre 2 y 7
ListBox1.AddItem a(j) 'Agrega el array como elemento del control list1
b = b + a(j) 'Acumula los elementos del array en la variable b
j=j+1
Loop
TextBox1 = b
End Sub

Matenimiento de pasajeros

1. Diseo de la hoja

Pgina: 76 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

2. Nombres de rango

3. Diseo del formulario UserForm1

Private Sub CommandButton2_Click()


UserForm2.Show
End Sub
Private Sub CommandButton3_Click()
registro.Show
End Sub

Elaborado por: Dennis Pichilingue R Pgina: 77


Ms. Excel VBA - Nivel II

4. Diseo del formulario UserForm2

Programa

Sub limpiar()
For Each ctrl In Me.Controls 'Recorre los controles
If TypeOf ctrl Is TextBox Then ctrl.Text = ""
Next
foto.Picture = Nothing 'Limpia la foto
End Sub

Private Sub cmdlista_Click()


UserForm4.Show
End Sub

Pgina: 78 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Private Sub numero_Change()


If numero = "" Then limpiar: Exit Sub
If Val(numero.Text) <= 0 And Val(numero.Text) >=
Application.WorksheetFunction.Max _
(Range("Num")) + 1 Then limpiar: Exit Sub
If Val(numero.Text) >= Application.WorksheetFunction.Max(Range("Num")) + 1
Then
spin.Value = 1
Else
spin.Value = Val(numero.Text)
End If
nombre = Range("num").Cells.Find(numero, , , xlWhole).Offset(0, 1)
apepat = Range("num").Cells.Find(numero, , , xlWhole).Offset(0, 2)
apemat = Range("num").Cells.Find(numero, , , xlWhole).Offset(0, 3)
dni = Range("num").Cells.Find(numero, , , xlWhole).Offset(0, 4)
destino = Range("num").Cells.Find(numero, , , xlWhole).Offset(0, 5)
diavuelo = Range("num").Cells.Find(numero, , , xlWhole).Offset(0, 6)
horavuelo = Range("num").Cells.Find(numero, , , xlWhole).Offset(0, 7)
On Error Resume Next 'Si encuentra un error pasa a la siguiente linea de cdigo
Err = 0 'No hay errores
foto.Picture = LoadPicture(ActiveWorkbook.Path & "\" & nombre & " " & apepat &
".jpg")
If Err > 0 Then
foto.Picture = Nothing 'Si hay errores de carga de imagen no muestra nada
'MsgBox Err.Description
MsgBox "No contamos con foto de referencia"
End If
End Sub
Private Sub spin_Change()
numero = spin.Value
End Sub
Private Sub UserForm_Initialize()
numero = 1
spin.Min = 1
spin.Max = Application.WorksheetFunction.Max _
(Range("Num"))
Elaborado por: Dennis Pichilingue R Pgina: 79
Ms. Excel VBA - Nivel II

End Sub

5. Diseo del formulario Registro

Programa

Private Sub cmbdestino_KeyPress(ByVal KeyAscii As


MSForms.ReturnInteger)
If KeyAscii >= 32 Then KeyAscii = 0
End Sub

Private Sub cmdregistro_Click()


If cmbdestino.ListIndex = -1 Then 'si no selecciono ningun elemento
MsgBox "Debe seleccionar un Destino"
cmbdestino.SetFocus
Exit Sub
End If
If cmbdia.ListIndex = -1 Then
MsgBox "Debe ingresar dia que se realizara el vuelo"
cmbdia.SetFocus
Exit Sub
End If

Pgina: 80 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

If cmbhora.ListIndex = -1 Then
MsgBox "Debe ingresar la hora que se realizara el vuelo"
cmbhora.SetFocus
Exit Sub
End If
Rpta = MsgBox("Esta seguro de Registrar al Viajero", vbYesNo + vbQuestion)
If Rpta = vbNo Then Exit Sub
Sheets("Hoja1").Select 'cambia a la pagina de orden de compra
Range("A3").Select
i=0
While ActiveCell <> "" 'hacer mientras la celda activa tenga datos
ActiveCell.Offset(1, 0).Select 'se desplaza una fila hacia abajo
Wend
ActiveCell.Offset(0, 1) = txtnombre
ActiveCell.Offset(0, 2) = txtapepat
ActiveCell.Offset(0, 3) = txtapemat
ActiveCell.Offset(0, 4) = txtdni
ActiveCell.Offset(0, 5) = cmbdestino
ActiveCell.Offset(0, 6) = cmbdia
ActiveCell.Offset(0, 7) = cmbhora
End Sub
Private Sub CommandButton1_Click()
Unload Me
End Sub
Private Sub UserForm_Initialize()
Range("A3").Select
i=0
While ActiveCell <> "" 'hacer mientras la celda activa tenga datos
ActiveCell.Offset(1, 0).Select 'se desplaza una fila hacia abajo
i=i+1
Wend
txtnumero = i
txtfecha.Text = Date
cmbdestino.RowSource = "destinos"
cmbdia.RowSource = "dia"
cmbhora.RowSource = "hora"
End Sub

Elaborado por: Dennis Pichilingue R Pgina: 81


Ms. Excel VBA - Nivel II

9. Array bidimensional (tablas o matrices)


Es un conjunto finito de elementos del mismo tipo, que tienen un mismo nombre de
variable. El nombre va acompaado de dos ndices que indica el nmero de orden del
elemento dentro del arreglo. Este arreglo se expande tanto en filas como en columnas.

Si tenemos un arreglo con el nombre de variable Y de 2 filas por 3 columnas de


elementos, que almacena nombres de personas, este arreglo se declara como sigue:

Dim Y ( 0 to 1, 0 to 2) as string

Donde:

Y : Nombre del arreglo


i : ndice del vector para las filas.
j : ndice del vector para las columnas.

Referencia a los elementos del arreglo.


Los elementos de un arreglo bidimensional se referencian con un subndice para la fila
y otra para la columna.

Y(0,0) Y(0.1) Y(0,2)


Y(1,0) Y(1,1) Y(1,2)

Representacin Grfica del arreglo con datos

Columnas
0 1 2
Fila 0
s 1

Arreglos multidimensionales
Podemos definir matrices de dimensin superior a dos. Podemos llegar a un mximo
de 60 dimensiones. Una matriz de 5 dimensiones se declarara:
Dim Variable ( 1 To N, 1 To M, 1 To P, 1 To Q, 1 To R)

Entendiendo que hay N, M, P, Q y R elementos en cada una de las dimensiones


respectivamente.

Pgina: 82 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Asignacin y lectura de datos de un arreglo


1. Diseo del formulario

2. Edite el siguiente programa

Private Sub cmdcarga_Click()


Dim s(4, 5) As Integer 'Declara arreglo bidimensional
Dim f, c As Integer
ListBox1.Clear
ListBox1.ColumnCount = 6
For f = 0 To 4 'Recorre las filas del arreglo
For c = 0 To 5 'Recorre las columnas del arreglo
s(f, c) = Int(Rnd * 21 + 10) Asigna datos al arreglo bidimensional
' Int(Rnd * 21 + 10) Genera No. entre 10 y 30
Next
Next
ListBox1.List = s( ) Lee los datos del arreglo bidimensional
End Sub

10. Arreglos Dinmicos


Hay situaciones en las cuales se desea usar un arreglo, pero al momento del diseo
no se sabe sus dimensiones. Para este tipo de situaciones Visual Basic permite
declaraciones arreglos dinmicos.

Declara un arreglo dinmico


Dim x ( ) As Integer
...
...
Redimensiona un arreglo dinmico
Redim x (lstLista.ListCount)

Elaborado por: Dennis Pichilingue R Pgina: 83


Ms. Excel VBA - Nivel II

Cuando se redimensiona un arreglo, los valores almacenados anteriormente se


pierden, porque cada elemento es reinicializado con cero o null dependiendo del tipo
de dato del elemento.
Si se desea preservar los valores debemos usar la palabra clave Preserve en la
sentencia de redimensionamiento.

Redimensiona un arreglo dinmico preservando sus


valores
Redim Preserve x ( intNmeroDeElementos )
Una variable ya declarada como una matriz puede redimensionarse a lo largo del
programa mediante la instruccin ReDim

ReDim Alumno (1To 25)

Mediante esta instruccin, estamos ReDimensionando una matriz ya declarada. No


se puede redimensionar una matriz inexistente.
Mediante la declaracin 1 To 25 le estamos diciendo que el primer elemento de la
matriz es el 1, independientemente de lo que hayamos puesto en OPTION BASE. Si
se redimensiona simplemente con el nmero de elementos:
ReDim (25)
Le estamos diciendo que tiene 25 elementos, pero que el primero sea el 0 el 1
depende de haber puesto OPTION BASE 0 U OPTION BASE 1.
Una matriz puede redimensionarse cuantas veces se quiera a lo largo de la
aplicacin, pero esa redimensin no puede afectar al nmero de dimensiones de la
matriz. Si redimensionamos la matriz perder la informacin existente. Para evitar
perder la informacin presente en la matriz, debe utilizar la sentencia ReDim
Preserve.
Si usa la palabra clave Preserve en matrices de dimensin superior a 1, va a
encontrarse con comportamientos no esperados. Como podr ver en la Ayuda de VB,
usando ReDim Preserve slo puede cambiar el tamao de la ltima dimensin de
matriz y no puede modificar en ningn momento el nmero de dimensiones. NO es
cierto del todo. S lo podr hacer una sola vez.
Respecto a cambiar el nmero de dimensiones, si ha declarado la matriz con unas
dimensiones determinadas, ya no podr cambiar las dimensiones ni con ReDim ni
con ReDim Preserve. Le saldr un error que dice que las dimensiones de la matriz
ya han sido declaradas.
Pero si ha declarado la matriz sin dimensiones :
Dim MiMatriz() Puede cambiar las dimensiones
Dim MiMatriz (1 To 5, 1 To 9) Y volver a cambiarlas
Dim MiMatriz (1 To 8, 1 To 15, 1 To 6)
Observe que no solamente la hemos cambiado dos veces de dimensiones (la primera
a 2 y la segunda a 3), sino que tambin hemos cambiado el nmero de elementos en
cada dimensin.

Pgina: 84 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Si hubisemos utilizado ReDim Preserve solamente podramos haber usado la


primera de las dos lneas anteriores :
ReDim Preserve MiMatriz (1 To 5, 1 To 9)
Pero ya no podramos volver a cambiar el nmero de dimensiones con la segunda
lnea. Nos dara un error.
Con ReDim podemos cambiar el nmero de elementos de cada dimensin cuantas
veces queramos. Por ejemplo, podemos redimensionar MiMatriz de las siguiente
forma :
ReDim MiMatriz (1 To 5, 1 To 9)
ReDim MiMatriz (1 To 15, 1 To 20)
ReDim MiMatriz (1 To 25, 1 To 30)
...........................
Si hubisemos empleado ReDim Preserve, podramos cambiar los elementos de
todas las dimensiones de la matriz una vez :
ReDim Preserve (1 To 5, 1 To 9)

a partir de ahora, solamente podemos cambiar los elementos de la ltima dimensin :


ReDim Preserve (1 To 5, 1 To 20)
ReDim Preserve (1 To 5, 1 To 30)
es decir, no podremos hacer esto :
ReDim Preserve (1 To 10, 1 To 30) donde se seala en negrita el error.
Esto no causa ningn error en una matriz de una dimensin, ya que si la matriz tiene
slo una dimensin, puede cambiar el tamao de esa dimensin porque es la nica
y la ltima.
Cuando a lo largo de la aplicacin se va redimensionando una matriz, podemos llegar
la circunstancia de que, en un momento determinado, no sepamos las dimensiones
de esa matriz.

Crear un array a partir de un rango de celdas.

Elaborado por: Dennis Pichilingue R Pgina: 85


Ms. Excel VBA - Nivel II

Nuestro trabajo consistir en pasar los datos de un rango de celdas a una matriz,
para luego emplear los elementos de esa matriz como parte de un ComboBox
Lo primero que haremos ser incrustar un Cuadro combinado (control ActiveX) en
nuestra 'Hoja1', lo que haremos desde la Ficha Programador, Controles, Insertar
controles, Controles ActiveX, Cuadro combinado:
Programa
Private Sub ComboBox1_gotfocus()
Dim clientes As Long
'cuenta el nmero de elementos en la Hoja1
clientes = Sheets("Hoja1").Range(Range("A2"), Range("A2").End(xlDown)).Rows.C
ount
'Definimos una Matriz sin dimensiones determinadas
Dim MyArray() As Variant
'Sabiendo el nmero de elementos a incluir, redimensionamos nuestra
Matriz
ReDim MyArray(1 To clientes) As Variant
On Error Resume Next 'En caso de error, que contine
ComboBox1.Clear 'limpiamos el ComboBox
'aadimos cada valor del rango definido de la Hoja1 como elemento de la Matriz
For i = 1 To clientes
MyArray(i) = Worksheets("Hoja1").Cells(i + 1, 1).Value
'inclumos cada elemento de la Matriz dentro del Cuadro combinado
ComboBox1.AddItem MyArray(i)
Next i
End Sub

11. El formulario
Se utiliza para disear su aplicacin. Los formularios Excel tienen una gran
variedad de controles, los cuales tienen una variedad de propiedades, funciones
y eventos.
Por defecto los UserForm tienen nombres como UserForm1, UserForm2, etc.. Para
poderlo identificar ms fcilmente podemos cambiarle el nombre en la ventana de
propiedades del UserForm, en concreto en la propiedad Name

Jerarqua de Objetos de UserForm

Pgina: 86 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Top
Caption

Left
Height

Width

11.1 Propiedades del formulario


BackColor Color de fondo del formulario.
BorderStyle Estilo del borde del formulario.
Caption Texto en la barra de ttulo del formulario.
Enabled True/False. Determina si est habilitado para responder a las
acciones del usuario.
Left y Top Ubicacin del formulario.
Name Nombre del formulario.
Width Tamao del ancho del formulario
Height Tamao de la altura del formulario
Picture Permite especificar una imagen de fondo
PictureSizeMode Modo de presentacin de la imagen: fmPictureSizeModeClip,
fmPictureSizeModeStretch, fmPictureSizeModeZoom
ScrollBars Muestra una barra de desplazamiento vertical, horizontal o
ambas

11.2 Eventos del formulario


Initialize Ocurre cuando se inicia el formulario
Activate Ocurre cuando el formulario se convierte en la ventana activa.
Click Ocurre cuando hace clic sobre el formulario.

Elaborado por: Dennis Pichilingue R Pgina: 87


Ms. Excel VBA - Nivel II

Deactivate Ocurre cuando el formulario deja de ser la ventana activa.


Load Ocurre cuando se carga un formulario.
Terminate Ocurre cuando se cierra un formulario
Ejemplo1. Ocultar un formulario: Userform1. Hide
Ejemplo2. Cerrar un formulario: Unload Userform1

11.3 Mtodos del formulario


Hide Oculta el formulario.
Move Ocurre cuando mueve el formulario de posicin.
Show Hace visible el formulario.

Ejemplo1. Modificar el tamao y color de un formulario


aleatoriamente

Private Sub UserForm_Click()


Me.Height = Int(Rnd * 500 + 50)
Me.Width = Int(Rnd * 750 + 50)
Me.BackColor = RGB(Rnd * 255, Rnd * 255, Rnd * 255)
End Sub
Ejemplo2. Cerrar un formulario
Private Sub CommandButton1_Click()
Unload Me
End Sub
11.4 Cmo se aaden controles al formulario?
Hacer clic sobre el control en el Cuadro de Herramientas.
Ubique el puntero del Mouse (una cruz) sobre el formulario en la esquina
superior izquierda donde desea colocar el control.
Realice un clic sostenido mientras arrastra el puntero a la esquina superior
derecha donde colocar el control.
Suelte el botn del Mouse.
Estos cuatro pasos se repiten con cada control que desea aadir al formulario.

Estableciendo Propiedades
Al disear la interfase de usuario de una aplicacin Visual Basic For Excel, se deben
establecer la propiedades para los controles (objetos) creados.

11.5 Propiedades en Tiempo de Diseo


Algunas propiedades pueden ser establecidas en tiempo de diseo. Para establecer
estas propiedades se emplea la ventana de propiedades. Para acceder a la ventana
de propiedades, oprima en botn secundario del ratn sobre un objeto, y luego
hacer clic en Propiedades.

Pgina: 88 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Tambin se puede obtener el mismo resultado seleccionado el objeto y luego


presionando la tecla F4.

11.6 Propiedades en Tiempo de Ejecucin


En tiempo de ejecucin, se puede escribir cdigo para establecer u obtener el valor
de una propiedad. Ejm
UserForm1.Caption = "Bienvenidos"
Procedimientos de Evento
Visual Basic invoca automticamente procedimientos de evento en respuesta a
acciones del teclado, del ratn o del sistema.

11.7 Editando Cdigo


Use las caractersticas de edicin de Visual Basic For Excel para que su cdigo sea
ms fcil de leer.
Presione las teclas Alt + F11 para editar cdigo.
Todo procedimiento inicia con Private Sub y termina con End Sub. Ejemplo:

Objeto Procedimiento
Private Sub CommandButton1_Click()
MsgBox "Bienvenidos
End Sub

Elaborado por: Dennis Pichilingue R Pgina: 89


Ms. Excel VBA - Nivel II

Carcter de Continuacin de Lnea


El carcter subrayado (_) es el carcter de continuacin de lnea, y se usa para dividir
una sentencia en mltiples lneas. El carcter de continuacin de lnea se coloca
luego de un espacio de la sentencia.

Cmo se edita una instruccin que ocupa varias


lneas?
Private Sub CommandButton1_Click()
MsgBox "La clave ingresada no es vlida", _
vbOKOnly + vbExclamation, _
"Mensaje"
End Sub

Comentarios
El aadir documentacin y comentarios a su cdigo permite comprender mejor lo que
hace el cdigo. Un comentario se inicia con el carcter apstrofe () o la palabra
reservada REM, de modo que todo el texto que contine a este carcter ser
ignorado en la ejecucin de la aplicacin. Veamos el siguiente ejemplo:

Cmo se edita un comentario?


Private Sub CommandButton1_Click()
Rem Msgbox muestra un mensaje
MsgBox "Esto es Visual Basic For Excel "
End Sub
Private Sub CommandButton1_Click()
UserForm1.Caption = "Bienvenidos"
End Sub

Sub CierraLibro()
Libro(1).Close
End Sub
El siguiente procedimiento utiliza un nombre especificado como cadena para
identificar un objeto Form.
Sub CierraForm()
Forms("MiForm.frm").Close
End Sub
Tambin es posible operar al mismo tiempo sobre toda una coleccin de objetos
siempre que los objetos compartan mtodos comunes. Por ejemplo, el siguiente
procedimiento cierra todos los formularios abiertos.
Sub CierraTodos()
Forms.Close
End Sub

Pgina: 90 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Ejercicio de aplicacin

Private Sub UserForm_Activate()


MsgBox "Bienvenidos"
End Sub

Private Sub UserForm_Terminate()


MsgBox "Hasta pronto"
End Sub

11.8 Eventos del mouse


Los eventos del mouse son: MouseDown(presiona el botn ), MouseUp(Suelta el
botn), MoveMouse(arrastra- mueve el mouse)

Preparando el Formulario
1. Quitarle las referencias de filas y columnas tradicionales de Excel para
ello tenemos que desactivar los ttulos de la hoja como se muestra en el men
Vista

ActiveWindow.DisplayHeadings = False

Quitando la barra inferior con el nombre de las hojas.

2. Quitar la barra de pestaa inferior donde aparece el nombre de todas las hojas
de clculo que nos permite navegar es decir donde estn todas las hojas
abiertas:

ActiveWindow.DisplayWorkbookTabs = False

Controles Bsicos
Con los controles, los usuarios pueden operar y obtener los resultados de una
aplicacin. Puede aadir controles a un formulario seleccionando la herramienta
adecuada del Cuadro de Herramientas. Entre los controles ms comunes a utilizar
en una aplicacin tenemos: Etiqueta (Label), Cuadro de Texto (TextBox) y Botn de
Comando (CommandButton).

Control Etiqueta (Label)


Se utiliza para mostrar texto que el usuario no puede modificar. Generalmente para
identificar otros controles en el formulario o para mostrar instrucciones al usuario.

Elaborado por: Dennis Pichilingue R Pgina: 91


Ms. Excel VBA - Nivel II

Propiedades
AutoSize True/False. Determina si el tamao del control se ajusta
automticamente al texto que contiene.
Caption Texto que muestra el control.
Name Nombre del control.
Font Establece la fuente, estilo y tamao para el texto del control.
Forecolor Color de letra
Backcolor Color de fondo

Ejemplo1: Aplicando propiedades al control Label


Private Sub UserForm_Activate()
With Label1
.Caption = "Nombres"
.AutoSize = True
.WordWrap = False
.Font.Name = "Times New Roman"
.Font.Size = 14
.Font.Bold = True
.ForeColor = RGB(0, 0, 255)
End With
End Sub

Control Cuadro de Texto (Textbox)


Se utiliza para que el usuario le proporcione datos a la aplicacin o para que la
aplicacin le devuelva la informacin al usuario. El texto que se muestra en el control
puede ser cambiado por el usuario.
Propiedades

Enabled True/False. Establece un valor que determina si el control puede


responder a eventos generados por el usuario.
Font Establece la fuentes, estilo y tamao para el texto del control.
Forecolor Establece el color del texto
Locked True/False. Determina si es posible modificar el texto en el
control.
MaxLength Establece la longitud mxima permitida para el texto en el
control.
MultiLine Establece si el control puede aceptar mltiples lneas de texto.
Name Nombre del control.
PasswordChar Carcter utilizado para ocultar el texto que realmente contiene el
control.
Text Texto que realmente contiene y muestra el control.
Visible Establece si el control ser visible para el usuario.
TextAlign Alinea el texto
Tooltiptext Devuelve o establece el texto mostrado cuando el mouse se
sita sobre un control.

Pgina: 92 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Eventos
Change Ocurre cuando cambia el texto que contiene el control.
KeyDown Ocurre cuando el usuario presiona una tecla
Keypress Ocurre cuando el usuario escribe

Mtodos
SetFocus Mueve el enfoque al control.

Control Botn de Comando (Commandbutton)

Permite que la aplicacin inicie, interrumpa o termine un proceso.


Propiedades
Cancel True/False. Establece si el botn se comportar como el botn
cancelar en el formulario y se invocar su evento Click cada
vez que se presione la tecla ESC.
Caption Establece el texto que muestra el botn.
Default True/False. Establece si el botn se comportar como el botn
predeterminado en el formulario.
Font Establece la fuente, estilo y tamao para el texto del control.
Name Nombre del botn.
Visible True/False. Establece si el botn ser visible para el usuario.

Eventos
Click Ocurre cuando se hace clic sobre el botn.

Mtodos
SetFocus Mueve el enfoque al botn.

Ejemplo1: Cambia el color de fondo aleatoriamente


Private Sub CommandButton2_Click()
red = Int(Rnd * 255)
green = Int(Rnd * 255)
blue = Int(Rnd * 255)
CommandButton2.BackColor = RGB(red, green, blue)
End Sub

Consistencia de datos tipo numrico


Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If (KeyAscii > 0 And KeyAscii < 48) Or (KeyAscii > 56 And KeyAscii < 255) Then
KeyAscii = 0
Exit Sub
End If
End Sub
Elaborado por: Dennis Pichilingue R Pgina: 93
Ms. Excel VBA - Nivel II

Programar las teclas de control> F2, F3, etc.


Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal
Shift As Integer)
If KeyCode = vbKeyF2 Then
MsgBox "Ha presionado la tecla F2"
End If
If KeyCode = vbKeyF3 Then
MsgBox "Ha presionado la tecla F3"
End If
End Sub

Consistencia de datos tipo texto


Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case KeyAscii
Case 65 To 90, 97 To 122, Asc(","), 32, Asc(".")
Case Else
KeyAscii = 0
Exit Sub
End Select
End Sub

Uso de las teclas flechas

Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal


Shift As Integer)
If KeyCode = vbKeyUp Then

Pgina: 94 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Image1.Top = Image1.Top - 10
End If
If KeyCode = vbKeyDown Then
Image1.Top = Image1.Top + 10
End If
If KeyCode = vbKeyLeft Then
Image1.Left = Image1.Left - 10
End If
If KeyCode = vbKeyRight Then
Image1.Left = Image1.Left + 10
End If
End Sub

12. Otros controles


12.1 Marco (Frame)
Este control permite agrupar otros controles para darle mayor funcionalidad a la
interfaz. Los controles Botones de Opcin necesariamente tienen que estar
agrupados por el control Marco. Para agrupar controles, dibuje primero el control
Marco y, a continuacin, dibuje los controles dentro de Marco.

Propiedades
Caption Ttulo de marco.
Enabled Determina si est habilitado para responder a las acciones del usuario.
Name Nombre del control.
Visible Determina si el Marco y los controles que
contiene estn visibles o no.
Ejemplo 1: Desactiva los controles de un frame

Private Sub CommandButton4_Click()


Dim Ctrl As Control
For Each Ctrl In Frame1.Controls
Ctrl.Enabled = Not Ctrl.Enabled
Next
End Sub

Elaborado por: Dennis Pichilingue R Pgina: 95


Ms. Excel VBA - Nivel II

12.2 Casilla de Verificacin (CheckBox)

Las casillas de verificacin se utilizan para proporcionar al usuario opciones de tipo


Si/No o Verdadero/Falso. Cuando el usuario selecciona una opcin (activa la
casilla), aparece una marca de verificacin () dentro de la casilla.
Propiedades
Caption Descripcin que acompaa a la casilla.
Enabled True/False. Determina si est habilitado para responder a las
acciones del usuario.
Name Nombre del control.
Value 0 Unchecked (Vaco, no marcado)
1 Checked (Marcado)
2 Grayed (Gris, Indefinido)
Visible Determina si la casilla est visible o no.
Eventos
Click Ocurre cuando el usuario hace clic sobre la casilla.

Disear un programa que permita acumular el total a pagar de la lista presentada


Costos:
Impresora: 250
Scanner: 180
Estabilizador: 60
a. Anlisis:
Datos de entrada: Utilizaremos un control checkBox
Datos de salida: Utilizaremos un control Text1, para mostrar los resultados
b. Diseo

Pgina: 96 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

c. Pseudocodigo.
Seleccionar desde los controles CheckBox, los perifricos a adquirir
Utilizar el condicional simple If .. Then, para calcular precio
d. Programa
Private Sub Command1_Click()
Dim Costo_Impr as single
Dim Costo_Scan as single
Dim Costo_Esta as single

Costo_Impr = 0
Costo_Scan = 0
Costo_Esta = 0

If Check1.Value = 1 Then
Costo_Impr = 250
End If
If Check2.Value = 1 Then
Costo_Scan = 180
End If
If Check3.Value = 1 Then
Costo_Esta = 60
End If
Total = Val(Costo_Impr) + Val(Costo_Scan) + Val(Costo_Esta)
Text1.Text = Total
End Sub

Private Sub Command2_Click()


End
End Sub

12.3 Botn de Opcin (OptionButton)


Estos controles se utilizan para que el usuario seleccione una opcin de un grupo
opciones. La opcin seleccionada tiene un punto en el centro.
Propiedades
Caption Descripcin que acompaa a la opcin.
Enabled True/False. Determina si est habilitado para responder a las acciones
del usuario.
Name Nombre del control.
Value True/False, marcado o no marcado.
Visible True/False. Determina si el botn est visible o no.
Eventos
Click Ocurre cuando el usuario hace clic sobre el botn.

Elaborado por: Dennis Pichilingue R Pgina: 97


Ms. Excel VBA - Nivel II

Ejemplo 1: Muestra ttulo de la opcin activada

Private Sub CommandButton5_Click()


For Each x In Frame1.Controls
If x.Value = True Then
MsgBox x.Caption
End If
Next
End Sub

Ejemplo: Disear el siguiente formulario. Del siguiente cuadro de dilogo segn la


categora debe mostrar el sueldo del empleado. Segn la ubicacin debe mostrar
el administrador que est a cargo de la sucursal.

Form Load
Text1.Text = ""
End Sub

Option1 Click
If OptionButton1.Value = True Then
Text1.Text = 5000
OptionButton5.SetFocus
End If
End Sub

Option2 Click
If OptionButton2.Value = True Then
Text1.Text = 3000
OptionButton5.SetFocus
End If

Pgina: 98 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Option3 Click
If OptionButton3.Value = True Then
Text1.Text = 2000
OptionButton5.SetFocus
End If

Option4 Click
If OptionButton4.Value = True Then
Text1.Text = 1000
OptionButton5.SetFocus
End If
Option5 Click
If Option5.Value = True Then
Text2.Text = "Local principal Carlos Castro la Rosa"
OptionButton5.SetFocus
End If

Option7 Click
If OptionButton7.Value = True Then
Text2.Text = "Sucursal de Miraflores Yuri Fitzerald Picklinc"
OptionButton7.SetFocus
End If

Option8 Click
If Option8.Value = True Then
Text2.Text = "Sucursal de Surco Iris Calderon Vasquez"
CommandButton1.SetFocus
End If

12.4 Cuadro de Lista (ListBox)


Un control ListBox muestra una lista de elementos entre los cuales el usuario puede
seleccionar uno o ms elementos. Si el nmero de elementos supera el nmero que
puede mostrarse, se agregar automticamente una barra de desplazamiento al
control ListBox.
Propiedades
List Es un arreglo que contiene los elementos de la
lista, y comienza con ndice 0.
ListCount Establece el nmero total de elementos de la
lista.
ListIndex Contiene el ndice del elemento seleccionado, el
cual es un nmero entre 0 (primer elemento) y el
nmero total de elementos en la lista 1
(ListCount 1). Si no se selecciona ningn elemento, el valor de la
propiedad ListIndex ser 1.
Enabled True/False. Determina si el control responde a las acciones del
usuario.
List(ndice) Utilice esta propiedad para tener acceso a los elementos de la lista
MultiSelect Establece si es posible seleccionar varios elementos o uno solo.

Elaborado por: Dennis Pichilingue R Pgina: 99


Ms. Excel VBA - Nivel II

Name Nombre del control.


Selected Arreglo de valores lgicos paralelo y del mismo tamao al arreglo list,
indica que elementos han sido seleccionados (True) de la lista. Se
utiliza en lugar de ListIndex cuando establecemos la propiedad
Multiselect en 1 2.
Sorted True/False. Establece los elementos se ordenan alfabticamente.
Style Establece el comportamiento del control.
Text Devuelve el elemento seleccionado en el cuadro de lista; el valor de
retorno es siempre equivalente al que devuelve la expresin
List(ListIndex). Es de slo lectura en tiempo de diseo y es de slo
lectura en tiempo de ejecucin.
Mtodos
AddItem Permite aadir nuevos elementos a la lista.
RemoveItem Permite eliminar elementos de la lista.
Clear Limpia la lista
Dropdown Despliega el Combobox
Eventos
Click Ocurre cuando el usuario interacta con el control.
Ejemplo 1: Agregar elementos aun Listbox1, utilizando el mtodo Additem
Private Sub Form_Activate()
ListBox1.AddItem "Chirley"
ListBox1.AddItem "Jean"
ListBox1.AddItem "Elky"
ListBox1.AddItem "Litzze"
ListBox1.AddItem "Yuri"
End Sub

Pgina: 100 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Ejemplo 2: Cargar la siguiente lista de datos en un ListBox

Private Sub UserForm_Activate()


Worksheets("Marcas").Range("A3").Select
Do While ActiveCell <> Empty
lst_aviones.AddItem ActiveCell
ActiveCell.Offset(1, 0).Select
Loop
End Sub
Ejemplo 3: Agrega elementos a un control ListBox, utilizando un array
Private Sub UserForm_Initialize()
ListBox1.List = Array(1001, 1002, 1003, 1004, 1005)
End Sub
Ejemplo 4: Agrega elementos a un control ListBox, utilizando un array
Private Sub UserForm_Initialize()
Dim MyArray As Variant
Dim Ctr As Integer
MyArray = Array("Apples", "Oranges", "Peaches", "Bananas", "Pineapples")
For Ctr = LBound(MyArray) To UBound(MyArray)
UserForm1.ListBox2.AddItem MyArray(Ctr)
Next
End Sub
Ejemplo 5: Agrega elementos a un control ListBox, utilizando Rowsource

Private Sub UserForm_Activate()


lst_bebidas.RowSource = "Hoja1!$A$3:$A$15"
End Sub

Elaborado por: Dennis Pichilingue R Pgina: 101


Ms. Excel VBA - Nivel II

Ejemplo 6: Carga un listbox con mltiples


columnas

Private Sub UserForm_Activate()


Worksheets("Hoja2").Select

With lst_calorias
.ColumnCount = 3
.ColumnHeads = True
.ColumnWidths = "100;10"
.RowSource = "Hoja2!A4:B16"
.ListStyle = fmListStyleOption
End With
End Sub
Ejemplo 7: Elimina el elemento seleccionado cuando presiona la tecla Supr.
Private Sub ListBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal
Shift As Integer)
If KeyCode = 46 Then
ListBox1.RemoveItem ListBox1.ListIndex
End If
End Sub

Ejemplo 8: Pasa/retorna elementos entre dos listbox

Private Sub Agrega_Click()


ListBox2.AddItem ListBox1.Value
ListBox1.RemoveItem (ListBox1.ListIndex)
End Sub

Private Sub Retorna_Click()


ListBox1.AddItem ListBox2.Value
ListBox2.RemoveItem (ListBox2.ListIndex)
End Sub

Pgina: 102 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Ejemplo 9: Mostrar los elementos seleccionados en una lista

Private Sub CommandButton1_Click()


For x = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(x) = True Then
MsgBox ListBox1.List(x)
End If
Next x
End Sub

Private Sub UserForm_Initialize()


ListBox1.List = Array("Pia", "Naranja",
"Manzana", "Pera", "Melocotn", "Uva",
"Lima", "Mango", "Mandarina")
ListBox1.MultiSelect = fmMultiSelectMulti
ListBox1.ListStyle = fmListStyleOption
End Sub

Ejemplo 10: Cargar una lista con datos de la hoja

Private Sub CommandButton2_Click()


ListBox1.Clear
ListBox1.RowSource = "A2:A16"
End Sub

Ejemplo 11: Cargar una lista con datos de la hoja


Sub CommandButton3_Click()
For Each x In Sheet1.Range("A1:E1")
UserForm1.ListBox1.AddItem x.Value
Next
End Sub
Ejemplo 12: Cargar mltiples columnas de datos en un listbox

Propiedades del Listbvox1


BoundColumn 1
ColumnCount 3 (Define que se mostrar 3 columnas de datos
ColumnHeads True (Indica que mostrar la cabecera de columnas)

Elaborado por: Dennis Pichilingue R Pgina: 103


Ms. Excel VBA - Nivel II

RowSource Hoja1!A2:C5

Private Sub ListBox1_Change()


Dim SourceData As Range
Dim Val1 As String, Val2 As String, Val3 As String
Set SourceRange = Range(ListBox1.RowSource)
Val1 = ListBox1.Value
Val2 = SourceRange.Offset(ListBox1.ListIndex, 1).Resize(1, 1).Value
Val3 = SourceRange.Offset(ListBox1.ListIndex, 2).Resize(1, 1).Value
Label1.Caption = Val1 & " " & Val2 & " " & Val3
End Sub

Ejemplo 13: Cargar listbox segn opcin elegida

lbl_tipo

Opt_calientes
Opt_frios

Private Sub Opt_calientes_Click()


lst_tipos.Clear
lst_tipos.List = Array("Capuchino", "Chocolate", "Cookie con Dulce de Leche",
"Dulce de Leche", "Vainilla")
lbl_tipo.Caption = "Capuchinos Calientes"
End Sub

Pgina: 104 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Private Sub Opt_frios_Click()


lst_tipos.Clear
lst_tipos.List = Array("Avellana", "Chocolate", "Dulce de Leche", "Frapp", "Vainilla")
lbl_tipo.Caption = "Capuchinos Fros"
End Sub

12.5 Cuadro Combinado (ComboBox)


Un control ComboBox combina las caractersticas de un control TextBox y un
control ListBox; los usuarios pueden introducir informacin en la parte del cuadro
de texto o seleccionar un elemento en la parte de cuadro de lista del control.
Para agregar o eliminar elementos en un control ComboBox, se usa el mtodo
AddItem o RemoveItem. Establezca las propiedades List, ListCount y ListIndex para
permitir a un usuario tener acceso a los elementos de un control ComboBox. Como
alternativa, puede agregar elementos a la lista mediante la propiedad List en tiempo
de diseo.
Propiedades
Enabled True/False. Determina si el control responde a las acciones del
usuario.
List Arreglo con los elementos de la lista.
ListCount Nmero de elementos de la lista
ListIndex Elemento seleccionado.
Name Nombre del control.
Sorted True/False. Establece si los elementos se ordenan alfabticamente.
Style Establece el comportamiento del control.
Text Texto que contiene el control.
ListFillRange Permite definir el rango de celdas a mostrar

LinKedCell. En esta propiedad debe especificar en que celda


debe copiarse el elemento seleccionado de la lista.
En esta lista no utilizaremos esta propiedad. Cuidado
con esta propiedad, tenga en cuenta que los
elementos de la lista son tratados como datos de tipo
String aunque contenga nmeros o fechas, por lo que
en estos casos, a veces ser necesario aplicar
funciones de conversin de datos antes que el dato se
copie en la hoja. Por ejemplo, si alguna vez construye
una lista con nmeros ver que el dato seleccionado
se alinea a la derecha, si son fechas, no se muestra
con el formato correspondiente.
Propiedad ListIndex.
Mediante esta propiedad podremos saber que elemento de
la lista es el seleccionado por su nmero de orden. Es decir, si
est seleccionado el primero, ListIndex valdr 0, si est
seleccionado el segundo valdr 1, etc. Si no hay ningn elemento

Elaborado por: Dennis Pichilingue R Pgina: 105


Ms. Excel VBA - Nivel II

seleccionado valdr -1. Tenga en cuenta que esta propiedad slo


est disponible en tiempo de ejecucin, es decir la podremos
leer mientras est funcionando el programa, no se puede
establecer en modo diseo, observe que no aparece en la ventana
propiedades del cuadro combinado.
ColumnCount , 2 (Indicamos el nmero de columnas de la lista.

Adems especificaremos el ancho de cada columna mediante la propiedad,


ColumnWidths, 4pt; 0pt Debe separar el ancho de cada columna mediante un
punto y coma.
Observe que la segunda columna no se mostrar debido a que hemos
especificado el ancho a 0.
ColumnBound, 1 significa que el dato que recoger la propiedad Value
corresponde al elemento seleccionado de la primera columna.
Si desea recoger datos le la segunda columna deber utilizar la propiedad
Column(Numero de Columna, Indice del elemento seleccionado) Las
columnas empiezan a numerarse a partir de la 0.
Mtodos
AddItem Permite aadir nuevos elementos a la lista.
RemoveItem Permite eliminar elementos de la lista.
Clear Elimina los elementos de la lista
Eventos
Click Ocurre cuando el usuario interacta con la lista del control.
Change Ocurre cuando el valor de la propiedad Text es modificado.

Ejemplo 1: Carga el combobox con nombres de frutas


Private Sub CommandButton1_Click()
Dim MyArray As Variant
Dim Ctr As Integer
MyArray = Array("Manzana", "Naranja", "Peras", "Platano", "Lima")
For Ctr = LBound(MyArray) To UBound(MyArray)
UserForm1.ComboBox1.AddItem MyArray(Ctr)
Next
End Sub
Ejemplo 2: Disear un programa que permita el uso de la seleccin extendida y la
propiedad style de un control ListBox.

Pgina: 106 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Multiselect:
Extendido

Edite el siguiente programa


General Declaraciones
Option Explicit

Private Sub Form_Activate()


Dim i As Long
For i = 1 To 5000
Listbox1.AddItem "Elemento Nm." & i
Listbox2.AddItem "Elemento Nm." & i
Next
Listbox2.Selected(0) = True ' el primer elemento siempre estar seleccionado
End Sub

Private Sub cmdSeleccionarTodo_Click()


Dim i As Long, saveIndex As Long, saveTop As Long
saveIndex = ListBox2.ListIndex
saveTop = ListBox2.TopIndex ' Guardar estado actual
' hacer invisible el cuadro de lista para evitar el parpadeo
ListBox2.Visible = False
' eliminar el comentario de la siguiente lnea para ver el cuadro de lista
' "invisible" Modificar el estado actual de todos los elementos
For i = 1 To ListBox2.ListCount - 1
ListBox2.Selected(i) = True
Next
ListBox2.TopIndex = saveTop ' recuperar el estado original, volver a hacerlo visible

ListBox2.ListIndex = saveIndex
ListBox2.Visible = True
End Sub

Private Sub cmdClearAll_Click()


Dim i As Long, saveIndex As Long, saveTop As Long
saveIndex = ListBox2.ListIndex ' Guardar estado actual
saveTop = ListBox2.TopIndex
ListBox2.Visible = False ' hacer invisible el cuadro de lista para evitar el parpadeo

' Modificar el estado actual de todos los elementos


For i = 1 To ListBox2.ListCount - 1
ListBox2.Selected(i) = False
Next
Elaborado por: Dennis Pichilingue R Pgina: 107
Ms. Excel VBA - Nivel II

' recuperar el estado original, volver a hacerlo visible


ListBox2.TopIndex = saveTop
ListBox2.ListIndex = saveIndex
ListBox2.Visible = True
End Sub

Private Sub cmdInvertAll_Click()


Dim i As Long, saveIndex As Long, saveTop As Long
saveIndex = ListBox2.ListIndex ' Guardar estado actual
saveTop = ListBox2.TopIndex
ListBox2.Visible = False ' hacer invisible el cuadro de lista para evitar el parpadeo
' Modificar el estado actual de todos los elementos
For i = 1 To ListBox2.ListCount - 1
ListBox2.Selected(i) = Not ListBox2.Selected(i)
Next
' recuperar el estado original, volver a hacerlo visible
ListBox2.TopIndex = saveTop
ListBox2.ListIndex = saveIndex
ListBox2.Visible = True
End Sub
Private Sub List2_ItemCheck(Item As Integer)
' rehusar desactivar el primer elemento
If Item = 0 And ListBox2.Selected(0) = False Then
ListBox2.Selected(0) = True
MsgBox "No puede desactivar el primer elemento", vbExclamation, "demostracin
suceso ItemCheck"
End If
End Sub

12.6 Imagen (Image)


El control Image se utiliza para mostrar un grfico. Un control Image puede mostrar
un grfico desde un mapa de bits, un icono o un metarchivo, as como un metarchivo
mejorado, un archivo JPEG o archivos GIF.
Propiedades
Picture Devuelve o establece un grfico que se mostrar en el control. Tambin
se le puede asignar un grfico devuelto por la funcin LoadPicture.
Stretch True/False. Devuelve o establece un valor que indica si un grfico
cambia su tamao para ajustarse al de un control Image.
Funcin LoadPicture()
Carga un grfico en un objeto Picture, un control PictureBox o un control Image.
Formato: LoadPicture(NombreDeArchivoGrfico)
Tambin se puede usar la funcin LoadPicture() para asignar un icono a un
formulario o al puntero del ratn mostrado en pantalla.

Pgina: 108 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Ejemplo 1: Carga imagen al hacer clic sobre el control image1

Private Sub Image1_Click()


Dim fname As String
' Muestra cuiadro de dilogo abrir
fname = Application.GetOpenFilename(filefilter:="jpg Files(*.jpg),*.jpg", Title:="Select
Image To Open")
If fname = "Falso" Then
Exit Sub
Else
Image1.Picture = LoadPicture(fname)
Me.Repaint
End If
End Sub

12.7 Control Multipage


Utilizar un control MultiPage para trabajar con una gran cantidad de informacin que
pueda clasificarse en varias categoras. El control MultiPage permite combinar
visualmente y clasificar esta informacin en un nico formulario.

El control MultiPage es un contenedor para una coleccin de objetos Page. Cada


objeto Page contiene su propio conjunto de controles y no depende necesariamente
de otros objetos de pgina para obtener informacin. Por ejemplo, puede agregar
diferentes controles en la regin cliente para cada objeto Page en el control
MultiPage. De forma predeterminada, un control MultiPage contiene dos pginas;
puede agregar o quitar pginas segn sea necesario.

Elaborado por: Dennis Pichilingue R Pgina: 109


Ms. Excel VBA - Nivel II

Aplicar el control MultiPage para realizar un mantenimiento de registros


(Desarrollado por Carlos Enrique Solano)

1. Diseo de los formularios


Los controles textbox, combobox tienen el nombre de los label que lo describen

Pgina: 110 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

2. Programa
General Declaraciones
Private Ruta
Private Sub Cerrar_Click()
Unload Me
End Sub
Private Sub UserForm_Initialize()
Ruta = ActiveWorkbook.Path
MultiPage1.Value = 0
Sexo.AddItem "Masculino"
Sexo.AddItem "Femenino"
Id = Application.WorksheetFunction.Max(Range("id"))
Boton.Max = Id
Boton = Id
End Sub
Private Sub Boton_Change()
Id = Boton
End Sub
Private Sub Nuevo_Click()
Id = Application.WorksheetFunction.Max(Range("id")) + 1

Elaborado por: Dennis Pichilingue R Pgina: 111


Ms. Excel VBA - Nivel II

Boton.Max = Id
Boton = Id
MultiPage1.Value = 0
codigoalumno = ""
Nombres = ""
Apellidos = ""
Edad = ""
Sexo = ""
Direccion = ""
Celular = ""
Email = ""
ciclo = ""
Cargo = ""
foto.Picture = Nothing
Nombres.SetFocus
On Error Resume Next
Kill Ruta & "\Foto.tmp"
End Sub
Private Sub id_Change()
Range("A3").Select
While ActiveCell <> Empty
If ActiveCell = Val(Id) Then
codigoalumno = ActiveCell.Offset(0, 1)
Nombres = ActiveCell.Offset(0, 2)
Apellidos = ActiveCell.Offset(0, 3)
Edad = ActiveCell.Offset(0, 4)
Sexo = ActiveCell.Offset(0, 5)
Direccion = ActiveCell.Offset(0, 6)
Celular = ActiveCell.Offset(0, 7)
Email = ActiveCell.Offset(0, 8)
Cargo = ActiveCell.Offset(0, 9)
ciclo = ActiveCell.Offset(0, 10)

Pgina: 112 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

On Error Resume Next


foto.Picture = Nothing
foto.Picture = LoadPicture(Ruta & "\" & Id & ".jpg")
FileCopy Ruta & "\" & Id & ".jpg", Ruta & "\Foto.tmp"
End If
ActiveCell.Offset(1, 0).Select
Wend
End Sub
Private Sub ElegirFoto_Click()
ChDrive Left(Ruta, 1)
ChDir Ruta
Archivo = Application.GetOpenFilename("Archivos de Fotos (*.jpg*),*.jpg*", ,
"Adjunte una foto actual")
On Error Resume Next
FileCopy Archivo, Ruta & "\Foto.tmp"
foto.Picture = LoadPicture(Archivo)
End Sub
Private Sub Registrar_Click()
Rpta = MsgBox("Desea registrar estos datos?", vbYesNo)
If Rpta = vbNo Then Exit Sub
Range("A3").Select
While ActiveCell <> ""
ActiveCell.Offset(1, 0).Select
If ActiveCell = Val(Id) Then
Rpta = MsgBox(" El partipipante ya esta registrado, Quiere actulizar su
informacion?", vbYesNo)
If Rpta = vbNo Then Exit Sub
GoTo Sale
End If
Wend
Sale:
ActiveCell = Val(Id)
ActiveCell.HorizontalAlignment = xlCenter
ActiveCell.Offset(0, 1) = codigoalumno

Elaborado por: Dennis Pichilingue R Pgina: 113


Ms. Excel VBA - Nivel II

ActiveCell.Offset(0, 2) = Nombres
ActiveCell.Offset(0, 3) = Apellidos
If Val(Edad) > 0 Then ActiveCell.Offset(0, 4) = Val(Edad)
ActiveCell.Offset(0, 4).HorizontalAlignment = xlCenter
ActiveCell.Offset(0, 5) = Sexo
ActiveCell.Offset(0, 5).HorizontalAlignment = xlCenter
ActiveCell.Offset(0, 6) = Direccion
ActiveCell.Offset(0, 7) = Celular
ActiveCell.Offset(0, 8) = Email
ActiveCell.Offset(0, 9) = Cargo
ActiveCell.Offset(0, 10) = ciclo
On Error Resume Next
Kill Ruta & "\" & Id & ".jpg"
Name Ruta & "\Foto.tmp" As Ruta & "\" & Id & ".jpg"
Kill Ruta & "\Foto.tmp"
Id.SetFocus
End Sub

13. Creacin de funciones


Adems de las funciones del VBA y de las funciones de la hoja de clculo de Excel,
podemos crear nuevas funciones personalizadas para atender necesidades
especficas. Las funciones creadas se pueden utilizar en el VBA o en las hojas de
clculo de Excel.
Sintaxis:
Function NombreFuncin(Arg1 As tipo, Arg2 as tipo) As tipo
Ejemplo1
La siguiente funcin requiere dos parmetros (valores) que debern ser digitados.
Los valores se encuentran representados por N1 y N2 del tipo Integer, sin embargo,
el resultado de la funcin es del tipo Doubl, ya que, en caso N1=10 y N2=3, el
resultado ser un valor decimal.
Function dgeneral(n1, n2 As Long) As Double
dgeneral = n1 / n2
End Function

Ejecucin de funciones a partir de la hoja de clculo


Para utilizar la funcin en una celda, solo necesita presionar el signo de igual (=)
seguido del nombre de la funcin y de los argumentos que sta tenga. Los

Pgina: 114 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

argumentos podrn ser valores fijos o valores buscados de celdas especficas, de


acuerdo a los ejemplos:
Argumento fijo
=dgeneral(10;2)
Argumento buscando valor contenido en celdas de la hoja de clculo
=dgeneral(a20;a21)
Tambin podemos utilizar la funcin creada, ejecutndola a partir del Asistente de
Funciones (fx). Como patrn, las funciones creadas en el VBA se encuentran en la
categora Definida por el usuario.

Utilizando funciones en diversos libros


Ejecucin de la funcin a partir de otro libro
Imaginemos que la funcin dgeneral() se cre en un libro denominado funcin.xlsm.
En este caso, la funcin podr ser utilizada en cualquier hoja de clculo de este libro,
y ser posible digitar en cualquier celda el siguiente ejemplo:
=dgeneral(10;2)
No obstante, al digitar la instruccin antes mencionada en otro libro, Excel no la
reconocer. En este caso, se necesita hacer referencia al archivo que contiene la
funcin.
Es necesario mantener el archivo funcin.xlsm abierto y, en cualquier celda del otro
archivo, digitar la siguiente instruccin. De esta manera, nos damos cuenta de la
necesidad de hacer referencia al archivo que contiene el cdigo de la funcin:
=funcin.xlsm!dgeneral(10;2)

Creacin de un complemento
Para que las funciones creadas puedan utilizarse en los dems archivos, podemos
crear un archivo como complemento de Excel (.xlam), el cual tendr todas las
funciones. Luego, solo se debe vincular este complemento al aplicativo Excel.
Observemos el siguiente procedimiento:
1. En un archivo nuevo, insertar dentro de un mdulo de VBA, todas las funciones
con sus respectivos cdigos;
2. Guardar el archivo como Complemento de Excel (se crear un archivo con la
extensin .xlam).

Anexando el complemento a Excel


1. Hacer clic en Archivo / Opciones;
2. Hacer clic en la opcin Complementos y, luego, en el botn Ir;
3. Hacer clic en Buscar e indicar el archivo de complemento que se anexar;
4. El nombre del archivo seleccionado aparecer en el cuadro de dilogo
Complementos

Elaborado por: Dennis Pichilingue R Pgina: 115


Ms. Excel VBA - Nivel II

Asistente de Funciones
Por medio del cdigo en VBA, se puede cambiar el nombre descriptivo de la funcin
y de sus respectivos argumentos, los cuales podrn aparecer en la ventana Asistente
de Funciones.
De acuerdo a lo descrito anteriormente las funciones creadas en VBA se encuentran,
como patrn, en la categora Definida por el Usuario. Sin embargo, podemos crear
una nueva categora dentro del asistente, dejando la funcin dentro de ella.
En el siguiente ejemplo, al ejecutarse la macro Configurar_Asistente(), se definir en
qu categora la funcin dgeneral() se ubicar dentro del Asistente de Funciones, as
como la descripcin de la macro y sus argumentos.
Por medio de la macro Configurar_Asistente(), se ejecuta la macro Reg_Funcin, que
tiene por objetivo cambiar las caractersticas en el Asistente de Funcin de acuerdo
a la versin de Excel, ya sea 2010 o versiones anteriores. Solamente en la versin
2010 podemos insertar texto independiente para cada argumento de la funcin, con
la utilizacin de la matriz insertada dentro del tem ArgumentDescriptions.

Function dgeneral(n1, n2 As Long) As Double


dgeneral = n1 / n2
End Function
Sub Configurar_Asistente()
reg_funcin True
MsgBox Acceda al asistente de funcin y
observe el resultado!
End Sub
Sub reg_funcin(ByVal registro As Boolean)
Const descr As String =Muestra el resultado de la divisin entre dos nmeros
If registro Then
#If VBA7 Then
Versin 2010
Excel.Application.MacroOptions dgeneral, descr, _
Category:=Nova_Cat, _
ArgumentDescriptions:=Array(Ingrese el primer nmero
, _
Ingrese el Segundo nmero.)
#Else
versin 2007 o anterior
Excel.Application.MacroOptions dgeneral, descr, _
Category:=Nova_Cat

Pgina: 116 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

#End If
Else
cdigo patrn para versiones anteriores a 2010
Excel.Application.MacroOptions dgeneral, Empty,
Category:=Empty
End If
End Sub
Bloque #if...#else#endif
Esta estructura, que posee un comportamiento similar a la estructura condicional
If...Then... Else, se utiliza para compilar condicionalmente el cdigo VBA en
plataformas diferentes.
Ejemplo2.
Function area_hexagono(Lado, Apotema)
P = Lado * 6
A = (P * Apotema) / 2
area_hexagono = A
End Function

Ejemplo3.
Sub area_circulo()
r=3
Pi = 3.1416
MsgBox "El area del circulo de radio: " & r & _
" es: " & r * r * Pi
End Sub

Paso por referencia y paso por valor.


Las variables pasadas como parmetro a la funcin o procedimiento pueden o no
modifican su valor dependiendo como se las pase por referencia o por valor.

Paso por valor


Las variables pasadas cmo parmetro a la funcin o procedimiento no modifican su
valor. Las funciones o procedimientos crean sus variables con los valores pasados
cmo parmetro.

Se tiene la function.
FUNCTION Area (byval B as integer, byval H as integer ) as single
Sentencias
END FUNCTION

Cuando se invoca la funcin.


Base = 10; Altura = 5
Area ( Base, Altura)

El valor inicial que toma B en la funcin es de 10 y el valor inicial de H es de 5.


Elaborado por: Dennis Pichilingue R Pgina: 117
Ms. Excel VBA - Nivel II

Las celdas de memoria son diferentes para los argumentos formales y actuales.

Paso por Referencia


Las variables pasadas cmo parmetro a la funcin o procedimiento si pueden ser
modificadas debido a que se hace referencia a la misma posicin de memoria.
En el paso de parmetros por referencia lo que se pasa en realidad es la direccin de
la variable u objeto, es por esto que el papel del argumento formal es el de ser una
referencia al argumento real; la llamada al mtodo no provoca la creacin de una nueva
variable.

De esta forma, las modificaciones que el mtodo pueda realizar sobre estos
argumentos se realizan efectivamente sobre los argumentos actuales. En este caso,
ambos argumentos (formal y actual) se pueden considerar como la misma variable con
dos nombres, uno en el mtodo llamante y otro en el llamado o invocado, pero hacen
referencia a la misma posicin de memoria.

FUNCTION Area ( B as integer, H as integer ) as single


Sentencias
END FUNCTION
Cuando se invoca la funcin.
Base = 10; Altura = 5
Area ( Base, Altura)
Las variables B y Base utilizan las mismas posiciones de memoria.
Lo mismo para las variables Altura y H, tambin utilizan las mismas posiciones de
memoria.
Cualquier cambio en el argumento formal afectar al argumento actual.

Ejemplos de funciones diversas

Function SepararPalabras(texto As String, separador As String)


SepararPalabras = Split(texto, separador)
End Function

Function DirectorioLibro()
DirectorioLibro = ActiveWorkbook.Path
End Function

Function NombreLibro() As String


NombreLibro = ThisWorkbook.FullName
End Function

Function ContarCaracteres(texto As String, CaracterBuscado As String) As


Integer
' Cuenta el nmero de veces que un caracter aparece en un texto dado
Dim longitud As Integer
Dim i As Integer
Dim n As Integer
Dim c As String
Pgina: 118 Elaborado por: Dennis Pichilingue R
Ms. Excel VBA - Nivel II

' longitud del texto dado:


longitud = Len(texto)
' eliminar caracteres blancos del inicio y final de la cadena
texto = Trim(texto)
n = 0 'contador de caracteres
'Recorre todo el texto dado:
For i = 1 To longitud
c = Mid(texto, i, 1)

If c = CaracterBuscado Then
n=n+1
End If
Next i
ContarCaracteres = n
End Function

Function PrimeraPalabra(texto As String) As String


'Extrae la primera palabra de un texto dado
Dim Posicion As Integer
Posicion = InStr(1, texto, " ") 'Busca la posicin del primer caracter blanco
PrimeraPalabra = Left(texto, Posicion - 1)
End Function

Function UltimaPalabra(texto As String) As String


'Extrae la ltima palabra de un texto dado
Dim temporal As String
Dim Posicion As Integer
temporal = StrReverse(texto) 'invierte el texto
Posicion = InStr(temporal, " ") 'busca la posicin del primer caracter blanco
UltimaPalabra = Right(texto, Posicion - 1)
End Function

Function Contiene(texto As String, Patron As String) As Boolean


'Devuelve verdadero si un patrn buscado se encuentra en el texto dado
If texto Like "*" & Patron & "*" Then
Contiene = True
Else
Contiene = False
End If
End Function

Function ExtraerElemento(texto As String, Posicion As String) As String


Dim Arreglo As Variant
'Se usa el espacio en blanco como separador de palabras
Arreglo = Split(texto, " ")
'Valida la posicin de la palabra
If Posicion > 0 And Posicion - 1 <= UBound(Arreglo) Then
ExtraerElemento = Arreglo(Posicion - 1)
Else
ExtraerElemento = ""
End If
End Function

Elaborado por: Dennis Pichilingue R Pgina: 119


Ms. Excel VBA - Nivel II

Function EliminarEspaciosAmbos(textoFuente As String) As String


EliminarAmbos = Trim(textoFuente)
End Function
Function EliminaCaracteres(texto As String, caracteres As String) As String
Dim longitud As Integer
Dim i As Integer
Dim temporal As String
Dim c As String
longitud = Len(texto) 'longitud del texto
temporal = ""
For i = 1 To longitud
c = Mid(texto, i, 1) 'caracter a examinar del texto principal
'Concatena el caracter del texto si no se encuentra en la lista de
'caracteres a eliminar
If InStr(caracteres, c) <= 0 Then
temporal = temporal + c
End If
Next i
EliminaCaracteres = temporal
End Function

Public Function rgbRed(rgbColor As Long) As Long


rgbRed = rgbColor Mod &H100
End Function

Public Function rgbBlue(rgbColor As Long) As Long


rgbBlue = (rgbColor \ &H10000) Mod &H100
End Function

Public Function rgbGreen(rgbColor As Long) As Long


rgbGreen = (rgbColor \ &H100) Mod &H100
End Function

Public Function w3Luminance(rgbColor As Long) As Double


w3Luminance = (0.2126 * ((rgbRed(rgbColor) / 255) ^ 2.2)) + _
(0.7152 * ((rgbGreen(rgbColor) / 255) ^ 2.2)) + _
(0.0722 * ((rgbBlue(rgbColor) / 255) ^ 2.2))
End Function

14. Creacin de Procedimiento


Un procedimiento es parte de un proyecto que realiza una o ms tareas relacionadas,
tiene su propio nombre. El procedimiento puede tener cero, uno o ms argumentos,
tambin son conocidos como subprogramas.

Sintaxis.

SUB Nombre procedimiento( arg1 as tipo , arg2 as tipo , ... , argn as tipo)
Sentencias
Exit sub Permite salir del procedimiento
END SUB

Pgina: 120 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Donde
arg1, arg2, ... , argn: Son los argumentos formales

La lista de argumentos se utiliza para comunicar el programa principal y el


procedimiento.
Invocar a un procedimiento
Cuando se invoca al procedimiento, se utiliza su nombre seguido de los argumentos
separados por comas.

Sintaxis
1era. Forma: NombreProcedimiento arg1, arg2, ... , argn
2da. Forma: Call NombreProcedimiento ( arg1, arg2, ... , argn)

Donde:
arg1, arg2, ... , argn: Son los argumentos actuales, deben ser del mismo tipo que
los argumentos formales.

Cuando se invoca a un procedimiento los valores de los argumentos actuales se


trasladan a los argumentos formales correspondientes, luego se ejecutan las
sentencias incluidas en el procedimiento. Cuando se llega a la sentencia end sub, la
ejecucin continua con la lnea que le sigue al procedimiento.

Ejemplos de procedimientos diversoas

Sub NombrePrimeraHoja()
'Nombre de la primera hoja de trabajo
MsgBox Worksheets(1).Name
End Sub

Sub tamaoletra()
'Tamao de letra
MsgBox Worksheets(1).Cells(1).Font.Size
End Sub

Sub CambiaTipoLetra()
' Cambiando el tipo de letra
Worksheets(1).Cells(1).Font.Name = "Georgia"
End Sub
Sub CambiarTipoLetra()
Range("A1").Font.Bold = True
End Sub

Sub ContarNumHojas()
'Contar el nmero de hojas de un libro de trabajo
Dim numHojas As Integer
numHojas = Application.Sheets.Count
MsgBox numHojas
End Sub
Elaborado por: Dennis Pichilingue R Pgina: 121
Ms. Excel VBA - Nivel II

Sub CambiaColorFondoCelda()
Dim i As Integer
For i = 1 To 11
If Cells(i, 1).Value = "Eva" Then
Cells(i, 1).Resize(1, 4).Interior.ColorIndex = 6 'Cambia color de la columna A a
la columna D
End If
Next i
End Sub

Sub CrearGrafico()
ActiveSheet.Shapes.AddChart.Select
ActiveChart.SetSourceData Source:=Range("A1:B4")
End Sub

Sub GraficoPastel()
ActiveSheet.Shapes.AddChart.Select
ActiveChart.SetSourceData Source:=Range("A1:B4")
ActiveChart.ChartType = xlPie
ActiveChart.SeriesCollection(1).Name = "Ventas por Categora"
End Sub

Sub CrearGrafica()
Dim Grafico As Chart
Dim RangoDatos As Range
' Crea una grfica con ayuda de la grabadora
Set RangoDatos = ActiveSheet.Range("A1:B5")
Set Grafico = Charts.Add
Grafico.SetSourceData Source:=RangoDatos
ActiveChart.ChartType = xlColumnClustered
End Sub
Sub FormulaDatos()
'Transforma la seleccin dada a valores
Dim Celda As Range
For Each Celda In Selection
If Celda.HasFormula Then
Celda.Formula = Celda.Value
End If
Next Celda
End Sub

Sub CambiarColor()
'Cambia el fondo de la celda si cumpla la condicin dada
Dim Celda As Range
For Each Celda In Range("Seleccion")
If Celda.Value >= 10 Then Celda.Interior.Color = RGB(153, 105, 120)
Next
End Sub

Sub CambiarColorCelda()
'Uso de un ciclo para cambiar el color de una celda que cumpla cierta condicin
Dim UltimaFila As Double

Pgina: 122 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Dim i As Integer
Dim ColumnaObjetivo As Integer

ColumnaObjetivo = 1
UltimaFila = Cells(Rows.Count, ColumnaObjetivo).End(xlUp).Row
For i = 1 To UltimaFila
If Cells(i, ColumnaObjetivo) Like "*o*" Then
Cells(i, ColumnaObjetivo).Interior.ColorIndex = 4
End If
Next i
End Sub

Sub BorrarFilas()
'Uso de un ciclo para borrar filas que cumplan cierta condicin esta operacin es
irreversible
Dim UltimaFila As Double
Dim i As Integer
Dim ColumnaObjetivo As Integer
ColumnaObjetivo = 3
UltimaFila = Cells(Rows.Count, ColumnaObjetivo).End(xlUp).Row
For i = 1 To UltimaFila
If Cells(i, ColumnaObjetivo) Like "*o*" Then
Rows(i).Delete
End If
Next i
End Sub

Sub RegionActual()
' Selecciona regin actualCtrl+*
ActiveCell.CurrentRegion.Select
End Sub
Sub Seleccionar1()
'Seleeciona todas las celdas de la hoja activa
Cells.Select
End Sub
Sub Seleccionar2()
'Seleccionar la celda de la fila 2 y la columna 4
Cells(2, 4).Select
End Sub
Sub Seleccionar3()
'Seleccionar la celda 2
Cells(2).Select
End Sub
Sub seleccionar4()
'Selecciona la celda 2 y borra su contenido
Cells(2).ClearContents
End Sub

Elaborado por: Dennis Pichilingue R Pgina: 123


Ms. Excel VBA - Nivel II

Subasta de Autos (Elaborado por Daniel Zavaleta)

1. Hoja: Lista

2. Hoja Buscar

Pgina: 124 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

3. Hoja Tablas

4. Nombres de rango

Elaborado por: Dennis Pichilingue R Pgina: 125


Ms. Excel VBA - Nivel II

5. Diseo del formulario de registro

Programa

Sub limpiar()
For Each ctrl In Me.Controls 'Recorre los controles
If TypeOf ctrl Is TextBox Then ctrl.Text = ""
Next
foto.Picture = Nothing 'Limpia la foto
End Sub

Private Sub cmdcerrar_Click()


Unload Me
End Sub

Private Sub cmdLista_Click()


UserForm2.Show
End Sub

Private Sub cmdregistraventa_Click()


If Val(precioventa.Text) < Val(preciobase.Text) Then
MsgBox "Debe ingresar un valor mayor o igual al precio base"
Exit Sub
End If
If Trim(comprador.Text) = "" Then 'Trim elimina los espacios en blanco
MsgBox "Debe ingresar nombre del, comprador"
Exit Sub
End If
pregunta = MsgBox("Desea grabar", vbYesNo + vbQuestion)

Pgina: 126 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

If pregunta = vbYes Then


Set c = Range("Num").Find(Val(numero), LookIn:=xlValues)
If Not c Is Nothing Then
celda = c.Address
Range(celda).Offset(0, 6) = Val(precioventa.Text)
Range(celda).Offset(0, 7) = comprador.Text
Else 'Si no encuentra el registro
On Error Resume Next
MsgBox "Registro no encontrado ..."
Exit Sub
End If
End If
End Sub

Private Sub numero_Change()


If numero = "" Then limpiar: Exit Sub
If Val(numero.Text) <= 0 And Val(numero.Text) >=
Application.WorksheetFunction.Max _
(Range("Num")) + 1 Then limpiar: Exit Sub
If Val(numero.Text) >= Application.WorksheetFunction.Max(Range("Num")) + 1
Then
spin.Value = 1
Else
spin.Value = Val(numero.Text)
End If
Marca = Range("num").Cells.Find(numero, , , xlWhole).Offset(0, 1)
Modelo = Range("num").Cells.Find(numero, , , xlWhole).Offset(0, 2)
Ao = Range("num").Cells.Find(numero, , , xlWhole).Offset(0, 3)
placa = Range("num").Cells.Find(numero, , , xlWhole).Offset(0, 4)
preciobase = Range("num").Cells.Find(numero, , , xlWhole).Offset(0, 5)
precioventa = Format(Range("num").Cells.Find(numero, , , xlWhole).Offset(0,
6), "###,##0.00")
comprador = Range("num").Cells.Find(numero, , , xlWhole).Offset(0, 7)
On Error Resume Next 'Si encuentra un error pasa a la siguiente linea de
cdigo
Err = 0 'No hay errores
foto.Picture = LoadPicture(ActiveWorkbook.Path & "\" & Marca & " " & Modelo &
".jpg")
If Err > 0 Then
foto.Picture = Nothing 'Si hay errores de carga de imagen no muestra nada
'MsgBox Err.Description
MsgBox "No contamos con foto de referencia"
End If
End Sub

Private Sub precioventa_Change()


If precioventa = "" Then aviso.Visible = False Else aviso.Visible = True
End Sub

Private Sub spin_Change()


numero = spin.Value
End Sub

Elaborado por: Dennis Pichilingue R Pgina: 127


Ms. Excel VBA - Nivel II

Private Sub UserForm_Initialize()


numero = 1
spin.Min = 1
spin.Max = Application.WorksheetFunction.Max _
(Range("Num"))
End Sub

6. Diseo del formulario de consulta

Programa
Sub VerListado()
Range("Lcriterios").ClearContents ' lo limpioo porq tengo q asegurarme par
ainiciar con un filtro nuevo
Range("Listado").ClearContents ' limpia lista de elementos que ya se abian
extarido manualmente
If Marca.Value <> "" Then Range("Marca") = Marca ' direccionando el
cmdmarca a la hoja BURCAR donde se realiza el proceso de filtrado
If Modelo.Value <> "" Then Range("Modelo") = Modelo ' direccionando el
cmdmarca a la hoja BURCAR donde se realiza el proceso de filtrado
If Ao <> "" Then ' si seleccion un ao
Range("ao") = Val(Ao) ' carga criterio ao. la funcion VAL convierte a
numero
End If
Range("Lista").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _
"Criterio"), CopyToRange:=Range("salida"), Unique:=False

Sheets("buscar").Select ' cambia a la hoja BUSCAR


Range("salida").Select
ActiveCell.CurrentRegion.Select ' selecciona toda la region filtrada ya sea q
tenga 1 dato o 15 datos

' como deseo jalar una cuadro de datos para mostraele ene mi listbox y ese
cuadrto tiene como cantidad de datos diferentes
' por lo cual tengo a crear un algoritmo que me designe un nombre a esa lista

If Selection.Rows.Count > 1 Then


Range(ActiveCell.Offset(1, 0), _
ActiveCell.Offset(Selection.Rows.Count - 1, Selection.Columns.Count -
1)).Select ' aca solo selecionamos el cuadro q nos conviene ya quitando la
cabecera
' por eso RANGE(ACTIVECEL.OFFSET(1,0) esta quitando la cabecera
Selection.Name = "Listado" ' asigna el nombre seleccionado filtrado
Pgina: 128 Elaborado por: Dennis Pichilingue R
Ms. Excel VBA - Nivel II

End If
ActiveCell.Select
Listado.RowSource = "Listado"
Sheets("lista").Select
End Sub

Private Sub ao_Change()


Call VerListado
End Sub

Private Sub cmdcerrar_Click()


Unload Me
End Sub

Private Sub Cmdlimpiar_Click()


Modelo = "": Marca = "": Ao = ""

Range("listado").ClearContents ' limpia el conteniddo de los datos filtrado de la


pagina buscar
Marca.SetFocus ' lleva el puntero del mouse al control MARCA
End Sub

Private Sub Listado_Click()


UserForm1.numero = Listado
' Range("A2").Activate
'cuenta = listaRegistros.ListCount 'Asigna a la variable cuenta No. de registros
del ListBox
'Set rango = Range("A1").CurrentRegion 'Asigna al objeto Rango la reginn
activa
'Recorre los registros del control ListBox(listaRegistros)
'For i = 0 To cuenta - 1 ' Los indices del ListBox inician en cero
' If listaRegistros.Selected(i) Then
' valor = listaRegistros.List(i)
' rango.Find(What:=valor, LookAt:=xlWhole, After:=ActiveCell).Activate
'End If
'Next
End Sub
Private Sub marca_Change()
Modelo = ""
Modelo.RowSource = Marca '
Call VerListado
End Sub

Private Sub modelo_Change()


Call VerListado
End Sub

Elaborado por: Dennis Pichilingue R Pgina: 129


Ms. Excel VBA - Nivel II

15. Manejo de eventos de Excel


Macros autoexecutables

Para que una macro se ejecute automticamente al abrir una planilla de Excel basta
con que su nombre sea Auto_open.

La macro AutoOpen se ejecuta despus de abrir un documento


nuevo. AutoOpen se ejecuta cuando abre un documento de las maneras siguientes:

Utilizar el comando Abrir en el men archivo .


Utilice los comandos FileOpen o FileFind .
Seleccione un documento en la lista usados ms recientemente (MRU) en el
men archivo .

Cuando se abre un documento, se ejecuta una macro AutoOpen si la


macro AutoOpen se guarda como parte del documento o si la macro se guarda
como parte de la plantilla en el que est basado el documento. No se ejecuta una
macro AutoOpen cuando guarda como parte de un complemento global.

Puede evitar que una macro AutoOpen se ejecute mantenga presionada la


tecla MAYS cuando abre un documento.

Del mismo modo, para que se ejecute al cerrar una planilla, debe
llamarse Auto_close

Ejemplo

Sub auto_open()'se ejecuta al abrir un libro


Application.Worksheets(1).Select
[A1].Select
End Sub
Sub auto_close()'se ejecuta al cerrar un libro
Application.ScreenUpdating = False
Application.Worksheets(1).Select
[A1].Select
ActiveWorkbook.Save
End Sub

16. Manejo de mdulos


Los mdulos son como una especie de pergamino largo donde escribes
cdigo. Cada uno de los "pergaminos" de las hojas de clculo abiertas se
muestra en esta zona. Los mdulos pueden tener asociada una interface grfica
(una ventana de Windows) asociada, o pueden no tenerla y ejecutar instrucciones
sin desplegar nada.

Pgina: 130 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Hay 3 tipos de mdulos:

Forms: Cdigo que tiene una ventana de Windows asociada.


Modules: Cdigo sin interface grfica.
Class modules: Cdigo que se usa para crear objetos. Es para
programadores ms avanzados, no vamos a cubrir esta parte aqu.

Estructura del cdigo dentro de los mdulos

Cuando escribas cdigo dentro del mdulo incluirs procedimientos o subrutinas


(Sub) y funciones (Function). Las subrutinas y funciones son fragmentos de
cdigo que tienen un propsito especfico y que se activan en determinadas
circunstancias, definidas por el que crea la macro. Cada subrutina o funcin tendr
un inicio y un final claramente definidos.

Antes de las subrutinas y funciones se efecta la declaracin de variables y


estructuras de datos que vas a usar y que sern utilizadas por varias subrutinas y
funciones del mdulo.

Elaborado por: Dennis Pichilingue R Pgina: 131


Ms. Excel VBA - Nivel II

Insertar un mdulo
Para insertar un mdulo en Excel, primero debes acceder a la ventana del editor
de VBA. Recuerda que este paso ya lo vimos en un artculo anterior.

Elegir la opcin Insertar.

Luego elegir la opcin Mdulo.

Eliminar un mdulo
Hacer clic derecho sobre el mdulo
Elegir Quitar mdulo

Ocultar un mdulo
Ingresa lo siguiente en el principio del mdulo: Option Private Module
Haz clic derecho en el nombre de tu proyecto VBA en el panel de
"Explorador de proyectos" y luego escoge "Propiedades de proyecto VBA"
desde el men de contexto.

Pgina: 132 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Hacer clic en la pestaa "Proteccin" y luego escoge "Bloquear vistas al


proyecto".

Ingresa tu contrasea preferida en los cuadros de "Contrasea" y


"Confirmar contrasea".

17. Control del tiempo al ejecutar


sentencias
Mtodo OnTime
El mtodo OnTime le permite programar la fecha y la hora de la ejecucin de un
macro. Utilizar el mtodo OnTime no impide que el usuario regrese a la
interaccin normal con Excel ni utilizar otros macros, incluso si este mtodo
todava no ha sido ejecutado.

A continuacin se muestra la sintaxis de OnTime y luego se describen cada uno


de sus argumentos:

Elaborado por: Dennis Pichilingue R Pgina: 133


Ms. Excel VBA - Nivel II

expresin.OnTime(Inicio, Procedimiento, Trmino, Nuevo Procedimiento)

Donde:

Expresin: Aqu se debe insertar una expresin que da


como resultado un objeto Aplicacin;

Inicio: Este argumento es una variante de uso obligatorio. Es


donde se define el inicio de la ejecucin del procedimiento;

Procedimiento: Este argumento es un string de uso obligatorio. Es


el nombre del procedimiento que ser ejecutado;

Trmino: Este argumento es un variant opcional. Este determina


hasta cundo podr ser ejecutado el procedimiento. Vamos a suponer
que, cuando llega la hora de inicio, Excel est ejecutando otro
procedimiento y el trmino ha sido definido como Inicio+ 45. Entonces
se esperarn 45 segundos hasta que el procedimiento anterior
termine de ejecutarse. Si Excel an no est listo despus de 45
segundos, no se ejecutar el procedimiento;

NuevoProcedimiento: Este argumento es un variant opcional. A


travs de este, se puede configurar un nuevo procedimiento OnTime.
Si el resultado es False, se excluir el procedimiento anterior; si es
True, que es el valor predefinido, se puede programar un nuevo
procedimiento.

La funcin TimeValue es la representacin del tiempo del VBA. Cuando se utiliza


TimeValue (hora), se ejecuta el mtodo OnTime en una hora especfica. Sin
embargo, si se utiliza Now+TimeValue (tiempo transcurrido), el mtodo es
ejecutado despus de un determinado tiempo, contando desde el momento
actual. La funcin TimeValue convierte la cadena de caracteres que se configur
como tiempo en un valor que Excel puede interpretar y acceder.

Ejemplo1:

Application.OnTime Now + TimeValue(00:00:30), Bombear

Application.OnTime TimeValue(15:00:00), Bombear

Ejemplo2:

Application.OnTime DateValue(02/12/2008 8:00 pm), Bombear


El evento OnTime tambin funciona en conjunto con el procedimiento UpdateClock.
Este procedimiento inserta la hora en una celda y programa otro evento para otro
momento, en que se dar su ejecucin otra vez. De esa manera, la celda elegida
tiene la hora actualizada peridicamente, a menos que el evento sea cancelado
con el procedimiento Stopclock.

Pgina: 134 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Ejemplo3:

A continuacin se muestra como ejemplo un cdigo que inserta en la celda B4 la


hora actualizada cada 21 segundos. En este cdigo, NextTick es una variable que
almacena la hora para el prximo evento:

Dim NextTick As Date

Sub MuestraHora()

Range(B4) = Time actualiza la celda B4 al tiempo actual

Prepara el prximo evento para queocurra dentro de 02 segundos

NextTick = Now + TimeValue(00:00:02) Application.OnTime NextTick,


MuestraHora

End Sub

Sub PararReloj()

On Error Resume Next

Para el reloj (OnTime es interrumpido)

Application.OnTime NextTick, MuestraHorario, , False

End Sub

El mtodo OnTime permanece activo incluso si se cierra el libro para el que fue
desarrollado, lo que significa que cada 21 segundos, el libro se abrir
nuevamente, si el procedimiento Stopclock no se ha ejecutado. Se puede evitar
que esto ocurra utilizando el evento Workbook_BeforeClose con la siguiente
instruccin:

Private Sub Workbook_BeforeClose(Cancel As Boolean) Call PararReloj

Ejemplo4:

Sub CellValueAutoIncr2()
eTime = Now + TimeValue("00:00:03")
Application.OnTime eTime, "CellValueAutoIncr2", , True
Cells(1, 1).Value = Cells(1, 1).Value + 5
count = count + 1

'stop the procedure after it runs for 5 times:


If count = 5 Then

Elaborado por: Dennis Pichilingue R Pgina: 135


Ms. Excel VBA - Nivel II

Application.OnTime eTime, "CellValueAutoIncr2", , False


count = 0

End If

End Sub

Mtodo Application.Wait (Excel)


Hace una pausa de una macro en ejecucin hasta la hora especificada.
Devuelve True si ha llegado la hora especificada.

Sintaxis: expresin .Wait(Time)


Ejemplo1:

newHour = Hour(Now())
newMinute = Minute(Now())
newSecond = Second(Now()) + 10
waitTime = TimeSerial(newHour, newMinute, newSecond)
Application.Wait waitTime

18. Control de errores


Descripcin de las sentencias que controlan errores

On error resume next. Activa rutina de errores y pasa a la siguiente instruccin


On error goto Etiqueta. Activa rutina de errores y salta a un aetiqueta
Err.number. Devuelve l nmero de error
Err.description. Devuelve la descripcin del error

Control de errores
Mediante cdigo puede vitar que se muestren los mensajes de error de Excel,
con el fin de prever y controlar los errores antes que se presenten.

Tipos de errores

Los errores de ejecucin, se producen cuando una operacin no se puede


ejecutar, como eliminar una celda de una hoja de clculo protegida, tambin son
impedidos sin dificultades.

Errores de lgica. Se produce, por ejemplo, cuando se digita el signo >= (mayor
o igual) en reemplazo del signo mayor que (>) para insertar una condicin en una
estructura condicional.

Pgina: 136 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Control de errores durante la ejecucin

La instruccin On Error se aplica exactamente en estos casos, ya que posiciona el


procedimiento y pone en funcionamiento la rutina de control de error.
Las sintaxis de instruccin On Error son tres.
A continuacin, se muestran cada una de estas, as como su respectiva
descripcin:

On Error GoTo line


En esta sintaxis, el argumento line es obligatorio y determina la fila donde debe
comenzar la rutina de control de errores. Se puede configurar este argumento como
cualquier etiqueta o nmero de fila. Su funcionamiento se origina cuando se
produce un error en la ejecucin y el control se desva a line, iniciando la rutina de
control de errores. Para que no se produzca errores en la compilacin, se debe
prestar atencin al hecho de que es necesario especificar la line en el mismo
procedimiento en donde se encuentra la instruccin On Error.

Ejemplo.
Sub ejemplo_error()
On Error GoTo Control
Dim edad As Byte
Edad = InputBox(Digite la edad) MsgBox La edad es & edad
Exit Sub

Control:
MsgBox Valor Invlido
End Sub

On Error Resume Next


Esta sintaxis hace que el control pase a la siguiente instruccin en caso de error
durante la ejecucin, y por lo tanto contina la ejecucin. Para acceder a objetos,
este es el tipo de control de errores ms adecuado.

Ejemplo:

Sub Nombre_Barras() On Error Resume Next


Dim barra As Object Range(a1) = Nombres Range(a2).Select
For Each barra In CommandBars ActiveCell = barra.Name ActiveCell.Offset(1,
0).Select
Next
End Sub

Elaborado por: Dennis Pichilingue R Pgina: 137


Ms. Excel VBA - Nivel II

On Error GoTo 0
Si se utiliza esta sintaxis, cualquier controlador de error que est activo en el
procedimiento actual ser desactivado.

Ejemplo:
Sub ejemplo_error1()
On Error GoTo 0
Dim edad As Byte
edad = InputBox(Digite la edad) MsgBox La edad es & edad
Exit Sub
Control:
MsgBox Valor no vlido
End Sub

Las rutinas de control de errores son secciones identificadas con una etiqueta o
nmero de fila, y no un procedimiento Sub o Function. Estas identifican la causa
del error a travs del valor en la propiedad Number del objeto Err. Entonces,
guardan y verifican los valores relevantes, lo que se debe hacer antes que ocurra
otro error o de la ejecucin de un procedimiento que cause un error. Los valores de
propiedad en el objeto Err slo muestran el ltimo error que ha ocurrido. En
Err.Description se encuentra en el mensaje de error relacionado con Err.Number.

Para cada error que aparece mientras se ejecuta un procedimiento, hay un cdigo
correspondiente. La propiedad Number da la instruccin Err para identificar y
controlar los errores, as como la instruccin On Error.

Ejemplo

Sub cantidad()
On Error GoTo Controlar
Dim Cantidad As Byte
cantidad = InputBox(Digite la cantidad)
If ctdad < 10 Then
MsgBox inventario Insuficiente
End If
Exit Sub
Controlar:
If Err.Number = 6 Then
MsgBox Valor Excedido. Mximo = 255
ElseIf Err.Number = 13 Then
MsgBox Digite un valor numrico
End If
End Sub

Pgina: 138 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Errores controlables
En algunas situaciones, es posible que tenga errores controlables. Estos se
producen durante la ejecucin de una aplicacin o durante el desarrollo o la
compilacin. Para verificar y responder a los errores controlables, se utiliza la
instruccin On Error o el objeto Err.

Tabla de errores
Cdigo del error Mensaje

3 Retornar sin GoSub


5 Llamada de procedimiento no vlido
6 Desbordamiento
7 Sin memoria
9 Subscrito fuera de rango
10 Esta matriz est fija o bloqueada temporalmente
11 Divisin por cero
13 Tipos incompatibles
14 No hay espacio para secuencia de caracteres
16 Expresin demasiado compleja
17 No se puede realizar la operacin solicitada
18 Se ha producido una interrupcin del usuario
20 Continuar sin error
28 Continuar sin error
35 Sub, Function o Property no definido
47 Clientes de aplicacin de la DLL o de recurso de cdigo en exceso
48 Error en la carga de recursos de cdigo o DLL
49 Convencin incorrecta de llamado de recurso de cdigo o DLL
51 Error interno
52 Nombre o nmero de archivo incorrecto
53 Archivo no encontrado
54 Modo de archivo incorrecto
55 Archivo abierto
57 Error de E/S del dispositivo
58 El archivo ya existe
59 Registro incorrecto
61 Disco lleno
62 Entrada al final del archivo
63 Nmero de registro incorrecto
67 Exceso de archivos
68 Dispositivo no disponible
70 Permiso denegado
71 El disco no est listo
74 No se puede cambiar el nombre con unidad diferente
75 Error de acceso a la ruta / archivo

Elaborado por: Dennis Pichilingue R Pgina: 139


Ms. Excel VBA - Nivel II

76 Ruta no encontrada
91 Variable objet o variable de bloque With no establecida
92 For Loop no iniciado
93 Secuencia de caracteres predefinidos no vlida
94 Uso no vlido de null
322 No se puede crear el archivo temporal necesario
325 Formato no vlido en el archivo de recursos
327 Valor de dato nombrado no encontrado
328 Parmetro no permitido, no es posible grabar matrices
335 No se pudo acceder al registro del sistema
336 Componente no registrado correctamente
337 Componente no encontrado
338 El componente no se ejecut correctamente
360 Objeto cargado
361 No se puede cargar o descargar este objeto
363 Control especificado no encontrado
364 Objeto descargado correctamente
365 No se puede descargar en este contexto
385 Se requiere el ndice de matriz de propiedades
387 Property Set no permitido
393 Property Get no se puede ejecutar en tiempo de ejecucin
419 Permiso para utilizar el objeto denegado
422 Propiedad no encontrada
423 Propiedad o mtodo no encontrado
424 Objeto obligatorio
425 Uso no vlido de objeto
438 El objeto no admite esta propiedad o mtodo
440 Error de automatizacin
443 El objeto de automatizacin no tiene un valor predefinido
445 El objeto no admite esta accin
445 El objeto no admite esta accin
446 El objeto no admite argumentos nombrados
447 El objeto no admite la configuracin de ubicacin actual
448 Argumento nombrado no encontrado
450 Nmero incorrecto de argumentos o asignacin de propiedad no
vlida
451 El objeto, no una coleccin
452 Ordinal no vlido
453 Cdigo especificado no encontrado
454 Recurso de cdigo no encontrado
455 Error de bloqueo del recurso de cdigo
457 Esta clave ya est asociada a un elemento de esta coleccin
460 Formato no vlido de portapapeles
461 Mtodo o miembro de dato no encontrado

Pgina: 140 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

462 La mquina del servidor remoto no existe o no est disponible


463 Clase no registrada en la mquina local
480 No se puede crear una imagen AutoRedraw
481 Figura no vlida
485 Tipo de figura no vlido
486 No se puede imprimir la imagen de formulario en este tipo de
impresora
520 No se puede vaciar el portapapeles
521 No se puede abrir el Portapapeles
735 No se puede guardar el archivo en el directorio TEMP
744 Texto de bsqueda no encontrado
746 Sustituciones demasiado largas
31001 Sin memoria
31004 Ningn objeto
31018 La clase no se ha establecido
31027 No se puede activar el objeto

19. Control de mensajes de alerta


(DisplayAlert)
Control de visualizacin de los tems de la ventana
Los tems de la ventana, como barras de desplazamiento, lneas de la cuadrcula
y pestaas de hojas, pueden mostrarse de manera controlada por medio de
propiedades de valores booleanos, es decir, lgicos, que deben ser definidos
como True, en los casos en que los tems deban mostrarse, o False, en caso no
deban mostrarse.

A continuacin, se presenta una tabla que representa, en la primera columna, las


propiedades y, en la segunda columna, los tems controlados por stas
respectivamente:

DisplayGridlines Lneas de cuadrcula.


DisplayFormulas Frmulas.
DisplayHeadings Encabezados de fila y columna.
DisplayOutline Smbolos de estructura de tpicos.
DisplayZeros Valores iguales a cero.
DisplayHorizontalScrollBar Barra de desplazamiento horizontal.
DisplayVerticalScrollBar Barra de desplazamiento vertical.
DisplayWorkbookTabs Pestaas de las hojas.
DisplayAutomaticPageBreaks Salto de pgina automtico.
DisplayStatusBar Barra de estado.
Ejemplo:
Sub Mostrar()

Elaborado por: Dennis Pichilingue R Pgina: 141


Ms. Excel VBA - Nivel II

With ActiveWindow
DisplayGridlines = True
DisplayHeadings = True
DisplayWorkbookTabs = True
DisplayVerticalScrollBar = False
End With
End Sub

VBA-Application
Ya hemos dicho que los objetos Excel tienen una estructura jerrquica.

En lo mas alto jerarqua est el objeto Application.


Con el objeto Application, podemos usar una serie de mtodos y propiedades para
variar el comportamiento de Excel durante la ejecucin de nuestras macros y
formularios.

De todos los mtodos y propiedades, vamos a quedarnos, de momento, con:

METODOS Y PROPIEDADES DE APPLICATION

1) Metodo Quit
Cierra todos lo libros y cierra Excel.
Si existen libros sin guardar, nos avisar de si queremos hacerlo en funcin del
valor de la propiedad DisplayAlerts.

2) Propiedad DisplayAlerts
Permite eliminar la visualizacin de mensajes de Excel.
Admite los valores True/False.
Con el valor a False se eliminarn todos los mensajes.
El valor por defecto es True.

3) Propiedad ScreenUpdating
Permite eliminar la actualizacin de pantalla.
Admite los valores True/False.
Con el valor a False evitaremos la actualizacin de pantalla.
Se aconseja poner la propiedad en False para mejorar el rendimiento y eliminar el
parpadeo de la pantalla durante la ejecucin.
El valor por defecto es True.

4) Propiedad Visible
Permite eliminar la visualizacin de Excel.
Admite los valores True/False.
Con el valor a False evitaremos la visualizacin de Excel.
Se aconseja usar esta propiedad solamente con formularios.
Colocarla en False en el evento Initialize, y ponerlo a True en el evento Terminate,
Pgina: 142 Elaborado por: Dennis Pichilingue R
Ms. Excel VBA - Nivel II

ambos en el formulario.
El valor por defecto es True.
5) Propiedad EnableEvents
Permite eliminar los eventos de hoja y libro.
Admite los valores True/False.
Con el valor a False evitaremos la ejecucin los eventos de hoja y libro
No afecta a los controles en los formularios ni en las hojas.
Permanece con el valor True/False hasta que no se cambia.
El valor por defecto es True.

20. Control de actualizacin en pantalla


(Screen. Updating)
En el suguiente video muestro como con la propiedad ScreenUpdatin del objeto
Application nos permite apagar la actualizacin de pantalla para ejecutar una macro
que se lleve muchos pasos, y en cambio slo muestre el resultado final.
En el artculo Lista incompleta de tips para programar macros en Excel sugiero el
uso de dicha propiedad con el objeto de ahorrar memoria y hacer nuestras macros
ms eficiente.
Cdigo utilizado en el video
Private Sub CommandButton1_Click()
'Con actualizacin de pantalla
Range("A2").Select
Do While ActiveCell <> ""
ActiveCell.Value = ActiveCell.Value & Contador
Contador = Contador + 1
ActiveCell.Offset(1, 0).Select
Loop
Range("A2").Select
End Sub

Private Sub CommandButton2_Click()


'Sin actualizacin de pantalla
Range("D2").Select
Application.ScreenUpdating = False
Do While ActiveCell <> ""
ActiveCell.Value = ActiveCell.Value & Contador
Contador = Contador + 1
ActiveCell.Offset(1, 0).Select
Loop
Range("D2").Select
Application.ScreenUpdating = True
End Sub
Elaborado por: Dennis Pichilingue R Pgina: 143
Ms. Excel VBA - Nivel II

Pgina: 144 Elaborado por: Dennis Pichilingue R

Das könnte Ihnen auch gefallen