Está en la página 1de 144

Ms.

Excel VBA - Nivel II

Contenido

Programación orientada a objetos


El código en Visual Basic para Excel
 Sentencias de declaración, Sentencias de asignación, Tipos de
objetos
Control de flujo del programa
 Sentencias de bifurcación, Sentencias de repetición o bucle
 Sentencias: De ejecución múltiple, Goto, Call , Exit
Manejo de archivos
 Abrir un archivo, Abri un archivo de texto como hoja de cálculo
 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 intersección 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 múltiples
 Formularios para el ingreso de fechas con calendario
 Formulario para ingreso de usuario con contraseña
Crear funciones personalizadas
Manejo de eventos de Excel
 Macros autoexecutables
Manejo de módulos
 Insertar, eliminar, ocultar módulos (contraseña)
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 actualización en pantalla (Screen. Updating)

Elaborado por: Dennis Pichilingue R Página: 1


Ms. Excel VBA - Nivel II

1. Programación orientada a objetos


La programación en Office se basa en la técnica de programación 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 programación
Visual Basic (VB). VBA se emplea para automatizar una aplicación existente de
Excel.
La programación es similar en ambos.

Página: 2 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

2. El código en Visual Basic para Excel


2.1 Constantes y variables
Constantes simbólicas
Una constante, es un valor que no cambia durante la ejecución de un programa.
A menudo utilizamos constantes una y otra vez en el código, o bien el código depende
de ciertos números difíciles de recordar. En estos casos, la mejor solución es definir
estos valores como constantes simbólicas y utilizar a partir de entonces los nombres
que identifican estas constantes.
Para definir una constante simbólica, se utiliza la siguiente sintaxis:
[Public | Private] Const constante [As tipo] = expresión
Variables
Es un objeto del código cuya misión consiste en almacenar un valor que puede
modificarse a lo largo de la ejecución 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
número de bytes que emplea en la memoria.
 Alcance: Indica dónde 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 hábito declarar su tipo
Comentarios
Cuando una frase va precedida de una comilla simple (‘), Visual interpreta que es un
comentario y no ejecuta acción 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, dígitos, el carácter de subrayado y los
caracteres de declaración 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 paréntesis.
 Una palabra reservada tiene un significado especial para Visual Basic For Excel.
Son palabras reservadas: las sentencias, redefinidas, los nombres de las
funciones, los métodos, las propiedades, los tipos, los operadores.
 No se pueden utilizar palabras reservadas como nombres de variables.

Elaborado por: Dennis Pichilingue R Página: 3


Ms. Excel VBA - Nivel II

Las variables se pueden clasificar según diversos


criterios
1. Según su Uso
Constantes Son variables que tienen datos que no se modificarán en el
programa y su empleo facilita la modificación de la aplicación.
Variables Cuyo contenido si se modifica en el programa.

2. Según su contenido
Tipo de Tamaño 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
precisión
simple)
Double 8 bytes -1.79769313486231E308 a
(coma -4,94065645841247E-324 para valores
flotante/ negativos; 4,94065645841247E-324 a
precisión 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 número más pequeño distinto
de cero es
+/-0,0000000000000000000000000001
Date 8 bytes 1 de enero de 100 a 31 de diciembre de
9999

Página: 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 numérico hasta el
(con intervalo de un tipo Double
números)
Variant 22 bytes + El mismo intervalo que para un tipo String
(con longitud de la de longitud variable
caracteres) cadena
Definido por Número 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. Según su alcance

TIPO DECLARA DESCRIPCIÓN


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 reinicialización se debe definir la
variable como ESTÁTICA.
Formulario Dim Las variables de ámbito formulario se pueden emplear en
cualquier procedimiento definido en el módulo. Estas
variables se deben declarar en la sección de declaraciones
del formulario o módulo.
Global Global Su ámbito es toda la aplicación, por lo que se puede usar
en cualquier parte y, por ello, no se pueden declarar en un
procedimiento o formulario.

Según se puede observar en la figura, hay cuatro lugares donde se pueden


definir las variables: Global, Formulario o Módulo y Procedimientos. (En el
formulario se incluyen controles y código mientras que en el módulo sólo puede
incluirse código).
Se pueden definir variables con el mismo nombre en niveles diferentes, aunque
no es aconsejable por la ambigüedad que esto supone, pero no son la misma
variable. En estos casos, el procedimiento usa la variable de nivel más cercano.
(local-formulario-global).

Elaborado por: Dennis Pichilingue R Página: 5


Ms. Excel VBA - Nivel II

2.2 Sentencias de declaración


Antes de utilizar una variable, es un buen hábito declarar su tipo. Una forma de hacer
esto es utilizando la sentencia Dim (o una de las palabras Public, Private o Static).
Cualquier declaración de éstas inicializa las variables numéricas con el valor cero y
las variables alfanuméricas con el carácter 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 precisión 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 más 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 declaración de
tipo.

Declaración explícita
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 sólo en el formulario o módulo donde se especifica. Para tener
la opción activa para todo el código de la aplicación, debemos acudir al menú
Herramientas, seleccionar Opciones,
Del cuadro de dialogo presentado activar "Requerir Declaración de variables".

Página: 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 utilización más común es
intervenir en cálculos 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 estática
Para hacer que esto no suceda, hay que declarar la variable como estática. Visual
reinicializa una variable estática solamente la primera vez que se llama al
procedimiento. Para declarar una variable como estática se utiliza la palabra clave
Static en lugar de Dim.

Por ejemplo:
Static var_ent As Integer

Variables utilizadas dentro del módulo


Una variable que es declarada a nivel de módulo (formulario, módulo estándar o
clase) puede ser compartida por todos los procedimientos de ese módulo.
Las variables de este tipo hay que declararlas como Dim o con Private en la sección
de declaraciones del módulo (sección General).
La forma de crear un nuevo módulo es ejecutando la orden Formulario para un
formulario, Módulo para un módulo estándar o Módulo de clase para una clase, del
menú Insertar.
Este tipo de variable son por defecto estáticas.

Variables globales
Una variable global es una variable declarada a nivel de módulo pero que puede
ser accedida desde cualquier otro módulo. Para hacer que sea global o pública hay
que declararla Public (Global en versiones anteriores) en la sección de
declaraciones del módulo.

Elaborado por: Dennis Pichilingue R Página: 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 módulo es necesario
especificar su pertenencia; esto es, de qué objeto es dato miembro dicha variable.

2.3 Sentencias de asignación


Se utiliza para asignar o almacenar valores a variables o constantes. Es una
operación que sitúa un valor determinado en una posición de memoria. La
operación de asignación 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 expresión, se producirá un
error lógico.
2. En la izquierda de una sentencia de asignación solo pueden existir
identificadores.
Ejemplo:
A = 10
Pi = 3.1416
NSueldo = Sueldo + aumento
No es válido lo siguiente:
Sueldo - Descuentos = 425
5=B
3. La operación de asignación 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 asignación.
4. Es posible utilizar el mismo nombre de identificador en ambos lados del
operador de asignación.
Ejemplo:
N=2
N=N+4

Página: 8 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Asignación por su Contenido:


1. Asignación aritmética:
La expresión que se evalúa es de tipo aritmético 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. Asignación Alfanumérica:
La expresión que se evalúa es de tipo carácter y esta formada por caracteres
alfanuméricos (letras, numéricos y caracteres especiales).
Ejemplo: X = “28 de julio 1922"
3. Asignación lógica
La expresión que se evalúa es de tipo lógico y solo puede tomar uno de dos valores
falso o verdadero. Estos representan el resultado de una comparación entre otros
datos.
Ejemplos: M=8>5 El valor lógico de M es verdadero.
Y = 3 > 2 AND 10 <= 5 El valor lógico de Y es Falso

Entender el comportamiento de una variable local.


Diseñe el siguiente formulario

Private Sub CommandButton1_Click()


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

Elaborado por: Dennis Pichilingue R Página: 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 código y ejecuta el programa verá que
cuando presiona el botón de command1, en el Text1 se muestra el valor 5.
Si usted presiona el botón 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.
Conclusión:
“a” es una variable local en command1, evento click y tiene como ámbito sólo el
command1, evento click.
La variable “a” asignada en el command2 es otra variable que ocupa otra posición
de memoria a pesar que tengan el mismo nombre.

Entender el comportamiento de una variable a nivel de formulario


1. Diseñe 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 código y ejecuta el programa verá que cuando presiona el botón
de command1, en el Text1 se muestra el valor 5.

Página: 10 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Si usted presiona el botón 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.
Conclusión:
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 código y ejecuta el programa verá que cuando presiona el botón
command1, en el Text1 se muestra el valor 3, si vuelve a presionarlo el botón
command1 en el Text1 se muestra el valor 6, si vuelve a presionar el botón
command1 en el Text1 se muestra el valor 9, … se comporta como un contador.
Conclusión:
“c” es una variable static, no se reinicia, retiene su valor, esto hace que se comporte
como un contador. Una variable static, sólo se puede declarar en eventos de los
controles mas no en el objeto General, evento Declaraciones.

Elaborado por: Dennis Pichilingue R Página: 11


Ms. Excel VBA - Nivel II

Entender el comportamiento de una variable declarada en un


módulo.

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 pública a nivel de módulo, esto quiere decir que tiene
como ámbito todos los formularios del proyecto.
Como nos damos cuenta de esto. Si usted edita el código y ejecuta el programa
verá que cuando presiona el botón command1 del form1, en el Text1 se muestra el
valor 5, si vuelve a presionarlo el botón command1 en el Text1 se muestra el valor
10, … se comporta como un contador.
Cuando pasa al segundo Form2 y presiona el botón Command1 en el Text1 se
muestra el valor 13. Pasa el valor de la variable “d” del form1 al form2.

Página: 12 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Conclusión:
“c” es una variable static, no se reinicia, retiene su valor, esto hace que se comporte
como un contador..
Una variable static, sólo se puede declarar en eventos de los controles mas no en
el objeto General, evento Declaraciones

Métodos de búsqueda (Elaborado por Daniel Zavaleta)


1. Diseño de la hoja

Elaborado por: Dennis Pichilingue R Página: 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

Página: 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 Página: 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 continuación se
describe algunos objetos:
- Application. Es el objeto superior y representa a Excel. a través de este
objeto podremos acceder a las opciones que da Excel como: Hacer visible Excel,
manipular la creación barras de herramientas o el asistente de Excel, elegir si el
cálculo es manual o automático, o cada cuantos minutos se auto guardará el libro,
etc.
- Workbok. Se refiere a los
libros. A través 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.

Página: 16 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Conectamos un objeto con sus propiedades y métodos a


través 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 jerarquía


Los objetos de Excel se clasifican en Clases y estas se ordenan en Jerarquía.
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 colección del objeto Worksheets
Ejemplo: Worksheets(“Hoja1”)
Objeto

Referencia a la hoja forma 2.


Conjunto de hojas forman una colección del objeto Worksheets
Ejemplo: Worksheets(1)
Objeto

Las jerarquías
Nos ayuda hacer referencia a los objetos según su posición en la jerarquía de objetos.
Utilice un punto para separar los objetos. Ejemplo.

Aplicación Libro Hoja celda

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

Elaborado por: Dennis Pichilingue R Página: 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

Página: 18 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Modelo de objetos de Excel

Elaborado por: Dennis Pichilingue R Página: 19


Ms. Excel VBA - Nivel II

El examinador de objetos
Muestra los eventos, métodos y propiedades asociados a cada objeto.

Hay tres paneles que a continuación se describe

 Panel Objetos, los iconos identifican las estructuras jerárquicas 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, métodos, eventos, variables,


constantes y otros elementos contenidos.

 Panel Descripción 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

Métodos

Evento

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


cuadro miembros de se mostraran sus eventos

Página: 20 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

La ventana inmediato
Es una herramienta para probar instrucciones, expresiones VBA, propiedades y
métodos. 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:
Interrogación ?, 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 Página: 21


Ms. Excel VBA - Nivel II

3. Control de flujo del programa


3.1 Sentencia de bifurcación
Permite que se ejecuten conjuntos distintos de instrucciones en función de que se
verifique o no una determinada condición.

Expresiones lógicas
Imprescindibles para verificar condiciones son las expresiones lógicas, expresiones
cuya evaluación produce un valor lógico.
a. Operadores de relación
Se utiliza para establecer una relación, entre un valor numérico con sus
respectiva variable o entre expresiones matemáticas. Entre los operadores de
relación 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
Relación 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

Página: 22 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

b. Operadores lógicos.
Se utiliza para establecer condiciones entre expresiones. Entre los operadores
lógicos tenemos:
not No lógico
and Y lógico
or O lógico.

c. Tablas de verdad
Negación (not)
Invierte la condición de la expresión.
P not P
V F
F V

Conjunción (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
Disyunción (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 Página: 23


Ms. Excel VBA - Nivel II

Ejemplos:
1. (1 > 0) AND (3 = 3) verdadero
2. (0 < 7) OR (0 > 7) verdadero
3. Defina una expresión lógica que evalué si un número se encuentra en el
rango de números 48 y 57. Sea “n” el número
(n >= 48 and n <= 57)
4. Defina una expresión lógica que evalué si un número se encuentra en el
rango de números 65 y 90, o en el rango 95 y 122. Sea “n” el número.
(n >= 65 and n <= 90) or (n >= 95 and n <= 122)
5. Defina una expresión lógica que evalué si un número se encuentra entre el
siguiente listado de números 8, 32, 13, 25,27, 42. Sea “n” el número.
(n = 8 or n=32 or n=13 or n=25 or n=27 or n=42)
6. Formas de representar una negación lógica:
Not True = False
7. La expresión "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 expresión " NO a es menor que b” not(a) < b
Es falsa si (a<b) es verdadero, y es verdadera si la comparación 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 más instrucciones basadas en una
expresión lógica. Puede utilizar la sintaxis de una línea o un bloque de varias líneas:

Sintaxis 1:
 If expresión lógica Then Sentencias
Sintaxis 2:
 If expresión lógica Then
Sentencias
End If
Si condición es True, Visual Basic ejecuta todas las sentencias que siguen a la
palabra clave Then.

Página: 24 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Ejemplo 1
Utilizando If … Then en una línea
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 evalúa primero la expresión lógica
Si es verdadero ejecuta el bloque de código que sigue a Then.
Si es falso ejecuta el bloque de código que sigue a Else.
Sintaxis:
If expresión lógica Then
Instrucciones 1
Else
Instrucciones 2
End If

Ejemplo.
Calcular el impuesto por 4ta. Categoría

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 Página: 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 expresión lógica1 Then
[bloque de sentencias 1]
[ElseIf expresión lógica2 Then
[bloque de sentencias 2]] ...
[Else
[bloque de sentencias n]]
End If
Visual Basic evalúa primero la expresión lógica1. Si es False, Visual Basic procede
a evaluar la expresión lógica2 y así sucesivamente, hasta que encuentre una
condición True.
Cuando encuentra una condición True, Visual Basic ejecuta el bloque de
instrucciones correspondientes y después ejecuta el código 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 carácter del teclado
 La tecla CTRL en combinación con una tecla alfabética
 La tecla CTRL en combinación con un carácter especial
 BACKSPACE.
 ESC.
 El evento KeyPress no ocurre cuando presiona:
 TAB.
 ENTER.
 Teclas flechas

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

Utilización de If...Then...ElseIf . Para verificar el estado aprobado o desaprobado,


según la nota de un alumno
1. Diseñe 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 válida"
End If
End If
End Sub

3.2 Selección múltiple: Select Case


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

Sintaxis
Select Case expresión_prueba
Case lista_expresion-n
instrucciones-n...
Case Else
instrucciones_else
End Select

Donde:
Expresión_prueba . Expresión numérica o expresión de cadena.
Lista_expresión-n . Lista delimitada por comas de una o más de las formas
siguientes: expresión, expresión To expresión, Is operador_de_comparación
expresión.
Instrucciones-n. Una o más instrucciones
Instrucciones_else. Instrucciones que se ejecuten si expresión_prueba no coincide
con ninguna de las cláusulas Case.

Como usar las instrucciones Select Case


En el siguiente ejemplo, la instrucción Select Case evalúa el argumento rendimiento
que se pasa al procedimiento. Observe que cada instrucción Case puede contener
más de un valor, una gama de valores, o una combinación de valores y operadores de
comparación. La instrucción opcional Case Else se ejecuta si la instrucción 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

Página: 28 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

1- Comparar 2 números 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 números 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 números 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 Página: 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 más instrucciones que se van a ejecutar sobre el objeto.
La instrucción With permite realizar una serie de instrucciones sobre un objeto
especificado sin volver a calificar el nombre del objeto. Por ejemplo, para cambiar un
número de propiedades diferentes en un único objeto, es más conveniente colocar las
instrucciones de asignación de las propiedades en la estructura de control With,
haciendo referencia al objeto una vez, en lugar de hacerlo con cada asignación de
propiedad.

Como usar las instrucciones With


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

El siguiente ejemplo introduce en un rango de celdas el número 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, Tamaño de
fuente 20 puntos, Color de fuente Roja, Centrado en la celda
Podríamos 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
instrucción 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 raíz cuadrada
de 200 y selecciona a continuación 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 supondría 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 Página: 31


Ms. Excel VBA - Nivel II

3.4 Sentencia de repetición o bucle


a. While...Wend
Ejecuta una serie de instrucciones mientras una condición dada sea True. Los bucles
While...Wend se pueden anidar a cualquier nivel. Cada Wend coincide con el While
más reciente.
Donde:
Condición. Expresión numérica o expresión de cadena cuyo valor es Verdadero o
Falso. Si condición es Null, condición se considera Falso.
Instrucciones. Una o más instrucciones que se ejecutan mientras la condición es
Verdadera, todas las instrucciones se ejecutan hasta que se encuentra la instrucción
Wend.
Sintaxis
While condición
Intrucciones
Wend
Ejemplo. La siguiente macro busca a partir de la celda B3 hacia abajo una celda que
se encuentre vacía.
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 número específico 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 numérica 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.

Página: 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 número 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 instrucción
For determina la variable contador x y sus valores inicial y final. La instrucción 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 ejecución 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 ejecución 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 condición es Verdadera o hasta que
una condición se convierta en Falsa. Utilice instrucciones Exit Do para salir de este
ciclo repetitivo, la instrucción Exit Do transfiere el control a la instrucción que sigue
inmediatamente a la instrucción Loop.
Cuando se utiliza con instrucciones anidadas Do…Loop, la instrucción Exit Do
transfiere control al bucle que está anidado un nivel por encima del bucle donde
ocurre.

Elaborado por: Dennis Pichilingue R Página: 33


Ms. Excel VBA - Nivel II

Sintaxis 1 Sintaxis 2
Do While | Until condición Do
instrucciones instrucciones
Exit Do Exit Do
instrucciones instrucciones
Loop Loop While | Until condició

Donde:
Condición. Expresión numérica o expresión de cadena que es Verdadera o Falsa. Si
la condición es Null, la condición se considera Falsa.
Instrucciones. Una o más instrucciones que se repiten mientras (While) o hasta que
(Until) la condición sea Verdadera

Como usar las instrucciones Do...Loop


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

a. Repetir instrucciones mientras una condición es Verdadera


Hay dos formas de utilizar la palabra clave While (Mientras) para comprobar el estado
de una condición en una instrucción Do...Loop. Se puede comprobar la condición antes
de entrar en el bucle, o después de que el bucle se haya ejecutado al menos una
vez.En el siguiente procedimiento WhileInicial, la condición 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 ejecutarán nunca. En
el procedimiento WhileFinal, las instrucciones contenidas en el bucle al menos se
ejecutarán una vez y aumentarán la Nota en 1, antes de comprobarse que la condición
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
Página: 34 Elaborado por: Dennis Pichilingue R
Ms. Excel VBA - Nivel II

b. Para repetir instrucciones hasta que una condición llegue a ser


Verdadera
Hay dos formas de utilizar la palabra clave Until (Hasta que) para comprobar el estado
de una condición en una instrucción Do...Loop. Se puede comprobar la condición antes
de entrar en el bucle (como muestra el procedimiento UntilInicial) o se pueden
comprobar después de que el bucle se haya ejecutado al menos una vez (como
muestra el procedimiento UntilFinal). El bucle seguirá ejecutándose mientras la
condición 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 instrucción Exit Do. Por ejemplo, para salir de
un bucle sin fin, se puede usar la instrucción Exit Do en el bloque de instrucciones
True de una instrucción If...Then...Else o Select Case. Si la condición es False, el bucle
seguirá ejecutándose 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 instrucción If...Then...Else
comprueba esa condición 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 Página: 35


Ms. Excel VBA - Nivel II

d. For Each...Next
Repite un grupo de instrucciones para cada elemento de una matriz o colección. 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. Después, mientras haya más elementos en grupo, las
instrucciones en el bucle continúan ejecutándose para cada elemento. Cuando no hay
más elementos en el grupo, se sale del bucle y la ejecución continúa con la instrucción
que sigue a la instrucción 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 más 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 colección o para cada elemento de una matriz. Visual Basic
asigna valor automáticamente 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 código siguiente recorre todas las celdas de un rango, asignado a la variable Cuadro
con la instrucción Set, e introduce el valor de la variable P en aquellas celdas cuyos
contenidos son menores o iguales a 10.

Página: 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 continuación 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 cálculo 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
número. 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 Página: 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 numérico."
Exit For
End If
Next
End Sub

1.
1. Sumar un rango de números
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

Página: 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 vacías
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 Página: 39


Ms. Excel VBA - Nivel II

7. Recorrer celdas de una hoja 2


Automátic

8. Recorrer celdas de una hoja 2

3.5 Instrucción GoTo


La instrucción GoTo permite que una instrucción especificada por una etiqueta de
línea sea ejecutada, ignorando otras posibles instrucciones en el flujo normal de los
procedimientos. Podemos especificar etiquetas de línea para cualquier fila del
código, solo se debe insertar un nombre alfanumérico que empiece con una letra y
termine en dos puntos (:).

En el siguiente ejemplo de código, cuando una condición sea atendida, la


instrucción GoTo será utilizada para ejecutar la instrucción identificada con la
etiqueta de línea 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 código]...
Exit Sub

Página: 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 estén
encerrados en paréntesis, si este procedimiento no tuviera argumentos no se
colocaran.
Ejemplo del modo de uso, tenemos dos procedimientos diferentes pero que
cumplen la misma función, Proc1 uno no recibe parámetros mientras que Proc2 si
recibe parámetros.

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 llamaría de la siguiente forma:


Sub principal2()
Proc1
End Sub

Elaborado por: Dennis Pichilingue R Página: 41


Ms. Excel VBA - Nivel II

Registro DE UNA FACTURA

1. Diseño de la hoja OrdeDeCompra

2. Diseño de la hoja Lista de eproductos

Página: 42 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

3. Nombres de rango

4. Diseño del formulario

5. Programa

Elaborado por: Dennis Pichilingue R Página: 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

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

Método GetOpenFilename
El método GetOpenFilename permite simplificar el acceso a archivos, lo que garantiza
que el nombre y la ruta del archivo estén correctos.
Abre el cuadro de diálogo Abrir y retorna una secuencia de caracteres el nombre del
archivo que el usuario selecciona

Elaborado por: Dennis Pichilingue R Página: 45


Ms. Excel VBA - Nivel II

Sintaxis:
Application.GetOpenFilename

Método GetSaveAsFilename
Abre un cuadro de diálogo igual al cuadro de Guardar como de Excel y obtiene el
nombre de ruta del archivo pero sin que se realice cualquier acción con estas
informaciones.
Sintaxis:
object.GetSaveAsFilename ( [initialFilename], [fileFilter], [filterIndex], [title],
[buttonText] )
Donde:
InitialFilename: Este argumento determina cuál será el nombre patrón que se muestra
en el cuadro antes que el usuario seleccione otro archivo;
FileFilter: Con este argumento podemos determinar qué tipos de archivos se
encontrarán disponibles en el cuadro de diálogo para que el usuario seleccione;
Title: Este argumento determina el texto que se va a mostrar en la barra de títulos del
cuadro de diálogo.
Ejemplo: Mostrar la ruta y nombre del archivo en un cuadro de diálogo:
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.

Página: 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 each…next 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 Página: 47


Ms. Excel VBA - Nivel II

Procedimiento que importa archivo de texto separado por tab


Archivo: textoConTab.txt
Valor
Mês médio Conta
Esta Agênci abertura da depósito cheque
do Cidade a Cliente Conta conta s especial Gerente
Zueira Indústria e 355.343
PR Curitiba 700 Comércio -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 Não Jaime
Porto Companhia. 356.789
RS Alegre 950 Flokos -7 Fevereiro 700 0 Não Perez
Porto 355.654
RS Alegre 955 Metalúrgica Prego -9 Janeiro 720 0 Não Vilma
Florianó Amim Indústria 244.675 Antonio
SC polis 800 Ltda. -9 Abril 560 0 Sim Dias
Florianó Tubarão Produtos 244.897
SC polis 800 Alimentícios -0 Outubro 955 0 Sim Márcia

Módulo1.
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 cálculo después 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 están como una sóla hoja de cálculo.


'Si existe más de una hoja de cálculo elimina las excedentes
n = Sheets.Count

Página: 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 cálculo y transfiere los datos


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

'Ajusta el tamaño 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 jerárquica para manipular, leer y crear


archivos de texto ASCII y Unicode. Esta estructura es muy diferente de la estructura
jerárquica de la implementación original de E/S de archivo de Visual Basic.

FileSystemObject no admite el acceso a archivos binarios, de modo que aún debe usar el
modelo original E/S de archivos de Visual Basic para ello.

Elaborado por: Dennis Pichilingue R Página: 49


Ms. Excel VBA - Nivel II

Función 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

Página: 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 continuación 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.

Métodos del objeto WorkBook


Algunos de los métodos para el objeto Workbooks son los siguientes:

Close: Este método cierra el archivo. A continuación tenemos la representación


de su sintaxis y, luego, la descripción 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 Página: 51


Ms. Excel VBA - Nivel II

FileName: Es el nombre del archivo;

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


de circulación.

Open: Se debe usar este método para abrir un archivo. A


continuación, tenemos la representación de la sintaxis:
Workbooks.Open FileName:=”Ruta del archivo”
El ejemplo siguiente de la línea de código que abre un archivo es el siguiente:

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

Save: Este método guarda el archivo. A continuación, tenemos la representación


de su sintaxis:

Workbooks(<nombre del archivo>).Save

El ejemplo siguiente de la línea de código que guarda un archivo es el siguiente:


Workbooks(“RelMensal.xlsx”).Save

Protect: Se usa este método para proteger el libro de trabajo y tiene una
función igual al comando Herramientas / Proteger / Proteger el libro de trabajo. La
sintaxis para ese método es la siguiente:

Protect(Password,Structure,Windows)

Unprotect: Este método elimina la protección del libro de trabajo. Su sintaxis


es la siguiente:

Unprotect(Password)

Ejemplo:

Workbooks(“prueba1.xlsx”).Unprotect “123Contraseña”

6. Manejo de la hoja: WorkSheet


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

Página: 52 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Propiedades de la hoja
A continuación, 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 cómo ocultar la hoja Plan1:
Worksheets(“Plan1”).Visible = False

ScrollArea: Por medio de esta propiedad, se pueden definir los límites de


desplazamiento por la hoja, ya que su función 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 región.

WorkSheets(“Plan1”).ScrollArea = “A1:L11”

Para liberar la navegación 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 podrán 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 Página: 53


Ms. Excel VBA - Nivel II

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

Worksheets(“Plan1”).EnableSelection = xlNoSelection

Métodos de la hoja
A continuación, se describen los métodos del objeto Worksheets:

Add(Before,After,Count,Type)

Add: Por medio de este método, se puede añadir hojas de cálculo, macro de
Excel 4.0 o un gráfico a un libro de trabajo. Su sintaxis se muestra a continuación
y, luego se encuentra la descripción de cada uno de sus elementos:
Before: Hoja antes de que se inserte la nueva;
After: Hoja después de que se inserte la nueva;
Count: Cantidad de hojas que se insertarán;
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 método no incluye las hojas del cuaderno de trabajo. La hoja que
se excluirá puede indicarse por su nombre o por la posición que ocupa en el
archivo. El ejemplo siguiente excluye la quinta hoja del archivo:

Sheets(4).Delete

Copy: Este método copia una hoja a otra ubicación en el archivo. La sintaxis
de este método es la siguiente:

Copy(After,Before)

El ejemplo siguiente hace una copia de Hoja2 y la coloca después de


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

Página: 54 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Move: Este método mueve la hoja a otra ubicación del archivo. Su sintaxis es
la siguiente:

Move(Before,After)

El ejemplo siguiente mueve la hoja Plan1 a la última ubicación en el cuaderno de


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

Select: Para seleccionar una hoja, se debe usar este método. La línea siguiente
puede usarse para seleccionar la hoja Plan1:

Sheets(“Plan1”).Select

Protect: Este método se utiliza para proteger la hoja y tiene una función igual
al comando de protección de hoja pero con un cuarto argumento. La sintaxis de
este método es la siguiente:

Protect(Password,DrawingObjects,Contents,Scenarios,UserInter

Argumento Descripción
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 método retira la protección de la hoja. El ejemplo siguiente


retira la protección de la hoja Hoja1, que posee una contraseña:

Sheets(“Hoja1”).Unprotect “contraseña”

Elaborado por: Dennis Pichilingue R Página: 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 más celdas de forma simultánea.

Propiedades objeto Range


Value: Esta es la propiedad predeterminada de Range. Con ella, se puede dar
o definir el valor de una o más celdas. Las celdas pueden indicarse no solamente
por su posición, sino también 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 también 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 número de línea de una celda. El ejemplo


siguiente inserta una celda activa al número de la línea de la celda B5:
ActiveCell = Range(“B5”).Row
• Column: Esta propiedad proporciona el número 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 número de la columna C3:

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

• Name: Esta propiedad proporciona nombre a una o más celdas. El ejemplo


siguiente coloca en la celda A3 el nombre “Precios”:

Range(“A3”).Name = “Precios”

Métodos del objeto Range


Select: Este método sirve para seleccionar celdas. Se puede seleccionar solo
una celda, o un intervalo de celdas, o una o más celdas, y más de un intervalo, etc.
Se pueden seleccionar diversas celdas independientemente de la posición de la
hoja donde se encuentra. Si se usa la siguiente línea, se seleccionará la celda A5
de la hoja activa:

Range(“A5”).Select

El próximo ejemplo selecciona el intervalo entre la celda activa y la celda


B6:
Range(ActiveCell, “B6”).Select
Página: 56 Elaborado por: Dennis Pichilingue R
Ms. Excel VBA - Nivel II

Copy: El método Copy copia las celdas, y el lugar donde quedará la copia
cambia según 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 automáticamente 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 posición de la celda E6.
Range(“c2:c4”).Copy Range(“e6”)

Cut: Este método 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 método 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 método limpia solo el contenido de la celda y mantiene


las demás 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 método 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 método es usado para eliminar las celdas de la hoja. En su sintaxis,
mostrada a continuación, el argumento Shift no es obligatorio y sirve para definir

Elaborado por: Dennis Pichilingue R Página: 57


Ms. Excel VBA - Nivel II

el lugar donde se moverán las celdas; si se quiere para la izquierda, se debe usar
xlShiftToLeft, y si es para arriba, xlShiftUp:
Delete(Shift)
El ejemplo a continuación elimina las celdas contenidas en el intervalo y desplaza
las demás hacia la izquierda:
Range(“c2:c4”).Delete xlToLeft

• Insert: Este método inserta las celdas en la hoja. En su sintaxis, mostrada a


continuación, el argumento Shift no es obligatorio sirve para indicar el lugar donde
se moverán las celdas; si se desea para la derecha, se debe usar xlShiftToRight,
si es hacia abajo, XlShiftDown:
Insert(Shift)
El ejemplo a continuación inserta las celdas contenidas en el intervalo y desplaza a
las demás hacia abajo:
Range(“c2:c6”).Insert xldown

Mantenimiento de almacén de un alibrería (Desarrollado por Kiara Gagliuffi)

1. Diseño de la hoja Base

Página: 58 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

2. Diseño de la hoja Registro

3. Diseño de la hoja Caja

Elaborado por: Dennis Pichilingue R Página: 59


Ms. Excel VBA - Nivel II

4. Tabla de nombres de rangops

5. Diseño del formulario

6. Programa
Página: 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 Página: 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
Página: 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 instrucción

Elaborado por: Dennis Pichilingue R Página: 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 acompañado de un índice que indica el número de orden del elemento
dentro del arreglo.

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


números, 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.
Gráficamente se representa, como se muestra en la gráfica

Ejemplo Gráfico

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 Presentación 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 gráfica.

Página: 64 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Representación 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 gráfico se observan:


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

8.2 Declaración de un arreglo unidimensional


La declaración de un arreglo permite definir la estructura que tendrá el arreglo, tipo de
arreglo, tipo de dato del arreglo y número de elementos del arreglo. Para indicar la
cantidad de elementos del arreglo usted puede especificar el límite inferior y superior.
Sintaxis:

Elaborado por: Dennis Pichilingue R Página: 65


Ms. Excel VBA - Nivel II

Dim Nombre ( Dimensión) As TipoDeDato

Donde
Nombre: Es el nombre del arreglo
Dimensión: Define el número 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
También puede declarar

Dim Nombre ( Li to Ls) As TipoDeDato

Dónde:
Li. Es el límite inferior del arreglo
Ls. Es el límite superior del arreglo
Si no define el límite 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. Gráficamente 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. Gráficamente se
muestra como sigue:

Página: 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. Gráficamente 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 Asignación.-
Asigna el valor de 25 al elemento 10 del array A
Ejm1: A(10) = 25

‘Asigna el dato “Andre Fernández” al elemento 2 del array Nombre


Ejm2: Nombre (2) = “Andre Fernández”

‘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 Página: 67


Ms. Excel VBA - Nivel II

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


Next
1. Diseño 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
Página: 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 'múltiplica 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. diseño 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 Página: 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. Diseño 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

Página: 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 subíndice disponible para la dimensión indicada de
una matriz.
Sintaxis: UBound(nombredelamatriz[, dimensión])
LBound devuelve el mayor subíndice disponible para la dimensión indicada de
una matriz.
Sintaxis: LBound(nombredelamatriz[, dimensión])

8.3.4 Operaciones de Actualización:


Inserción. Adición de un nuevo elemento a la lista
Borrado. Eliminación de un elemento de la lista.

Inserción
La inserción 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 demás conserven el orden relativo entre ellos

Elaborado por: Dennis Pichilingue R Página: 71


Ms. Excel VBA - Nivel II

Insertar un elemento al array.


1. Diseño 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 función 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

Página: 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. Diseño 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 Página: 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

Ordenación
Organización de los elementos de la lista de acuerdo con algún tipo de orden. Ejm.
ordenar de mayor a menor, en orden alfabético, etc.
Este proceso permite ordenar un conjunto de objetos en un orden específico. Esto
se hace por lo general para facilitar la búsqueda de los elementos del array. Así se
clasifica en: los diccionarios, agendas telefónicas, en los casilleros de bibliotecas,
relación de amigos, etc.

Página: 74 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Ordenamiento por el método de burbuja


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

1. Diseño 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 Página: 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. Diseño de la hoja

Página: 76 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

2. Nombres de rango

3. Diseño del formulario UserForm1

Private Sub CommandButton2_Click()


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

Elaborado por: Dennis Pichilingue R Página: 77


Ms. Excel VBA - Nivel II

4. Diseño 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

Página: 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 código
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 Página: 79
Ms. Excel VBA - Nivel II

End Sub

5. Diseño 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

Página: 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 Página: 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 acompañado de dos índices que indica el número 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 subíndice 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)

Representación Gráfica del arreglo con datos

Columnas
0 1 2
Fila 0
s 1

Arreglos multidimensionales
Podemos definir matrices de dimensión superior a dos. Podemos llegar a un máximo
de 60 dimensiones. Una matriz de 5 dimensiones se declararía:
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.

Página: 82 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Asignación y lectura de datos de un arreglo


1. Diseño 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 Dinámicos


Hay situaciones en las cuales se desea usar un arreglo, pero al momento del diseño
no se sabe sus dimensiones. Para este tipo de situaciones Visual Basic permite
declaraciones arreglos dinámicos.

Declara un arreglo dinámico


Dim x ( ) As Integer
...
...
Redimensiona un arreglo dinámico
Redim x (lstLista.ListCount)

Elaborado por: Dennis Pichilingue R Página: 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 dinámico preservando sus


valores
Redim Preserve x ( intNúmeroDeElementos )
Una variable ya declarada como una matriz puede redimensionarse a lo largo del
programa mediante la instrucción ReDim

ReDim Alumno (1To 25)

Mediante esta instrucción, estamos ReDimensionando una matriz ya declarada. No


se puede redimensionar una matriz inexistente.
Mediante la declaración 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 número 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
aplicación, pero esa redimensión no puede afectar al número de dimensiones de la
matriz. Si redimensionamos la matriz perderá la información existente. Para evitar
perder la información presente en la matriz, debe utilizar la sentencia ReDim
Preserve.
Si usa la palabra clave Preserve en matrices de dimensión superior a 1, va a
encontrarse con comportamientos no esperados. Como podrá ver en la Ayuda de VB,
usando ReDim Preserve sólo puede cambiar el tamaño de la última dimensión de
matriz y no puede modificar en ningún momento el número de dimensiones. NO es
cierto del todo. SÍ lo podrá hacer una sola vez.
Respecto a cambiar el número 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 también hemos cambiado el número de elementos en
cada dimensión.

Página: 84 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Si hubiésemos utilizado ReDim Preserve solamente podríamos haber usado la


primera de las dos líneas anteriores :
ReDim Preserve MiMatriz (1 To 5, 1 To 9)
Pero ya no podríamos volver a cambiar el número de dimensiones con la segunda
línea. Nos daría un error.
Con ReDim podemos cambiar el número de elementos de cada dimensión 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 hubiésemos empleado ReDim Preserve, podríamos 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 dimensión :


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 señala en negrita el error.
Esto no causa ningún error en una matriz de una dimensión, ya que si la matriz tiene
sólo una dimensión, puede cambiar el tamaño de esa dimensión porque es la única
y la última.
Cuando a lo largo de la aplicación 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 Página: 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 número 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 número de elementos a incluir, redimensionamos nuestra
Matriz
ReDim MyArray(1 To clientes) As Variant
On Error Resume Next 'En caso de error, que continúe
ComboBox1.Clear 'limpiamos el ComboBox
'añadimos 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
'incluímos cada elemento de la Matriz dentro del Cuadro combinado
ComboBox1.AddItem MyArray(i)
Next i
End Sub

11. El formulario
Se utiliza para diseñar su aplicación. 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 más fácilmente podemos cambiarle el nombre en la ventana de
propiedades del UserForm, en concreto en la propiedad Name

Jerarquía de Objetos de UserForm

Página: 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 título del formulario.
Enabled True/False. Determina si está habilitado para responder a las
acciones del usuario.
Left y Top Ubicación del formulario.
Name Nombre del formulario.
Width Tamaño del ancho del formulario
Height Tamaño de la altura del formulario
Picture Permite especificar una imagen de fondo
PictureSizeMode Modo de presentación 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 Página: 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 Métodos del formulario


Hide Oculta el formulario.
Move Ocurre cuando mueve el formulario de posición.
Show Hace visible el formulario.

Ejemplo1. Modificar el tamaño 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 ¿Cómo se añaden 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 botón del Mouse.
 Estos cuatro pasos se repiten con cada control que desea añadir al formulario.

Estableciendo Propiedades
Al diseñar la interfase de usuario de una aplicación Visual Basic For Excel, se deben
establecer la propiedades para los controles (objetos) creados.

11.5 Propiedades en Tiempo de Diseño


Algunas propiedades pueden ser establecidas en tiempo de diseño. Para establecer
estas propiedades se emplea la ventana de propiedades. Para acceder a la ventana
de propiedades, oprima en botón secundario del ratón sobre un objeto, y luego
hacer clic en Propiedades.

Página: 88 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

También se puede obtener el mismo resultado seleccionado el objeto y luego


presionando la tecla F4.

11.6 Propiedades en Tiempo de Ejecución


En tiempo de ejecución, se puede escribir código para establecer u obtener el valor
de una propiedad. Ejm
UserForm1.Caption = "Bienvenidos"
Procedimientos de Evento
Visual Basic invoca automáticamente procedimientos de evento en respuesta a
acciones del teclado, del ratón o del sistema.

11.7 Editando Código


Use las características de edición de Visual Basic For Excel para que su código sea
más fácil de leer.
Presione las teclas Alt + F11 para editar código.
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 Página: 89


Ms. Excel VBA - Nivel II

Carácter de Continuación de Línea


El carácter subrayado (_) es el carácter de continuación de línea, y se usa para dividir
una sentencia en múltiples líneas. El carácter de continuación de línea se coloca
luego de un espacio de la sentencia.

¿Cómo se edita una instrucción que ocupa varias


líneas?
Private Sub CommandButton1_Click()
MsgBox "La clave ingresada no es válida", _
vbOKOnly + vbExclamation, _
"Mensaje"
End Sub

Comentarios
El añadir documentación y comentarios a su código permite comprender mejor lo que
hace el código. Un comentario se inicia con el carácter apóstrofe (‘) o la palabra
reservada REM, de modo que todo el texto que continúe a este carácter será
ignorado en la ejecución de la aplicación. Veamos el siguiente ejemplo:

¿Cómo 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
También es posible operar al mismo tiempo sobre toda una colección de objetos
siempre que los objetos compartan métodos comunes. Por ejemplo, el siguiente
procedimiento cierra todos los formularios abiertos.
Sub CierraTodos()
Forms.Close
End Sub

Página: 90 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Ejercicio de aplicación

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 botón ), MouseUp(Suelta el
botón), 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 títulos 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 pestaña inferior donde aparece el nombre de todas las hojas
de cálculo que nos permite navegar es decir donde están todas las hojas
abiertas:

ActiveWindow.DisplayWorkbookTabs = False

Controles Básicos
Con los controles, los usuarios pueden operar y obtener los resultados de una
aplicación. Puede añadir controles a un formulario seleccionando la herramienta
adecuada del Cuadro de Herramientas. Entre los controles más comunes a utilizar
en una aplicación tenemos: Etiqueta (Label), Cuadro de Texto (TextBox) y Botón 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 Página: 91


Ms. Excel VBA - Nivel II

Propiedades
AutoSize True/False. Determina si el tamaño del control se ajusta
automáticamente al texto que contiene.
Caption Texto que muestra el control.
Name Nombre del control.
Font Establece la fuente, estilo y tamaño 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 aplicación o para que la
aplicación le devuelva la información 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 tamaño 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 máxima permitida para el texto en el
control.
MultiLine Establece si el control puede aceptar múltiples líneas de texto.
Name Nombre del control.
PasswordChar Carácter 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
sitúa sobre un control.

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

Métodos
SetFocus Mueve el enfoque al control.

Control Botón de Comando (Commandbutton)

Permite que la aplicación inicie, interrumpa o termine un proceso.


Propiedades
Cancel True/False. Establece si el botón se comportará como el botón
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 botón.
Default True/False. Establece si el botón se comportará como el botón
predeterminado en el formulario.
Font Establece la fuente, estilo y tamaño para el texto del control.
Name Nombre del botón.
Visible True/False. Establece si el botón será visible para el usuario.

Eventos
Click Ocurre cuando se hace clic sobre el botón.

Métodos
SetFocus Mueve el enfoque al botón.

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 numérico


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

Página: 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 Opción necesariamente tienen que estar
agrupados por el control Marco. Para agrupar controles, dibuje primero el control
Marco y, a continuación, dibuje los controles dentro de Marco.

Propiedades
Caption Título 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 están 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 Página: 95


Ms. Excel VBA - Nivel II

12.2 Casilla de Verificación (CheckBox)

Las casillas de verificación se utilizan para proporcionar al usuario opciones de tipo


Si/No o Verdadero/Falso. Cuando el usuario selecciona una opción (activa la
casilla), aparece una marca de verificación () dentro de la casilla.
Propiedades
Caption Descripción que acompaña a la casilla.
Enabled True/False. Determina si está habilitado para responder a las
acciones del usuario.
Name Nombre del control.
Value 0 – Unchecked (Vacío, 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.

Diseñar un programa que permita acumular el total a pagar de la lista presentada


Costos:
Impresora: 250
Scanner: 180
Estabilizador: 60
a. Análisis:
Datos de entrada: Utilizaremos un control checkBox
Datos de salida: Utilizaremos un control Text1, para mostrar los resultados
b. Diseño

Página: 96 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

c. Pseudocodigo.
Seleccionar desde los controles CheckBox, los periféricos 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 Botón de Opción (OptionButton)


Estos controles se utilizan para que el usuario seleccione una opción de un grupo
opciones. La opción seleccionada tiene un punto en el centro.
Propiedades
Caption Descripción que acompaña a la opción.
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 botón está visible o no.
Eventos
Click Ocurre cuando el usuario hace clic sobre el botón.

Elaborado por: Dennis Pichilingue R Página: 97


Ms. Excel VBA - Nivel II

Ejemplo 1: Muestra título de la opción 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: Diseñar el siguiente formulario. Del siguiente cuadro de diálogo según la


categoría debe mostrar el sueldo del empleado. Según la ubicación 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

Página: 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 más elementos. Si el número de elementos supera el número que
puede mostrarse, se agregará automáticamente 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 número total de elementos de la
lista.
ListIndex Contiene el índice del elemento seleccionado, el
cual es un número entre 0 (primer elemento) y el
número total de elementos en la lista –1
(ListCount – 1). Si no se selecciona ningún 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 Página: 99


Ms. Excel VBA - Nivel II

Name Nombre del control.


Selected Arreglo de valores lógicos paralelo y del mismo tamaño 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 alfabéticamente.
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 expresión
List(ListIndex). Es de sólo lectura en tiempo de diseño y es de sólo
lectura en tiempo de ejecución.
Métodos
AddItem Permite añadir 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 interactúa con el control.
Ejemplo 1: Agregar elementos aun Listbox1, utilizando el método Additem
Private Sub Form_Activate()
ListBox1.AddItem "Chirley"
ListBox1.AddItem "Jean"
ListBox1.AddItem "Elky"
ListBox1.AddItem "Litzze"
ListBox1.AddItem "Yuri"
End Sub

Página: 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 Página: 101


Ms. Excel VBA - Nivel II

Ejemplo 6: Carga un listbox con múltiples


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

Página: 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("Piña", "Naranja",
"Manzana", "Pera", "Melocotón", "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 múltiples 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 Página: 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 según opción 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

Página: 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 Fríos"
End Sub

12.5 Cuadro Combinado (ComboBox)


Un control ComboBox combina las características de un control TextBox y un
control ListBox; los usuarios pueden introducir información 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 método
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 diseño.
Propiedades
Enabled True/False. Determina si el control responde a las acciones del
usuario.
List Arreglo con los elementos de la lista.
ListCount Número de elementos de la lista
ListIndex Elemento seleccionado.
Name Nombre del control.
Sorted True/False. Establece si los elementos se ordenan alfabéticamente.
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 números o fechas, por lo que
en estos casos, a veces será necesario aplicar
funciones de conversión de datos antes que el dato se
copie en la hoja. Por ejemplo, si alguna vez construye
una lista con números 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 número de orden. Es decir, si
está seleccionado el primero, ListIndex valdrá 0, si está
seleccionado el segundo valdrá 1, etc. Si no hay ningún elemento

Elaborado por: Dennis Pichilingue R Página: 105


Ms. Excel VBA - Nivel II

seleccionado valdrá -1. Tenga en cuenta que esta propiedad sólo


está disponible en tiempo de ejecución, es decir la podremos
leer mientras esté funcionando el programa, no se puede
establecer en modo diseño, observe que no aparece en la ventana
propiedades del cuadro combinado.
ColumnCount , 2 (Indicamos el número de columnas de la lista.

Además 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.
Métodos
AddItem Permite añadir 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 interactúa 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: Diseñar un programa que permita el uso de la selección extendida y la
propiedad style de un control ListBox.

Página: 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 Núm." & i
Listbox2.AddItem "Elemento Núm." & 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 línea 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 Página: 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, "demostración
suceso ItemCheck"
End If
End Sub

12.6 Imagen (Image)


El control Image se utiliza para mostrar un gráfico. Un control Image puede mostrar
un gráfico 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 gráfico que se mostrará en el control. También
se le puede asignar un gráfico devuelto por la función LoadPicture.
Stretch True/False. Devuelve o establece un valor que indica si un gráfico
cambia su tamaño para ajustarse al de un control Image.
Función LoadPicture()
Carga un gráfico en un objeto Picture, un control PictureBox o un control Image.
Formato: LoadPicture(NombreDeArchivoGráfico)
También se puede usar la función LoadPicture() para asignar un icono a un
formulario o al puntero del ratón mostrado en pantalla.

Página: 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 diálogo 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 información que
pueda clasificarse en varias categorías. El control MultiPage permite combinar
visualmente y clasificar esta información en un único formulario.

El control MultiPage es un contenedor para una colección de objetos Page. Cada


objeto Page contiene su propio conjunto de controles y no depende necesariamente
de otros objetos de página para obtener información. Por ejemplo, puede agregar
diferentes controles en la región cliente para cada objeto Page en el control
MultiPage. De forma predeterminada, un control MultiPage contiene dos páginas;
puede agregar o quitar páginas según sea necesario.

Elaborado por: Dennis Pichilingue R Página: 109


Ms. Excel VBA - Nivel II

Aplicar el control MultiPage para realizar un mantenimiento de registros


(Desarrollado por Carlos Enrique Solano)

1. Diseño de los formularios


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

Página: 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 Página: 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)

Página: 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 Página: 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. Creación de funciones


Además de las funciones del VBA y de las funciones de la hoja de cálculo de Excel,
podemos crear nuevas funciones personalizadas para atender necesidades
específicas. Las funciones creadas se pueden utilizar en el VBA o en las hojas de
cálculo de Excel.
Sintaxis:
Function NombreFunción(Arg1 As tipo, Arg2 as tipo) As tipo
Ejemplo1
La siguiente función requiere dos parámetros (valores) que deberán ser digitados.
Los valores se encuentran representados por N1 y N2 del tipo Integer, sin embargo,
el resultado de la función 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

• Ejecución de funciones a partir de la hoja de cálculo


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

Página: 114 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

argumentos podrán ser valores fijos o valores buscados de celdas específicas, de


acuerdo a los ejemplos:
• Argumento fijo
=dgeneral(10;2)
• Argumento buscando valor contenido en celdas de la hoja de cálculo
=dgeneral(a20;a21)
También podemos utilizar la función creada, ejecutándola a partir del Asistente de
Funciones (fx). Como patrón, las funciones creadas en el VBA se encuentran en la
categoría Definida por el usuario.

Utilizando funciones en diversos libros


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

Creación de un complemento
Para que las funciones creadas puedan utilizarse en los demás 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 módulo de VBA, todas las funciones
con sus respectivos códigos;
2. Guardar el archivo como Complemento de Excel (se creará un archivo con la
extensión .xlam).

Anexando el complemento a Excel


1. Hacer clic en Archivo / Opciones;
2. Hacer clic en la opción Complementos y, luego, en el botón 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 diálogo
Complementos

Elaborado por: Dennis Pichilingue R Página: 115


Ms. Excel VBA - Nivel II

Asistente de Funciones
Por medio del código en VBA, se puede cambiar el nombre descriptivo de la función
y de sus respectivos argumentos, los cuales podrán aparecer en la ventana Asistente
de Funciones.
De acuerdo a lo descrito anteriormente las funciones creadas en VBA se encuentran,
como patrón, en la categoría Definida por el Usuario. Sin embargo, podemos crear
una nueva categoría dentro del asistente, dejando la función dentro de ella.
En el siguiente ejemplo, al ejecutarse la macro Configurar_Asistente(), se definirá en
qué categoría la función dgeneral() se ubicará dentro del Asistente de Funciones, así
como la descripción de la macro y sus argumentos.
Por medio de la macro Configurar_Asistente(), se ejecuta la macro Reg_Función, que
tiene por objetivo cambiar las características en el Asistente de Función de acuerdo
a la versión de Excel, ya sea 2010 o versiones anteriores. Solamente en la versión
2010 podemos insertar texto independiente para cada argumento de la función, con
la utilización 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_función True
MsgBox “¡Acceda al asistente de función y
observe el resultado!”
End Sub
Sub reg_función(ByVal registro As Boolean)
Const descr As String =“Muestra el resultado de la división entre dos números”
If registro Then
#If VBA7 Then
‘Versión 2010
Excel.Application.MacroOptions “dgeneral”, descr, _
Category:=”Nova_Cat”, _
ArgumentDescriptions:=Array(“Ingrese el primer número
“, _
“Ingrese el Segundo número.”)
#Else
‘versión 2007 o anterior
Excel.Application.MacroOptions “dgeneral”, descr, _
Category:=”Nova_Cat”

Página: 116 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

#End If
Else
‘código patrón 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 código 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 parámetro a la función o procedimiento pueden o no
modifican su valor dependiendo como se las pase por referencia o por valor.

Paso por valor


Las variables pasadas cómo parámetro a la función o procedimiento no modifican su
valor. Las funciones o procedimientos crean sus variables con los valores pasados
cómo parámetro.

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

Cuando se invoca la función.


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

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


Elaborado por: Dennis Pichilingue R Página: 117
Ms. Excel VBA - Nivel II

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

Paso por Referencia


Las variables pasadas cómo parámetro a la función o procedimiento si pueden ser
modificadas debido a que se hace referencia a la misma posición de memoria.
En el paso de parámetros por referencia lo que se pasa en realidad es la dirección 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 método no provoca la creación de una nueva
variable.

De esta forma, las modificaciones que el método 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 método llamante y otro en el llamado o invocado, pero hacen
referencia a la misma posición de memoria.

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


Sentencias
END FUNCTION
Cuando se invoca la función.
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, también 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 número 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
Página: 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 posición 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 posición 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 patrón 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 posición 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 Página: 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. Creación de Procedimiento


Un procedimiento es parte de un proyecto que realiza una o más tareas relacionadas,
tiene su propio nombre. El procedimiento puede tener cero, uno o más argumentos,
también 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

Página: 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
ejecución continua con la línea 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 tamañoletra()
'Tamaño 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 número de hojas de un libro de trabajo
Dim numHojas As Integer
numHojas = Application.Sheets.Count
MsgBox numHojas
End Sub
Elaborado por: Dennis Pichilingue R Página: 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 Categoría"
End Sub

Sub CrearGrafica()
Dim Grafico As Chart
Dim RangoDatos As Range
' Crea una gráfica 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 selección 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 condición 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 condición
Dim UltimaFila As Double

Página: 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 condición esta operación 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 región 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 Página: 123


Ms. Excel VBA - Nivel II

Subasta de Autos (Elaborado por Daniel Zavaleta)

1. Hoja: Lista

2. Hoja Buscar

Página: 124 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

3. Hoja Tablas

4. Nombres de rango

Elaborado por: Dennis Pichilingue R Página: 125


Ms. Excel VBA - Nivel II

5. Diseño 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 lños espacios en blanco
MsgBox "Debe ingresar nombre del, comprador"
Exit Sub
End If
pregunta = MsgBox("Desea grabar", vbYesNo + vbQuestion)

Página: 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)
Año = 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
código
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 Página: 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. Diseño 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 Año <> "" Then ' si seleccion un año
Range("año") = Val(Año) ' carga criterio año. 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
Página: 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 año_Change()


Call VerListado
End Sub

Private Sub cmdcerrar_Click()


Unload Me
End Sub

Private Sub Cmdlimpiar_Click()


Modelo = "": Marca = "": Año = ""

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 reginón
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 Página: 129


Ms. Excel VBA - Nivel II

15. Manejo de eventos de Excel


Macros autoexecutables

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

La macro AutoOpen se ejecuta después 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 más 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 MAYÚS 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 módulos


Los módulos son como una especie de pergamino largo donde escribes
código. Cada uno de los "pergaminos" de las hojas de cálculo abiertas se
muestra en esta zona. Los módulos pueden tener asociada una interface gráfica
(una ventana de Windows) asociada, o pueden no tenerla y ejecutar instrucciones
sin desplegar nada.

Página: 130 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Hay 3 tipos de módulos:

 Forms: Código que tiene una ventana de Windows asociada.


 Modules: Código sin interface gráfica.
 Class modules: Código que se usa para crear objetos. Es para
programadores más avanzados, no vamos a cubrir esta parte aquí.

Estructura del código dentro de los módulos

Cuando escribas código dentro del módulo incluirás procedimientos o subrutinas


(Sub) y funciones (Function). Las subrutinas y funciones son fragmentos de
código que tienen un propósito específico y que se activan en determinadas
circunstancias, definidas por el que crea la macro. Cada subrutina o función tendrá
un inicio y un final claramente definidos.

Antes de las subrutinas y funciones se efectúa la declaración de variables y


estructuras de datos que vas a usar y que serán utilizadas por varias subrutinas y
funciones del módulo.

Elaborado por: Dennis Pichilingue R Página: 131


Ms. Excel VBA - Nivel II

Insertar un módulo
Para insertar un módulo en Excel, primero debes acceder a la ventana del editor
de VBA. Recuerda que este paso ya lo vimos en un artículo anterior.

 Elegir la opción “Insertar”.

 Luego elegir la opción “Módulo”.

Eliminar un módulo
 Hacer clic derecho sobre el módulo
 Elegir Quitar módulo

Ocultar un módulo
 Ingresa lo siguiente en el principio del módulo: 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.

Página: 132 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

 Hacer clic en la pestaña "Protección" y luego escoge "Bloquear vistas al


proyecto".

 Ingresa tu contraseña preferida en los cuadros de "Contraseña" y


"Confirmar contraseña".

17. Control del tiempo al ejecutar


sentencias
Método OnTime
El método OnTime le permite programar la fecha y la hora de la ejecución de un
macro. Utilizar el método OnTime no impide que el usuario regrese a la
interacción normal con Excel ni utilizar otros macros, incluso si este método
todavía no ha sido ejecutado.

A continuación se muestra la sintaxis de OnTime y luego se describen cada uno


de sus argumentos:

Elaborado por: Dennis Pichilingue R Página: 133


Ms. Excel VBA - Nivel II

expresión.OnTime(Inicio, Procedimiento, Término, Nuevo Procedimiento)

Donde:

• Expresión: Aquí se debe insertar una expresión que da


como resultado un objeto Aplicación;

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


donde se define el inicio de la ejecución del procedimiento;

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


el nombre del procedimiento que será ejecutado;

• Término: Este argumento es un variant opcional. Este determina


hasta cuándo podrá ser ejecutado el procedimiento. Vamos a suponer
que, cuando llega la hora de inicio, Excel está ejecutando otro
procedimiento y el término ha sido definido como Inicio+ 45. Entonces
se esperarán 45 segundos hasta que el procedimiento anterior
termine de ejecutarse. Si Excel aún no está listo después de 45
segundos, no se ejecutará el procedimiento;

• NuevoProcedimiento: Este argumento es un variant opcional. A


través 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 función TimeValue es la representación del tiempo del VBA. Cuando se utiliza


TimeValue (hora), se ejecuta el método OnTime en una hora específica. Sin
embargo, si se utiliza Now+TimeValue (tiempo transcurrido), el método es
ejecutado después de un determinado tiempo, contando desde el momento
actual. La función 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 también 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 ejecución otra vez. De esa manera, la celda elegida
tiene la hora actualizada periódicamente, a menos que el evento sea cancelado
con el procedimiento Stopclock.

Página: 134 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Ejemplo3:

A continuación se muestra como ejemplo un código que inserta en la celda B4 la


hora actualizada cada 21 segundos. En este código, NextTick es una variable que
almacena la hora para el próximo evento:

Dim NextTick As Date

Sub MuestraHora()

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

‘Prepara el próximo 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 método 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
instrucción:

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 Página: 135


Ms. Excel VBA - Nivel II

Application.OnTime eTime, "CellValueAutoIncr2", , False


count = 0

End If

End Sub

Método Application.Wait (Excel)


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

Sintaxis: expresión .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


Descripción de las sentencias que controlan errores

 On error resume next. Activa rutina de errores y pasa a la siguiente instrucción


 On error goto Etiqueta. Activa rutina de errores y salta a un aetiqueta
 Err.number. Devuelve l número de error
 Err.description. Devuelve la descripción del error

Control de errores
Mediante código 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 ejecución, se producen cuando una operación no se puede


ejecutar, como eliminar una celda de una hoja de cálculo protegida, también son
impedidos sin dificultades.

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

Página: 136 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

Control de errores durante la ejecución

La instrucción 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 instrucción On Error son tres.
A continuación, se muestran cada una de estas, así como su respectiva
descripción:

• 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 número de fila. Su funcionamiento se origina cuando se
produce un error en la ejecución y el control se desvía a line, iniciando la rutina de
control de errores. Para que no se produzca errores en la compilación, se debe
prestar atención al hecho de que es necesario especificar la line en el mismo
procedimiento en donde se encuentra la instrucción 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 Inválido”
End Sub

• On Error Resume Next


Esta sintaxis hace que el control pase a la siguiente instrucción en caso de error
durante la ejecución, y por lo tanto continúa la ejecución. Para acceder a objetos,
este es el tipo de control de errores más 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 Página: 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 válido”
End Sub

Las rutinas de control de errores son secciones identificadas con una etiqueta o
número de fila, y no un procedimiento Sub o Function. Estas identifican la causa
del error a través 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 ejecución de un procedimiento que cause un error. Los valores de
propiedad en el objeto Err sólo 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 código
correspondiente. La propiedad Number da la instrucción Err para identificar y
controlar los errores, así como la instrucción 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. Máximo = 255”
ElseIf Err.Number = 13 Then
MsgBox “Digite un valor numérico”
End If
End Sub

Página: 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 ejecución de una aplicación o durante el desarrollo o la
compilación. Para verificar y responder a los errores controlables, se utiliza la
instrucción On Error o el objeto Err.

Tabla de errores
Código del error Mensaje

3 Retornar sin GoSub


5 Llamada de procedimiento no válido
6 Desbordamiento
7 Sin memoria
9 Subscrito fuera de rango
10 Esta matriz está fija o bloqueada temporalmente
11 División por cero
13 Tipos incompatibles
14 No hay espacio para secuencia de caracteres
16 Expresión demasiado compleja
17 No se puede realizar la operación solicitada
18 Se ha producido una interrupción del usuario
20 Continuar sin error
28 Continuar sin error
35 Sub, Function o Property no definido
47 Clientes de aplicación de la DLL o de recurso de código en exceso
48 Error en la carga de recursos de código o DLL
49 Convención incorrecta de llamado de recurso de código o DLL
51 Error interno
52 Nombre o número 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 Número 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 Página: 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 válida
94 Uso no válido de null
322 No se puede crear el archivo temporal necesario
325 Formato no válido en el archivo de recursos
327 Valor de dato nombrado no encontrado
328 Parámetro 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 ejecución
419 Permiso para utilizar el objeto denegado
422 Propiedad no encontrada
423 Propiedad o método no encontrado
424 Objeto obligatorio
425 Uso no válido de objeto
438 El objeto no admite esta propiedad o método
440 Error de automatización
443 El objeto de automatización no tiene un valor predefinido
445 El objeto no admite esta acción
445 El objeto no admite esta acción
446 El objeto no admite argumentos nombrados
447 El objeto no admite la configuración de ubicación actual
448 Argumento nombrado no encontrado
450 Número incorrecto de argumentos o asignación de propiedad no
válida
451 El objeto, no una colección
452 Ordinal no válido
453 Código especificado no encontrado
454 Recurso de código no encontrado
455 Error de bloqueo del recurso de código
457 Esta clave ya está asociada a un elemento de esta colección
460 Formato no válido de portapapeles
461 Método o miembro de dato no encontrado

Página: 140 Elaborado por: Dennis Pichilingue R


Ms. Excel VBA - Nivel II

462 La máquina del servidor remoto no existe o no está disponible


463 Clase no registrada en la máquina local
480 No se puede crear una imagen AutoRedraw
481 Figura no válida
485 Tipo de figura no válido
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 búsqueda no encontrado
746 Sustituciones demasiado largas
31001 Sin memoria
31004 Ningún objeto
31018 La clase no se ha establecido
31027 No se puede activar el objeto

19. Control de mensajes de alerta


(DisplayAlert)
Control de visualización de los ítems de la ventana
Los ítems de la ventana, como barras de desplazamiento, líneas de la cuadrícula
y pestañas de hojas, pueden mostrarse de manera controlada por medio de
propiedades de valores booleanos, es decir, lógicos, que deben ser definidos
como True, en los casos en que los ítems deban mostrarse, o False, en caso no
deban mostrarse.

A continuación, se presenta una tabla que representa, en la primera columna, las


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

DisplayGridlines Líneas de cuadrícula.


DisplayFormulas Fórmulas.
DisplayHeadings Encabezados de fila y columna.
DisplayOutline Símbolos de estructura de tópicos.
DisplayZeros Valores iguales a cero.
DisplayHorizontalScrollBar Barra de desplazamiento horizontal.
DisplayVerticalScrollBar Barra de desplazamiento vertical.
DisplayWorkbookTabs Pestañas de las hojas.
DisplayAutomaticPageBreaks Salto de página automático.
DisplayStatusBar Barra de estado.
Ejemplo:
Sub Mostrar()

Elaborado por: Dennis Pichilingue R Página: 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 jerárquica.

En lo mas alto jerarquía está el objeto Application.


Con el objeto Application, podemos usar una serie de métodos y propiedades para
variar el comportamiento de Excel durante la ejecución de nuestras macros y
formularios.

De todos los métodos 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 función del
valor de la propiedad DisplayAlerts.

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

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

4) Propiedad Visible
Permite eliminar la visualización de Excel.
Admite los valores True/False.
Con el valor a False evitaremos la visualización 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,
Página: 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 ejecución 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 actualización en pantalla


(Screen. Updating)
En el suguiente video muestro como con la propiedad ScreenUpdatin del objeto
Application nos permite apagar la actualización de pantalla para ejecutar una macro
que se lleve muchos pasos, y en cambio sólo muestre el resultado final.
En el artículo 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
más eficiente.
Código utilizado en el video
Private Sub CommandButton1_Click()
'Con actualización 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 actualización 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 Página: 143
Ms. Excel VBA - Nivel II

Página: 144 Elaborado por: Dennis Pichilingue R

También podría gustarte