Está en la página 1de 345

Aplicaciones

VBA
Excel
con

Fundam entos de program ación en VBA


Funciones VBA
Gestión de errores
Estructuras condicionales y repetitivas
M anejo de base de datos

EDITORIAL
Aplicaciones

VBAcon
Excel

https://www.facebook.com/groups/2703670239892266
EDITORIAL

España - México - Colombia - Chile - Ecuador - Perú - Bolivia - Uruguay - Guatemala - Costa Rica
Aplicaciones VBA con Excel
Autor: Manuel Torres Remon

© Derechos de autor registrados:


Empresa Editora Macro EIRL

© Derechos de edición, arte gráco y diagramación reservados:


Empresa Editora Macro EIRL

Jefe de edición:
Cynthia Arestegui Baca

Coordinación de edición:
Magaly Ramon Quiroz

Diseño de portada:
Darío Alegría Vargas

Corrección de eslo:
José Vásquez Espíritu

Diagramación:
Lizbeth R. Eufracio Quispe

Edición a cargo de:


© Empresa Editora Macro EIRL


 Teléfono: (511) 748 0560


* E-mail: proyectoeditorial@editorialmacro.com
Página web: www.editorialmacro.com

Primera edición: marzo de 2016

ISBN N.° 978-612-304-265-3


ISBN e-book N.° 978-612-304-349-0

Prohibida la reproducción parcial o total, por cualquier medio o método, de este libro sin previa
autorización de la Empresa Editora Macro EIRL. d e s c a r g a do en: e y b o oks. c o m
Manuel Ángel Torres Remon



Lima, Perú.

-

-
cialmente en las materias de Programación, Base de Datos y Análisis de Sistemas.

Ha publicado libros sobre programación como Fundamentos de programación con Visual


Basic 2012, Programación orientada a objetos con Visual Basic 2012, Programación Trans-
act con SQL Server 2012. También es autor de los libros Diseño web con HTML5 y CSS3,
Desarrollo de aplicaciones web con PHP y Desarrollo de aplicaciones web con PHP y MySQL.

Para cualquier duda o consulta sobre este material, puede escribir al siguiente correo:
manuel.torresr@hotmail.com.
Agradecimientos
Escuché alguna vez la frase: “La lectura de un libro enriquece de conocimientos y empo-

personas que cargan un libro en la mano, debido a que este ha sido reemplazado por los




-
na para el desarrollo del libro Aplicaciones VBA con Excel.

-
-



Dedicatoria
Este libro está dedicado con mucho cariño y aprecio

que son y seguirán siendo mi fuente de inspiración;
también deseo agradecer a mi eterna compañera,
Luz, por comprenderme en todo lo que me propongo
ÍNDICE

Introducción ................................................................................................................ 15

CAPÍTULO 1
Introducción al VBA
1.1 Introducción ................................................... ..................................................... 17
1.2 Denición de VBA ............................................................................................... 18
1.3 Comparando VB con VBA ................................................................................... 18
1.4 Macros y su relación con VBA............................................................................. 19
1.5 La cha Desarrollador de Excel ........................................................................... 20
 ...................................................................... 20
1.5.2 Principales botones...................................................................................... 21
1.6 Modos de Acceso al VBA .................................................................................... 22
1.7 Personalizar la seguridad de la macro ............................................................... 22
1.8. Grabar una aplicación VBA ................................................................................ 23
1.9 Descripción del editor VBA ................................................................................ 24
1.9.1 Barra de herramientas estándar ................................................................. 24
1.9.2 Operaciones desde la barra de herramienta estándar............................... 25
1.10 El explorador de proyectos ............................................................................... 25
1.11 La ventana Propiedades .................................................................................... 26
1.12 La ventana de código ........................................................................................ 27
1.13 Modelo de objetos de Excel ............................................................................. 28
1.14 Objeto Applicaon ........................................................................................... 29
.................................................................................................... 29
 ................................................................................................ 30
 ............................................................................................ 31
......................................................................................... 32
 ....................................................................................................... 32
 ..................................................................................................... 32
............................................................................................. 33
1.14.8 Visible ......................................................................................................... 34
 ....................................................................................... 34
1.14.10 DisplayFormulaBar ................................................................................... 35
1.14.11 DisplayFullScreen ..................................................................................... 35
1.14.12 Quit ........................................................................................................... 36
1.14.13 OnTime ..................................................................................................... 36
1.15 El objeto WorkBook .......................................................................................... 38
1.15.1 Count .......................................................................................................... 38
1.15.2 Name .......................................................................................................... 38
1.15.3 Path ............................................................................................................ 38
1.15.4 Open ........................................................................................................... 39
1.15.5 Add ............................................................................................................. 39
 ...................................................................................................... 39
1.15.7 Close ...........................................................................................................40
1.15.8 Save ............................................................................................................ 40
1.15.9 Save As ....................................................................................................... 41
1.15.10 SaveCopyAs .............................................................................................. 42
1.16 El objeto WorkSheets ........................................................................................ 43
1.16.1 Count .......................................................................................................... 43
1.16.2 Name .......................................................................................................... 43
1.16.3 Next ............................................................................................................44
1.16.4 Previous ...................................................................................................... 44
1.16.5 Index ........................................................................................................... 45
 ....................................................................................................... 45
1.16.7 Add .............................................................................................................. 46
1.16.8 Delete .........................................................................................................48
1.17 El objeto Range ................................................................................................. 49
1.17.1 Address ....................................................................................................... 49
1.17.2 Cells ............................................................................................................. 49
1.17.3 End .............................................................................................................. 49
1.17.4 Formula ....................................................................................................... 51
1.17.5 FormulaLocal .............................................................................................. 52
1.17.6 FormulaR1C1............................................................................................... 53
1.17.7 Value ........................................................................................................... 55
 ...................................................................................................... 56
1.17.9 Clear ........................................................................................................... 57
1.17.10 ClearContents .......................................................................................... 57
1.17.11 Delete ........................................................................................................ 57
1.17.12 Calculate .................................................................................................. 58
1.18 El objeto Cells .................................................................................................... 58
1.19 Listado de funciones VBA ................................................................................. 59
1.20 Casos desarrollados ......................................................................................... 70
Caso desarrollado 1: Macro para formato de dólares ......................................... 70
Caso desarrollado 2: Macro para formato de texto ............................................. 72
Caso desarrollado 3: Macro para determinar las horas de recorrido de un
conductor ............................................................................................................... 76
Caso desarrollado 4: Cerrar un libro guardando los cambios .............................. 78
Caso desarrollado 5: Cerrar un libro sin guardar los cambios.............................. 80
Caso desarrollado 6: Abrir un libro de solo lectura .............................................. 81
.............................................. 82
Caso desarrollado 8: Crear una copia de un libro ................................................ 84
 ....................... 85
 ........................... 88
 ............................................................................. 91
............................................................ 94
Caso desarrollado 13: Next-Previous .................................................................. 96
Caso desarrollado 14: Open................................................................................... 99

CAPÍTULO 2
Fundamentos de programación
2.1 Fases para la solución de un programa.............................................................101
2.1.1 Fase 1: Análisis del problema..................................................................... 102
2.1.2 Fase 2: Diseño del algoritmo...................................................................... 104
 ........................................... 106
2.1.4 Fase 4: Ejecución del programa en VBA .................................................... 108
 ............................................................. 108
2.2 Elementos de un programa VBA .......................................................................109
........................................................................................... 109
2.2.2 Palabras reservadas ................................................................................... 110
2.2.3 Comentarios .............................................................................................. 110
2.3 Tipos de datos .................................................................................................. 111
2.3.1 Enteros........................................................................................................ 111
2.3.2 Reales ......................................................................................................... 112
2.3.3 Caracteres y cadenas ................................................................................ 112
2.3.4 Lógicos........................................................................................................ 113
2.3.5 Fechas......................................................................................................... 113
2.3.6 Variante ...................................................................................................... 113
2.4 Constantes ........................................................................................................113
2.5 Variables .......................................................................................................... 114
2.6 Operadores ......................................................................................................118
2.6.1 Asignación ................................................................................................. 118
 ................................................................................................. 119
2.6.3 Relacionales ............................................................................................... 120
2.6.4 Lógicos ....................................................................................................... 121
2.6.5 Incremento y decremento ......................................................................... 122
2.6.6 Orden de prioridad .................................................................................... 122
2.6.7 Expresiones ................................................................................................ 123
2.7 Conversiones de po ........................................................................................ 123
2.7.1 Implícita .....................................................................................................123
2.7.2 Reglas .......................................................................................................... 124
2.7.3 Explícita ......................................................................................................125
2.8 Mensajes en VBA .............................................................................................. 126
2.9 Ingreso de valor con la función InputBox .........................................................129
2.10 Ingreso de valor con el método InputBox .......................................................130
2.11 Ámbito o alcance de las variables .................................................................. 131
2.12 Funciones denidas por el usuario ................................................................ 132
2.12.1 Formato para la implementación de una función sin parámetros......... 133
2.12.2 Formato para la implementación de una función con parámetros........ 135
2.12.3 Formato para invocar una función con parámetros o sin ellos .............. 136
2.13 Procedimientos ............................................................................................... 136
2.13.1 Formato para la implementación de un procedimiento sin parámetros.. 137
2.13.2 Formato para la implementación de un procedimiento con parámetros..138
2.13.3 Formato para invocar un procedimiento con parámetros o sin ellos.... 139
2.14 Casos desarrollados ........................................................................................ 139
Caso desarrollado 1: Guardería ........................................................................... 139
Caso desarrollado 2: Estudios universitarios ...................................................... 141
 ................... 144
 ................................ 146
            
empleado.............................................................................................................. 148
 ........................ 151
 ............................. 153
........................... 155
................. 158
2.15 Casos propuestos ............................................................................................ 161
Caso propuesto 1: Fase de análisis del problema: Ferrocarril............................ 161
Caso propuesto 2: Fase de análisis del problema: Turistas................................. 161
Caso propuesto 3: Fase de análisis del problema: Inversión de negocio........... 162
 ........................................................ 163
......... 163
Caso propuesto 6: Financiamiento ...................................................................... 163
Caso propuesto 7: Tienda comercial ................................................................... 164

CAPÍTULO 3
UserForm y objetos visuales
3.1 UserForm .......................................................................................................... 165
3.2 Administración de UserForm en VBA ............................................................... 166
................................................................................. 166
 ........................................................... 167
 ............................................................................... 167
 ................................................................................ 168
3.2.5 Asociar el formulario a la hoja de Excel .................................................... 168
3.3 Tiempos en la programación ........................................................................... 170
3.3.1 Tiempo de diseño....................................................................................... 170
3.3.2 Tiempo de ejecución ................................................................................. 171
................................................... 171
3.4 Nomenclatura de nombres a objetos .............................................................. 171
3.5 Principales controles visuales y sus propiedades ............................................. 172
....................................................................................... 172
3.5.2 Control Label ............................................................................................ 175
3.5.3 Control TextBox ........................................................................................ 177
 ......................................................................... 180
3.5.5 Control ListBox ........................................................................................... 181
3.5.6 Control ComboBox ..................................................................................... 183
3.5.7 Control Frame ............................................................................................184
 ................................................................................184
 ....................................................................................... 185
3.5.10 Control de imagen .................................................................................... 186
3.6 Agregar los controles visuales al UserForm ...................................................... 187
3.7 Ventana de Código ............................................................................................ 187
3.8 Casos desarrollados .........................................................................................188
Caso desarrollado 1: Control de registro de usuarios......................................... 188
Caso desarrollado 2: Registro de pago a vendedores......................................... 195

CAPÍTULO 4
Funciones VBA
4.1 Introducción a las funciones ............................................................................. 201
4.1.1 Funciones para cadena de caracteres ....................................................... 201
4.1.2 Funciones numéricas ................................................................................. 207
4.1.3 Funciones de fecha .................................................................................... 210
4.1.4 Funciones de comprobación de valor ....................................................... 214

CAPÍTULO 5
Gestión de errores
5.1 Gesón de errores ............................................................................................ 217
5.2 Tipos de errores VBA ........................................................................................ 217
5.3 Control básico de errores con On Error Goto ................................................... 218
5.4 La Clase Err........................................................................................................ 219
Caso desarrollado: Capitalización........................................................................ 219

CAPÍTULO 6
Estructuras condicionales
6.1 Introducción .....................................................................................................223
6.2 Implementación de una condición .................................................................. 224
6.3 Estructura If simple ........................................................................................... 225
6.4 Estructura If doble ............................................................................................ 226
6.5 Estructura If doblemente encadenada ............................................................. 227
6.6 Estructura de selección múlple Select-Case...................................................228
6.7 Casos desarrollados .........................................................................................230
Caso desarrollado 1: If simple - Registro de personal.........................................230
Caso desarrollado 2: If simple - Registro de venta de productos...................... 234
Caso desarrollado 3: If doble - Boleta de Venta.................................................238
Caso desarrollado 4: If doblemente encadenado - Boleta de pago.................. 242
Caso desarrollado 5: Select Case - Control de viajes ......................................... 246
Caso desarrollado 6: Validación - Venta de productos......................................250

CAPÍTULO 7
Estructuras repetitivas
7.1 Introducción ......................................................................................................259
7.2 Contadores ........................................................................................................ 259
7.3 Acumuladores ...................................................................................................260
7.4 Estructura For… Next ........................................................................................ 261
7.5 Estructura While ............................................................................................... 263
7.6 Casos desarrollados ..........................................................................................264
Caso desarrollado 1: Contadores y acumuladores - Movimientos bancarios.... 264
Caso desarrollado 2: Estructura For - Registro de notas.................................... 268
 ........................... 273
Caso desarrollado 4: Estructura Do Loop - Tienda comercial de
 ............................................................................................... 279
 ....... 287
Caso desarrollado 6: Estructura Do Loop - Eliminar celdas vacías .................... 289
............... 290

CAPÍTULO 8
Base de datos
8.1 Introducción ................................................... ...................................................293
Caso desarrollado 1: Consulta de datos desde la hoja de Excel (Agenda de
clientes) ................................................................................................................293
Caso desarrollado 2: Listado de clientes por distrito (Agenda de clientes) ....... 297
Caso desarrollado 3: Listado de clientes por letra inicial de su apellido paterno
(Agenda de clientes).............................................................................................301
8.2 Recuperación de datos mediante la sentencia SELECT de SQL ........................309
8.2.1 Agregar una referencia.............................................................................. 311
8.3 Listado de registros simple ............................................................................... 312
Caso desarrollado 1: Listado de clientes ............................................................. 312
Caso desarrollado 2: Listado de productos......................................................... 313
8.4 Listado de registros usando alias...................................................................... 315
Caso desarrollado: Listado de facturas ............................................................... 315
8.5 Listado de registros especicando campos ...................................................... 317
........................... 317
8.6 Listado de registros ordenados ........................................................................ 319
Caso desarrollado 1: Listado de clientes ordenados .......................................... 319
 ............................ 321
8.7 Listado de los primeros registros ..................................................................... 324
 ........................ 324
8.8 Listado de registros sin reper valores ............................................................ 327
 ........................... 328
8.9 Listado de registros condicionados ..................................................................330
 ......... 331
.......... 333
Caso desarrollado 3: Mantenimiento de productos ........................................... 338
Bibliograa ............................................................................................................... 343
Introducción
El libro Aplicaciones VBA con Excel le ayudará a crear aplicaciones comunes usando el
lenguaje VBA de Excel.

-
tribuidos de la siguiente manera:

En el capítulo uno hacemos una introducción a los objetos VBA de Excel, empleando


Asimismo, en el capítulo dos mencionamos y desarrollamos todos los elementos necesa-


rios para implementar una aplicación en VBA. Para esto exponemos casos desarrollados y

que le ayudará a comprender los demás capítulos.



propiedades.

En el capítulo cinco, hacemos una breve explicación de cómo debe tratarse los errores en


En el capítulo seis, explicaremos cómo se implementan las estructuras condicionales us-


ando la sentencia If y Select, mostrando casos desarrollados.


        
hoja de Excel.

Finalmente, en el capítulo ocho, hacemos uso de las bases de datos de Access y del
propio Excel para implementar aplicaciones complejas con datos masivos.
1
Cap.
Introducción al VBA

Capacidad
Reconoce los conceptos básicos del lenguaje VBA; así como el modelo de objetos de


1.1 Introducción
-
bajos de manipulación, análisis y presentación de datos. Ha pasado de ser una aplicación

así que hoy en día no solo lo usan personas de una determinada profesión; lo usa cual-
quiera que necesite administrar de manera correcta su información.

-
do todas las fórmulas, funciones y demás acciones que realice bajo Excel en realidad son
ejecutadas mediante código que no es visible por el usuario.

A veces, a pesar de las amplias capacidades que ofrece Excel, el usuario siente que en

-
sonal del cual dependen cuarenta sueldos de los trabajadores de un pequeña empresa,
y que solo usted conoce el manejo de dicha planilla; hasta aquí todo parece estar bien;
ahora suponga el caso de que usted viajara a otro país y no puede manipular la informa-
ción fuera de la empresa; por lo tanto, deja encargado a su secretaria la manipulación de
la planilla; le pregunto: ¿usted viajaría tranquilo? Si cambiamos el escenario a una aplica-
ción VBA de control de planilla, en la cual solo permita ingresar valores correctos y emita
mensajes cuando lo necesite, cambiaría la situación, pues se sabe que cualquier personal
autorizado podría usar dicha aplicación. De eso trata VBA, de brindar la posibilidad de
ampliar dichas aplicaciones realizadas en Excel y pasarlas algo así como a un sistema; por
supuesto, bajo el entorno Excel.

Muchos conceptos nuevos que veremos en este material serán explicados conforme va-

         
básica entendible.
Aplicaciones VBA con Excel
18

Debemos considerar que, para crear aplicaciones, no necesariamente usted debe ser un
experto en programación o algo así; ya que si fuera así, estamos seguros que no estaría
usando VBA. Más bien, este material se considera como una iniciación en la programación;
por lo tanto, no es requisito indispensable saber sobre programación, pues en este ma-
terial le explicaremos los comandos necesarios para iniciarse como programador junior.

1.2 Definición de VBA


Las iniciales VBA proviene del inglés Visual Basic for Applicaons, el cual podemos enten-
derlo como «aplicaciones para Visual Basic», es un entorno de desarrollo que se encuen-


Asimismo, VBA funciona mediante la ejecución de macros, estos permiten realizar en


un objeto de Excel un conjunto de instrucciones llamado código, es decir, podrían estar
sobre una hoja, libro, celda, etc.


de VBA. Imagine usted una hoja de Excel con diez mil registros en la cual quiera generar

o función de Excel usaría? Seguro está pensando en usar las funciones de base de datos
             
-





1.3 Comparando VB con VBA


-
guaje es considerado un dialecto de BASIC. Basic es un lenguaje de programación de alto
nivel, es decir, puede ser desarrollado de manera sencilla y entendible, además cuenta
con un entorno de desarrollo integrado el cual permite crear un ambiente de programa-

aplicaciones independientes de su entorno; quiere decir, una aplicación desarrollada en
Visual Basic puede ser ejecutada como un archivo independiente o como un archivo eje-
cutable.

En cambio, Visual Basic Aplicaciones (VBA) es considerado como un lenguaje de progra-


            

abarcaremos la acogida en Excel por ser uno de las aplicaciones más usadas por los
profesionales.
Cap.1: Introducción al VBA
19


realizarlo dentro de Excel», y que el resultado de la aplicación puede mostrarse directa-
mente en la aplicación o en una hoja de Excel, pero no fuera de su entorno.


copiar los códigos en ambos y no notar la diferencia. Veamos un formulario en común de
ambas aplicaciones:

Fig. 1.1 Formulario desarrollado en VBA

El formulario mostrado puede desarrollarse bajo el entorno de Visual Basic, el cual emi-
     
resultados en una o más hojas de Excel.

1.4 Macros y su relación con VBA




que una macro para VBA es un conjunto de instrucciones llamado «código fuente» que
trabaja en segundo plano en Excel. Finalmente, podemos decir que una macro puede ser

conocimiento básico de las instrucciones.
Aplicaciones VBA con Excel
20

Fig. 1.2 Macros y su relación con VBA

Observamos que, desde la hoja de Excel, se invoca a un formulario de registro de planilla



en Excel por medio del botón Grabar Información.

1.5 La ficha Desarrollador de Excel



en una hoja de Excel y principalmente el control de las macros, es por ello importante
conocer los elementos que lo componen:

1.5.1 Activar la ficha Desarrollador


Desa-
rrollador
vemos en la siguiente imagen:

Fig. 1.3 Cinta de opciones de Excel inicial


Cap.1: Introducción al VBA
21

Desarrollador:

1. Haga clic en el botón Archivo de la cinta de opciones de Excel.


2. De la lista de opciones mostrada en el lado izquierdo de la ventana, seleccione Op-
ciones.
3. Le aparecerá la ventana de Opciones de Excel, aquí deberá seleccionar Personalizar
cinta de opciones

En resumen: Archivo > Opciones > Personalizar cinta de opciones > Desarrollador

Fig. 1.4 Cinta de opciones de Excel con la cha Desarrollador acva.

1.5.2 Principales botones



Desarrollador:

Fig. 1.5 Botones de la cha Desarrollador

Botón Descripción o funcionalidad Tecla de acceso rápido


Apertura de la ventana editora de VBA, desde aquí
podemos iniciar las aplicaciones VBA tanto en código <Alt+F11>
como del modo visual.

Apertura de la ventana de diálogo de selección de


macros, desde aquí podemos seleccionar una macro <Alt+F8>

eliminarlo y/o crear uno nuevo.

Fig. 1.6 Ventana de diálogo de selección de macros


Aplicaciones VBA con Excel
22

         


un documento de Excel. Aquí debemos tener especial
cuidado; pues al iniciar la grabación, todo lo que realice -
en la hoja quedará registrado en la macro.


la macro. Más adelante explicaremos este punto, por
ahora solo podemos mencionar que al iniciar una aplica- -


Muestra controles para el diseño de formularios en


la hoja de Excel. En nuestro caso, usaremos el control
Botón para crear un puente entre la hoja de Excel y el -
código VBA.

1.6 Modos de Acceso al VBA


Veamos las diferentes formas de acceder al editor VBA:

Primera forma: Ficha Desarrollador > Visual Basic


Segunda forma: <ALT+F11 >
Tercera forma: Ficha Desarrollador > Ver Código

1.7 Personalizar la seguridad de la macro



 .xlsm



Fig. 1.7 Seguridad de macros

         


Desarrollador > Seguridad de macros; des-


de aquí seleccione Deshabilitar todas las macros sin nocación
Conar en el acceso al modelo de objeto de proyectos VBA.
Cap.1: Introducción al VBA
23

Fig. 1.8 Ventana de conguración de macros

.xlsm (macro de
Excel) sin necesidad de mostrar el mensaje de «Advertencia de seguridad».

1.8 Grabar una aplicación VBA


Antes de entrar completamente al desarrollo de aplicaciones con VBA debemos tener
           

nuestro caso seleccionaremos solo dos opciones:

Opción 1: Desde Excel


Presione <F12>

Asigne un nombre al archivo


 Libro habilitado para macros (*.xlsm)

Fig. 1.9 Ventana de grabación de Excel

Guardar.
Aplicaciones VBA con Excel
24

Opción 2: Desde el entorno VBA

Ficha Desarrollador
Seleccione Visual Basic
Seleccione Archivo > Guardar libro…
Los pasos siguientes son los mismos aplicados en la Opción 1.

1.9 Descripción del editor VBA

Fig. 1.10 Editor VBA


nuevas versiones de Excel.

1.9.1 Barra de herramientas estándar




Botón Descripción o funcionalidad Tecla de acceso directo

Intercambia las interfaces de VBA y Excel, es decir, podrá


<Alt+F11>
volver a la hoja de Excel.

Permite insertar Formulario, Módulo, Modelo de clase


-
o Procedimiento al proyecto VBA.

Permite grabar cualquier cambio realizado en el entorno


VBA. Tenga en cuenta que, grabar en el entorno VBA, es <Ctrl+S>
equivalente a grabar en Excel.
Cap.1: Introducción al VBA
25

Permite ejecutar, pausar y parar un procedimiento o un <F5>


formulario del proyecto VBA.

<Ctrl+R>
Permite mostrar la ventana Exploradora de Proyectos.

<F4>
Permite mostrar la ventana de Propiedades.

1.9.2 Operaciones desde la barra de herramienta estándar

Cuesones Ruta de acceso


¿Cómo grabar el proyecto? Archivo > Guardar Libro
¿Cómo exportar código VBA? La exportación
Archivo > Exportar > Asignar
permite guardar un código (.cls) u objeto (.frm)
nombre > botón Guardar.
en un archivo independiente.
¿Cómo importar código VBA? La importación
Archivo > Importar > Selec-
permite abrir un código u objeto en un proyecto
cionar el archivo.
VBA nuevo.
¿Cómo visualizar el Explorador de Proyectos y la Ver > Explorador de Proyectos
ventana de Propiedades? Ver > Ventana Propiedades
Herramientas > Opciones > Formato
      
del Editor > Texto Normal >
editor de código de VBA?

Herramientas > Propieda-
¿Cómo cambiar el nombre del proyecto VBA? des de… > General > Asignar
un nombre al proyecto.
Herramientas > Propiedades de…

¿Cómo proteger el código u objetos implementa-
Bloquear proyecto para visuali-
dos en un proyecto VBA?
zación y asignar una contraseña
para visualizar sus propiedades.

1.10 El explorador de proyectos


Permite visualizar la estructura general que puede llegar a tener un proyecto, de tal ma-
nera que puede organizar todos los objetos implementados; es así que los procedimien-
tos y funciones se alojan en Módulos, los UserForm en formularios y las hojas de Excel
en la carpeta Microso Excel Objetos.

Fig. 1.11 Ventana exploradora de proyectos


Aplicaciones VBA con Excel
26



Cuesones Ruta de acceso


Clic derecho sobre el nombre del
¿Cómo cambiar el nombre del
proyecto > Seleccione Propiedades
proyecto?
del VBAProject > Asigne un nombre.
Seleccione una hoja de Excel desde

    -
hojas de Excel?
des > Name > Asigne un nombre.
¿Cómo agregar un Módulo al Clic derecho sobre el Proyecto >
proyecto? Insertar > Módulo.
¿Cómo agregar un UserForm al Clic derecho sobre el Proyecto >
proyecto? 
¿Cómo eliminar un Módulo del Clic derecho sobre el Módulo >
proyecto? Quitar Módulo.
¿Cómo eliminar un Formulario del Clic derecho sobre el Formulario >
proyecto? 

1.11 La ventana Propiedades



Debemos considerar que, cuando se selecciona un determinado objeto VBA, la ventana
de propiedades muestra propiedades relacionadas a dicho objeto.

Para tal efecto, veremos las partes de la ventana de propiedades:

B C
Cap.1: Introducción al VBA
27

A. Muestra una lista de objetos de las cuales se examinan sus propiedades. Para visuali-

mostrará el nombre del objeto.

Nombre de la clase

Nombre del objeto

B. Listado de propiedades según el objeto seleccionado, debemos tener en cuenta que




C. Presenta opciones iniciales por cada propiedad, debemos considerar que toda pro-

mencionar que para cambiar el valor de una opción se puede realizar aplicando doble
clic sobre la opción.

1.12 La ventana de código


Aquí es donde podemos colocar código VBA que luego puede ser ejecutado en los obje-
tos de Excel como un libro, hoja, etc.

Para acceder a una ventana de código, solo debemos hacer doble clic sobre un objeto,
por ejemplo, la siguiente imagen muestra la ventana editora del objeto ThisWorkbook al
hacer doble clic.

Fig. 1.12 Ventana de código del ThisWorkbook

Donde:
Aquí se presenta una lista de objetos en la cual puede
asignar código.

Aquí se presenta una lista de eventos según el objeto se-


leccionado.
Aplicaciones VBA con Excel
28

1.13 Modelo de objetos de Excel



su vez forman piezas individuales en el entorno de Excel. Podríamos decir que un objeto



de programación, aprovechando así el uso de los elementos las veces que sea necesario.

En Excel los objetos presentan la siguiente jerarquía:


14 y negrita a un texto asignado en la celda A5, entonces podemos usar la siguiente línea
de código:

"A5").Font.Name="Tahoma"
"A5").Font.Size=14
"A5").Font.Bold=True

Donde:

Applicaon: Hace referencia al propio Excel.




AcveWorkbook: Hace referencia al libro actual.




AcveSheet: 


Range: 



Font: Hace referencia a la propiedad Tipo de letra que será aplicada en un rango de
celda.
Bold: Hace referencia a una subopción de la propiedad Font que permite aplicar ne-


Cap.1: Introducción al VBA
29




Primero:propiedades, es decir, un objeto puede presentar caracterís-




Código VBA Descripción del caso


Application. Hoja1 y
ThisWorkbook. azul a la Hoja2.
Sheets(1).
Tab.Color = vbRed
Application.
ThisWorkbook.
Sheets(2).
Tab.Color = vbBlue
Application.       Hoja1 y
ThisWorkbook. «Listado» a la Hoja2.
Sheets(1).
Name = "Reporte”
Application.
ThisWorkbook.
Sheets(2).
Name = “Listado”

Segundo:métodos, estos se caracterizan por realizar una ac-




Código VBA Descripción del caso


Range("A2:C4").Select Seleccionar las celdas A2 hasta C4
 
 

1.14 Objeto Application


Representa la propia aplicación Excel y mayormente funciona como contenedor de otros
-
terminada.

Propiedades del objeto Applicaon

1.14.1 ActiveCell


Address de AcveCell.
Aplicaciones VBA con Excel
30

Sub celdaActiva()
Dim celda As String
celda = Application.ActiveCell.Address
MsgBox "La dirección de la celda activa es: " & celda
End Sub

Analizando el código:

Dim celda As String



celda = Application.ActiveCell.Address

La variable celda
$A$1 el cual indica que el cursor se encuentra en la celda A1.

MsgBox "La dirección de la celda activa es: " & celda

La función MsgBox permite mostrar un mensaje de salida al usuario, para nuestro


caso el texto que se encuentra entre comillas es el mensaje mostrado al usuario, el
símbolo & permite unir dicho texto al contenido de la variable celda.

1.14.2 ActiveSheet




Sub celdaActiva()
Dim celda As String
celda = Application.InputBox(prompt:="Ingrese una celda
para activar: ",
Type:=2)
Application.ActiveSheet.Range(celda).Select
End Sub

Analizando el código:

Dim celda As String

Declaramos la variable celda en la cual almacenaremos la celda que será considerada



la forma A13.
Cap.1: Introducción al VBA
31

celda = Application.InputBox(prompt:="Ingrese una celda de la forma


Columna Final; para activar: ",
Type:=2)

Asignamos el valor ingresado por el usuario a la variable celda, como lo mencionamos


anteriormente será de la forma A13. InputBox permite mostrar una ventana al usua-
-
Type:=2.

Fig. 1.13 Ventana de po InputBox

Application.ActiveSheet.Range(celda).Select

     


AcveSheet, Range se encargará de ubicar el cursor en la celda y select de


1.14.3 ActiveWindow

permita mostrar el nombre completo del libro actual.
Sub muestraTitulo()
Dim libro As String
libro = Application.ActiveWindow.Caption
MsgBox "El nombre del libro es: " & libro
End Sub

Analizando el código:

Dim libro As String

Declaramos la variable libro que tendrá la misión de almacenar el nombre del libro
actual.

libro = Application.ActiveWindow.Caption

Asignamos a la variable libroAcveWin-


dow.Capon.

MsgBox "El nombre del libro es: " & libro

Finalmente, mostramos el nombre del libro mediante la impresión de la variable libro.


Aplicaciones VBA con Excel
32

1.14.4 ActiveWorkbook
-
mita mostrar el nombre completo del libro actual.
Sub muestraTitulo()
Dim libro As String
libro = Application.ActiveWorkbook.Name
MsgBox "El nombre del libro es: " & libro
End Sub

1.14.5 Caption


de Excel.

Sub muestraTitulo()
Dim titulo As String
titulo = Application.Caption
MsgBox "Título de la ventana: " & titulo
End Sub

Analizando el código:

Dim titulo As String

Se declara la variable tulo 




titulo = Application.Caption

Asignamos a la variable tulo


propiedad Capon del objeto Applicaon.

MsgBox "Título de la ventana: " & titulo

Finalmente, mostramos el contenido de la variable tulo mediante la función MsgBox.

1.14.6 Selection
            
procedimiento que permita mostrar la dirección de las celdas seleccionadas en la hoja
actual de Excel.

Sub muestraRango()
Dim rango As String
rango = Application.Selection.Address
MsgBox "El rango seleccionado es: " & rango
End Sub
Cap.1: Introducción al VBA
33

Analizando el código:

Dim rango As String

Declaramos la variable rango  


seleccionadas.

rango = Application.Selection.Address

Asignamos a la variable rango la dirección exacta de las celdas seleccionadas de una


-
das desde la hoja de Excel.

MsgBox "El rango seleccionado es: " & rango

-
nado en la variable rango.

1.14.7 ThisWorkbook

Veamos un procedimiento que permita mostrar el nombre del libro actual de Excel.

Sub muestraNombre()
Dim nombre As String
nombre = Application.ThisWorkbook.Name
MsgBox "El nombre del libro es: " & nombre
End Sub

Analizando el código:

Dim nombre As String

Declaramos la variable nombre


de Excel.

nombre = Application.ThisWorkbook.Name

Name
del ThisWorkbook.

MsgBox "El nombre del libro es: " & nombre

         
nombre.
Aplicaciones VBA con Excel
34

1.14.8 Visible
Permite mostrar u ocultar la aplicación Excel, esto puede ser usado al ejecutar un formu-

Excel nuevamente con la propiedad Visible=True. Veamos un procedimiento que permita
ocultar el libro actual.

Sub ocultaVentana()
Application.Visible = False
End Sub

Analizando el código:

Application.Visible = False

La opción False permite ocultar la aplicación Excel; con la opción True lo volvemos

clave de acceso de usuario o realice algún tema de seguridad.

1.14.9 MoveAfterReturn
Permite habilitar e inhabilitar el movimiento del cursor al presionar la tecla <Enter>
después del ingreso de valor en una celda. Veamos un procedimiento que inhabilita y
hablita el movimiento del cursor en una hoja de Excel.
Sub inhabilita()
Application.MoveAfterReturn = False
End Sub

Sub habilita()
Application.MoveAfterReturn = True
End Sub

Analizando el código:

Application.MoveAfterReturn = False

Permite inhabilitar el movimiento del cursor al presionar la tecla <Enter>, es decir,


podremos ingresar valores y permanecer en la misma celda, la única forma de mover
el cursor será por medio de las teclas direccionales.

Application.MoveAfterReturn = true

Es el valor por defecto, igualmente permite habilitar el movimiento del cursor al pre-
sionar la tecla <Enter>.
Cap.1: Introducción al VBA
35

1.14.10 DisplayFormulaBar
Permite habilitar e inhabilitar la visualización de la barra de fórmulas en el libro de Ex-
cel. Veamos un procedimiento que inhabilita y habilita la barra de fórmulas.

Sub inhabilita()
Application.DisplayFormulaBar = False
End Sub

Sub habilita()
Application.DisplayFormulaBar = True
End Sub

Analizando el código:

Application.DisplayFormulaBar = False



Application.DisplayFormulaBar = True

Es el valor por defecto, igualmente permite mostrar la barra de fórmula en el libro




1.14.11 DisplayFullScreen
Permite habilitar e inhabilitar la maximización de la hoja de cálculo de un documento
de Excel. Veamos un procedimiento que inhabilita y habilita la maximización de la hoja
de cálculo.

Sub restaura()
Application.DisplayFullScreen = False
End Sub

Sub maximiza()
Application.DisplayFullScreen = True
End Sub

Analizando el código:
Application.DisplayFullScreen = False

Permite restaurar a su estado normal la hoja de cálculo.

Application.DisplayFullScreen = True

Permite maximizar el tamaño de la hoja de cálculo, ocupando toda la pantalla.


Aplicaciones VBA con Excel
36

Métodos del objeto Applicaon

1.14.12 Quit
Método que permite salir de la aplicación de Excel, cerrando todos los libros y pregun-
tando si se guardará los cambios en el caso de que los hubiera. Veamos un procedi-
miento que permite cerrar la aplicación Excel.

Sub salir()
Dim r As Integer
r = MsgBox("Esta seguro de salir", vbYesNo + vbCritical)
If r = 6 Then
Application.Quit
End If
End Sub

Analizando el código:

Dim r As Integer

Declaramos la variable r



r = MsgBox("Esta seguro de salir", vbYesNo + vbCritical)

La función MsgBox presentará una ventana con-


dicional, en la cual el usuario seleccionará la op-
ción «Sí» o «No» dependiendo de la opción que el
determine, vbYesNo permite mostrar los botones
mientras que vbCrical muestra el símbolo, tal
como se muestra en la siguiente imagen:

If r = 6 Then

Al seleccionar la opción «Sí» se asigna el número seis a la variable r, mientras que al


seleccionar «No» se le asignará el número siete.

Application.Quit



1.14.13 OnTime
Método que permite ejecutar un proceso en un

que permita mostrar la fecha y hora actual des-

Fig. 1.14 Mensaje mostrado a parr de
los 10 segundos
Cap.1: Introducción al VBA
37

Sub tiempo()
Dim segundos As Date
segundos = Now + TimeValue("0:0:10”)
Application.OnTime segundos, "mostrarMensaje"
End Sub

Sub mostrarMensaje()
MsgBox "Fecha Actual: " & Date & " Hora actual: " & Time
End Sub

Debemos tener en cuenta los siguientes aspectos, el procedimiento empo-


sión de contabilizar los diez segundos e invocar al procedimiento «mostrarMensaje».
Ambos procedimientos deben implementarse en un módulo. Adicionalmente conside-
re que usando Now+TimeValue
mientras que TimeValue se programa en un hora determinada.

Analizando el código:

Dim segundos As Date

Declaramos la variable segundos-



Date
que hace referencia a una hora.

segundos = Now + TimeValue("0:0:10")

Now+Ti-
meValue

Application.OnTime segundos, "mostrarMensaje"

Finalmente, invocamos al método OnTime  


segundos ya es-
  
debe encerrarse entre comillas dobles para ser invocado.

MsgBox "Fecha Actual: " & Date & " Hora actual: " & Time

En el procedimiento "mostrarMensaje" se invoca a la función MsgBox para mostrar


la fecha actual por medio de la función Date y la hora actual por medio de la función
Time.
Aplicaciones VBA con Excel
38

1.15 El objeto WorkBook


Representa a un libro de Excel; a la colección de libros abiertos se les llama Workbooks.

Propiedades del objeto WorkBook

1.15.1 Count

abierto» es la representación de la apertura de los archivos de Excel.
Sub numeroLibros()
MsgBox "La cantidad de libros abiertos es: " & Workbooks.Count
End Sub

Analizando el código:

MsgBox "La cantidad de libros abiertos es: " & Workbooks.Count

La función MsgBox permite mostrar un mensaje de salida al usuario. Para nuestro


caso el texto que se encuentra entre comillas es el mensaje mostrado al usuario, el
símbolo & permite unir dicho texto a la propiedad Count el cual se encarga de contar
el número de libros abiertos. Para la prueba se deberá abrir por lo menos dos veces la
aplicación Excel y en uno de ellos colocar el código presentado. Este código puede ser
implementado en el ThisWorkbook de cualquier libro.

1.15.2 Name
Representa el nombre del libro actual de Excel. Veamos un procedimiento que muestre
el nombre del libro.

Sub nombreLibro()
MsgBox "El nombre del libro es: " & ThisWorkbook.Name
End Sub

Analizando el código:
MsgBox "El nombre del libro es: " & ThisWorkbook.Name

ThisWorkbook.Name
el archivo, el nombre mostrado será Libro1. Por otra parte, no se olvide que el símbo-
lo & permite concatenar dos o más elementos dentro de una misma sentencia.

1.15.3 Path
-
to. Veamos un procedimiento que muestre la ruta registrada para el libro actual.

Sub rutaArchivo()
MsgBox "La ruta del archivo es: " & ThisWorkbook.Path
End Sub
Cap.1: Introducción al VBA
39

Analizando el código:

MsgBox "La ruta del archivo es: " & ThisWorkbook.Path

Path-
ta una ruta, primero debemos grabar el libro, de otra manera el mensaje solo mostrará
el texto «La ruta del archivo es:».

Métodos del objeto WorkBook

1.15.4 Open
Permite abrir un archivo de Excel, debemos considerar que para mostrar el contenido
de un libro primero debemos conocer la ruta exacta de donde proviene el libro.
Sub abrirArchivo()
Workbooks.Open "D:\Capitulo 1\path-workbook.xlsm"
End Sub

Analizando el código:

Workbooks.Open "D:\Capitulo 1\path-workbook.xlsm"

Open    


donde fue grabado el documento. Debemos tener en cuenta que al abrir un archivo


1.15.5 Add


Sub agregaLibros()
Workbooks.Add
End Sub

Analizando el código:

Workbooks.Add

El método Add

1.15.6 Activate
-

apertura de los libros, y la segunda es por el nombre del mismo libro.
Sub activaListado()
Workbooks("listado.xlsx").Activate
End Sub
Aplicaciones VBA con Excel
40

Analizando el código:

Workbooks("listado.xlsx").Activate

El método Acvate ubica el cursor en el libro invocado; en este caso, estamos in-
vocando al archivo "listado.xlsx" Debemos considerar que el archivo solicitado no
.xlsm sino más bien debe ser solo un archivo exis-
tente en una misma carpeta. Si el libro invocado es el segundo abierto de una lista de
libros, entonces el código podríamos haberlo escrito de la siguiente manera Woork-
Books(2).Acvate.

1.15.7 Close
Permite cerrar un determinado libro. Debemos tener en cuenta que desde un docu-
mento podemos cerrar cualquier libro abierto inclusive el mismo. Veamos como cerrar
el libro actual.
Sub cerrarLibro()
ThisWorkbook.Close
End Sub

Analizando el código:

ThisWorkbook.Close

El método Close cierra el libro preguntando si desea grabar los cambios realizados; se
debe tener en cuenta que si no realiza ningún cambio al libro, este se cerrará automá-

en el siguiente código:
Sub cerrarLibro()
Workbooks("listado.xlsx").Close SaveChanges:=False
End Sub

Analizando el código:

Workbooks("listado.xlsx").Close SaveChanges:=False

El método Close cierra el libro "listado.xlsx"; la opción SaveChanges permite grabar



False no graba los cambios del libro, en cambio True graba los cambios realizados, sin
necesidad de preguntarle al usuario.

1.15.8 Save
Permite guardar los cambios en un determinado libro. Debemos tener en cuenta que
guardará los cambios realizados al documento, para esto el libro deberá encontrarse
previamente grabado. Su función es parecida al accionar del botón Grabar de la barra
de herramientas.
Cap.1: Introducción al VBA
41

Sub guardaLibro()
ThisWorkbook.Save
End Sub

Analizando el código:

ThisWorkbook.Save

El método Save permite guardar los cambios en un documento previamente guarda-


do, sin necesidad de mostrar la ventana de diálogo de grabación. También podemos
usar los siguientes códigos para la misma acción:


Sub guardaLibro()
ActiveWorkbook.Save
End Sub


Sub guardaLibro()
Workbooks("Save - WorkBook.xlsm").Save
End Sub

Guardando el libro haciendo referencia al número de libro abierto, aquí debemos te-
ner en cuenta que el número es asignado en el orden de apertura de los libros:
Sub guardaLibro()
Workbooks(1).Save
End Sub

1.15.9 Save As
P
el archivo original. Debemos tener en cuenta que el archivo original debe encontrarse
previamente guardado. Su función es parecida al accionar del botón Guardar como…
de la barra de herramientas.

Sub guardaLibro()
ActiveWorkbook.SaveAs "C:\Capitulo 1\Copia de Seguridad.xlsm"
Workbooks.Open "C:\Capitulo 1\Save As - WorkBook.xlsm"
Workbooks("Save As - WorkBook.xlsm").Activate
End Sub

Analizando el código:

ThisWorkbook.SaveAs "C:\Capitulo 1\Copia de Seguridad.xlsm"

El método SaveAs permite guardar todo el archivo en uno nuevo para lo cual debe-

Aplicaciones VBA con Excel
42

Workbooks.Open "C:\Capitulo 1\Save As - WorkBook.xlsm"

Cuando un archivo de Excel es grabado con el método SaveAs este archivo se con-

documento; esta línea de código permite abrir justamente el archivo original que se
cerró al guardar el documento con otro nombre.

Workbooks("Save As - WorkBook.xlsm").Activate

           
Open.

Otras opciones que presenta el manejo del método Save As es:

Sub guardaLibro()
ThisWorkbook.SaveAs "C:\Capitulo 1\Copia de Seguridad.xlsm"
Workbooks.Open "C:\Capitulo 1\Save As - WorkBook.xlsm"
Workbooks("Save As - WorkBook.xlsm").Activate
End Sub

Sub guardaLibro()
Workbooks.("C:\Capitulo 1\Save As - WorkBook.xlsm").SaveAs
"C:\Capitulo 1\Copia de Seguridad.xlsm"
Workbooks.Open "C:\Capitulo 1\Save As - WorkBook.xlsm"
Workbooks("Save As - WorkBook.xlsm").Activate
End Sub

Sub guardaLibro()
Workbooks(1).SaveAs "C:\Capitulo 1\Copia de Seguridad.xlsm"
Workbooks.Open "C:\Capitulo 1\Save As - WorkBook.xlsm"
Workbooks("Save As - WorkBook.xlsm").Activate
End Sub

1.15.10 SaveCopyAs
Permite crear una copia del libro actual. Debemos tener en cuenta que el libro a dupli-
car debe encontrarse previamente grabado.

Sub crearCopia()
ActiveWorkbook.SaveCopyAs "C:\Capitulo 1\Copia de Seguridad.xlsm"
End Sub

Analizando el código:

ActiveWorkbook.SaveCopyAs "C:\Capitulo 1\Copia de Seguridad.xlsm"

El método SaveCopyAs permite guardar todo el libro a uno nuevo; también debemos
mencionar que la diferencia que existe con el método SaveAs  
muestra el archivo copiado, solo lo crea.
Cap.1: Introducción al VBA
43

1.16 El objeto WorkSheets


El objeto WorkSheet representa a una hoja de cálculo de Excel, a la colección de hojas
se le llama WorkSheets
métodos:

Propiedades del objeto WorkSheets

1.16.1 Count
Representa el número total de hojas por libro, es decir devolverá el número de hojas
  
hojas predeterminado es uno, en otras versiones de Excel el número total de hojas era
tres.
Sub numeroHojas()
MsgBox "La cantidad de hojas es: " & WorkSheets.Count
End Sub

Analizando el código:

MsgBox "La cantidad de hojas es: " & WorkSheets.Count

Count
siempre devuelve un valor numérico entero.

1.16.2 Name
Representa el nombre de la hoja actual. Debemos considerar que el nombre predeter-
minado es Hoja1
sobre la hoja, y seleccionando Cambiar nombre-
cando la propiedad Name desde la ventana de propiedades. Veamos cómo mostrar el
nombre de la hoja actual por medio de un procedimiento.

Sub hojaActual()
MsgBox "El nombre de la hoja es: " & Worksheets(1).Name
End Sub

Analizando el código:

MsgBox "El nombre de la hoja es: " & Worksheets(1).Name

Debemos tener en cuenta que el nombre de la hoja es una propiedad del objeto Wor-
ksheets
será Hoja1 o simplemente 1 si queremos tratarlo por su índice. Es por esa razón que al
invocar la propiedad Name hacemos referencia al número de hoja del cual queremos
su nombre. Otras opciones para la invocación del nombre de la hoja pueden ser:
Aplicaciones VBA con Excel
44

AcveSheet, el cual hace referencia a la hoja actual:

Sub hojaActual()
MsgBox "El nombre de la hoja es: " & ActiveSheet.Name
End Sub

Hoja1 del conjunto de hojas:


Sub hojaActual()
MsgBox "El nombre de la hoja es: " & Hoja1.Name
End Sub

Count del WorkSheets, desde aquí podemos obtener el nom-



Sub hojaActual()
MsgBox "El nombre de la hoja es: " &
Worksheets(Worksheets.Count).Name
End Sub

Haciendo referencia a otro libro:

Sub nombreHoja()
MsgBox "El nombre de la hoja es: " &
Workbooks("Libro2").Worksheets(1).Name
End Sub

1.16.3 Next
-
miento que permita mostrar la siguiente hoja en un determinado libro.

Sub hojaSiguiente()
ActiveSheet.Next.Activate
End Sub

Analizando el código:
ActiveSheet.Next.Activate

Debemos tener en cuenta que la propiedad Next permite ubicar datos de la próxima
hoja, mientras que Acvate

1.16.4 Previous
-
miento que permita mostrar la hoja anterior desde una hoja actual en un determinado
libro.

Sub hojaAnterior()
ActiveSheet.Previous.Activate
End Sub
Cap.1: Introducción al VBA
45

Analizando el código:

ActiveSheet.Previous.Activate

Debemos tener en cuenta que usamos el objeto AcveSheet para movernos a las si-

sin ningún problema por todas las hojas de un determinado libro.

1.16.5 Index
Propiedad que permite devolver el número de hoja de un conjunto de hojas de un mis-
mo libro. Veamos el procedimiento índice que devuelve el número de hoja en la que se
encuentra el usuario:

Sub indice()
MsgBox "El número de hoja es: " & ActiveSheet.Index
End Sub

Analizando el código:

MsgBox "El número de hoja es: " & ActiveSheet.Index

Index-
minado libro.

En el siguiente código se muestra un mensaje única y exclusivamente cuando el usua-



Sub indice()
Dim numero As Integer
numero = ActiveSheet.Index
If numero = Sheets.Count Then
MsgBox "Usted se encuentra en la última hoja"
End If
End Sub

Métodos

1.16.6 Activate
      
cómo mostrar el contenido de la Hoja2, sabiendo que la hoja actual es la Hoja1.

Sub activaHoja()
WorkSheets(2).Activate
End Sub
Aplicaciones VBA con Excel
46

Analizando el código:

WorkSheets(2).Activate

Acvate es un método que no necesita parámetros lo único que debemos considerar



número dos representa a la segunda hoja de todo el libro.

1.16.7 Add
Permite agregar un determinado número de hojas a un libro. Debemos tener en cuenta
que el nombre por defecto de las hojas es HojaN donde «N» representa al número de
hoja según un determinado libro. Veamos el procedimiento que permite agregar un

Sub agregaHoja()
Dim nombre As String
nombre = InputBox("Ingrese el nombre de la hoja nueva: ")
Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name=nombre
Worksheets(1).Activate
End Sub

Analizando el código:

Dim nombre As String

nombre = InputBox("Ingrese el nombre de la hoja nueva: ")


Solicitamos el nombre de la hoja por medio de la función InputBox, dicho nombre se
almacenará en la variable nombre que próximamente asignaremos a la nueva hoja.

Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name=nombre

El método Add
la posición usamos la opción Aer -
cuerde que Worksheets.Count determina el número total de hojas contenidas en el


La forma predeterminada de agregar un hoja nueva sería Worksheets.Add; en caso


de agregar una nueva hoja después de la Hoja2 podría ser de la siguiente manera:
Worksheets.Add(Aer:=Worksheets("Hoja2")); si quisiéramos agregar tres hojas al
Worksheets.Add Aer:=Worksheets(Works-
heets.Count), Count:=3.

Worksheets(1).Activate



Cap.1: Introducción al VBA
47



Fig. 1.15 Pantalla principal para agregar múlples hojas

Para este ejercicio hay que tener cuidado con las ubicaciones de los elementos como
INFORME
0001 que se encuentra en la celda B5
hojas en un mismo libro es:

Sub generaHojas()
For i = 1 To 20
nombre = Worksheets(1).Cells(4 + i, 2).Value
If nombre <> "" Then
Worksheets.Add(after:=Worksheets(Worksheets.Count)).Name=nombre
Else
Exit Sub
End If
Next
End Sub

Analizando el código:
For i = 1 To 20
nombre = Worksheets(1).Cells(4 + i, 2).Value
If nombre <> "" Then
Worksheets.Add(after:=Worksheets(Worksheets.Count)).Name=nombre
Else
Exit Sub
End If
Next
Aplicaciones VBA con Excel
48


           For

-
cías; por eso, condicionamos que el nombre de la hoja sea diferente al vacío (If nom-
bre<>""). De esta manera, se podrá crear las hojas con nombres. En el caso de que
For mediante la sentencia Exit
Sub

Finalmente, la parte más importante del procedimiento es cómo capturar el nombre


de las hojas que se encuentran en las celdas de Excel; primero, debemos considerar
la posición del primer nombre el cual se encuentra en B5, considerado como la 5,
columna 2; es así que podemos capturar los nombres mediante la propiedad Cells, así
pues, 4+i representa a 5 cuando el valor de i vale 1; este valor aumentará conforme i
aumente, observe que el número 2 no cambiará ya que todos los nombres se encuen-
tran en la columna B considerada como 2 para la propiedad Cells.

1.16.8 Delete
Permite eliminar una hoja de un conjunto de hojas en un determinado libro.

Sub eliminaHoja()
Dim numero As Integer
numero = InputBox("Ingrese número de hoja a eliminar: ")

Application.DisplayAlerts = False
Worksheets(numero).Delete
End Sub

Analizando el código:

Dim numero As Integer

numero = InputBox("Ingrese número de hoja a eliminar: ")


Solicitamos el número de hoja que se desea eliminar, este se guardará en la variable
número; recuerde que la función InputBox permite mostrar un cuadro de entrada en
la cual el usuario podrá ingresar valores.

Application.DisplayAlerts = False

Esta sentencia bloquea los mensajes enviados desde Excel cuando intentamos elimi-
nar las hojas.

Worksheets(numero).Delete

Finalmente, llegamos a eliminar la hoja seleccionada por el usuario, recuerde que


debe ingresar el número de hoja y no el nombre, ya que la variable ha sido declarada
como valor numérico.
Cap.1: Introducción al VBA
49

1.17 El objeto Range


El objeto Range
            
mencionar que el objeto Range puede hacer referencia a celdas de otro libro.

Propiedades del objeto Range

1.17.1 Address
Representa la ubicación de la celda actual en una determinada hoja. Veamos un proce-


Sub ubicacionCelda()
MsgBox "La ubicación de la celda activa es: "& ActiveCell.Address
End Sub

Analizando el código:

MsgBox "La ubicación de la celda activa es: " & ActiveCell.Address

La dirección de una celda está dada de la forma $columna$la, de tal manera que la
propiedad Address

1.17.2 Cells
Permite hacer referencia a un conjunto de celdas en una determinada hoja. Veamos un
procedimiento que permite seleccionar un conjunto de celdas:

Sub seleccionaCeldas()
Range(Cells(6, 2), Cells(15, 4)).Select
End Sub

Analizando el código:

Range(Cells(6, 2), Cells(15, 4)).Select

El objeto Range-
Cells, es así que (6,2) representa a la celda B6 mientras que (15,4)
representa a la celda D15.

1.17.3 End
-


Aplicaciones VBA con Excel
50

Fig. 1.16 Listado de clientes

Sub primeraFila()
Range("B5").End(xlUp).Offset(1, 0).Select
End Sub

Sub ultimaFila()
Range("B5").End(xlDown).Select
End Sub

Sub primeraColumna()
Range("B5").End(xlToLeft).Offset(0, 1).Select
End Sub

Sub ultimaColumna()
Range("B5").End(xlToRight).Select
End Sub

Analizando el código:

Range("B5").End(xlUp).Offset(1, 0).Select

xlUp-
B5xlUp ubicaría en la celda B4, es por
Oset

Range("B5").End(xlDown).Select

xlDown
la celda B5.

Range("B5").End(xlToLeft).Offset(0, 1).Select

xlToLe
B5, usamos Oset(0,1) para saltar una columna adelante.
Cap.1: Introducción al VBA
51

Range("B5").End(xlToRight).Select

xlToRight
a la celda B5.

Finalmente, podemos implementar un procedimiento que permita seleccionar toda la



Sub ultimaFilaCompleta()
Range("B20", Range("B20").End(xlToRight)).Select
End Sub

1.17.4 Formula
Permite implementar una fórmula de Excel desde VBA, hay que tener en cuenta que las

implementar un procedimiento que permite mostrar los totales por unidades y por
costo del siguiente cuadro:

Fig. 1.17 Listado de productos

Sub generaCalculos()
Range("D23").Formula = "=sum(D9:D22)"
Range("E23").Formula = "=sum(E9:E22)"
End Sub

Analizando el código:

Range("D23").Formula = "=sum(D9:D22)"

La propiedad Formula
función interpretada por Excel, es por esto que, para sumar todas las unidades, se
emplea la función sum que es análoga a la función «suma» de Excel.
Aplicaciones VBA con Excel
52

Range("E23").Formula = "=sum(E9:E22)"



comentar que VBA envía a la celda de Excel la fórmula =sum(E9:E22) mientras que
Excel lo recepciona como =Suma(E9:E22).
Finalmente, si aplicamos todas las funciones vistas hasta el momento podríamos lle-

Sub generaCalculos()
Range("D9").End(xlDown).Offset(1, 0).Select
ActiveCell.Formula = "=sum(D9:D22)"

Range("E9").End(xlDown).Offset(1, 0).Select
ActiveCell.Formula = "=sum(E9:E22)"
End Sub

1.17.5 FormulaLocal
Debemos considerar que en VBA para hacer referencia a la funciones de Excel se debe
-
logas en VBA y Excel. Veamos cómo implementar un procedimiento que permita calcu-

tal como se muestra en la siguiente imagen:

Fig. 1.18 Listado de pagos


Cap.1: Introducción al VBA
53

Antes de implementar el procedimiento se debe tener en claro las posiciones en celdas


de los valores a calcular, ya que la implementación de la función FormulaLocal es como
usar una fórmula directamente en una hoja de Excel.
Sub calculaPago()
Range("M12").FormulaLocal = "=SUMA(D12:L12)"
Range("M12").Select
Selection.AutoFill Destination:=Range("M12:M42")

Range("M43").FormulaLocal = "=SUMA(M12:M42)"
End Sub

Analizando el código:
Range("M12").FormulaLocal = "=SUMA(D12:L12)"

La celda M12 representa la primera posición del cálculo que debemos realizar, recuer-
de que la función FormulaLocal es como encontrarse en una hoja de Excel; por tanto,
para sumar todos los montos del primer registro sería =SUMA(D12:L12).

Range("M12").Select

La idea es copiar la formula a las demás celdas como lo haríamos en una hoja de Excel,
así que empezamos por ubicarnos en la celda donde se encuentra la fórmula imple-
mentada con la sentencia anterior.

Selection.AutoFill Destination:=Range("M12:M42")

Para copiar la fórmula a las demás celdas debe considerar la posición de todos los
elementos a sumar y, además, deberán ser adyacentes. AutoFill permite copiar la fór-

aplicación de la copia, en nuestro caso desde M12 hasta M42. Tenga en cuenta que,
M12.

Range("M43").FormulaLocal = "=SUMA(M12:M42)"

Finalmente, aplicamos la fórmula usando la función FormulaLocal


función Suma como si estuviéramos en la hoja de Excel; tenga en cuenta que M43 es
la celda donde se mostrará el resultado.

1.17.6 FormulaR1C1
Establece una fórmula mediante la notación R1C1 donde R-
tras C
-

su código, y la sección lo determina el sexto carácter del lado izquierdo. Finalmente,

se componga por la primera letra de su nombre más su apellido paterno, tal como se
muestra en la siguiente imagen:
Aplicaciones VBA con Excel
54

Fig. 1.19 Listado de parcipantes

Sub determinaValores()
Range("D10").FormulaR1C1 = "=RIGHT(RC[-2])"
Range("D10").Select
Selection.AutoFill Destination:=Range("D10:D20")

Range("E10").FormulaR1C1 = "=MID(RC[-3],6,1)"
Range("E10").Select
Selection.AutoFill Destination:=Range("E10:E20")

Range("F10").FormulaR1C1 = "=LOWER(MID(RC[-3], SEARCH("" "", RC[-3],


SEARCH("" "", RC[-3]) + 1), 1 + 1) & MID(RC[-3], RIGHT(1), RIGHT(SEARCH("" "",
RC[-3]) - 1))) & ""@editorialmacro.com"""
Range(“F10”).Select
Selection.AutoFill Destination:=Range("F10:F20")
End Sub

Sub limpiarCeldas()
Range("D10:F20").ClearContents
End Sub

Analizando el código:

Range("D10").FormulaR1C1 = "=RIGHT(RC[-2])"
Range("D10").Select
Selection.AutoFill Destination:=Range("D10:D20")

Range, ya que
FormulaR1C1,
RIGHT(RC[-2]), debido a que, según el
     

aumentamos ni disminuimos a R.

Luego, hacemos que la celda D10


AutoFill 
como D10 hasta D20.
Cap.1: Introducción al VBA
55

Range("E10").FormulaR1C1 = "=MID(RC[-3],6,1)"
Range("E10").Select
Selection.AutoFill Destination:=Range("E10:E20")

En la celda E10
función MID que representa al Extraer de Excel retrocediendo para este caso tres co-

-
AutoFill.

Range("F10").FormulaR1C1 = "=LOWER(MID(RC[-3],
SEARCH("" "", RC[-3],
SEARCH("" "", RC[-3]) + 1), 1 + 1) &
MID(RC[-3], RIGHT(1),
RIGHT(SEARCH("" "", RC[-3]) - 1))) &
""@editorialmacro.com"""
Range("F10").Select
Selection.AutoFill Destination:=Range("F10:F20")

Para la generación del correo electrónico debemos hacer uso de varias funciones
como Lower para que el correo se genere en minúsculas, Search para hallar los espa-
Mid para extraer parte
del texto. Recuerde que el símbolo & permite unir o concatenar dos o más expresio-
    
doblemente, tal es así que representar "" sería "" "".

1.17.7 Value
Tiene un trabajo de asignación y recuperación de valor sobre una celda, es decir, pode-
Formu-
la; así también podemos obtener un valor desde las celdas de la hoja de Excel hacia VBA.

Fig. 1.20 Listado de productos


Aplicaciones VBA con Excel
56

Sub generaCalculos()
Range("D23").Value = ""
Range("E23").Value = ""

Range("D9").End(xlDown).Offset(1, 0).Select
ActiveCell.Value = "=sum(D9:D22)"

Range("E9").End(xlDown).Offset(1, 0).Select
ActiveCell.Value = "=sum(E9:E22)"
End Sub

Analizando el código:

Range("D23").Value = ""
Range("E23").Value = ""

La forma para limpiar la celda D23 es enviando un valor vacío a dicha celda por medio
de la propiedad Value; de la misma manera, se limpia el contenido de la celda E23.

Range("D9").End(xlDown).Offset(1, 0).Select
ActiveCell.Value = "=sum(D9:D22)"

Nos ubicamos al inicio de las unidades (D9


(xlDown) y saltar una posición (Oset(1, 0)-
des usando la fórmula "=sum(D9:D22)".

Range("E9").End(xlDown).Offset(1, 0).Select
ActiveCell.Value = "=sum(E9:E22)"

Nos ubicamos al inicio de los costos (E9  


(xlDown) y saltar una posición (Oset(1, 0)) para generar la suma de dichos costos
usando la fórmula "=sum(E9:E22)".

Métodos

1.17.8 Activate
Range-
va. Veamos algunos casos:

Procedimiento que permite capturar el contenido de una determinada celda.

Sub capturaContenido()
Range("D7").Activate

Dim valor As String


valor = ActiveCell.Value
MsgBox "El valor de la celda D7 es: " & valor
End Sub
Cap.1: Introducción al VBA
57

Procedimiento que permite mostrar la hora actual en la celda D7.


Sub enviaValor()
Range("D7").Activate
Range("D7").FormulaLocal = "=Hoy()"
End Sub

1.17.9 Clear
Método que permite eliminar el contenido y el formato asignado a un determinado
número de celdas. Veamos un procedimiento que permita limpiar el contenido de un
determinado rango de celdas así como su formato:

Sub eliminaContenido()
Range("D10:D20").clear
End Sub

1.17.10 ClearContents
-
cados en el objeto Range. Veamos el procedimiento:

Sub limpiaCeldas()
Range("D10:D50").ClearContents
End Sub

1.17.11 Delete
Método que elimina un determinado número de celdas. Veamos un procedimiento que
permita eliminar un conjunto determinado de celdas:
Sub eliminaCelda()
Range("D10:D20").Delete
End Sub
Aplicaciones VBA con Excel
58



Sub eliminaFila()
Range("D10").Activate
Selection.EntireRow.Delete
End Sub

Si necesitamos eliminar una columna completa podríamos usar el siguiente procedi-


miento:

Sub eliminaFila()
Range("D10").Activate
Selection.EntireColumn.Delete
End Sub

1.17.12 Calculate
Método que permite recalcular las fórmulas en un determinado rango.

Sub recalculaFormulas()
Range("D10").Calculate
End Sub

1.18 El objeto Cells


Cells cuenta con las mismas funcionalidades que el objeto Range la diferencia es la es-
RangeCells lo


Al respecto, podemos decir que Cells ofrece la ventaja de recorrer por varias celdas ha-

algunos ejemplos del objeto Cells:

Procedimiento que permita seleccionar todas las celdas de una determinada hoja:

Sub seleccionarTodo()
Cells.Select
End Sub

Procedimiento que permita seleccionar la celda D2:

Sub seleccionarCeldaDos()
Cells(2, 4).Select
End Sub
Cap.1: Introducción al VBA
59

Procedimiento que permita limpiar el contenido solo para la celda D2:

Sub seleccionarRango()
Cells(2,4).ClearContents
End Sub

D2:

Sub modicaFuente()
Cells.Font.Name = "Arial"
Cells.Font.Size = 10
End Sub

Procedimiento que permita asignar un valor número a la celda D2:

Sub asignaValor()
Cells(2,4).Value = 200
End Sub

1.19 Listado de funciones VBA



fórmulas en Excel, cabe mencionar que se encuentran ordenados en forma ascendente
por la columna función Excel.

Función VBA Función Excel


 
 
 
 
 
 
 
 
 
 
 
 
Aplicaciones VBA con Excel
60

Función VBA Función Excel


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Cap.1: Introducción al VBA
61

Función VBA Función Excel


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Aplicaciones VBA con Excel
62

Función VBA Función Excel


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Cap.1: Introducción al VBA
63

Función VBA Función Excel


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Aplicaciones VBA con Excel
64

Función VBA Función Excel


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Cap.1: Introducción al VBA
65

Función VBA Función Excel


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Aplicaciones VBA con Excel
66

Función VBA Función Excel


 
 
 
 
 
 
 
 
 
 M.C.D
 M.C.M
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Cap.1: Introducción al VBA
67

Función VBA Función Excel


 
N N
 
 
 
 
 
 
 
 
 
 
 O
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Aplicaciones VBA con Excel
68

Función VBA Función Excel


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Cap.1: Introducción al VBA
69

Función VBA Función Excel


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
T T
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Aplicaciones VBA con Excel
70

Función VBA Función Excel


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

1.20 Casos desarrollados

ͫCaso desarrollado 1: Macro para formato de dólares


Implemente una macro llamada MonedaDolares que permita dar el formato de mo-


Pasos:
1. En un documento nuevo de Excel elabore el siguiente cuadro

Fig. 1.21 Hoja de Excel

2. C2
3. Ficha Desarrollador > Grabar macro y asigne los valores tal como se muestra en la
siguiente ventana:
Cap.1: Introducción al VBA
71

Fig. 1.22 Ventana «Grabar macro»

4. Tenga en cuenta que al hacer clic en el botón Aceptar


se empezará a implementar
la macro, seguidamente procederemos a formatear el valor de la celda C2 para lo
cual presionaremos <CTRL+1> > Categoría: Contabilidad > Posiciones decimales:
2 > Símbolo: $ Ingles (Estados Unidos).

Fig. 1.23 Conguración de la moneda


5.             
muestra en la siguiente imagen:

Fig. 1.24 Formato de número


6. Desarrollador >
Detener grabación.
7. Por otra parte, ahora visualizaremos el código VBA generado con base en la macro,
para lo cual debemos presionar la combinación de teclas <Alt+F11>.

Fig. 1.25 Ventana exploradora de proyectos


Aplicaciones VBA con Excel
72

8. Paravisualizar el código debemos hacer doble clic sobre el objeto Módulo1, la




Fig. 1.26 Código fuente de la macro

ͫCaso desarrollado 2: Macro para formato de texto


Implemente una macro llamada FormatoTitulo que permita combinar las celdas y


Pasos:

1. En un documento nuevo de Excel coloque el texto «Reporte de ventas» en la celda


B2, tal como se muestra en la siguiente imagen:

Fig. 1.27 Hoja de Excel

2. FichaDesarrollador > Grabar macro y asignar los valores como se muestra en la


siguiente ventana:

Fig. 1.28 Ventana de diálogo «Grabar macro»


Cap.1: Introducción al VBA
73

3. Aplique el siguiente formato al texto de la celda B2:


Combinar las celdas desde B2 hasta G2.


Asignar el tamaño de letra 18.


4. Desarrollador > Detener grabación.
5. 

Fig. 1.29 Aspecto nal del tulo en la hoja de Excel

6. Desarrollador > Visual


Basic.
Código fuente de la macro «FormatoTitulo»

Sub FormatoTitulo()
Range("B2:G2").Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Selection.Merge
With Selection.Font
.Name = "Tahoma"
.Size = 22
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ThemeColor = xlThemeColorLight1
.TintAndShade = 0
.ThemeFont = xlThemeFontNone
End With
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorAccent5
.TintAndShade = 0.799981688894314
.PatternTintAndShade = 0
End With
End Sub
Aplicaciones VBA con Excel
74

Como verá el código generado usa funciones propias de VBA que a simple vista parece
complejo, pero conforme vamos avanzando en el tema, observará usted que su inter-
pretación es sencilla; por mientras, eliminaremos las instrucciones neutras del código

de la macro), teniendo así el siguiente código:

Código de la macro depurada

Sub FormatoTitulo()
'1. Seleccionar las celdas a combinar
Range("B2:G2").Select
'2. Combinar las celdas
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
End With
Selection.Merge
'3. Aplicar formato de fuente al texto
With Selection.Font
.Name = "Tahoma"
.Size = 22
End With
'4. Aplicando color de fondo a las celdas
With Selection.Interior
.Pattern = xlSolid
.ThemeColor = xlThemeColorAccent5
.TintAndShade = 0.799981688894314
End With
End Sub

Explicaremos el código generado por la macro:

Código VBA Descripción


Range("B2:G2").Select Permite seleccionar las celdas desde B2
hasta G2.
Selection Permite centrar el texto de forma hori-
.HorizontalAlignment=xlCenter zontal.
Selection Permite centrar el texto de forma
.VerticalAlignment = xlBottom 
Selection.Merge Permite combinar las celdas selecciona-
da con Range("B2.G2").select.
Selection.Font   
.Name = "Tahoma" celdas seleccionadas.
Selection.Font Permite aplicar el tamaño de la fuente a
.Size = 22 las celdas seleccionadas.
Selection.Interior Permite asignar un color de fondo a las
.Pattern = xlSolid celdas seleccionadas.
Selection.Interior Permite asignar un tema de color a las
.ThemeColor=xlThemeColorAccent5 celdas seleccionadas (opcional).
Cap.1: Introducción al VBA
75

Código VBA Descripción


Selection.Interior Permite asignar un degradado del color
.TintAndShade = 0.799981688894314 seleccionado aplicado a las celdas selec-
cionadas.
With Permite resumir una sentencia común
en VBA. Por ejemplo, veamos el
End With siguiente código:

Selection.Font.Name="Taho-
ma"
Selection.Font.Size=22

Si analizamos el código, notamos que la


instrucción Selecon.Font se repite; por
lo tanto, usando la función With podría
ser de la siguiente:

With Selection.Font
.Name = "Tahoma"
.Size = 22
End With

7. Para probar los cambios realizados a la macro, ubíquese en la Hoja2 del mismo
libro y coloque un texto en la celda B2Desarrollador >
Macros > seleccione FormatoTitulo > Ejecutar, tal como se muestra en la siguiente
imagen:

Fig. 1.30 Ventana de diálogo de la macro


Aplicaciones VBA con Excel
76

ͫCaso desarrollado 3: Macro para determinar las horas de recorrido de un conductor


-


dos decimales.

Pasos:

1. En un documento nuevo de Excel elabore el siguiente cuadro:

Fig. 1.31 Hoja de Excel mostrando el entorno del problema

2.       Desarrollador > Grabar macro y


asigne los siguientes valores:

Fig. 1.32 Valores de la macro «Conductor»


Cap.1: Introducción al VBA
77

3. D13 y colo-
que la siguiente instrucción en la barra:

= C13*C12 / D12

4. El código generado en la macro es:

Fig. 1.33 Código generado en la macro

Analicemos el código generado:


Código VBA Descripción
Range("D13").Select Permite seleccionar la celda D13.
ActiveCell.FormulaR1C1       
Formu-
laR1C1.
"=RC[-1]*R[-1]C[-1]/R[-1]C" Si nos encontramos en D13, entonces:

- RC[-1]: hace referencia a la celda C13.


- R[-1]C[-1]: hace referencia a la celda
C12.
- R[-1]C: hace referencia a la celda D12.

Hay que tener en cuenta que R repre-


      C, a la
columna; por tanto, RC[-1] hace que la

una posición, basándose en la celda
D13.
Selection.NumberFormat="0.00" La propiedad NumberFormat permite

en una determinada celda. Cuando se
-
ta a todos los números enteros, mientras
que .00 representa a dos decimales.

5. Pruebe la macro, pero primero asegúrese que la celda D13 se encuentre vacía, lue-
Desarrollador > Macros > seleccione Conductor > Ejecutar. El resultado
es 2.4 horas.
Aplicaciones VBA con Excel
78

-
tencias. Ambos códigos son equivalentes:

Fig. 1.34 Código modicado de la macro «Conductor»

ͫCaso desarrollado 4: Cerrar un libro guardando los cambios


Implemente un procedimiento dentro del proyecto VBA que permita cerrar un libro
de Excel, registrando los cambios realizados. Hay que tener en cuenta que, si el libro

es nuevo, antes de cerrar este, debe mostrar el cuadro de diálogo de la grabación.

Pasos:

1. Desde el Explorador de Proyectos haga doble clic sobre ThisWorkbook, asegúrese


que la ventana mostrada se parezca a la siguiente:

Fig. 1.35 Contenido del ThisWorkbook

Tenga en cuenta que el objeto debe encontrarse en General mientras que en


propiedades debe estar seleccionado Declaraciones.

2. Ahora agregaremos un procedimiento lla-


mado CerrarLibroG, para lo cual debemos
seleccionar Procedimiento del menú In-
sertar, tal como se muestra en la siguiente
imagen:

Fig. 1.36 Agregando un procedimiento al


proyecto VBA
Cap.1: Introducción al VBA
79

3. La ventana editora de código debe tener el siguiente aspecto:

Fig. 1.37 Implementación de un procedimiento

4. Agregaremos el siguiente código:

Fig. 1.38 Código del procedimiento CerrarLibroG

5. En Excel invocaremos al procedimiento mediante un botón, para esto debemos


Desarrollador > Insertar > Botón de Controles de formulario
> arrastre un marco en la hoja de Excel formando un rectángulo, al soltarlo se mos-
trará la siguiente ventana:

Fig. 1.39 Asignación de Macro al procedimiento en VBA

6. De la ventana anterior seleccione ThisWorkbook.CerrarLibroG y haga clic en el bo-


tón Aceptar.
7. Seguidamente, haga clic derecho sobre el botón y seleccione la opción Modicar
texto.
Aplicaciones VBA con Excel
80

Fig. 1.40 Modicando el texto del botón

8. 
los cambios» y haga clic fuera del botón.
9. Antes de probar la aplicación debemos grabar la hoja de Excel, para esto presione
Libro de Excel
habilitado para macros.
10. Finalmente, pruebe la acción haciendo clic sobre el botón Cerrar libro guardando
los cambios.

ͫCaso desarrollado 5: Cerrar un libro sin guardar los cambios


Implemente un procedimiento dentro del proyecto VBA que permita cerrar un libro
de Excel sin registrar los cambios realizados. Hay que tener en cuenta que, si el libro


Pasos:

1. ThisWorkbook, asegúrese que el objeto debe


encontrarse en General mientras que en propiedades debe estar seleccionado De-
claraciones.
2. Ahora agregaremos un procedimiento llamado CerrarLibro, para lo cual debemos
seleccionar Procedimiento del menú Insertar.
3. Agregaremos el siguiente código:

Fig. 1.41 Código del procedimiento CerrarLibro


Cap.1: Introducción al VBA
81

4. En Excel invocaremos al procedimiento mediante un botón, para esto debemos


Desarrollador > Insertar > Botón de Controles de formulario
> arrastre un marco en la hoja de Excel formando un rectángulo, al soltarlo, selec-
cione el procedimiento CerrarLibro y haga clic en el botón Aceptar.
5. Seguidamente, haga clic derecho sobre el botón y seleccione la opción Modicar
texto > asígnele el texto «Cerrar libro sin guardar los cambios».
6. Antes de probar la aplicación debemos grabar la hoja de Excel, para esto presione
Libro de Excel
habilitado para macros.
7. Finalmente, pruebe la acción haciendo clic sobre el botón Cerrar libro sin grabar
los cambios.

ͫCaso desarrollado 6: Abrir un libro de solo lectura


.xlsx)
desde un solo archivo con código VBA. Hay que tener en cuenta lo siguiente:

1. Debemos contar con una carpeta en la cual se encuentren los tres archivos involu-
crados en este caso se llaman Listado01.xlsx, Listado02.xlsx y Listado03.xlsx.
2.            
Control de listadosLibro de Excel habilitado para
macros.
3. Seguidamente, crear los procedimientos de la siguiente manera:

Fig. 1.42 Procedimientos de apertura de archivos .xlsx

4. En el archivo Control de listados, agregar tres botones desde Controles de formu-


lario y a cada botón asígnele el procedimiento correspondiente.
Aplicaciones VBA con Excel
82

ͫCaso desarrollado 7: Acvar un determinado libro



usuario.

Pasos:

1. Asumamos que contamos con una carpeta llamada Reporte de Ventas con los si-
guientes archivos:

Fig. 1.43 Contenido de la carpeta Reporte de Ventas

2. Enel editor de código VBA del archivo Control de reportes colocar el siguiente
procedimiento:

Fig. 1.44 Código del procedimiento acvaLibro

Explicaremos brevemente el código presentado en el procedimiento; empecemos


por el término libro el cual es una variable que almacena el nombre del libro que
el usuario desea abrir; la función InputBox, muestra un cuadro de diálogo el cual le
permite al usuario ingresar un valor; el símbolo & ".xlsx" concatena el nombre del
archivo que el usuario ingrese con el texto .xlsxAcvate
Workbooks.

No se olvide que el archivo Control de reportes debe ser guardado en la misma


Libro de Excel habilitado para
macros.

3. En la hoja de Excel del libro Control de reportes agregar un botón llamado Acvar
libros y direccionarlo al procedimiento acvaLibro.
Cap.1: Introducción al VBA
83

Fig. 1.45 Entorno de Excel con botón de aplicación

4. Alseleccionar dicho botón la aplicación mos-


trará la siguiente imagen:

Fig. 1.46 Cuadro de diálogo para el ingre-


so del nombre del archivo

Aquí el usuario deberá ingresar el nombre del


      
cuenta que los archivos de reportes deben es-
tar abiertos para poder invocarlos.

Fig. 1.47 Cuadro de diálogo para el ingre-


so del nombre del archivo

5. Finalmente, observará que si el nombre del libro es correcto, entonces visualizará


el libro.

Si en caso desea controlar el error por ingreso del libro incorrecto, el código inicial
podría cambiar por:

Fig. 1.48 Código fuente del procedimiento acvaLibro


Aplicaciones VBA con Excel
84

ͫCaso desarrollado 8: Crear una copia de un libro


Implemente una aplicación que permita crear un archivo copia del libro actual de
forma que, al hacer clic en un botón, crea un archivo con el mismo contenido en el
siguiente formato:

Nombre del archivo original Nombre de la copia


Informe01.xlsm Informe01_25-04-2016.xlsm

Hay que tener en cuenta que el archivo original puede encontrarse en cualquier ubi-

ubicación del archivo original.

Pasos:

1. ThisWorkbook, asegúrese que el objeto debe


encontrarse en General mientras que en Propiedades debe estar seleccionado De-
claraciones.
2. Ahora agregaremos un procedimiento llamado copiaLibro, para lo cual debemos
seleccionar Procedimiento del menú Insertar.
3. Agregaremos el siguiente código:

Fig. 1.49 Código del procedimiento copiaLibro

4. En Excel invocaremos al procedimiento mediante un botón, para esto debemos ubi-


Desarrollador > Insertar > Botón de Controles de formulario >
arrastre un marco en la hoja de Excel formando un rectángulo, al soltarlo seleccione
el procedimiento copiaLibro y haga clic en el botón Aceptar.
5. Seguidamente, haga clic derecho sobre el botón y seleccione la opción Modicar
texto > asígnele el texto «Generar copia de archivo».
6. Antes de probar la aplicación debemos grabar la hoja de Excel, para esto presione
<F12> desde Excel, asigne un nombre al libro por ejemplo Informe01
seleccione Libro de Excel habilitado para macros. Para este ejercicio es muy im-
portante el nombre del archivo, ya que de aquí se desprende el nombre de la copia
del archivo.
7. Finalmente, pruebe la acción haciendo clic sobre el botón Generar copia de archivo.
Cap.1: Introducción al VBA
85

ͫCaso desarrollado 9: Uso de propiedades del objeto Applicaon


Implemente una aplicación VBA que permita controlar el acceso a un documento de
Excel, el cual muestra la siguiente imagen a un usuario logueado correctamente:

Fig. 1.50 Pantalla inicial mostrada al usuario logueado correctamente

Se debe tener en cuenta:

Al abrir el documento nos debe solicitar el nombre del usuario, tal como se muestra
en la siguiente imagen:

Fig. 1.51 Ventana de solicitud de usuario


muestra en la siguiente imagen:

Fig. 1.52 Ventana de solicitud de clave de acceso

Si todo está correcto, debe mostrar la siguiente ventana:

Fig. 1.53 Mensaje de bienvenida al usuario


Aplicaciones VBA con Excel
86

Si el usuario y la clave no son correctas, debe mostrar el siguiente mensaje:

Fig. 1.54 Mensaje para el usuario no válido

Además de mostrar el mensaje, deberá cerrar la aplicación, es decir, cerrará Excel




En todos los casos, la ventana de Excel debe permanecer oculta, es decir, solo se
mostrará cuando el usuario sea logueado correctamente.

Pasos:

1. En
un documento nuevo de Excel implemente la siguiente interfaz, tal como se
muestra en la siguiente imagen:

Fig. 1.55 Pantalla inicial mostrada al usuario logueado correctamente

2. Ficha Desarrollador > Visual Basic > ThisWorkbook


3. Cambie el objeto a Workbook con el evento Open de la siguiente manera:

La línea de código debe tener el siguiente aspecto:

Private Sub Workbook_Open()


End Sub
Cap.1: Introducción al VBA
87

4. Coloque el siguiente código dentro del método tal como lo muestra la siguiente imagen:

Fig. 1.56 Código del evento Open de objeto Workbook

Explicaremos el código implementado:

Application.Visible=False


Excel para mostrar un cuadro de entrada de datos.

Dim usuario As String, clave As String

Se declara la variable usuarioString para almacenar el nombre del usuario


que desea acceder al sistema, de la misma forma declare la variable clave el cual
almacena el password según el usuario.

usuario=Application.InputBox(Prompt:="Ingrese nombre de usuario",


Type:=2)

Applicaon.InputBox permite mostrar un cuadro de entrada de valor con el men-





clave=Application.InputBox(Prompt:= "Ingrese clave:", Type:=2)


al usuario por medio de un cuadro de entrada y lo almacenará en la variable clave.

If UCase(usuario)="ADMINISTRADOR" And clave="123" Then

Comparamos el contenido de la variable usuario con la palabra ADMINISTRADOR,


     uCase

preocupe de las mayúsculas o minúsculas al ingresar el nombre del usuario. Con-

Aplicaciones VBA con Excel
88

MsgBox "Bienvenido usuario Administrador"

La función MsgBox permite enviar un mensaje al usuario, de tal forma que la


aplicación se pueda comunicar con el usuario.

Application.Visible=True

 
ingreso del código y usuario.

Application.Quit

Permite salir de la aplicación Excel, en nuestro caso solo saldrá de Excel cuando el
usuario o la clave sean incorrectas.

5. Li-
bro de Excel habilitado para macros. Salir de Excel y volver abrir el libro; ingrese
el nombre del usuario «Administrador» y la clave «123» para probar el acceso.

ͫCaso desarrollado 10: Uso de métodos del objeto Applicaon


-

la siguiente imagen:

Fig. 1.57 Pantalla inicial de la aplicación


Se debe tener en cuenta:

-
ción como B11, C11 y D11.
Los botones de Iniciar empo y Detener empo-
lizar los procedimientos en el entorno VBA.
Para probar la aplicación, primero debemos hacer clic en el botón Iniciar empo

botón Detener empo        
cronómetro.
Cap.1: Introducción al VBA
89

Pasos:

1. En
un documento nuevo de Excel implemente la siguiente interfaz, tal como se
muestra en la siguiente imagen:

Fig. 1.58 Pantalla inicial mostrada al usuario logueado correctamente

2. Ficha Desarrollador > Visual Basic


3. Agregue un módulo al proyecto desde el menú Insertar > Módulo
4. Coloque los siguientes procedimientos dentro del módulo:

Dim segundos As Date, contador As Date

Sub detenerCronometro()
Application.OnTime segundos, "actualizaTiempo", , False
End Sub

Sub actualizaTiempo()
Application.Range("D11").Value =
FormatDateTime(Now-CDate(Application.Range("B11").Value),vbLongTime)
segundos = Now + (1 / 86400)
Application.OnTime segundos, "actualizaTiempo"
End Sub

Sub IniciaTiempo()
Call actualizaTiempo
contador = Now
Application.Range("B11").Value = FormatDateTime(contador, vbLongTime)
Application.Range("C11").ClearContents
End Sub

Sub detenerTiempo()
Call detenerCronometro
Application.Range("C11").Value = FormatDateTime(Now(), vbLongTime)
Application.Range("D11").Value =
FormatDateTime(CDate(Application.Range("C11"))-
CDate(Application.Range("B11")), vbLongTime)
End Sub
Aplicaciones VBA con Excel
90

Explicaremos el código implementado:

Dim segundos As Date, contador As Date

Las variables segundos y contador están declaradas en la sección global de la aplica-


ción, es decir, podrán ser usadas en cualquier función o procedimiento. Asimismo, la
variable segundos
cronómetro; mientras que la variable contador almacena la hora actual.

Sub detenerCronometro()
Application.OnTime segundos, "actualizaTiempo", , False
End Sub

El procedimiento detenerCronometro-
dos; dentro del procedimiento se hace referencia al método OnTime del objeto Appli-
caon
segundos
al procedimiento actualizaTiempo para iniciar nuevamente el cronómetro; debemos
considerar que la opción False

Sub actualizaTiempo()
Application.Range("D11").Value =
FormatDateTime(Now-CDate(Application.Range("B11").Value),
vbLongTime)
segundos = Now + (1 / 86400)
Application.OnTime segundos, "actualizaTiempo"
End Sub

El procedimiento actualizaTiempo        
cronómetro mostrado en la celda D11; para esto, se hace referencia a dicha celda
mediante Applicaon.Range("D11").Value, asimismo, la función Now determina la
fecha y hora actual, la función CDate       
válida. La función FormatDateTime

ejemplo, vbLongTime.

Sub IniciaTiempo()
Call actualizaTiempo
contador = Now
Application.Range("B11").Value =
FormatDateTime(contador, vbLongTime)
Application.Range("C11").ClearContents
End Sub

El procedimiento IniciaTiempo-
metro mostrado en la celda D11; así como mostrar el contador en la celda B11 y lim-
piar el contenido de la celda C11. La claúsula Call permite invocar a un procedimiento
desde cualquier parte de la aplicación, también es válido llamarlo directamente sin
Call. El método ClearContents permite eliminar el contenido
Range.
Cap.1: Introducción al VBA
91

Sub detenerTiempo()
Call detenerCronometro
Application.Range("C11").Value =
FormatDateTime(Now(), vbLongTime)
Application.Range("D11").Value =
FormatDateTime(CDate(Application.Range("C11"))-
CDate(Application.Range("B11")), vbLongTime)
End Sub



Now() muestra la fecha actual.

5. En Excel invocaremos a los procedimientos mediante botones, para esto debemos


Desarrollador > Insertar > Botón de Controles de formulario
> arrastre un marco en la hoja de Excel formando un rectángulo, al soltarlo seleccio-
ne el procedimiento IniciaTiempo y haga clic en el botón Aceptar.
6. Seguidamente, haga clic derecho sobre el botón y seleccione
la opción Modicar texto

7. De la misma manera, tendrá que realizarlo para el botón Detener empo.


8. Antes de probar la aplicación debemos grabar la hoja de Excel, para esto presione
Libro de Excel
habilitado para macros.
9. Finalmente, pruebe las acciones presionando primero el botón Iniciar empo, lue-
 Detener empo.

ͫCaso desarrollado 11: Acvate


Implemente una aplicación VBA que permita mostrar la información obtenida por la
empresa «Inversiones Mygsala SAC», en la cual se encuentran los datos de los clien-
     
como se muestra en la siguiente imagen:

Fig. 1.59 Pantalla principal


Aplicaciones VBA con Excel
92

Se debe tener en cuenta:

En el proyecto existe una hoja principal en la cual se encuentra los botones de para el


Hoja2: Data

Fig. 1.60 Data



Fig. 1.61 Gráco


En cada uno de las hojas se colocará un botón de acceso directo al menú principal
llamado «Principal».

Pasos:
1. 

2. Acceda al entorno VBA presionando <Alt+F11> y haga doble clic sobre el objeto
ThisWorkbook, es aquí donde implementaremos los procedimientos necesarios en
la aplicación.
Cap.1: Introducción al VBA
93

3. Implemente los siguientes procedimientos:

Sub activaData()
Worksheets(2).Activate
End Sub

Sub activaGraco()
Worksheets(3).Activate
End Sub

Sub salir()
r = MsgBox("Esta seguro de salir?",
vbYesNo + vbInformation, "Salir")
If r = 6 Then
Me.Close
End If
End Sub

Sub retornarPrincipal()
Worksheets(1).Activate
End Sub

Analizando el código:

Worksheets(2).Activate



clientes.

Worksheets(3).Activate



r=MsgBox("Esta seguro de salir?",vbYesNo+vbInformation,"Salir")


If r = 6 Then
Me.Close
End If

La variable r
debemos considerar que el número seis representa al botón Sí, mientras que el
número siete representa al botón No; es así que, usamos la estructura If para com-
parar cuál fue la respuesta del usuario, de acuerdo con esto podrá salir o quedarse
en el libro.

Worksheets(1).Activate

Finamente, el método retornarPrincipal permite ubicar en la primera hoja desde


cualquier hoja, la idea principal es regresar al menú de opciones que presenta la

Aplicaciones VBA con Excel
94

4. En Excel invocaremos a los procedimientos mediante botones, para esto, empeza-


Desarrollador > Insertar > Botón de Contro-
les de formulario > arrastre un marco en la hoja de Excel formando un rectángulo,
al soltarlo seleccione el procedimiento AcvaData y haga clic en el botón Aceptar;
de la misma manera deberá realizarlo con los demás botones.

Fig. 1.62 Listado de procedimientos implementa-


dos en VBA

No se olvide, que el procedimiento retornarPrincipal debe ser invocado por medio


de botones en las hojas Listado de clientes

5. Antes de probar la aplicación debemos grabar la hoja de Excel, para esto presione
Libro de Excel
habilitado para macros.
6. -
dos en cada hoja del libro.

ͫCaso desarrollado 12: Name WorkSheets


Implemente una aplicación VBA que permita mostrar los nombres de las hojas conte-
nidas en un determinado libro, tal como se muestra en la siguiente imagen:

Fig. 1.63 Pantalla inicial de la aplicación (hoja1-RESUMEN)


Cap.1: Introducción al VBA
95

Se debe tener en cuenta:

En el libro de Excel se debe contar con una hoja inicial que presente la relación de


nóminas de matrícula tal como se muestra en la imagen anterior.


El libro debe contener más de dos hojas para poder obtener los nombres de ellas.


Pasos:

1. Establezca las hojas necesarias para la aplicación.


2. Acceda al entorno VBA presionando <Alt+F11> y haga doble clic sobre el objeto
ThisWorkbook, es aquí donde implementaremos los procedimientos necesarios en
la aplicación.
3. Implemente los siguientes procedimientos:

Sub muestraHojas()
Dim hojas As Worksheet
i = 1
For Each hojas In Sheets
Sheets(1).Cells(6 + i, 2).Value = hojas.Name
i = i + 1
Next
End Sub

Sub limpiaCeldas()
Sheets(1).Range("B7:B100").ClearContents
End Sub

Sub salir()
r = MsgBox("Esta seguro de salir?",
vbYesNo + vbInformation, "Salir")
If r = 6 Then Me.Close
End Sub

Analizando el código:

Dim hojas As Worksheet


i = 1
For Each hojas In Sheets
Sheets(1).Cells(6 + i, 2).Value = hojas.Name
i = i + 1
Next

La variable hojas representará a todos las hojas del libro. La variable i

puede imprimir en las celdas de la hoja de Excel. La estructura For Each permite
recorrer todas las hojas encontradas en el libro; es ahí, justamente, donde usamos
la variable hojas. La opción In Sheets hace referencia a la colección de hojas que
      
mediante la sentencia Cells.
Aplicaciones VBA con Excel
96

Sheets(1).Range("B7:B100").ClearContents

El método ClearContents permite eliminar las celdas de un determinado rango, para


Range.

r = MsgBox("Esta seguro de salir?",


vbYesNo + vbInformation, "Salir")
If r = 6 Then Me.Close

      


variable r acumula la respuesta que el usuario seleccionará y que la sentencia If com-
probará justamente qué botón seleccionó, si el usuario selecciona Sí entonces cerrará
la hoja con la sentencia Me.Close.

4. EnExcel invocaremos a los procedimientos mediante botones, para esto, empeza-


remos por la Hoja1Desarrollador > Insertar > Botón de Controles
de formulario > arrastre un marco en la hoja de Excel formando un rectángulo, al
soltarlo seleccione el procedimiento y haga clic en el botón Aceptar; de la misma
manera deberá realizarlo con los demás botones.

Fig. 1.64 Listado de procedimientos


implementados en VBA

5. Antes de probar la aplicación debemos grabar la hoja de Excel, para esto presione
Libro de Excel
habilitado para macros.
6. -
dos en cada hoja del libro.

ͫCaso desarrollado 13: Next-Previous


Implemente una aplicación VBA que permita mostrar toda la información de las orga-

de botones, podamos avanzar o retroceder por las hojas de información, tal como se
muestra en la siguiente imagen:
Cap.1: Introducción al VBA
97

Fig. 1.65 Listado de registros con botones anterior y siguiente


Se debe tener en cuenta:

En el libro de Excel se debe contar con las siguientes hojas:




Hoja1: Listado01

Fig. 1.66 Listado 01

Hoja2: Datos02

Fig. 1.67 Datos 02


Aplicaciones VBA con Excel
98

Hoja3: Datos03

Fig. 1.68 Datos 03


A cada uno de las hojas colocaremos botones que permitan desplazarse entre ellas.

Pasos:

1. -

2. Acceda al entorno VBA presionando <Alt+F11> y haga doble clic sobre el objeto
ThisWorkbook, es aquí donde implementaremos los procedimientos necesarios en
la aplicación.
3. Implemente los siguientes procedimientos:

Sub hojaSiguiente()
ActiveSheet.Next.Activate
End Sub
Sub hojaAnterior()
ActiveSheet.Previous.Activate
End Sub

4. EnExcel invocaremos a los procedimientos mediante botones, para esto, empeza-


remos por la Hoja1Desarrollador > Insertar > Botón de Controles
de formulario > arrastre un marco en la hoja de Excel formando un rectángulo, al
soltarlo seleccione el procedimiento hojaSiguiente y haga clic en el botón Aceptar;
de la misma manera deberá realizarlo con los demás botones.

Fig. 1.69 Listado de procedimien-


tos implementados en VBA
Cap.1: Introducción al VBA
99

En resumen, la Hoja1 tendrá un solo botón que lo dirigirá a la Hoja2, mientras que
la Hoja2 presentará dos botones: uno que permita retornar a la Hoja1 y otra que
permita moverlo a la Hoja3     Hoja3 solo se implementará un
Hoja2.

5. Antes de probar la aplicación debemos grabar la hoja de Excel, para esto presione
Libro de Excel
habilitado para macros.
6. -
dos en cada hoja del libro.

ͫCaso desarrollado 14: Open


Implemente una aplicación VBA que permita abrir los archivos de Excel desde un
mismo documento, tal como se muestra en la siguiente imagen:

Fig. 1.70 Pantalla del libro «Control de reportes»

Se debe tener en cuenta:

Todos los archivos correspondientes a los reportes y el mismo archivo Control de


reportes deben encontrarse en una misma carpeta.
xlsm, pueden ser
.xls o .xlsx.

Pasos:

1. En
un documento nuevo de Excel implemente la siguiente interfaz, tal como se
muestra en la siguiente imagen:

Fig. 1.71 Pantalla inicial del control de reportes


Aplicaciones VBA con Excel
100

2. Ficha Desarrollador > Visual Basic.


3. Hacer doble clic sobre ThisWorkbook desde la ventana Explorador de Proyectos.
4. Coloque los siguientes procedimientos:

Sub muestraReporte01()
Workbooks.Open Filename:="C:\Reportes Excel 2016\reporte01.xlsx"
End Sub
Sub muestraReporte02()
Workbooks.Open Filename:="C:\Reportes Excel 2016\reporte02.xlsx"
End Sub
Sub muestraReporte03()
Workbooks.Open Filename:="C:\Reportes Excel 2016\reporte03.xlsx"
End Sub

Explicaremos el código implementado:

Workbooks.Open Filename:="C:\Reportes Excel 2016\reporte01.xlsx"

El método Open
del archivo se debe usar la cláusula Filename; es recomendado que los archivos se
encuentren en una unidad estable como la unidad C:\ ya que dicha cláusula solicita la
ruta exacta del archivo.

5. EnExcel invocaremos a los procedimientos mediante botones, para esto debemos


Desarrollador > Insertar > Botón de Controles de formulario
> arrastre un marco en la hoja de Excel formando un rectángulo, al soltarlo seleccio-
ne el procedimiento abrirReporte01 y haga clic en el botón Aceptar; de la misma
manera deberá realizarlo a los demás botones.

Fig. 1.72 Listado de procedimientos


implementados en VBA

6. Antes de probar la aplicación debemos grabar la hoja de Excel, para esto presione
Libro de Excel
habilitado para macros.
7. Finalmente, pruebe las acciones presionando cualquiera de los botones, considere

2
Cap.
Fundamentos de programación

Capacidad

una aplicación VBA, además de implementar funciones y procedimientos que permitan
el desarrollo de aplicaciones ordenadas.

2.1 Fases para la solución de un programa


La solución a un determinado problema se puede dar de diferentes formas y en diferen-
tes escenarios. Cuando el problema es conocido, se puede solucionar directamente en
el lenguaje de programación, pero siempre se recomienda realizar un análisis del mismo,
pues las soluciones pasadas no necesariamente solucionan las actuales.

   -


mente el lenguaje BASIC también debemos conocer cuáles son las funciones que enlazan
los resultados con Excel, ya que no nos servirá de mucho mostrar los resultados en VBA
cuando se requiere, por ejemplo, un informe o reporte de datos.

Entonces, podemos resumir que para solucionar un determinado problema debemos


seguir las siguientes fases:

Acvidades Fases

Analizar el problema de tal forma que


Análisis del problema


Diseñar el algoritmo de solución al


 Diseño del algoritmo
la necesidad del problema.

-

minado lenguaje en nuestro VBA.

Ejecutar el programa de tal manera


Ejecución del programa





Aplicaciones VBA con Excel
102

2.1.1 Fase 1: Análisis del problema


-
-
querimos de tres capacidades que usted debe reconocer y que en el futuro le será muy
sencillo detectarlos, entonces, una vez entendido el problema responda a las siguientes
preguntas:

Preguntas Valores de solución

Aquí debemos listar los datos que se necesita


para la solución del problema, por lo menos
¿Qué datos necesito para la debe haber uno y para esta etapa debe ser
solución del problema? un valor atómico, es decir, no debe contener
más de un valor. Es comúnmente llamado
«ENTRADA».

Aquí podemos emplear nuestros conoci-


mientos previos sobre los cálculos matemá-

¿Cómo uso esos datos o cual será la como parte de la solución al problema. Aquí
fórmula que emplearé en la solución? podemos establecer una analogía con las
funciones que ofrece Excel, pues las funciones
trabajan dependiendo de cómo usted lo use.
Es comúnmente llamada «PROCESO».

Aquí debemos determinar cuál será el



¿Cuál es el resultado? uso de los datos; es decir, una integración
entre la primera y segunda pregunta. Es
comúnmente llamada «SALIDA».

Veamos algunos casos para entender mejor cómo debemos analizar un problema antes


Problema 1: 



Analizando el problema, encontramos los siguientes datos:

Peso del paquete Distancia de la Costo de transporte


(kg) población (km) ($)
5 60 9.00
15 200 ¿?
Cap.2: Fundamentos de programación
103


valores Entrada-Proceso-Salida.

Entrada Peso del paquete(peso), Distancia de la población(distancia)

Proceso
costo = 9 × 15 × 200


El costo del transporte es directamente proporcional al peso del




el costo aumenta en proporción al peso del paquete.

De la misma manera, debemos comparar el costo de acuerdo



         
proporcional, ya que a mayor distancia, mayor será el costo de
transporte.

Finalmente, podemos concluir con la siguiente fórmula de


solución al problema:

costo = 9 × peso × distancia




Si se observa la fórmula, nos damos cuenta que para poder


hallar el costo, necesitamos saber cuál es el peso y la distancia.
Por lo tanto, es válido decir que «peso» y «distancia» son datos
de entrada, mientras que «costo» representa el valor de salida.

Salida Costo de transporte (costo)

Problema 2:
Doce obreros, trabajando 8 horas diarias, terminan un trabajo en 25 días. ¿Cuánto tar-
darán en hacer ese mismo trabajo 5 obreros trabajando 10 horas diarias?

Analizando el problema, encontramos los siguientes datos:

Candad de obreros Horas de trabajo Días trabajados


12 8 25
5 10 ¿?


valores Entrada-Proceso-Salida.
Aplicaciones VBA con Excel
104

Entrada 

Proceso

Días = 25 × 12 × 8


de obreros, es decir, si por 25 días se necesitan 12 obreros,
-

disminuye.

De la misma manera, debemos comparar las horas diarias de


trabajo basado en los días trabajados, es decir, si trabajando 8
horas diarias nos demoramos 25 días; entonces podemos decir
que, por 10 horas diarias, nos demoraremos menos días; por lo
tanto, las horas de trabajo son inversamente proporcionales a los
días trabajados.

Finalmente, podemos concluir con la siguiente fórmula de solución


al problema:

días = 25 × 12 × 8
obreros horas

Si observamos la fórmula, entenderemos que para poder hallar


        
lo tanto, es válido decir que «obreros» y «horas» son datos de
entrada, mientras que «días» representa el valor de salida.

Salida Días trabajados (días)


y salida, así pues, le recomiendo que resuelva los ejercicios propuestos.

2.1.2 Fase 2: Diseño del algoritmo


El diseño del algoritmo es representado mediante dos herramientas que pueden ser dia-

ya que son los más parecidos al código fuente que necesitamos implementar en VBA.

Se dice que un pseudocódigo representa el problema en cortos pasos de forma descen-



problema con los datos obtenidos en la fase 1.

Ahora, seleccionaremos los dos casos expuestos en la fase 1 para representarlos en la


fase del diseño del algoritmo.
Cap.2: Fundamentos de programación
105

Problema 1:



Patrón de entrada, proceso y salida del problema:

Entrada peso, distancia

Proceso costo = 9 × peso × distancia


5 60
Salida costo

Pseudocódigo de solución:

Líneas de pseudocódigo Descripción


INICIO Punto de inicio del pseudocódigo.
Leer peso, distancia Solicita el valor de peso y distancia.
Costo=9x(peso/5)x(distancia /60) Calcula el costo según lo analizado.
Imprimir costo Muestra el resultado del cálculo.
FIN 

Problema 2: Doce obreros, trabajando 8 horas diarias, terminan un trabajo en 25


días. ¿Cuánto tardarán en hacer ese mismo trabajo 5 obreros trabajando 10 horas
diarias?

Patrón de entrada, proceso y salida del problema:

Entrada obreros, horas


12 8
Proceso días = 25 × ×
obreros horas
Salida dias

Pseudocódigo de solución:

Líneas de pseudocódigo Descripcion


INICIO Punto de inicio del pseudocódigo.
Leer obreros, horas Solicita el valor de obreros y horas.

días = 25x(12/obreros)x(8/horas)
según la fórmula.
Imprimir días Muestra el resultado del cálculo.
FIN 
Aplicaciones VBA con Excel
106

2.1.3 Fase 3: Codificación de un programa en VBA



el pseudocódigo y reemplazarlos por las sentencias propias de VBA. Esto lo vamos a ir
aprendiendo conforme pasemos los capítulos del libro.

Tomaremos como referencia el Problema 1:

Problema 1: 



Pseudocódigo de solución:

Líneas de pseudocódigo
INICIO

Leer peso, distancia


Costo = 9 x (peso/5) x (distancia /60)
Imprimir costo

FIN

Paso 1: Diseñe el siguiente formato en Excel

Paso 2: Ingrese al entorno VBA (<ALT+F11>), luego inserte un módulo al proyecto (In-
sertar>Módulo) y coloque el siguiente código:

Fig. 2.1 Implementación de la función calculaCosto


Cap.2: Fundamentos de programación
107

 -
brando a VBA.

Código VBA Descripción


        
Function calculaCosto el nombre que representará al código VBA, se debe
tomar en cuenta que un nombre de función no debe
tener espacios en blanco.

ByVal peso es decir, peso representa el primer valor que el usuario
envíe a la función.

Debe considerar que para asignar dos o más pará-
ByVal distancia metros hay que separarlos por comas y deben estar
precedidos siempre por la palabra ByVal 
«por el valor».
Para que la función devuelva una respuesta se debe
asignar el valor resultante al nombre de la función.
calculaCosto=costo Vale decir, qué costo es el resultado esperado por la
función que será devuelta, cuando hagamos referen-
cia a la función calculaCosto.
End Function 

Problema 2: Doce obreros, trabajando 8 horas diarias, terminan un trabajo en 25


días. ¿Cuánto tardarán en hacer ese mismo trabajo 5 obreros trabajando 10 horas
diarias?

Pseudocódigo de solución:
Líneas de pseudocódigo
INICIO
Leer obreros, horas

días = 25x(12/obreros)x(8/horas)

Imprimir días
FIN

Paso 1: Diseñe el siguiente formato en Excel


Aplicaciones VBA con Excel
108

Paso 2: Ingrese al entorno VBA (<ALT+F11>), luego inserte un módulo al proyecto


(Insertar>Módulo) y coloque el siguiente código:

Fig. 2.2 Implementación de la función calculaDias



Código VBA Descripción


Function calculaDias Nombre de la función.
ByVal obreros, Byval horas Parámetros de la función.
Formula que calcula los días en
Días=25*(12/obreros)*(8/horas) 
y las horas que trabajan.
calculaDias=días Devolviendo el resultado a la función.
End Function Fin de la función calculaDias.

2.1.4 Fase 4: Ejecución del programa en VBA


En esta fase pasaremos a probar el valor resultante de la función en Excel, por tanto,
ubíquese en la hoja del Paso 1. Según el diseño, debemos ubicarnos en la celda D6 e
invocar a la función calculaCosto de la siguiente manera:

=calculaCosto(B5;C5)

Tenga en cuenta que B5 representa al valor del peso, por lo tanto asegúrese que la cel-
da B5 contenga dicho valor, mientras C5 representa a la distancia.

Finalmente, se debe tener en cuenta que cada objeto de VBA se ejecuta de diferente
forma, en este caso estamos viendo la ejecución de una función.

2.1.5 Fase 5: Verificación y depuración


Ahora debemos comprobar que los valores expuestos como resultado sean los esperados
por el usuario de tal forma que, si el resultado no es el esperado, entonces usted podrá

Cap.2: Fundamentos de programación
109

2.2 Elementos de un programa VBA


Cuando se desarrolla una aplicación VBA se necesita tener en cuenta que todo código
está compuesto por elementos que en conjunto trabajan para generar un resultado espe-
rado por el usuario. Ahora veremos cuáles son los elementos más importantes.

2.2.1 Identificadores
Es un conjunto de caracteres los cuales pueden ser letras, números o caracteres subra-
yados. Estos representan un valor dentro del código VBA y es muy importante tener en
cuenta los siguientes aspectos, puesto que en toda la línea de programación se hace



nombre_cliente es igual a NOMBRE_CLIENTE y viceversa.


Alternava Observación
Con el guion bajo podremos unir dos o más
palabras que componen a un solo iden-


nombre_cliente
_ (Guion bajo) fecha_de_nacimiento
dias_trabajados

_nombres
_descripcion
_precio


-
guir entre las palabras que compone un
     
segunda palabra
nombreCliente
fechaDeNacimiento
diasTrabajados


 

números, por ejemplo:

Válido No Válido
nota1 1nota
nota_1 1_nota
descuento10 10descuento
descuento_10 10_descuento
Aplicaciones VBA con Excel
110


dim, integer, string,
double, funcon, sub, private, etc.

2.2.2 Palabras reservadas


Se le llama así a un conjunto de palabras separadas por el lenguaje VBA y que solo pue-
-


Palabras claves
As Boolean ByRef Byte ByVal
Case CBool CByte CChar Cdate
CDec CDbl Char CInt Class
CLng CObj Const  Date
Decimal Dim Do Double Else
ElseIf End EndIf Error Exit
False For  Get GetType
GoTo If Integer Is Long
Loop Mod Module Next Not
Nothing Object Or Private Protected
Public REM Short Single Step
String Sub Then To True
Variant 

2.2.3 Comentarios

la idea es asignar comentarios para explicar algún efecto en el código o simplemente


Debemos recordar que una aplicación es interpretada y compilada por el lenguaje VBA
y que un comentario es interpretado como tal, pero no ingresa a la compilación. Existen
dos sentencias para asignar comentarios:

Sentencia Ejemplo
Rem Rem Comentarios
' (comilla simple) 'Comentarios
Cap.2: Fundamentos de programación
111

Veamos una primera forma de implementar comentarios en una función usando la


comilla simple:

Fig. 2.3 Código de la función calculaDias usando comilla simple

Ahora veremos la misma implementación pero esta vez usaremos la función REM:

Fig. 2.4 Código de la función calculaDias usando la función REM

2.3 Tipos de datos



Aquí debemos comentar que VBA no obliga a la declaración de variables y toma como
Variant.

Asimismo, cuando no se declara una variable tenga en cuenta que se declarará interna-
 Variant. Finalmente, podemos decir que una variable declara-
da como Variant



2.3.1 Enteros


Aplicaciones VBA con Excel
112

Tipo de datos Capacidad Ejemplo


Edad de una persona, nota de un alumno,
Byte 0.255
número de hijos de un trabajador, etc.

Integer -32768 a +32767
puntaje de evaluación, etc.
-2.147.483.648 a Número de asistentes a un evento,
Long
+2.147.483.647 

2.3.2 Reales
Los números reales abarcan la capacidad expuesta por los números enteros pero ade-


Tipo de datos Capacidad Ejemplo



-3.4028523E38 a
-1,401298E-45
Promedio de notas, talla y
Single
peso de una persona, etc.

+1,401298E-45 a
+3.402823E38


-1.79769313486232E308 a
-4,94065645841247E-324 
Double valor de la exponencial, tasa de
 interés anual de un banco, etc.
+4,94065645841247E-324 a
+1.79769313486232E308

-7,9228162514264337593543950335 Subtotal, descuento de


Decimal
a 7,9228162514264337593543950335 una compra, etc.



-922.337.000.000.000 a Precio de un producto, sueldo


Currency
+922.337.000.000.000 de un empleado, etc.

2.3.3 Caracteres y cadenas



String.

Tipo de datos Capacidad Ejemplo


Nombre del empleado, descrip-
Tiene un máximo de 2 millones de ción de un producto, categoría
String
caracteres. de un empleado, estado
civil de una persona, etc.
Cap.2: Fundamentos de programación
113

2.3.4 Lógicos
-


Tipo de datos Capacidad Ejemplo


Sexo, estado civil de un empleado
Boolean True/False (soltero, casado), condición de un
alumno (aprobado, desaprobado), etc.

2.3.5 Fechas
-

registro de las horas.

Tipo de datos Capacidad Ejemplo


Fecha de nacimiento de un empleado,
1 de enero de 100 a
Date fecha de vencimiento de un
31 de diciembre de 9999
producto, fecha de contrato, etc.

2.3.6 Variante
           


Variant

Tipo de datos Capacidad Ejemplo


Número entero, nombre de estu-
Variant 
diante, año de nacimiento, etc.

2.4 Constantes

como un valor predeterminado. Su formato es:

CONST Nombre As TipoDatos = "Valor"

Donde:

CONST: 
Nombre: Es el nombre que se le asigna a la constante.

As TipoDatos: 


puede ser Integer, Double, Date, etc.


Valor: Es el valor que tendrá la constante.

Aplicaciones VBA con Excel
114



 

CONST pi As Double = 3.14159265359

 

CONST interés As Double = 0.08

 6

CONST fecha As Date = "01/01/2016"

 

CONST estado As String = "Emida"

2.5 Variables
Toda aplicación en VBA usa variables para almacenar información referente a su entorno,
       


Al respecto, debemos mencionar que una variable es una posición con nombre en la me-

números, etc.

A diferencia de las constantes, una variable cambia de valor las veces que sea necesaria,


¿Cómo idencar una variable en una aplicación?


Veamos el siguiente código VBA:

Sub calculaPromedio()
Alumno = InputBox("Ingrese nombre del alumno: ")
nota1 = CInt(InputBox("Ingrese Nota 1: "))
nota2 = CInt(InputBox("Ingrese Nota 2: "))
nota3 = CInt(InputBox("Ingrese Nota 3: "))

promedio = (nota1 + nota2 + nota3) / 4

MsgBox "El promedio es: " & promedio


End Sub
Cap.2: Fundamentos de programación
115

Las variables son alumno, nota1, nota2, nota3 y promedio ya que almacenarán diferen-


por lo tanto, el nombre del alumno y sus notas serán diferentes. Igualmente, podríamos
decir que alumno, nota1, nota2, nota3 son variables de entrada mientras que promedio
es una variable de salida.

¿Qué nombre le puedo asignar a una variable?


Colocar los nombres de las variables es una decisión del programador, pero se debe se-
guir un patrón para asignar un nombre. Por ejemplo, si almacenamos una descripción
de un producto, podríamos llamar a su variable descripcion o producto; pero si el valor
resulta algo compuesto como el precio unitario de un producto, podríamos llamarlo pre-
cioUnitario o pUnitario. Como notará asignamos mayúscula al inicio de la segunda pala-

decisión la toma usted. Veamos algunos casos:

Caso Nombres posibles de variables


fechaNacimiento
fecha_nacimiento
Fecha de nacimiento de un empleado
fechaNac
_fecha_nacimiento

promedioPonderado
Promedio ponderado de un alumno promedio_ponderado
promPonderado

sueldoBasico
Sueldo básico de un empleado sueldo_basico
sueldoBas

¿Cómo declarar una variable?

Dim nombre_variable As poDatos

Donde:

Dim: Es la palabra reservada que indica el inicio de la declaración de una o más


variables. Al respecto debemos mencionar que solo puede haber un Dim por línea
de código.
Variable: Es el nombre que el programador asignará a la variable. Lea el tema de

As poDatos: Inte-
ger, Double, Currency, etc.
Aplicaciones VBA con Excel
116

Veamos algunas declaraciones de variables según el po de datos

Especicación Declaración de variable


Declaración de la edad de una Dim edad As Byte
persona Dim edad As Integer

Dim cantidad As Integer



Dim cantidad As Long
personas asistentes a un evento

Declaración de la distancia recorrida Dim distancia As Single


por un automóvil. Dim distancia As Double

 - Dim peso As Double


mos de un camión.
Declaración del pago de pensiones Dim pension As Decimal
de un estudiante. Dim pension As Currency

¿Qué símbolos se puede usar para representar a un po de datos en la declaración de


variables?

Símbolo Especicación Declaración de variable


 Declaración de la edad de una persona. Dim edad%

     


& (Single) Dim cantidad&
personas asistentes a un evento.
Declaración de la distancia recorrida por
! (Long) Dim distancia!
un automóvil.
Declaración de un peso en toneladas de un
 Dim peso#
determinado camión.
@ (Currency) Declaración del sueldo de un empleado. Dim sueldo@

Declaración de la dirección domiciliaria de


 Dim direccion$
un empleado.

Algunas opciones al declarar variables

Especicación Declaración de variable


Dim edad As Integer
Declaración de una sola variable.
Dim edad%

Declaración de dos variables o más Dim nota1 As Integer, Nota2 As Integer


 Dim nota1%,Nota2%,nota3%

Declaración de dos variables o más Dim edad As Integer, sueldo As Currency


 Dim edad%, sueldo@
Cap.2: Fundamentos de programación
117

Finalmente, podemos reestructurar el código presentado al inicio (con referencia a este


tema), el cual quedará de la siguiente manera:

Sub calculaPromedio()
Dim alumno As String
Alumno = InputBox("Ingrese nombre del alumno: ")

Dim nota1 As Integer, nota2 As Integer, nota3 As Integer


nota1 = CInt(InputBox("Ingrese Nota 1: "))
nota2 = CInt(InputBox("Ingrese Nota 2: "))
nota3 = CInt(InputBox("Ingrese Nota 3: "))

Dim promedio As Double


promedio = (nota1 + nota2 + nota3) / 3

MsgBox "El promedio es: " & promedio


End Sub

O también, podríamos tener el siguiente código usando símbolos en la declaración de


variables:

Sub calculaPromedio()
Dim alumno$, nota1%, nota2%, nota3%, promedio#
Alumno = InputBox("Ingrese nombre del alumno: ")

nota1 = CInt(InputBox("Ingrese Nota 1: "))


nota2 = CInt(InputBox("Ingrese Nota 2: "))
nota3 = CInt(InputBox("Ingrese Nota 3: "))

promedio = (nota1 + nota2 + nota3) / 3

MsgBox "El promedio es: " & promedio


End Sub

¿Cómo asignar un valor inicial a una variable?


La asignación inicial de una variable se debe a la necesidad de asignar un valor pre-
determinado a una o más variables; esto quiere decir que, si la variable no cambia
de valor durante la ejecución de la aplicación, entonces el valor inicial se mantendrá.
Normalmente se usa para variables de conteo o acumulaciones, los cuales veremos en

Aplicaciones VBA con Excel
118

Especicación Declaración de variable Valor Inicial


Dim n As Integer 0
Dim distancia As Single 0.0
Inicialización de variables por Dim peso As Double 0.0
defecto. Dim nombre As String «»
Dim fecha As Date 12:00:00am
Dim estado As Boolean False
Dim n As Integer
10
n=10
Inicialización de variables con
 Dim categoria As String
categoria = "Administrador" Administrador

Dim n As Integer: n=10


Inicialización de variables con 10

Dim categoria As String:
en una misma línea. categoria="Administrador" Administrador

2.6 Operadores


-
cerlos y saber el uso adecuado de algunos de ellos.

2.6.1 Asignación


declaración de la variable.

Además, debemos considerar que una variable también puede registrar un valor resul-
tante de una expresión. Su formato es:

Variable = valor

Veamos algunas referencias:

Especicación Asignación de valor


Asignar la categoría de Operario a un Dim categoria As String
empleado. categoria = "Operario"

Dim monto As Currency


monto = 5200.75
-
minado monto y asignarlo a una variable. Dim descuento As Currency
descuento = monto * 0.2

Dim fechaNac As Date


Determinar la edad de una persona basado fechaNac = "05/05/1976"
en su fecha de nacimiento y asignarlo a una
variable. Dim edad As Integer
edad = Year(Date) - Year(fechaNac)
Cap.2: Fundamentos de programación
119

2.6.2 Aritméticos



Operadores Descripción Formas de uso



producto.

Dim precioLista As Currency


+ Suma o adición
precioLista = 5400

Dim precioVenta As Currency


precioVenta = precio + 50



Dim pago As Currency


– Resta o sustracción pago = 10000

Dim descuento as Currency


descuento = pago – 2.17/100

Determinar a cuánto asciende un monto el cual es




  Dim monto As Currency


*
producto monto = 10000

Dim nuevoMonto As Currency


nuevoMonto = monto * 1.2

Determinar el promedio en decimales de un alumno, el


cual cuenta con tres notas decimales.

Dim nota1#, nota2#, nota3#


nota1 = 10.5
/ División real
nota2 = 15.7
nota3 = 20

Dim promedio#
promedio = (nota1 + nota2 + nota3) / 3

-
minado de meses.

Dim meses As Integer


\ División entera
meses = 121

Dim años As Integer


años = meses \ 12

Determinar la raíz cuadrado de un número determinado.

Dim n As Integer
Exponenciación o
^ n=2
potencia
Dim raiz As Double
raiz = n ^ (1/2)
Aplicaciones VBA con Excel
120

     


dígito de un número entero cualquiera.

Dim n As Integer
MOD Resto de la división
n = 12453

Dim ultimoDigito As Integer


ultimoDigito = n Mod 10

2.6.3 Relacionales

obtener un resultado verdadero o falso según la condición. Mayormente, estos ope-
 If For o
While

Operadores Descripción Formas de uso


Comparar las edades de dos personas:

Dim edad1%, edad2%


edad1 = 15
= Igualdad edad2 = 15

Dim mensaje$
mensaje = IIf(edad1 = edad2, "Iguales",
"No son iguales")

Determinar si una persona es mayor de edad, de acuerdo a su


fecha de nacimiento:

Dim fechaNac As Date


fechaNac = "04/05/1981"
> Mayor que
Dim edad As Integer
edad = Year(Date) - Year(fechaNac)

Dim mensaje$
mensaje = IIf(edad > 17, "Mayor de edad",
"Menor de edad")

Determinar si un alumno ha aprobado o no un curso el cual




Dim nota1%, nota2%, nota3%


nota1 = 10
nota2 = 15
nota3 = 20
< Menor que
Dim promedio As Double
promedio = (nota1 + nota2 + nota3) / 3

Dim mensaje$
mensaje = IIf(promedio < 10.5, "Desaprobado",
"Aprobado")
Cap.2: Fundamentos de programación
121

Determinar si una persona es mayor de edad, de acuerdo a su


fecha de nacimiento:

Dim fechaNac As Date


fechaNac = "04/05/1981"
>= Mayor o igual que
Dim edad As Integer
edad = Year(Date) - Year(fechaNac)

Dim mensaje$
mensaje = IIf(edad >= 18, "Mayor de edad",
"Menor de edad")

Determinar si un alumno ha aprobado o no un curso el cual




Dim nota1%, nota2%, nota3%


nota1 = 10
nota2 = 15
nota3 = 20
<= Menor o igual que
Dim promedio As Double
promedio = (nota1 + nota2 + nota3) / 3

Dim mensaje$
mensaje = IIf(promedio <= 10.4, "Desaprobado",
"Aprobado")

Determinar si un número es par o impar.

Dim n As Integer
Diferente o n = 4
<>
desigual
Dim mensaje$
mensaje = IIf(n Mod 2 <> 0, "Número impar",
"Número par")

2.6.4 Lógicos
-
guir los siguientes operadores:

Operadores Descripción Formas de uso


Determinar si una persona es mayor de edad pero menor a
AND Y lógica 65 años.
edad > 17 AND edad<=65

Determinar si un trabajador es de categoría Operario o Super-


visor.
OR O lógica
categoría ="Operario" OR categoría ="Super-
visor"

Si la categoría de un alumno es A, B, C, D y E, determinar si un


alumno pertenece a la categoría entre la A y la D.
NOT Negación
NOT categoría ="E"
Aplicaciones VBA con Excel
122

2.6.5 Incremento y decremento


En VBA no existen operadores de incremento o decremento, podemos usar las siguien-
tes expresiones si necesitamos realizar incrementos sucesivos o decrementos.
Expresión Ejemplo
I=I+1 

Dim ch As Integer, cm As Integer


If sexo = "H" OR sexo="h" Then
ch = ch + 1
else
cm = cm + 1
End If

L           
usamos el operador OR       

Por su parte la variable ch


Mientras que la variable cm
D = D- 1 Si contamos con un número de correos electrónicos recibidos en un determinado

de correos leídos.

Dim cantidadCorreos As Integer, estado As Boolean


cantidadCorreos = 1000
estado = True

If estado = True Then


cantidadCorreos = cantidadCorreos - 1
End If

2.6.6 Orden de prioridad



o más operadores de diferentes categorías, es decir, puede tener una combinación de


Categoría Operadores Descripción


^ Exponenciación
+– 
*/ 
 -
\ División entera
cos
MOD Resto de la división
+- Suma, resta
& Concatenación
= Igualdad
Operadores de compa- <> Diferente
ración >=, <= Mayor o igual, menor o igual
>, < Mayor, menor
NOT Negación
Operadores lógicos AND Y lógica
OR O lógica

Debemos tener en cuenta que el operador con más alto grado de prioridad es el
juego de paréntesis ().
Cap.2: Fundamentos de programación
123

2.6.7 Expresiones
  
dentro de un código VBA, desde aquí se puede obtener algún resultado relevante en


Aritmécas: Son expresiones que emiten un resultado directo y que no es necesario


el VBA para su resolución. Por ejemplo:

A1 = 1200(32x-1 )+ 80

A2 = 10x +x-2
2

Algorítmicas: Son expresiones que son entendidas por el compilador del VBA. Por
ejemplo:

A1 = 1200 * (3 ^ (2*X-1))+80
A2 = 10 ^ (X+2)*(X-1)

2.7 Conversiones de tipo





que VBA puede realizar conversiones implícitas, estas se llaman así cuando se convierten

por conveniencia.

2.7.1 Implícita
En VBA se considera una conversión implícita cuando un valor se convierte automá-
        
permite calcular el promedio de cuatro notas de un determinado alumno.

Sub calculaPromedio()
promedio = (nota1+ nota2+ nota3+ nota4)/4
Msgbox "El promedio es: " & promedio
End Sub
Aplicaciones VBA con Excel
124

Si analizamos el código mostrado parece no haber problemas de conversiones ni nada


parecido; es así que no deberíamos preocuparnos, pero notemos que la variable pro-
 -
mente, ya que asumimos que la suma de cuatro notas entre cuatro devuelve un pro-
medio, y esta es la misma acción que realiza VBA.

Cuando trabajemos con elementos visuales como el cuadro de texto será más claro la
conversión implícita, veamos la siguiente línea:

Dim Edad As Integer


Edad = txtEdad.Text

Declaramos la variable Edad 


texto txtEdad; dicho valor es completamente textual por eso el objeto se llama cuadro
de texto, imaginemos que el usuario ingresa su edad, por ejemplo, 50; este será enviado
a la variable Edad

La forma explícita de recibir un valor sería de la siguiente manera:

Dim Edad As Integer


Edad = CInt(txtEdad.Text)

2.7.2 Reglas

que las conversiones más comunes se realizan de cadena a número para cuando ne-
   
necesite concatenar valores. Ya usted comprenderá su uso mediante los casos desarro-
llados expuestos en este material.

Veamos las principales funciones de conversión para el lenguaje VBA:

Función Tipo Descripción



CBool Boolean Boolean, usado para valores lógicos
como True o False.


CByte Byte Byte, usado para valores numéricos
cortos.


CCur Currency
Currency, usado para valores monetarios.


CDate Date Date
hora.
Cap.2: Fundamentos de programación
125

Double,
CDbl Double -
rio largo.

Decimal,
CDec Decimal 
Currency o Double.

       


CInt Integer Integer, usado para valores numéricos enteros,
es decir, sin fracciones decimales.
   Long,
CLng Long usado para valores numéricos enteros muchos
 Integer.

Single,
CSng Single usado para valores numéricos fraccionarios
cortos.

String,
CStr String 
de cualquier longitud.

Variant,
 
CVar Variant 
      
valor recepcionado.

2.7.3 Explícita
También se le conoce como declaración forzada, es así que un valor de una variable
pasa a otra por conveniencia del programador. Su formato es:

Variable = ReglaConversion(Valor)

Tenemos algunos ejemplos:



Dim cadena As String


cadena = "123"

Dim numero As Integer


numero = CInt(cadena)


Dim cadena As String
cadena = "0.255"

Dim moduloVector As Double


moduloVector = CDbl(cadena)
Aplicaciones VBA con Excel
126

 
Dim cadena As String
cadena = "2850.00"

Dim monto As Currency


monto = CCur(cadena)

 

Dim cadena As String


cadena = "20/02/2016"

Dim fechaRegistro As Date


fechaRegistro = CDate(cadena)

 
Dim numero As Integer
numero = 10

Dim cadena As String


cadena = CStr(cadena)

2.8 Mensajes en VBA


Cuando se trabaje con los controles visuales en VBA se nos hará necesario enviar infor-


de decisión en una determinada situación. Veamos de qué se componen los mensajes:

Título

Ícono Mensaje

Botón

Fig. 2.5 Cuadro de diálogo de mensaje

Formato:

MsgBox "Mensaje", Botones, "Titulo"


Variable = MsgBox("Mensaje", Botones+Icono, "Titulo")

Donde:

Mensaje: 
corto, pero si necesita señalar información masiva, podríamos optar por usar los cam-
bios de línea en el mensaje. Veamos algunos casos:
Cap.2: Fundamentos de programación
127

MsgBox "Cliente registrado correctamente con fecha " & Now,


vbOKOnly + vbInformation

Fig. 2.6 Cuadro de diálogo con mensaje en una sola línea

MsgBox "Cliente registrado correctamente: " & vbNewLine & _


"Fecha: " & Now, vbOKOnly + vbInformation

Fig. 2.7 Cuadro de diálogo con mensaje en dos líneas

Botón: Aquí se muestran los botones implementados en un determinado mensaje.




Constante Valor Descripción


Muestra el botón Aceptar, considere también que es
 0 tomado como un valor por defecto cuando no se especi-

 1 Muestra los botones Aceptar y Cancelar.
vbAbortRetryIgnore 2 Muestra los botones Anular, Reintentar y Omir.
vbYesNoCancel 3 Muestra los botones Sí, No y Cancelar.
vbYesNo 4 Muestra los botones Sí y No.
vbRetryCancel 5 Muestra los botones Reintentar y Cancelar.

 16 Muestra el icono Críco.

 32 Muestra el ícono de consulta de Advertencia.

 48 Muestra el ícono de mensaje de Advertencia.

 64 Muestra el ícono de mensaje de Información.


Aplicaciones VBA con Excel
128

Título: 


Variable: Cuando se antepone una variable al mensaje, es que deseamos obtener la




respuesta del usuario, es así que debemos conocer la siguiente tabla de valores:

Constante Valor obtenido Descripción


 1 Ocurre al presionar el botón Aceptar.
VbCancel 2 Ocurre al presionar el botón Cancelar.
VbAbort 3 Ocurre al presionar el botón Anular.
VbRetry 4 Ocurre al presionar el botón Reintentar.
VbIgnore 5 Ocurre al presionar el botón Omir.
VbYes 6 Ocurre al presionar el botón Sí.
VbNo 7 Ocurre al presionar el botón No.

Veamos algunos códigos sobre el manejo de la función MsgBox:

Mostrar un mensaje simple al usuario.




MsgBox "Cliente registrado correctamente..!!"




MsgBox "Cliente registrado correctamente..!!", vbInformation, "Sistema"

Mostrar los datos personales de un determinado cliente.




Dim nombres$, apellidos$


Dim fechaNac As Date

nombres = "Fernanda Ximena"


apellidos = "Torres Lazaro"
fechaNac = "11/03/2011"

MsgBox "Cliente registrado correctamente: " & vbNewLine & _


vbNewLine & _
"Nombres: " & nombres & vbNewLine & _
"Apellidos: " & apellidos & vbNewLine & _
"Fecha de Nacimiento: " & fechaNac, vbOKOnly + vbInformation
Cap.2: Fundamentos de programación
129

Determinar la salida de la aplicación por medio de un mensaje.

Dim r As Integer
r = MsgBox("Está seguro de salir?",VbYesNo, "Salida")
If r=6 Then End

2.9 Ingreso de valor con la función InputBox


-
terminado valor, inicialmente el valor será capturado como cadena de texto. Su formato es:

Variable = InputBox("Mensaje", "Titulo", Defecto,


PosicionX, PosicionY)

Donde:

Mensaje: Es el texto que se mostrará al usuario, normalmente se le indica al usuario



Ingresar la descripción de un producto
Dim descripción As String
descripcion = InputBox("Ingrese descripción del producto: ")


Dim cantidad As Integer
cantidad = InputBox("Ingrese cantidad comprada: ")

Ingresar la fecha de registro de un producto


Dim fechaReg As Date
fechaReg = InputBox("Ingrese fecha de registro del producto: ")

Titulo:  InputBox, considere esta parte




Dim descripción As String
descripcion=InputBox("Ingrese descripción del producto:","Entrada")
Aplicaciones VBA con Excel
130

Defecto:-
gresar un valor, esta es opcional. Veamos el siguiente caso:

Ingresar un año para generar la búsqueda de los registros


Dim año As Integer
año=InputBox("Ingrese año:","Entrada","2016")

Fig. 2.8 Ventana de diálogo InputBox

PosicionX, PosicionY: Indica la posición en X e Y de la ventana de diálogo InputBox en


la pantalla. Veamos el siguiente caso:

Ingresar un año en la posición 8000, 5000


Dim año As Integer
año=InputBox("Ingrese año:","Entrada","2016",8000,5000)

2.10 Ingreso de valor con el método InputBox


La funcionalidad del método InputBox
lo que sí podemos decir es que el método InputBox presenta un aspecto simple y a la vez


Variable = Application.InputBox(Prompt:="Mensaje", Type:=ValorTipo)

Donde:

Prompt: 
Ingresar la descripción de un determinado producto:

Dim descripcion As String


descripcion=Application.InputBox(Prompt:="Ingrese descripción:")

Fig. 2.9 Ventana de diálogo desde el método InputBox


Cap.2: Fundamentos de programación
131

Type:


Tipo Descripción
0 Permite el acceso de una fórmula
1 Permite el acceso de un número
2 Permite el acceso de una cadena de caracteres.
4 Permite el acceso de un elemento booleano (True or False).
8 Permite el acceso de un rango de celdas.

Veamos algunos casos para el uso del método Inputbox:


Dim edad As Integer
edad=Application.InputBox(Prompt:="Ingrese edad:",Type:=1)


Dim nombre As String
nombre=Application.InputBox(Prompt:="Ingrese nombre:",Type:=2)


Dim rango As Range
Set rango=Application.InputBox(Prompt:="Elija un rango", Type:=8)
rango.Interior.Color = "255"

2.11 Ámbito o alcance de las variables


Cuando se declara una variable, esta toma un alcance sobre el lugar donde fue declarado,

puede ser una función o procedimiento.



Variable local: -


go el cual puede ser una función o procedimiento. Veamos la declaración de la variable
local edad dentro de la función calculaEdad:

Fig. 2.10 Función calculaEdad del ThisWorkbook


Como observamos la variable Edad se usa dentro de toda la función calculaEdad inclu-
sive en las tres líneas de código.
Aplicaciones VBA con Excel
132

Variable global: -


go, es decir, fuera de un procedimiento o función. Esto implica que todas las funciones
y procedimientos podrán usar a dicha variable ya que toma un ámbito global. Veamos
la declaración de la variable Edad de ámbito global:

Fig. 2.11 Funciones implementadas en el ThisWorkbook

Como observamos la variable Edad se declara al exterior de las funciones calculaEdad y


determinaCondicion; al ser declarada de dicha manera ambas funciones podrán hacer
uso de la variable. La función calculaEdad se encarga de darle valor a dicha variable
mediante la expresión Edad = Year(Date) – Year(fecha); mientras que la función deter-
minaCondicion, al invocar a la variable Edad-
nado en la variable Edad, esa es la consecuencia de la variable global.

Finalmente, se agregó la sentencia Opon Explicit al inicio de todo el código para forzar
a la declaración de todas las variables usadas en la implementación de las funciones.

2.12 Funciones definidas por el usuario




el de devolver algún valor a quien lo invoca. Asimismo, podemos decir que una función
puede recibir datos de entrada por medio de parámetros, pero siempre retornará un
solo valor llamado valor de salida.

Finalmente, podemos decir que las funciones permiten organizar de la mejor manera
grandes códigos que se pueden presentar en una aplicación. VBA no limita la implemen-
tación de una función, ya que esta se puede desarrollar en cualquier contenedor de có-
digo del VBA, lo que se recomienda es almacenar las funciones en módulos. Veamos la

Cap.2: Fundamentos de programación
133

Function calculaCuadratica(ByVal a As Integer,


ByVal b As Integer,
ByVal c As Integer)
Dim x As Double
x=(-b + ((b^2)-4*a*c)^(1/2)) / (2*a)
calculaCuadratica = x
End Function

2.12.1 Formato para la implementación de una función sin parámetros


-
turar algún valor o para devolver un valor constante como PI o Epsilon.

FUNCTION NOMBRE() AS TIPO


SENTENCIAS
NOMBRE=VALOR DE SALIDA
END FUNCTION

Donde:

FUNCTION: Es la palabra reservada para iniciar la implementación de la función.

NOMBRE: 
los nombres de variables. Recomendamos que todo nombre de función inicie con
capturaEdad o
devuelvePI.

AS TIPO: 



Variant sobre el valor resultante.

SENTENCIAS: Son las sentencias o expresiones que puede contener una función; aquí
podemos hacer uso de todas las estructuras que posee VBA.

NOMBRE=VALOR DE SALIDA: Debemos tener en cuenta que toda función siempre


nombre=va-
lor de salida; sabiendo que nombre es el nombre de la función y valor de salida es
el valor resultante.

END FUNCTION: 


Aplicaciones VBA con Excel
134

Ejemplos:

Función que permita devolver la fecha actual

Function devuelveFecha() As Date


Dim fecha As Date
fecha = Now
devuelveFecha = fecha
End Function

Procedimiento que use la función devuelveFecha:

Sub muestraFecha()
MsgBox "La fecha actual es: " & devuelveFecha
End Sub

Función que permita devolver el valor ingresado en un cuadro de texto que represen-
ta a la edad de una persona

Function getEdad() As Integer


getEdad = CInt(txtEdad.Text)
End Function

Procedimiento que use la función getEdad:

Sub capturaDatos()
Dim Edad As Integer
Edad = getEdad()
End Sub

Función que permita devolver el valor de PI


Function devuelvePI() As Double
devuelvePI = 3.1416
End Function

Procedimiento que use la función devuelvePI


Sub calculos()
Dim t As Double
t = 2 * devuelvePI()
MsgBox "El valor de T es: " & t
End Sub
Cap.2: Fundamentos de programación
135

2.12.2 Formato para la implementación de una función con parámetros

FUNCTION NOMBRE(PARAMETROS) AS TIPO


SENTENCIAS
NOMBRE=VALOR DE SALIDA
END FUNCTION

Donde:

PARAMETROS: -



ByVal nombre As Tipo, donde
ByVal es la palabra reservada que indica el paso de un valor, nombre-
dor del parámetro y As Tipo

Ejemplos:

Función que permita calcular el valor IVA de un monto




Function calculaIVA(ByVal monto As Currency) As Currency


Dim IVA As Double
IVA = 0.19 * monto
calculaIVA = IVA
End Function

Procedimiento que permite usar la función calculaIVA


Sub calculaMonto()
Dim monto As Double, neto As Double
monto = 2500
neto = monto - calculaIVA(monto)
MsgBox "El monto es: " & monto
End Sub

Función que permita devolver el valor exponencial de dos números enteros




Function calculaExponecial(ByVal base As Integer,


ByVal exponente As Integer) As Integer
Dim potencia As Integer
potencia = base ^ exponente
calculaExponencial = potencia
End Function

Procedimiento que use la función calculaExponencial

Sub calcula()
Dim base As Integer, exponente As Integer
Dim potencia As Integer
potencia = calculaExponencial(base,exponente)
MsgBox "La potencia es: " & potencia
End Sub
Aplicaciones VBA con Excel
136

Función que permita validar un valor numérico, dicho valor tendrá un rango de 0 a


Function validaNumero(ByVal N As Integer) As String


If N <= 0 Or N > 20 Then
validaNumero = "Numero no permitido..!!"
Else
validaNumero = ""
End If
End Function

Procedimiento que permite usar la función validaNumero

Sub calculaPromedio()
Dim nota As Integer
nota = InputBox("Ingrese nota: ")
If validaNumero(nota) = "" Then
MsgBox "Su nota es: " & nota
Else
MsgBox validaNumero(nota)
End If
End Sub

2.12.3 Formato para invocar una función con parámetros o sin ellos
-
-
ción; por lo tanto, la invocación puede tener los siguientes formatos:

Variable = nombreFuncion(Parámetros)
Expresión = nombreFuncion(Parámetros)+Valor

El primer formato asigna el valor de devolución de la función a la variable, solo debe-



de la variable. En el segundo formato, observamos que la función puede ser parte de
una expresión, esto se debe a que la función siempre envía un valor, y este puede ser
usado en una nueva expresión.

2.13 Procedimientos
Los procedimientos son bloques de código que pueden recibir datos por medio de pará-
metros o a través de variable globales, pero que no devuelven ningún resultado a quien
los invoque. Son también llamados funciones sin valor de retorno. Pueden ser usados

controles visuales o imprimir algún valor directamente.
Cap.2: Fundamentos de programación
137



Sub calculaCuadratica(ByVal a As Integer,


ByVal b As Integer,
ByVal c As Integer)
Dim x As Double
x=(-b + ((b^2)-4*a*c)^(1/2)) / (2*a)
MgsBox "El resultado es: " & x
End Function

2.13.1 Formato para la implementación de un procedimiento sin parámetros


-
gún valor del procedimiento, podríamos optar por el uso de variables globales.

SUB NOMBRE()
SENTENCIAS
END SUB

Donde:

SUB: Es la palabra reservada para iniciar la implementación del procedimiento.


NOMBRE: 
que los nombres de variable. Recomendamos que todo nombre de procedimiento
mues-
traCondicion o limpiaControles.
SENTENCIAS: Son las sentencias o expresiones que puede contener un procedimien-
to. Aquí podemos hacer uso de todas las estructuras que posee VBA además pode-
mos incluir funciones y otros procedimientos.
END SUB: 

Ejemplos:

Procedimiento que permita mostrar la fecha actual

Sub muestraFecha()
Dim fecha As Date
fecha = Now
MsgBox "La fecha actual es: " & fecha
End Sub
Aplicaciones VBA con Excel
138

Procedimiento que permita mostrar el valor de PI

Sub muestraPI()
Dim PI As Double
PI = 3.1416
MsgBox "El valor de PI es: " & PI
End Sub

2.13.2 Formato para la implementación de un procedimiento con parámetros

SUB NOMBRE(PARAMETROS)
SENTENCIAS
END SUB

Donde:

PARAMETROS: 
-
ByVal nom-
bre As Tipo, donde ByVal es la palabra reservada que indica el paso de un valor, nom-
breAs Tipo

Ejemplos:

Procedimiento que permita mostrar el valor IVA de un determinado monto

Sub calculaIVA(ByVal monto As Currency)


Dim IVA As Double
IVA = 0.19 * monto
MsgBox "El valor del IVA es: " & IVA
End Sub

Procedimiento que permita mostrar el valor exponencial de dos números enteros

Sub calculaExponecial(ByVal base As Integer,


ByVal exponente As Integer)
Dim potencia As Integer
potencia = base ^ exponente
MsgBox "El valor de la potencia es: " & potencia
End Sub
Cap.2: Fundamentos de programación
139

2.13.3 Formato para invocar un procedimiento con parámetros o sin ellos


Se le llama invocación del procedimiento cuando esta, es solicitada para una acción

por lo tanto, la invocación puede tener los siguientes formatos:

Call nombreProcedimiento (Parámetros)


nombreProcedimiento(Parámetros)

El uso de la palabra Call es opcional, ya que en el segundo formato demuestra que no


es necesario su uso. Por ejemplo:

Invocar al procedimiento muestraFecha → Call muestraFecha


Invocar al procedimiento muestraPI → Call muestraPI
Invocar al procedimiento muestraIVA → Call muestraIVA(15000)
Invocar al procedimiento calculaExponencial → Call calculaExponencial(4,2)

2.14 Casos desarrollados

ͫCaso desarrollado 1: Guardería


El ingreso mensual total de una guardería por el concepto de cuidado de x niños está
dado por la fórmula 450x; sus costos mensuales totales son 380x+3500. ¿Cuántos niños
se necesitan inscribir mensualmente para alcanzar un punto de equilibrio aceptable?

Fig. 2.12 Cálculo de ingresos mensuales en guardería


Aplicaciones VBA con Excel
140

Pasos:

1. Diseñe el siguiente modelo en la primera hoja de Excel:

Fig. 2.13 Diseño inicial del control de ingresos en la guardería

2. Ingrese al entorno VBA, haga doble clic sobre el objeto ThisWorkbook e implemen-
te el procedimiento calculosGuarderia:

Fig. 2.14 Procedimiento que permite realizar los cálculos


Cap.2: Fundamentos de programación
141

3. Seguidamente, debemos agregar un botón en la hoja de Excel para obtener los




 Desarrollador > Insertar > Controles de formulario > Botón.


Luego seleccione el procedimiento calculosGuarderia desde la lista de macros.

Fig. 2.15 Selección de macro

4. Pruebe los resultados ingresando el total de alumnos (E10), cuota mensual (C12),
otros gastos (C13E12).
5. Libro de Excel habilitado para macros.

ͫCaso desarrollado 2: Estudios universitarios


-
caria para sus estudios superiores. ¿Cuánto recibirá dentro de 18 años, suponiendo

fórmula:

C = Cinicial (1 + rn ) nt

Donde:
Cnal: n años

Cinicial: Monto inicial del depósito

r: Porcentaje de interés


t: Años de depósito


n: Composición del interés por año (trimestral (12÷3=4))



Aplicaciones VBA con Excel
142



C = Cinicial * ( 1 + ( r / n ) ) ^ ( n * t )

Si reemplazamos en la fórmula, por los valores dados en el problema, tenemos:

C  = 5000 * ( 1 + 0.04 / 4 ) ^ ( 4 * 18 )

Fig. 2.16 Cálculo del monto trimestral por depósito de herencia

Pasos:

1. Diseñe el siguiente modelo en la segunda hoja de Excel:

Fig. 2.17 Diseño inicial para el cálculo de monto trimestral


Cap.2: Fundamentos de programación
143

2. Ingrese al entorno VBA, haga doble clic sobre el objeto ThisWorkbook e implemen-
te el procedimiento calculaHerencia:

Fig. 2.18 Procedimiento que permite realizar los cálculos

3. Seguidamente, debemos agregar un botón en la hoja de Excel para obtener los




 Desarrollador > Insertar > Controles de formulario > Botón.


Luego seleccione el procedimiento calculaHerencia desde la lista de macros.

Fig. 2.19 Selección de macro

4. Pruebe los resultados ingresando el monto depositado (C10), tasa de interés (C11)
y años (C14); haga clic en el botón Calcular.
5. Libro de Excel habilitado para macros.
Aplicaciones VBA con Excel
144

ͫCaso desarrollado 3: Uso de Operadores - Municipalidad de Lima


     
-
ciales, comedores populares y el programa vaso de leche.

   


-
pulares y el resto para el programa vaso de leche. Debe considerar los siguientes
aspectos:

Implemente en Excel el siguiente entorno:

Fig. 2.20 Entorno benecios sociales

Implemente procedimientos para realizar los cálculos mostrados y para limpiar las
celdas.
Todas las variables usadas en la aplicación deben ser declaradas según la naturaleza
de sus valores.

Pasos:

1. Diseñe el modelo de la aplicación


2. Implemente los siguientes procedimientos dentro del entorno ThisWorkbook:
Cap.2: Fundamentos de programación
145

Sub calculaDonacion()
Dim monto As Currency
monto = Range("C16").Value

Dim cAsistenciales As Double, cPopulares As Double


Dim pVaso As Double
cAsistenciales = monto * 0.25
cPopulares = monto * 0.35
pVaso = monto - (cAsistenciales + cPopulares)

Range("C18").Value = cAsistenciales
Range("C19").Value = cPopulares
Range("C20").Value = pVaso
End Sub

Sub limpiar()
Range("C16").ClearContents
Range("C18:C20").ClearContents
Range("C16").Select
End Sub

Explicación del código - Procedimiento calculaDonacion:


Dim monto As Currency
monto = Range("C16").Value

Declaramos la variable monto que será la encargada de almacenar el valor desde la


celda C16, almacenada por el usuario el cual representa el valor total de la donación.

Dim cAsistenciales As Currency, cPopulares As Currency


Dim pVaso As Currency
cAsistenciales = monto * 0.25
cPopulares = monto * 0.35
pVaso = monto - (cAsistenciales + cPopulares)

monto, este
será usado en otras expresiones, el cual podrá calcular el monto asignado al pro-
grama de Centros Asistenciales (cAsistenciales), comedores populares (cPopulares)
y el programa vaso de leche (pVaso). Todas estas variables deben ser declaradas
como Currency por tratarse de valores monetarios.
Range("C18").Value = cAsistenciales
Range("C19").Value = cPopulares
Range("C20").Value = pVaso

Finalmente, debemos enviar los valores resultantes a las celdas correspondientes.


Aplicaciones VBA con Excel
146

Explicación del código - Procedimiento limpiar:


Range("C16").ClearContents
Range("C18:C20").ClearContents
Range("C16").Select


poder hacer un rango de celdas y, así, ahorrar líneas de código como sucedió
con Range("C18:C20")C16 mediante el
método Select.

3. Desarrollador
y que se encuentre asociado al procedimiento calculaDonacion.
4. Desarrollador
que se encuentre asociado al procedimiento limpiar.
5. Probar la aplicación, ingresando un monto en la celda C16 y mostrar los resultados
con el botón Procesar. Para un segundo ingreso podrá presionar el botón Limpiar.

ͫCaso desarrollado 4: Uso de constantes - Casa de cambio


-

monto en soles. Debe considerar los siguientes aspectos:

Implemente en Excel el siguiente entorno:

Fig. 2.21 Entorno de casa de cambio


Cap.2: Fundamentos de programación
147


1 dólar = 3.51 soles
1 dólar = 1.09 euros
1 dólar = 2.12 marcos

Pasos:

1. Diseñe el modelo de la aplicación


2. Implemente el siguiente procedimiento dentro del entorno ThisWorkbook:

Sub determinaMontos()
Const DOLAR = 3.51
Const EURO = 1.09
Const MARCOS = 2.12

Dim soles As Currency


soles = Range("D14")

Dim montoE As Currency, montoD As Currency


Dim montoM As Currency

montoD = soles / DOLAR


montoE = montoD * EURO
montoM = montoD * MARCOS

Range("D17").Value = montoE
Range("D18").Value = montoM
Range("D19").Value = montoD
End Sub

Explicación del código - Procedimiento calculaDonacion:

Const DOLAR = 3.51


Const EURO = 1.09
Const MARCOS = 2.12

Empezamos por implementar las constantes antes de comenzar la captura de los



problema.

Dim soles As Currency


soles = Range("D14")

Luego, debemos capturar el monto ingresado por el usuario; este se registrará en la


celda D14, el cual es capturado con la función Range y enviado a la variable monto,
Currency.

Dim montoE As Currency, montoD As Currency


Dim montoM As Currency

-

Descargado en: ey books.co m
Aplicaciones VBA con Excel
148

montoD = soles / DOLAR


montoE = montoD * EURO
montoM = montoD * MARCOS



constante las expresiones que la usen no sufrirán cambios.

Range("D17").Value = montoE
Range("D18").Value = montoM
Range("D19").Value = montoD

Finalmente, debemos enviar los valores resultantes a las celdas correspondien-


tes, aquí se debe considerar el modelo presentado inicialmente para la aplicación.

3.  Desarrollador-
SAR» y que se encuentre asociado al procedimiento determinaMontos.
4. Pruebe la aplicación ingresando un monto en soles en la celda D14, luego haga
clic en el botón PROCESAR.

ͫCaso desarrollado 5: Símbolos que representan los pos de datos - Salario de


empleado
La empresa Trome S.A. necesita tener un mejor control sobre los montos que se paga a
sus empleados, para lo cual cuenta con horas trabajadas, tarifa por hora, descuento de

necesita implementar una aplicación que permita calcular el monto bruto, descuento
de Oncosalud, descuento de ley y sueldo neto de un determinado empleado. Debe
considerar los siguientes aspectos:

• Implemente en Excel el siguiente entorno:

Fig. 2.22 Montos del empleado


Cap.2: Fundamentos de programación
149

Implemente un procedimiento que permita realizar los cálculos y otro para limpiar


las celdas.
Todas las variables usadas en la aplicación deben ser declaradas con símbolos que



Pasos:

1. Diseñe el modelo de la aplicación


2. Implemente los siguientes procedimientos dentro del entorno ThisWorkbook:

Sub calcularMontos()
Dim Empleado$, hTrabajadas%, tHora@
Empleado = Range("C11").Value
hTrabajadas = Range("C12").Value
tHora = Range("F12").Value

Dim mBruto@, tDescuentos@, sNeto@


Dim dOncosalud@, dLey@
mBruto = hTrabajadas * tHora
dOncosalud = 8.5 / 100 * mBruto
dLey = 12 / 100 * mBruto
tDescuentos = dOncosalud + dLey
sNeto = mBruto - tDescuentos

Range("C14").Value = mBruto
Range("F14").Value = dOncosalud
Range("F15").Value = dLey
Range("C16").Value = tDescuentos
Range("C17").Value = sNeto
End Sub

Sub limpiaCeldas()
Range("C11").Value = ""
Range("C12").ClearContents
Range("F12").ClearContents
Range("C14").ClearContents
Range("F14:F15").ClearContents
Range("C16:C17").ClearContents
Range("C11").Select
End Sub

Explicación del código - Procedimiento calcularMontos:


Dim Empleado$, hTrabajadas%, tHora@
Empleado = Range("C11").Value
hTrabajadas = Range("C12").Value
tHora = Range("F12").Value


$ representa al As
String, % representa al As Integer y @ representa al As Currency. Luego captura-
mos los valores ingresados en la hoja de Excel. Asegúrese que las celdas son las
correspondientes a los datos como C11 al nombre del empleado, C12 a las horas
trabajadas y F12 a la tarifa horaria.
Aplicaciones VBA con Excel
150

Dim mBruto@, tDescuentos@, sNeto@


Dim dOncosalud@, dLey@
mBruto = hTrabajadas * tHora
dOncosalud = 8.5 / 100 * mBruto
dLey = 12 / 100 * mBruto
tDescuentos = dOncosalud + dLey"
sNeto = mBruto – tDescuentos

Realizamos los cálculos de los montos según lo solicitado en el problema.

Range("C14").Value = mBruto
Range("F14").Value = dOncosalud
Range("F15").Value = dLey
Range("C16").Value = tDescuentos
Range("C17").Value = sNeto

Finalmente, enviamos los valores calculados a las celdas correspondientes, asegú-


rese que las posiciones de las celdas resultados sean las correctas.

Explicación del código - Procedimiento limpiaCeldas:

Range("C11").Value = ""
Range("C12").ClearContents
Range("F12").ClearContents
Range("C14").ClearContents
Range("F14:F15").ClearContents
Range("C16:C17").ClearContents
Range("C11").Select

La celda C11 es una celda combinada por lo tanto no se puede usar el método
ClearContents como en las demás celdas, así es que usamos el método Value y
C11 para ingresar
nuevamente valores.

3. Desarrollador
que se encuentre asociado al procedimiento calcularMontos.
4. Desarrollador-
DAS» y que se encuentre asociado al procedimiento limpiaCeldas.
5. Pruebe la aplicación ingresando el nombre del empleado, las horas trabajadas y la
tarifa por hora, luego haga clic en el botón CALCULAR.
Cap.2: Fundamentos de programación
151

ͫCaso desarrollado 6: Uso de mensajes - Conversión de grados



(°C) y la convierta a sus equivalentes en grados Fahrenheit (°F), grados Kelvin (K) y


Implemente en Excel el siguiente entorno:

Fig. 2.23 Entorno de conversión de grados

Antes de mostrar las respuestas en la hoja de Excel, muestre el siguiente mensaje


con las fórmulas siguientes:



Pasos:

1. Diseñe el modelo de la aplicación


2. Implemente los siguientes procedimientos dentro del entorno ThisWorkbook:
Aplicaciones VBA con Excel
152

Sub calculaGrados()
Dim C#
C = Range("C8").Value

Dim F#, K#, R#


F = (9 * C) / 5 + 32
R = C + 460
K = R - 187

MsgBox "Las fórmulas a usar son: " & vbNewLine & _


vbNewLine & _
"Farhenheit: 9C/5+32" & vbNewLine & _
"Rankine: C+460" & vbNewLine & _
"Kelvin: R-187"

Range("C12").Value = F
Range("C13").Value = R
Range("C14").Value = K
End Sub

Explicación del código:

Dim C#
C = Range("C8").Value

Empezamos declarando la variable Cdouble(#) en la cual almacenaremos el


valor ingresado en la celda C8.

Dim F#, K#, R#


F = (9 * C) / 5 + 32
R = C + 460
K = R - 187

Realizamos los cálculos de los montos según lo solicitado en el problema, recuerde


double(#).

MsgBox "Las fórmulas a usar son: " & vbNewLine & _


vbNewLine & _
"Farhenheit: 9C/5+32" & vbNewLine & _
"Rankine: C+460" & vbNewLine & _
"Kelvin: R-187"

Antes de mostrar los resultados en las celdas, enviamos un mensaje al usuario con
las fórmulas usadas. Aquí debemos mencionar que vbNewLine permite el cambio
de línea dentro del texto del mensaje, la"& _"
sentencia en la línea siguiente.

Range("C12").Value = F
Range("C13").Value = R
Range("C14").Value = K

Finalmente, enviamos los valores calculados a las celdas correspondientes, asegúrese


que las posiciones de las celdas resultados sean las correctas.
Cap.2: Fundamentos de programación
153

3. Desarrollador 
y que se encuentre asociado al procedimiento calculaGrados.
4. Pruebe la aplicación ingresando un valor en grados Celsius en la celda C8, luego
haga clic en el botón PROCESAR.

ͫCaso desarrollado 7: Uso de InputBox - Venta de repuestos


La empresa de venta de repuestos para automóviles Chery necesita una aplicación
que permita determinar el precio al que debe vender una pieza considerando en

precio de compra de la pieza y el porcentaje de ganancia será ingresado mediante la
función InputBox. Debe considerar los siguientes aspectos:

Implemente en Excel el siguiente entorno:

Fig. 2.24 Entorno venta de repuestos



Pasos:

1. Diseñe el modelo de la aplicación


2. Implemente los siguientes procedimientos dentro del entorno ThisWorkbook:

Sub calculaMontos()
Dim precio@
precio = Range("C9").Value

Dim porcentaje#
porcentaje = InputBox("Ingrese porcentaje de ganancia: ")

Dim montoGanancia@
montoGanancia = precio * porcentaje / 100

Dim precioVenta@
precioVenta = precio + montoGanancia
Aplicaciones VBA con Excel
154

Range("C10").Value = porcentaje / 100


Range("C11").Value = montoGanancia
Range("C13").Value = precioVenta
End Sub

Sub limpiarCeldas()
Range("C9:C11").ClearContents
Range("C13").ClearContents
Range("C9").Select
End Sub

Explicación del código:

Dim precio@
precio = Range("C9").Value

Empezamos declarando la variable precio, luego se almacena el valor registrado en


la celda C9.

Dim porcentaje#
porcentaje = InputBox("Ingrese porcentaje de ganancia: ")

La variable porcentaje recibe el valor ingresado desde la función InputBox.

Dim montoGanancia@
montoGanancia = precio * porcentaje / 100

El monto de ganancia se calcula en base al porcentaje ingresado por el usuario y el


precio de compra del repuesto.

Dim precioVenta@
precioVenta = precio + montoGanancia

El precio de venta se calcula en base al precio ingresado y el monto de ganancia.

Range("C10").Value = porcentaje / 100


Range("C11").Value = montoGanancia
Range("C13").Value = precioVenta

Finalmente, enviamos los valores resultantes a las celdas correspondientes.

3. Desarrollador
que se encuentre asociado al procedimiento calculaMontos.
4. Pruebe la aplicación ingresando un valor para el precio de compra en la celda C9,
luego haga clic en el botón PROCESAR.
Cap.2: Fundamentos de programación
155

ͫCaso desarrollado 8: Uso de funciones - Pago de vendedores




-
grama que calcule la comisión, el salario bruto, el descuento y el salario neto de un
vendedor de la empresa. Debe considerar los siguientes aspectos:

Implemente en Excel el siguiente entorno:

Fig. 2.25 Entorno de pago de vendedores

Implemente funciones necesarias para la aplicación.



Declare la constante «básico» con el valor 700.

Pasos:

1. Diseñe el modelo de la aplicación


2. Implemente las siguientes funciones dentro del entorno ThisWorkbook:

Const basico = 700


Function getMonto()
getMonto = Range("C11").Value
End Function

Function calculaComision(ByVal monto As Currency) As Currency


Dim comision@
comision = getMonto * 0.09
calculaComision = comision
End Function

Function calculaBruto(ByVal comision As Currency) As Currency


calculaBruto = basico + comision
End Function
Aplicaciones VBA con Excel
156

Function calculaDescuento(ByVal bruto As Currency) As Currency


calculaDescuento = bruto * 0.11
End Function

Function calculaNeto(ByVal bruto As Currency,


ByVal descuento As Currency) As Currency
calculaNeto = bruto - descuento
End Function

Explicación del código:

Function getMonto()
getMonto = Range("C11").Value
End Function

Función que permita obtener el monto de venta desde la celda C11.

Function calculaComision(ByVal monto As Currency) As Currency


Dim comision@
comision = getMonto() * 0.09
calculaComision = comision
End Function

Función que permite calcular el monto de comisión basado en el monto vendido,


el cual será enviado por medio del parámetro monto.

Function calculaBruto(ByVal comision As Currency) As Currency


calculaBruto = basico + comision
End Function


constante y del monto de comisión, el cual será enviado por medio del parámetro
comisión.

Function calculaDescuento(ByVal bruto As Currency) As Currency


calculaDescuento = bruto * 0.11
End Function

Función que permite determinar el monto de descuento basado en el monto bruto.

Function calculaNeto(ByVal bruto As Currency,


ByVal descuento As Currency) As Currency
calculaNeto = bruto - descuento
End Function

Finalmente, la función calculaNeto



Cap.2: Fundamentos de programación
157

3. Implemente el siguiente procedimiento dentro del entorno ThisWorkbook:

Sub calculos()
Dim monto@
monto = getMonto()

Dim comision@, bruto@, descuento@, neto@


comision = calculaComision(monto)
bruto = calculaBruto(comision)
descuento = calculaDescuento(bruto)
neto = calculaNeto(bruto, descuento)

Range("C13").Value = comision
Range("C14").Value = bruto
Range("C15").Value = descuento
Range("C16").Value = neto
End Sub

Explicación del código:

Dim monto@
monto = getMonto()

getMonto.

Dim comision@, bruto@, descuento@, neto@


comision = calculaComision(monto)
bruto = calculaBruto(comision)
descuento = calculaDescuento(bruto)
neto = calculaNeto(bruto, descuento)

Realizamos los cálculos sobre las variables comision, bruto, descuento y neto a par-


Range("C13").Value = comision
Range("C14").Value = bruto
Range("C15").Value = descuento
Range("C16").Value = neto

Finalmente, se envían los resultados en las celdas correspondientes.

4. Desarrollador 
que se encuentre asociado al procedimiento calculos.
5. Pruebe la aplicación ingresando un valor para el monto vendido en la celda C11, lue-
go haga clic en el botón PROCESAR.
Aplicaciones VBA con Excel
158

ͫCaso desarrollado 9: Uso de procedimientos - Pago de vendedores




-
grama que calcule la comisión, el salario bruto, el descuento y el salario neto de un
vendedor de la empresa. Debe considerar los siguientes aspectos:

Implemente en Excel el siguiente entorno:

Fig. 2.26 Entorno de pago de vendedores

Implemente procedimientos necesarios para la aplicación.




Pasos:

1. Diseñe el modelo de la aplicación


2. Implemente los siguientes procedimientos dentro del entorno ThisWorkbook:

Const basico = 700


Dim monto@, comision@, bruto@, descuento@, neto@

Sub getMonto()
monto = Range("C11").Value
End Sub

Sub calculaComision()
comision = monto * 0.09
End Sub

Sub calculaBruto()
bruto = basico + comision
End Sub
Cap.2: Fundamentos de programación
159

Sub calculaDescuento()
descuento = bruto * 0.11
End Sub

Sub calculaNeto()
neto = bruto - descuento
End Sub

Sub calculos()
Call getMonto
Call calculaComision
Call calculaBruto
Call calculaDescuento
Call calculaNeto

Range("C13").Value = comision
Range("C14").Value = bruto
Range("C15").Value = descuento
Range("C16").Value = neto
End Sub

Explicación del código:

Const basico = 700


Dim monto@, comision@, bruto@, descuento@, neto@

-
ción de las variables monto, comision, bruto, descuento y neto. Recuerde que la
declaración de variables globales debe realizarse fuera de los procedimientos; es así
que cada uno de los procedimientos podrá acceder a los valores almacenados de
dichas variables en cualquier momento.

Sub getMonto()
monto = Range("C11").Value
End Sub

Procedimiento que se encarga de llenar de valor la variable global monto, debe


considerar que la celda C11

Sub calculaComision()
comision = monto * 0.09
End Sub

Procedimiento que se encarga de calcular el monto de la comisión basándose en



procedimiento calculaComision debe invocarse al procedimiento getMonto.
Aplicaciones VBA con Excel
160

Sub calculaBruto()
bruto = basico + comision
End Sub

Procedimiento que permite calcular el monto bruto en base a las variables globales
básico y comision, recuerde que la variable comision fue llenada por el procedi-
miento calculaComision y que la variable basico es un valor constante.

Sub calculaDescuento()
descuento = bruto * 0.11
End Sub

Procedimiento que permite calcular el monto de descuento basado en el monto bruto.

Sub calculaNeto()
neto = bruto - descuento
End Sub

Procedimiento que permite determinar el monto neto basado en las variables glo-
bales bruto y descuento.

Sub calculos()
Call getMonto
Call calculaComision
Call calculaBruto
Call calculaDescuento
Call calculaNeto

Range("C13").Value = comision
Range("C14").Value = bruto
Range("C15").Value = descuento
Range("C16").Value = neto
End Sub

Finalmente, debemos invocar a todos los procedimientos desde otro procedimien-


to, este será el que se asocie al botón PROCESAR que se encuentra en la hoja de
Excel. Tenga en cuenta que, como las variables están dependiendo de los procedi-
mientos, estos deben ser llamados en estricto orden, ya que de otra manera algu-
nas variables quedarán vacías.

3. Desarrollador
y que se encuentre asociado al procedimiento calculos.
4. Pruebe la aplicación ingresando un valor para el monto vendido en la celda C11,
luego haga clic el botón PROCESAR.
Cap.2: Fundamentos de programación
161

2.15 Casos propuestos

ͫCaso propuesto 1: Fase de análisis del problema: Ferrocarril


Si tenemos 500 obreros trabajando en la implementación de un ferrocarril, en el que
laboran 10 horas diarias, y donde logran colocar 2300 metros de vía en 28 días; con
425 obreros trabajando a 8 horas diarias, ¿cuántos metros de vía colocarán en 42
días?

Analizando el problema, encontramos los siguientes datos:

Candad de Candad de horas Candad de


Candad de días
obreros diarias (h) metros (m)


valores Entrada-Proceso-Salida.

Entrada
Proceso

Salida

ͫCaso propuesto 2: Fase de análisis del problema: Turistas


-
chan 12 turistas?

Analizando el problema, encontramos los siguientes datos:

Candad de días de duración de la


Candad de turistas
comida
Aplicaciones VBA con Excel
162


valores Entrada-Proceso-Salida.

Entrada
Proceso

Salida

ͫCaso propuesto 3: Fase de análisis del problema: Inversión de negocio




cada uno?

Analizando el problema, encontramos los siguientes datos:

Aporte de amigo Aporte de amigo Aporte de amigo


Ganancia ($)
1 ($) 2 ($) 3 ($)


valores Entrada-Proceso-Salida.

Entrada
Proceso

Salida
Cap.2: Fundamentos de programación
163

ͫCaso propuesto 4: Expresiones aritmécas



función de cada operador y el orden de prioridad según VBA.

Expresión Resultado
A1 = 10 / 15 A1=
A2 = 10 \ 15 A2=
A3 = 10 MOD 15 A3=
A4 = 3 + 4 * 8 * 4 – (9 + 3) / 6 A4=
A5 = 3 + 4 * (8 * 4) – 9 + 3 / 6 A5=
A6 = 10 / 100 A6=
A7 = 1 ^ (1/2) A7=

ͫCaso propuesto 5: Expresiones aritmécas vs. expresiones algorítmicas




Expresión Resultado
E1 = r + 1
d

e
E2 = (x + y)

x+y
E3 =
x-y
E4 = (x + y)2 (a + b)
√x
E5 =
x+ y
2

ͫCaso propuesto 6: Financiamiento


Implemente una aplicación en VBA que permita controlar la herencia que puede reci-
bir un niño de parte de sus padres. Para esto, desean establecer un fondo de ahorro


por año compuesto, asumiendo que el interés sea semestral o trimestral?

C  = C inicial (1rn )nt



Aplicaciones VBA con Excel
164

ͫCaso propuesto 7: Tienda comercial




-



determine el importe de la compra, el importe del descuento y el importe a pagar.
Debe considerar los siguientes aspectos:

 Implemente en Excel el siguiente entorno:

Fig. 2.27 Entorno enda comercial

Implemente procedimientos para realizar los cálculos mostrados y para limpiar las
celdas.
Todas las variables usadas en la aplicación deben ser declaradas según la naturaleza
de sus valores.
3
Cap.
UserForm y objetos visuales

Capacidad
Reconoce los elementos que conforman las aplicaciones visuales de VBA como los


3.1 UserForm


punto podremos crear aplicaciones basadas en formularios e integrarlas a las hojas de
Excel de la forma que crea conveniente.

Por otra parte, podemos mencionar que los UserForm permiten una interacción integra-
UserForm en VBA:

Insertar un UserForm al libro de trabajo.


Agregar los controles visuales al UserForm.

Mediante las propiedades, modelar los controles y el mismo formulario de tal manera

que pueda ser legible para el usuario.


Agregar funciones o procedimientos a los controles.

Enlazar el formulario en la hoja de Excel mediante un botón.

Veamos un ejemplo del uso del UserForm, aquí observamos un formulario el cual solicita
datos, los cuales pueden ser enviados a una hoja de Excel o simplemente ser manejados
directamente desde el formulario.

Fig. 3.1 Entorno básico del UserForm



Aplicaciones VBA con Excel
166

En la siguiente imagen observamos los datos que se visualizarán en el formulario, la idea


principal de VBA es el uso de los datos que se encuentran en las hojas de cálculo como si
-
cia los datos, los cuales veremos en este capítulo.

Fig. 3.2 Entorno de Excel registrando datos desde VBA




3.2 Administración de UserForm en VBA


Veremos algunas funcionalidades que presentan los UserForm.

3.2.1 Agregar un UserForm


UserForm que se puede agregar sobre un proyecto.
Veamos algunas formas de agregar un UserForm desde el entorno VBA:

 Desde el menú Insertar seleccionar la opción UserForm.

 Desde el panel Explorador de Proyectos, haga clic derecho, seleccionar Insertar >
UserForm.

Fig. 3.3 Agregando un UserForm


Cap.3: UserForm y objetos visuales
167

Al agregar un Userform el Explorador de Proyectos muestra el siguiente aspecto:

Fig. 3.4 Ventana del Explorador de Proyectos

Se muestra una carpeta llamada Formularios en la cual se almacenarán todos los User-
Form que agregue al proyecto.

3.2.2 Modificar el nombre del UserForm


En vista que se pueden agregar muchos UserForm al proyecto se debe considerar el
asignar un nombre adecuado a cada UserForm
debemos seguir los siguientes pasos:

Seleccione un UserForm desde la ventana Exploradora


de Proyectos.
 Name      
nombre, se recomienda que dicho nombre inicie con
el texto «frm», tal como se muestra en la siguiente
imagen: frmPago o frmVenta.

Fig. 3.5 Propiedades del UserForm

3.2.3 Eliminar un UserForm


Debemos seguir los siguientes pasos:

Seleccione un UserForm desde la ventana Explorador de Proyectos


Haga clic derecho sobre dicho UserForm y seleccione la opción Quitar, normal-

mente está acompañado del nombre que se le asignó al UserForm.


A la pregunta: «¿Desea exportar frm antes de quitarlo?», seleccione No para elimi-


Fig. 3.6 Exportar un UserForm antes de eliminarlo


Aplicaciones VBA con Excel
168

3.2.4 Ejecutar un UserForm


 UserForm frente al
usuario. Para ejecutar podemos realizar los siguientes pasos:

Haga doble clic sobre un UserForm desde la ventana Explorador de Proyectos;


esto hará que dicho UserForm
Presione <F5> o desde el menú Ejecutar > seleccione Ejecutar o también podría-
mos ejecutar con el botón que se encuentra en la barra de herramientas es-
tándar del entorno VBA.

Por otra parte, para salir del modo de Ejecución podemos realizar las siguientes opciones:


También podríamos seleccionar el botón desde la barra de herramientas es-
tándar del entorno VBA.

3.2.5 Asociar el formulario a la hoja de Excel


En la mayoría de ocasiones un UserForm se asociará a una hoja de Excel con la idea
de enviar información o mostrar algún resultado esperado. Veamos cómo invocar un
formulario desde la hoja de Excel.

Por medio de un botón


Desarrollador, seleccione la opción botón de los Controles de for-
mulario que se encuentra dentro de Insertar y arrastre formando un cuadro en la
hoja de Excel.

Fig. 3.7 Opciones de Insertar desde la cha Desarrollador


Cap.3: UserForm y objetos visuales
169

Luego, se mostrará la siguiente ventana, desde la cual se debe seleccionar el botón


Nuevo:

Fig. 3.8 Ventana de asignación de Macro

Finalmente, debemos hacer la invocación del UserForm por medio de código VBA, el
cual se muestra en la siguiente imagen:

Fig. 3.9 Código implementado al botón

.ShowUserForm, lo con-
trario a la muestra se llama ocultar al UserForm, es decir, cuando hay varios UserForm
         
código frmVenta.Hide para administrarlo de la mejor manera.

-

y seleccione Modicar texto, quedando de la siguiente manera:

Fig. 3.10 Botón que invoca al UserForm frmVenta


Aplicaciones VBA con Excel
170

ͫPor medio de una imagen


Agregue una imagen a la hoja de Excel, luego haga clic
derecho sobre dicha imagen y seleccione Agregar ma-
cro… y los siguientes pasos son los mismos aplicados en Fig. 3.11 Imagen
Por medio de un botón. que muestra el
UserForm frmVenta

ͫPor medio de una forma


Agregue una forma a la hoja de Excel, luego haga clic de-
recho sobre dicha forma y seleccione Agregar macro…
y los siguientes pasos son los mismos aplicados en Por
medio de un botón. Fig. 3.12 Forma que
muestra el Userform
frmVenta

3.3 Tiempos en la programación



          




3.3.1 Tiempo de diseño


Se le llama así cuando el programador coloca los controles sobre el UserForm, cambia
las propiedades de dichos controles y asigna código VBA en algunos controles. Veamos
un UserForm-
pulados, es decir, se podrá mover, copiar o eliminar.

Fig. 3.13 Tiempo de diseño


Cap.3: UserForm y objetos visuales
171

3.3.2 Tiempo de ejecución


Se le llama así cuando el UserForm está preparado para la exposición frente al usuario


Fig. 3.14 Tiempo de ejecución

3.3.3 Pasar del tiempo de diseño a ejecución


-
cionar Ejecutar > Ejecutar o seleccionar el botón desde la barra de herramientas
estándar del VBA.


 UserForm o hacer clic en el botón
reestablecer desde el cuadro de herramientas estándar del VBA

3.4 Nomenclatura de nombres a objetos


Antes de pasar a explicar todos los controles que posee VBA, tenemos que considerar

User-
Form.

Asimismo, debemos mencionar que para asignar nombres de los controles existe una
   
  

Aplicaciones VBA con Excel
172

Clase Prejo Ejemplo


 frm frmVenta
 lbl lblTotal
Cuadro de Texto (TextBox) txt txtFecha
btn btnCalcular

cmd cmCalcular
Cuadro de Lista (ListBox) lst lstPaises
Cuadro combinado (ComboBox) cbo cboProductos

  


 opt optCasado
Imagen (Image) img imgFoto
Marco (Frame) fra 

3.5 Principales controles visuales y sus propiedades


Haremos una lista de los controles y sus principales propiedades:

Label TextBox
Select Objects ComboBox
ListBox


Frame
 
Image

TabStrip


RefEdit ScrollBar


Fig. 3.15 Descripción de los controles desde el cuadro de herramientas


Fuente: <http://www.globaliconnect.com/>

3.5.1 Control UserForm


Este control es el principal elemento contenedor de otros controles desde aquí podre-
mos diseñar entornos de usuario de acuerdo a la necesidad de la aplicación. Al insertar
un nuevo UserForm al proyecto debe tener en cuenta los siguientes aspectos:

Tiene un nombre inicial predeterminado llamado UserForm1.


Tiene un alto y ancho asignado de forma estándar.

-

po de diseño del UserForm y su misión es ayudar a modelar los controles conteni-


dos dentro de él.
Cap.3: UserForm y objetos visuales
173

Fig. 3.16 Aspecto inicial del UserForm

ͫOpciones de conguración del UserForm

Modicar ancho y alto del UserForm en empo de diseño: Debemos tener en


cuenta que, al crear un nuevo UserForm, este presenta un tamaño inicial el cual


Modicar el alto y ancho de la cuadricula del UserForm en empo de diseño: Des-

de el menú seleccione Herramientas > Opciones > Ficha General


las unidades de la cuadrícula según su conveniencia.

Fig. 3.17 Ventana de opciones del UserForm



(Name):Form, según la nomencla-


tura de nombres deberá empezar con frm por ejemplo frmVenta, frmPago, etc. Es
muy importante asignar un nombre al UserForm, ya que la hoja de Excel necesitara
asociarse a él y lo hará por su nombre.
Aplicaciones VBA con Excel
174

Para comprobar el nombre asignado al UserForm podría seguir los siguientes pasos:

Fig. 3.18 Ventana de propiedades del UserForm


nombre del control UserForm que el programador ha asignado, mientras que User-
Form

BackColor: UserForm, tenga en cuenta que si co-


loca una imagen de fondo el color queda rezagado, ya que se estarían superponiendo.

Fig. 3.19 Ventana de paleta de colores

 Paleta-
tras que Sistema muestra los colores propios del sistema.

BorderStyle:  UserForm


UserForm.

Capon: UserForm-


Height: UserForm.

Picture: UserForm.

Fig. 3.20 UserForm asignado con


imagen de fondo
Cap.3: UserForm y objetos visuales
175

Si desea eliminar la imagen de fondo, tendrá que presionar la tecla <Supr> sobre el
texto (mapa de bits) de la propiedad Picture.

PictureSizeMode: Propiedad que determina la forma en que la imagen se adaptará al


UserForm. Presenta las siguientes opciones:

fmPictureSizeModeClip: Imagen en modo normal


fmPictureSizeModeStretch: Imagen controlada por el tamaño del UserForm.
fmPictureSizeModeZoom: Imagen expandida en alto y ancho sobre el UserForm.

StartUpPosion: UserForm frente a la pantalla al




Width:UserForm.

3.5.2 Control Label



de UserForm

En el siguiente UserForm

Label

Fig. 3.21 UserForm de venta de productos

Label a Venta de productos, Descripción,



Aplicaciones VBA con Excel
176



(Name):Label. Según la nomencla-


tura de nombres deberá empezar con lbl, por ejemplo, lblTitulo, lblPension, etc. Se
Label


nombre, por ejemplo, lblSubtotal.

AutoSize:-
tenido del mismo.

BackColor: Permite asignar un color de fondo al marco que controla el alto y ancho del
control Label.

BackStyle:Label, tenemos:

fmBackStyleOpaque:-
lor. Este es el valor estándar.
fmBackStyleTransparent: Permite hacer transparente el contenido del marco que
controla al Label, nos sirve principalmente cuando se quiere eliminar el color de
fondo del Label.

BorderColor:
y cuando la propiedad BorderStyle se encuentre en fmBorderStyleSingle.

BorderStyle:  Label, en caso de


seleccionar fmBorderStyleNone no podrá visualizar el color del borde.

Capon: Representa el contenido textual que se muestra en el control Label, esto per-


ControlTipText: Label, este mos-



es que aparece un texto en un marco de relleno amarillo.

Enabled: Permite bloquear la selección del control Label, pero si, por estructura, dicho

diferencia es que Enabled=True muestra de color gris al control Label.

Font: La-
bel
Cap.3: UserForm y objetos visuales
177

Fig. 3.22 Cambio de fuente con la propiedad Font

ForeColor: Permite asignar de color al texto mostrado en el control Label.

TextAlign: Determina la alineación del texto con respecto al marco del control Label.

Visible: Determina si el control Label-



bien que puede hacerlo visible mediante una determinada condición.

WordWrap: Permite visualizar el texto en más de 2 líneas del objeto Label.

3.5.3 Control TextBox


También llamado «Caja de texto» o «Cuadro de texto», en la cual podemos ingresar o
registrar un valor que será usado en el código VBA; esta es la única forma de solicitar


En el siguiente UserForm TextBox:

TextBox

Fig. 3.23 UserForm de venta de productos


Aplicaciones VBA con Excel
178



(Name):TextBox, según la nomenclatu-


ra de nombres debe empezar con txt, por ejemplo, txtCandad.

BackColor:TextBox siempre y cuando la


propiedad BackStyle sea fmBackColorOpaque.

BackStyle: TextBox el cual puede ser transparente


u opaco.

BorderColor:TextBox siempre y cuando la


propiedad BorderStyle sea fmBorderStyleSingle.

BorderStyle: TextBox.

ControlTipText: -
se por encima del control TextBox.

Enabled: Permite habilitar o inhabilitar el acceso al control TextBox, normalmente se



una condición de registro. El valor estándar es Enabled=True.

Font: 
control TextBox.

ForeColor:TextBox.

Height: -



Locked: Permite bloquear y desbloquear el acceso al texto del control TextBox. Es pa-
recido al trabajo que realiza la propiedad Enabled con la diferencia que se permite
establecer el cursor dentro del control TextBox bloqueado.

MaxLength:          TextBox.
Veamos estos casos:


el acceso desde 0 a 99 años.
            MaxLen-
ght=8.
Cap.3: UserForm y objetos visuales
179

Debe tener en cuenta que la propiedad MaxLenght no realiza validaciones sobre los
    
validaciones las realizaremos más adelante con la estructura condicional If.

MulLine: Permite habilitar el ingreso de valores en varias líneas del control TextBox;

en ocasiones se usa para imprimir muchos resultados como parte de la solución de un
problema.

PasswordChar: -
sado en el control TextBox-
carar, el más común es el asterisco (*) pero eso dependerá del criterio del programador.

ScrollBars: Permite asignar barras de desplazamiento sobre la caja de texto; normal-


 MulLine se encuentre en True.
La propiedad presenta las siguientes opciones:

 0 fmScrollBarsNone (sin barras)


 1 fmScrollBarsHorizontal (solo barra horizontal)
 
 3 fmScrollBarsBoth (ambas barras)

Text: Permite asignar un valor al control TextBox, normalmente esta propiedad debe



TextAlign: Permite alinear el texto contenido en el control TextBox. Tenemos las si-
guientes opciones:

 
 2 fmTextAlignCenter
 3 fmTextAlignRight

Width:       TextBox; inicialmente, este presenta un
valor estándar para todos los controles TextBox incorporados al UserForm.

WordWrap:
propiedad MulLineTextBox.
Aplicaciones VBA con Excel
180

3.5.4 Control CommandButton


Es también llamado botón de comando por su traducción en español o simplemente
UserForm, normal-
mente está asociado a un código que lo implementará de acuerdo con la necesidad de
la aplicación.

En el siguiente UserForm





Fig. 3.24 UserForm de venta de productos

  CommandBuon a Procesar, Limpiar,


Salir.



(Name):CommandBuon, según la
nomenclatura de nombres debe empezar con btn, por ejemplo, btnProcesar, btnLim-
piar o btnSalir.

BackColor: Permite asignar un color de fondo al botón, esto se podría dar en botones


Cancel: Permite accionar un botón con la tecla <Esc>, el valor predeterminado es False;
además, dentro de un UserForm solo puede haber un botón con la propiedad Cancel=-
True.

Capon: 
que se mostrará en el botón.

ControlTipText: Permite mostrar un mensaje de apoyo al usuario al posicionar el pun-


tero del mouse encima del botón.
Cap.3: UserForm y objetos visuales
181

Default: Permite accionar un botón con la tecla <Enter>, el valor predeterminado es


False; además debemos tener en cuenta que dentro de un UserForm solo puede haber
un botón con la propiedad Default=True.

Font: 
botón de comando.

ForeColor: Permite asignar un color de texto al texto mostrado dentro del control bo-
tón de comando.

Picture:
imagen asignada puede tener diferentes posiciones dentro del botón, la cual puede ser
PicturePosion.

PicturePosion: Permite asignar una posición dentro del marco que presenta el control
botón de comando.

WordWrap: Permite la escritura de dos a más líneas dentro del control botón de co-
mando.

3.5.5 Control ListBox


-
tos una debajo de otra como un listado. Se debe tener en cuenta que cada elemento
registrado en el control ListBox        
otra, esta se llama índice.

En el siguiente UserFormListBox:

ListBox

Fig. 3.25 UserForm de venta de productos


Aplicaciones VBA con Excel
182



(Name): Es el nombre que se le asignará al control ListBox; de acuerdo con la nomen-


clatura debemos usar la palabra lst, por ejemplo, lstVendedores.

BackColor: ListBox.

ColumnCount: ListBox,
el valor predeterminado es uno.

ControlTipText: -
na el puntero del mouse encima del control ListBox.

Enabled: Permite bloquear los valores dentro del control ListBox haciendo que el usua-
rio no pueda seleccionar ningún elemento de la lista, el valor predeterminado es True.

Font: 
ListBox.

ForeColor:ListBox.

ListStyle:ListBox, tenemos
fmListStylePlain como valor predeterminado:

Fig. 3.26 fmListStylePlain

El valor fmListStyleOpon presenta la siguiente forma:

Fig. 3.27 fmListStyleOpon

MulSelect:  


ListBox, presenta las siguientes opciones:

0: fmMulSelectSingle: Es el valor predeterminado el cual permite seleccionar los


elementos del control ListBox de uno en uno.
1: fmMulSelectMul: Permite seleccionar varios elementos del control ListBox.
Cap.3: UserForm y objetos visuales
183

 2: fmMulSelectExtended: Permite seleccionar varios elementos del control List-


Box

TextAlign:ListBox.

3.5.6 Control ComboBox


Es también llamado cuadro combinado el cual presenta una lista de opciones desplega-
 ListBox.

En el siguiente UserFormComboBox:

ComboBox

Fig. 3.28 UserForm de venta de productos



(Name): Es el nombre que se le asignará al control ComboBox de acuerdo con la no-


menclatura debemos usar la palabra cbo, por ejemplo, cboDescripcion.

DropBuonStyle:            
control ComboBox, presenta las siguientes opciones:

0: fmDropbuonStylePlain

1: fmDropBuonStyleArrow

2: fmDropBuonStyleEllipsis

3: fmDropBuonStyleReduce
Aplicaciones VBA con Excel
184

3.5.7 Control Frame


Es también llamado marco, el cual permite seccionar un área dentro del control User-
Form.

En el siguiente UserFormFrame:

Frame

Fig. 3.29 UserForm de venta de productos



(Name): Es el nombre que se le asignará al control Frame en muchas ocasiones, no será


necesario asignarle un nombre a menos que necesite bloquear todo el Frame.

Capon: Frame.

Enabled: Permite bloquear todo el contenido del control Frame, el valor predetermi-
nado es True.

Font:            
Frame.

3.5.8 Control OptionButton


Es también llamado botón de opción, el cual permite asignar opciones predetermina-

de las opciones como, por ejemplo, el estado civil de un empleado.

En el siguiente UserFormOponBuon:
Cap.3: UserForm y objetos visuales
185



Fig. 3.30 UserForm de venta de productos



(Name): Es el nombre que se le asignará al control OponBuon; según la nomencla-


tura debe iniciar con la palabra «opt» como, por ejemplo, optCredito u optContado.

Capon: OponBuon.

3.5.9 Control CheckBox



opciones predeterminadas en una aplicación, pero la diferencia con el control Opon-
Buon es que se pueden seleccionar más de dos opciones, como, por ejemplo, selec-
cionar las preferencias de un usuario.

En el siguiente UserForm



Fig. 3.31 UserForm de venta de productos


Aplicaciones VBA con Excel
186



(Name): Es el nombre que se le asignará al control CheckBox según la nomenclatura


chkDescuento.

Capon:CheckBox.

3.5.10 Control de imagen


Este control permite incorporar una imagen como un control común dentro del User-
Form.

En el siguiente UserFormImage:

Image

Fig. 3.32 UserForm de venta de productos



(Name): Es el nombre que se le asignará al control Image; según la nomenclatura debe



será necesaria asignar un nombre.

Picture: 

el marco del control ImagePictureSi-
zeMode.

PictureAlignment: Permite alinear la imagen que se encuentra dentro del marco del
control Image.

PictureSizeMode: Permite adaptar el tamaño de la imagen frente al marco del control


Image.
Cap.3: UserForm y objetos visuales
187

3.6 Agregar los controles visuales al UserForm


Añadir un control visual al UserForm permite dar solución a una determinada aplicación,

los controles del UserForm

UserForm:

Arrastrar desde el cuadro de herramientas hacia el UserForm, permite agregar un


solo control.
Si presiona doble sobre un control desde el cuadro de herramientas podrá agregar

UserForm, de tal forma


que cuando termine de añadir los controles necesarios, debe seleccionar el control
Seleccionar objetos que se encuentra al inicio del cuadro de herramientas; esto hará

UserForm, podrá duplicarlos presio-

nando la tecla <CTRL> y sin soltar arrastrar por el UserForm.

3.7 Ventana de Código



que podemos hacer uso de toda la funcionalidad VBA, esta ventana es única para todo


Fig. 3.33 Ventana de código

Presenta algunas partes que debemos considerar ya que será nuestra plataforma de có-
digo de VBA.

 Listado de controles , desde aquí podemos seleccionar cual-


quier control agregado al UserForm.
 Listado de eventos , desde aquí podemos seleccionar algún
evento del control seleccionado desde la lista de controles.

Cuando se selecciona un determinado control y un evento; el bloque de código se pre-


senta de la siguiente manera:
Private Sub UserForm_Click()
'Código del procedimiento
End Sub
Aplicaciones VBA con Excel
188

Donde:

Private: Es la visibilidad del procedimiento, de forma predeterminada siempre apa-


recera private en cada uno de los controles.
Sub: Indica el inicio del procedimiento.
UserForm: Es el nombre del control en la cual se programará el código VBA.
Click: Es el evento seleccionado para un determinado control; este evento se apli-

Código del procedimiento: Es el código VBA que presenta un determinado control.

End Sub:

Cuando se presente demasiado código dentro del contenedor podemos resumirlo,


mostrando un solo procedimiento o mostrando todos mediante el botón .

3.8 Casos desarrollados

ͫCaso desarrollado 1: Control de registro de usuarios


Implemente una aplicación que permita registrar los datos de los usuarios para lo
cual se deberá ingresar los apellidos, nombres, DNI y contraseña, asimismo debemos
tener en cuenta los siguientes aspectos:

Implemente en Excel el siguiente entorno:

Fig. 3.34 Registro de usuarios en Excel


Cap.3: UserForm y objetos visuales
189

Implemente el siguiente UserForm:

Fig. 3.35 Userform de registro de usuarios


cinco caracteres numéricos y llenando con ceros el lado izquierdo.
Implemente un procedimiento para limpiar los controles colocados dentro del
UserForm.
Implemente un procedimiento para asignar un borde a las celdas una vez registra-
do los datos en Excel.


esto hará que se pueda agregar usuarios uno debajo de otro como un listado.


Pasos:

1. Diseñe el modelo de la aplicación tanto en la hoja de Excel como en el UserForm.


2. Asigne las propiedades a los siguientes controles:

(Name) frmRegistro

 
Label1  
Label2  
Label3 (Name) lblNumero
Label4  
Label5  
Label6  
Label7  
(Name) btnRegistrar


Default True
Picture Grabar.gif
Aplicaciones VBA con Excel
190

(Name) btnNuevo
 
Picture Nuevo.gif
(Name) btnAnular
 
Picture Anular.gif
(Name) btnSalir


Cancel True
Picture Salir.gif
TextBox1 (Name) txtApellidos
TextBox2 (Name) txtNombres
(Name) txtDNI
TextBox3
MaxLenght 8
(Name) txtContraseña
TextBox4 MaxLenght 4
PasswordChar *

3. Implemente los siguientes códigos dentro del UserForm:

Dim uFila%
Private Sub btnAnular_Click()
Call limpiaControles
End Sub

Private Sub btnNuevo_Click()


uFila = determinaUltimaFila()
lblNumero.Caption = Format(uFila - 9, "00000")
Call limpiaControles
End Sub

Private Sub btnRegistrar_Click()


Dim numero$, dni$, apellido$, nombres$, clave$
numero = lblNumero.Caption
dni = txtDni.Text
apellidos = txtApellidos.Text
nombres = txtNombres.Text
clave = txtClave.Text

Cells(uFila, 2).Value = numero


Cells(uFila, 3).Value = dni
Cells(uFila, 4).Value = UCase(apellidos) & Space(1) &
UCase(nombres)
Cells(uFila, 5).Value = clave
Call borde
End Sub

Private Sub btnSalir_Click()


Unload Me
End Sub

Private Sub UserForm_Activate()


uFila = determinaUltimaFila()
lblNumero.Caption = Format(uFila - 9, "00000")
End Sub
Cap.3: UserForm y objetos visuales
191

Function determinaUltimaFila() As Integer


uFila=Sheets(1).Cells(Rows.Count,2).End(xlUp).Offset(1,0).Row
determinaUltimaFila = uFila
End Function

Sub limpiaControles()
txtApellidos.Text = ""
txtNombres.Text = ""
txtDni.Text = ""
txtClave.Text = ""
txtApellidos.SetFocus
End Sub

Sub borde()
Range(Cells(uFila, 2), Cells(uFila, 5)).Select
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ThemeColor = 1
.TintAndShade = -0.249946592608417
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ThemeColor = 1
.TintAndShade = -0.249946592608417
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.ThemeColor = 1
.TintAndShade = -0.249946592608417
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ThemeColor = 1
.TintAndShade = -0.249946592608417
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.ThemeColor = 1
.TintAndShade = -0.249946592608417
End With
Cells(uFila, 2).Select
End Sub

Explicación del código:

Dim uFila%
Private Sub UserForm_Activate()
uFila = determinaUltimaFila()
lblNumero.Caption = Format(uFila - 9, "00000")
End Sub

Empezamos por declarar de forma global la variable uFila; esto se debe a que cuando
-
claración global implica que todos los procedimientos o funciones podrán acceder al
valor de dicha variable.
Aplicaciones VBA con Excel
192

Seguidamente, implementamos código en el evento Acvate del control UserForm,


esto se realizó para que, al iniciar el UserForm, nos muestre el código autogenerado.
La variable global invoca a la función determinaUlmaFila-
ro exacto en la que debe registrarse el nuevo usuario. La función Format permite
              
rellenando con ceros. La expresión uFila - 9 se debe a que en la hoja de Excel los
uFila
restarle 9 nos quedará el número de usuario; de la misma manera, ocurrirá si ya se

Function determinaUltimaFila() As Integer
uFila=Sheets(1).Cells(Rows.Count,2).End(xlUp).Offset(1,0).Row
determinaUltimaFila = uFila
End Function



      
cambiar el valor 2 que se encuentra en Cells(Rows.Count,2), ya que dicho valor de-


Sub limpiaControles()
txtApellidos.Text = ""
txtNombres.Text = ""
txtDni.Text = ""
txtClave.Text = ""
txtApellidos.SetFocus
End Sub

Procedimiento que permite limpiar todos los controles del UserForm, las comillas
dobles sin ningún valor determinan la limpieza del control TextBox, mientras que
SetFocus

Sub borde()
Range(Cells(uFila, 2), Cells(uFila, 5)).Select
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ThemeColor = 1
.TintAndShade = -0.249946592608417
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ThemeColor = 1
.TintAndShade = -0.249946592608417
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.ThemeColor = 1
.TintAndShade = -0.249946592608417
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ThemeColor = 1
Cap.3: UserForm y objetos visuales
193

.TintAndShade = -0.249946592608417
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.ThemeColor = 1
.TintAndShade = -0.249946592608417
End With
Cells(uFila, 2).Select
End Sub

Procedimiento que se encarga de agregar bordes a las celdas con los datos del nuevo

lo capturamos con el siguiente código Range(Cells(uFila, 2), Cells(uFila, 5)).Select,
todo el código siguiente es para designar a qué borde se agregará una línea.

Private Sub btnRegistrar_Click()


Dim numero$, dni$, apellido$, nombres$, clave$
numero = lblNumero.Caption
dni = txtDni.Text
apellidos = txtApellidos.Text
nombres = txtNombres.Text
clave = txtClave.Text

Cells(uFila, 2).Value = numero


Cells(uFila, 3).Value = dni
Cells(uFila, 4).Value = UCase(apellidos) & Space(1) &
UCase(nombres)
Cells(uFila, 5).Value = clave
Call borde
End Sub

Para llegar a este procedimiento debemos hacer doble clic sobre el botón Registrar
que se encuentra en el UserForm; con esto indicamos que la cabecera de este proce-


Empezamos por capturar los datos desde los controles, recuerde que siempre de-
bemos declarar todas las variables usadas en el código VBA; la forma de capturar un
valor desde el control TextBox es variable = TextBox.Text, la propiedad Text captura


-
tencia Cells(uFila,2).Value=numero
  Space(1) permite dejar un espacio entre los
apellidos y los nombres del nuevo usuario.

Finalmente, se invoca al procedimiento borde que se encargará de colocar un borde


de color gris sobre los nuevos datos agregados a la hoja de Excel.
Aplicaciones VBA con Excel
194

Private Sub btnAnular_Click()


Call limpiaControles
End Sub

Para llegar a este procedimiento se presionó doble clic sobre el botón Anular el cual

       -
miento limpiaControles.

Private Sub btnNuevo_Click()


uFila = determinaUltimaFila()
lblNumero.Caption = Format(uFila - 9, "00000")
Call limpiaControles
End Sub

Para llegar a este procedimiento debemos hacer doble clic sobre el botón Nuevo, el

con el mismo formato inicial.

Private Sub btnSalir_Click()


Unload Me
End Sub

Para llegar a este procedimiento debemos hacer doble clic sobre el botón Salir el
UserForm
Unload Me.

4. Desarrollador seleccione el botón Nuevo, asigne el


siguiente código:
Sub Botón2_Haga_clic_en()
frmRegistro.Show
End Sub



5. Pruebe la aplicación haciendo clic sobre el botón Formulario de registro.


Cap.3: UserForm y objetos visuales
195

ͫCaso desarrollado 2: Registro de pago a vendedores





bruto. Diseñe un programa que calcule la comisión, el monto bruto, monto de des-
cuento y el monto neto de un vendedor de la empresa. Debe considerar los siguien-
tes aspectos:

Implemente en Excel el siguiente entorno:

Fig. 3.36 Registro de pago a vendedores en Excel

Implemente el siguiente UserForm.

Fig. 3.37 Entorno de pago de vendedores

Implemente un botón de proceso que permita determinar el resumen de pago


mostrando así el nombre del vendedor, el monto de comisión, monto bruto, monto
de descuento y el monto neto a recibir.
Implemente un botón que envíe toda la información resultante a la hoja de Excel,

de registro.
Aplicaciones VBA con Excel
196


Implemente un procedimiento que permita limpiar los controles contenidos en el



Pasos:

1. Diseñe el modelo de la aplicación tanto en la hoja de Excel como en el UserForm.


2. Asigne las propiedades a los siguientes controles:

(name) frmPago

 
Label1  
Label2  
Label3 (Name) MONTO TOTAL VENDIDO
(Name) btnProcesar
 
 


 


 
(Name) btnSalir
 
Cancel True
TextBox1 (Name) txtVendedor
TextBox2 (Name) txtMonto
ListBox (Name) lstR

3. Implemente los siguientes códigos dentro del UserForm:

Const basico = 700


Dim vendedor$, monto@, comision@, bruto@, descuento@, neto@

Function determinaUltimaFila() As Integer


Dim uFila%
uFila=Sheets(1).Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Row
determinaUltimaFila = uFila
End Function

Sub limpiarControles()
txtVendedor.Text = ""
txtMonto.Text = ""
lstR.Clear
txtVendedor.SetFocus
End Sub

Private Sub btnProcesar_Click()


Cap.3: UserForm y objetos visuales
197

vendedor = txtVendedor.Text
monto = CCur(txtMonto.Text)

comision = monto * 0.09


bruto = basico + comision
descuento = bruto * 0.11
neto = bruto - descuento

lstR.AddItem "** RESUMEN DE PAGO **"


lstR.AddItem "VENDEDOR: " & vendedor
lstR.AddItem "COMISION: $ " & Format(comision, "0.00")
lstR.AddItem "------------------------------------------------"
lstR.AddItem "MONTO BRUTO: $ " & Format(bruto, "0.00")
lstR.AddItem "MONTO DESCUENTO: $ " & Format(descuento, "0.00")
lstR.AddItem "MONTO NETO: $ " & Format(neto, "0.00")
End Sub

Private Sub btnLimpiar_Click()


Call limpiarControles
End Sub

Private Sub btnExcel_Click()


Dim uFila%
uFila = determinaUltimaFila

Sheets(1).Cells(uFila, 2).Value = uFila - 11


Sheets(1).Cells(uFila, 3).Value = Date
Sheets(1).Cells(uFila, 4).Value = UCase(vendedor)
Sheets(1).Cells(uFila, 5).Value = monto
Sheets(1).Cells(uFila, 6).Value = comision
Sheets(1).Cells(uFila, 7).Value = bruto
Sheets(1).Cells(uFila, 8).Value = descuento
Sheets(1).Cells(uFila, 9).Value = neto
Call limpiarControles
End Sub

Private Sub btnSalir_Click()


Unload Me
End Sub

Explicación del código:


Const basico = 700
Dim vendedor$, monto@, comision@, bruto@, descuento@, neto@


el nombre del vendedor, monto vendido, monto de comisión, monto bruto, monto
             
«Enviar a Excel».

Function determinaUltimaFila() As Integer


Dim uFila%
uFila=Sheets(1).Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Row
determinaUltimaFila = uFila
End Function



Aplicaciones VBA con Excel
198

Sub limpiarControles()
txtVendedor.Text = ""
txtMonto.Text = ""
lstR.Clear
txtVendedor.SetFocus
End Sub

Procedimiento que permite limpiar todos los controles usados en el UserForm.

Private Sub btnProcesar_Click()


vendedor = txtVendedor.Text
monto = CCur(txtMonto.Text)

comision = monto * 0.09


bruto = basico + comision
descuento = bruto * 0.11
neto = bruto - descuento

lstR.AddItem "** RESUMEN DE PAGO **"


lstR.AddItem "VENDEDOR: " & vendedor
lstR.AddItem "COMISION: $ " & Format(comision, "0.00")
lstR.AddItem "------------------------------------------------"
lstR.AddItem "MONTO BRUTO: $ " & Format(bruto, "0.00")
lstR.AddItem "MONTO DESCUENTO: $ " & Format(descuento, "0.00")
lstR.AddItem "MONTO NETO: $ " & Format(neto, "0.00")
End Sub

Llegamos a este procedimiento haciendo doble clic sobre el botón Procesar desde
el UserForm. Empezamos el código capturando el nombre del vendedor así como
el monto vendido, hay que tener en cuenta que el monto es un valor monetario que
CCur cuando se envía dicho valor a la variable.

Luego, calculamos los montos según el criterio del problema y terminamos el proceso
enviando toda la información al control ListBox, debemos tener en cuenta, que Ad-
dItem permite agregar un elemento a la lista; el símbolo & permite concatenar dos
elementos ya sean numéricos o textuales y la función Format
de moneda a los montos.

Private Sub btnLimpiar_Click()


Call limpiarControles
End Sub

Llegamos a este procedimiento haciendo doble clic sobre el botón Limpiar desde el
UserForm. El cual invoca al procedimiento limpiarControles que es el encargado de
dejar limpios los controles para un nuevo registro de valores en el UserForm.
Cap.3: UserForm y objetos visuales
199

Private Sub btnExcel_Click()


Dim uFila%
uFila = determinaUltimaFila

Sheets(1).Cells(uFila, 2).Value = uFila - 11


Sheets(1).Cells(uFila, 3).Value = Date
Sheets(1).Cells(uFila, 4).Value = UCase(vendedor)
Sheets(1).Cells(uFila, 5).Value = monto
Sheets(1).Cells(uFila, 6).Value = comision
Sheets(1).Cells(uFila, 7).Value = bruto
Sheets(1).Cells(uFila, 8).Value = descuento
Sheets(1).Cells(uFila, 9).Value = neto
Call limpiarControles
End Sub

Llegamos a este procedimiento haciendo doble clic sobre el botón Enviar a Excel des-
de el UserForm. El cual permite enviar toda la información obtenida en el UserForm

donde enviaremos todos los valores. La función DATE devuelve la fecha actual obte-
UCase
nombre del vendedor; cada vez que se envíe los datos a Excel se deberá limpiar los
controles para un nuevo registro, es por eso que se invoca al procedimiento limpiar-
Controles.

Private Sub btnSalir_Click()


Unload Me
End Sub

Finalmente, llegamos a este procedimiento haciendo doble clic sobre el botón Salir
desde el UserForm, el cual permite salir de la aplicación.
4
Cap.
Funciones VBA

Capacidad
Implementa aplicaciones VBA haciendo uso de las principales funciones VBA como las
cadenas, numéricas, fechas y comprobaciones de valor.

4.1 Introducción a las funciones




De la misma manera, VBA ofrece un conjunto de funciones que podrán ser usadas en
cualquier aplicación que use el código VBA, estos se dividen en categorías como funcio-
nes de texto, fecha, numéricos, etc.

4.1.1 Funciones para cadena de caracteres


String, veremos a


ASC: Devuelve el código ASCII de un determinado carácter. ASCII es el acrónimo en in-


glés de American Standard Code for Informaon Interchange, es decir, Código Están-
dar Estadounidense para el Intercambio de Información, es un código de caracteres


Veamos una aplicación que permita mos-


trar las letras del abecedario y su código
ListBox.

Formulario propuesto:

Fig. 4.1 Listado de códigos ASCII


Aplicaciones VBA con Excel
202

Código VBA:

Private Sub btnListar_Click()


Dim letrasMayusculas As Variant
letrasMayusculas=Array("A","B","C","D","E","F","G","H","I","J", _
"K","L","M","N","O","P","Q","R","S","T", _
"U","V","W","X","Y","Z")
lstCodigos.ColumnCount = 2
For i = 0 To 25
lstCodigos.AddItem letrasMayusculas(i)
lstCodigos.List(i, 1) = Asc(letrasMayusculas(i))
Next
End Sub

Explicando el código implementado:


Dim letrasMayusculas As Variant
letrasMayusculas = Array("A","B","C","D","E","F","G","H","I","J", _
"K","L","M","N","O","P","Q","R","S","T", _
"U","V","W","X","Y","Z")

Declaramos la variable letrasMayusculasVariant ya que soporta valores del


Arreglo (un arreglo es un conjunto de elementos del mismo, almacenados en un
sola variable). Luego almacenamos las letras del abecedario usando la función Array
que se encargará de llenar el arreglo con dichos elementos, recuerde que deben ser
enviados en forma de cadena, es por eso que cada letra debe ir encerrada entre co-
millas dobles y separadas por comas.


en la línea posterior, si quiere evitar algún error de interpretación, entonces escríbalo
en una sola línea eliminando para este caso las líneas inferiores agregadas.
lstCodigos.ColumnCount = 2

Sentencia que permite dividir el control ListBox en dos columnas, la primera mostrar
la letra y la segunda su código ASCII.
For i = 0 To 25
lstCodigos.AddItem letrasMayusculas(i)
lstCodigos.List(i, 1) = Asc(letrasMayusculas(i))
Next

La estructura For se encargará de recorrer por cada una de las letras almacenadas en
el arreglo con la intención de mostrar su código ASCII en pocas líneas de código. Hay
que tener en cuenta que el control ListBox
enviarán por medio de la propiedad AddItem; para mandar información a la segunda
columna usaremos lstCodigos.List(i, 1) donde i
a la segunda columna.


enviamos todos los elementos del arreglo letrasMayusculas.
Cap.4: Funciones VBA
203

Chr: La función Chr actúa a la inversa de la función Asc, esto quiere decir, que ingre-


sando un número nos devolverá el carácter asociado desde la tabla ASCII.

Veamos una aplicación que permita mostrar los códigos ASCII del 0 al 255 y su carác-
ter asociado en un control ListBox.

Formulario propuesto:

Fig. 4.2 Listado de códigos ASCII

Código VBA:

Private Sub btnListar_Click()


lstCodigos.ColumnCount = 2
For i = 0 To 255
lstCodigos.AddItem i
lstCodigos.List(i, 1) = Chr(i)
Next
End Sub

Explicando el código implementado:

lstCodigos.ColumnCount = 2

ListBox, la primera columna mostrará los nú-


meros del 0 al 255, mientras que la segunda columna presentará el carácter asociado.

For i = 0 To 255
lstCodigos.AddItem i
lstCodigos.List(i, 1) = Chr(i)
Next

Recorremos por los 256 números y estos serán impresos en la primera columna,
mientras que en la segunda enviamos el carácter mediante la función Chr y el valor
de la variable i
lstCodigos.List(i, 1).
Aplicaciones VBA con Excel
204

Format: 
monetario, decimal, fecha o porcentaje.

-


mato Format(valor, "Currency").


     -


guiente formato Format(monto, "Standard").



Format(IVA, "Percent").
-

ta como Format(d, "Long Date").





presenta como MsgBox Format(d, "Medium Date").


-


senta como Format(d, "Short Date").

Veamos una aplicación que permita ingresar un valor numérico que sea expresado en
el formato Currency, Estándar y Percent, además de ingresar una fecha para que sea
expresado en fecha larga, mediana y corta en un control ListBox.

Formulario propuesto:

Fig. 4.3 Manejo de la función Format

Código VBA:

Private Sub btnFormatos_Click()


Dim n%, fecha As Date
n = CInt(txtNumero.Text)
fecha = CDate(txtFecha.Text)

lstR.AddItem "**RESUMEN DE FORMATOS**"


lstR.AddItem "MONEDA: " & Format(n, "Currency")
lstR.AddItem "ESTANDAR: " & Format(n, "Standard")
Cap.4: Funciones VBA
205

lstR.AddItem "ESTANDAR: " & Format(n, "0.00")


lstR.AddItem "------------------------------------------"
lstR.AddItem "PORCENTAJE: " & Format(n, "Percent")
lstR.AddItem "------------------------------------------"
lstR.AddItem "FECHA LARGA: " & Format(fecha, "Long Date")
lstR.AddItem "FECHA MEDIANA: " & Format(fecha, "Medium Date")
lstR.AddItem "FECHA CORTA: " & Format(fecha, "Short Date")
End Sub

Explicando el código implementado:

Dim n%, fecha As Date


n = CInt(txtNumero.Text)
fecha = CDate(txtFecha.Text)

Empezamos por obtener los valores desde el control txtNumero y txtFecha, recuerde

la función CInt convierte de cadena a número y CDate convierte una cadena en el
formato de fecha.

lstR.AddItem "**RESUMEN DE FORMATOS**"


lstR.AddItem "MONEDA: " & Format(n, "Currency")
lstR.AddItem "ESTANDAR: " & Format(n, "Standard")
lstR.AddItem "ESTANDAR: " & Format(n, "0.00”)
lstR.AddItem "------------------------------------------"
lstR.AddItem "PORCENTAJE: " & Format(n, "Percent")
lstR.AddItem "------------------------------------------"
lstR.AddItem "FECHA LARGA: " & Format(fecha, "Long Date")
lstR.AddItem "FECHA MEDIANA: " & Format(fecha, "Medium Date")
lstR.AddItem "FECHA CORTA: " & Format(fecha, "Short Date")

ListBox, tenga

formato Estándar es exactamente igual que "0.00".

LCase:  




formato es LCase(Cadena).
Ucase: 


formato es UCase(Cadena).
Len: Función que permite determinar el número de caracteres contenido en una ca-



formato es Len(Cadena).
Le: Función que permite capturar un número determinado de letras del lado iz-


quierdo de una cadena de caracteres. Su formato es Le(Cadena).


Right: Función que permite capturar las letras contenidas desde el lado derecho de
una cadena de caracteres. Su formato es Right(Cadena).
Ltrim: Función que permite eliminar los espacios en blanco que se encuentren en el

lado izquierdo de una cadena de caracteres. Su formato es Ltrim(Cadena).


Aplicaciones VBA con Excel
206

Rtrim: Función que permite eliminar los espacios en blanco del lado derecho de una
determinada cadena de caracteres. Su formato es Rtrim(Cadena).
Trim: Función que permite eliminar los espacios en blanco de ambos lados de la ca-
dena de caracteres. Su formato es Trim(Cadena).
Space:
dentro de una cadena de caracteres. Su formato es Space(Candad de espacios).

Veamos una aplicación que permita ingresar los apellidos, nombres y fecha de naci-
 
electrónico se compone de la primera letra de su nombre y las cuatro primeras letras
de los apellidos. Debe tener en cuenta que el correo debe ser expresado en minúsculas
y eliminar los espacios en blanco que pudiera tener los apellidos y nombres.

En el caso del código se inicia con el año actual, las cuatro primeras letras de sus apelli-


Formulario propuesto:

Fig. 4.4 Manejo de las funciones de cadena

Código VBA:

Private Sub btnGenerar_Click()


Dim apellidos$, nombres$, fecha As Date
apellidos = Trim(txtApellidos.Text)
nombres = Trim(txtNombres.Text)
fecha = CDate(txtFechaNac.Text)

Dim email$, codigo$


email = LCase(Left(nombres, 1) & Left(apellidos, 4)) & "_" &
Right(fecha, 2) & "@miempresa.com"
codigo = Year(Date) & "_" & UCase(Left(apellidos, 4)) & "_" &
Right(fecha, 2)
lblEmail.Caption = email
lblCodigo.Caption = codigo
End Sub
Cap.4: Funciones VBA
207

Explicando el código implementado:

Dim apellidos$, nombres$, fecha As Date


apellidos = Trim(txtApellidos.Text)
nombres = Trim(txtNombres.Text)
fecha = CDate(txtFechaNac.Text)

Capturamos los apellidos, nombres y la fecha de nacimiento, recuerde que debe con-
    CDate. A la vez quitamos los espacios en blanco que
pudiera ingresar el usuario en los apellidos y nombres.

Dim email$, codigo$


email = LCase(Left(nombres, 1) & Left(apellidos, 4)) & "_" &
Right(fecha, 2) & "@miempresa.com"
codigo = Year(Date) & "_" & UCase(Left(apellidos, 4)) & "_" &
Right(fecha, 2)

-
cación. Recuerde que el símbolo & permite unir dos o más elementos y la función
Year(Date) captura el año actual.

lblEmail.Caption = email
lblCodigo.Caption = codigo

Finalmente, imprimiremos el correo electrónico y el codigo generado.

4.1.2 Funciones numéricas


Integer, Double,
Single o Currency   
aplicación:

Abs: -
vo. Su formato es Abs(Numero).
Sin: Función que permite devolver el seno de un número entero o real. Su formato

es Sin(Numero).
Cos: Función que permite devolver el coseno de un número entero o real. Su formato

es Cos(Numero).
Tan: Función que permite devolver la tangente de un número entero o real. Su for-


mato es Tan(Numero).
Sqr: Función que permite devolver la raíz cuadrada de un número entero. Su formato
es Sqr(Numero).
Fix: Función que permite devolver el valor entero redondeando al exceso a un núme-

ro real. Su formato es Fix(Numero).


Hex: Función que permite devolver un valor entero en un valor hexadecimal. Su for-


mato es Hex(Numero).
Aplicaciones VBA con Excel
208

Int: Función que permite devolver solo la parte entera de una operación, expresión o
número. Tenga en cuenta que esta función no redondea el valor, solo captura la parte
entera.
Log: Función que permite devolver el logaritmo natural de un número entero en base e.
Rnd: Función que permite devolver un número aleatorio entre 0 y 1, pero nosotros
    -
      
adelantaremos un poco este tema:

Por ejemplo, se necesita imprimir por medio de mensajes al usuario 10 números alea-
torios entre 20 y 40.

Sub Aleatorio()
Dim inicio%
inicio = 20
Dim tope%
tope = 40
For i = 1 To 10
MsgBox Int((tope - inicio + 1) * Rnd + inicio)
Next
End Sub

Veamos una aplicación que permita calcular el módulo de un vector para lo cual de-


fórmula es como sigue:



Formulario propuesto:

Fig. 4.5 Manejo de las funciones numéricas


Cap.4: Funciones VBA
209

Código VBA:

Private Sub btnProcesar_Click()


Dim i#, j#, k#
i = CDbl(txtI.Text)
j = CDbl(txtJ.Text)
k = CDbl(txtK.Text)

Dim modulo#
modulo = (Abs(i) ^ 2 + Abs(j) ^ 2 + Abs(k) ^ 2) ^ (0.5)

lstR.AddItem "MODULO DEL VECTOR"


lstR.AddItem "Primer valor: " & Abs(i) ^ 2
lstR.AddItem "Segundo valor:" & Abs(j) ^ 2
lstR.AddItem "Tercer valor: " & Abs(k) ^ 2
lstR.AddItem "----------------------------------"
lstR.AddItem "Modulo del vector es: " & modulo
End Sub

Explicando el código implementado:


Dim i#, j#, k#
i = CDbl(txtI.Text)
j = CDbl(txtJ.Text)
k = CDbl(txtK.Text)

Obtenemos los valores desde los controles Textbox. Debe tener en cuenta que los

eso son declarados como Double

Dim modulo#
modulo = (Abs(i) ^ 2 + Abs(j) ^ 2 + Abs(k) ^ 2) ^ (0.5)

 
con la función Abs y el símbolo ^ para elevar a la N potencia un valor numérico. Hay
que tener en cuenta que para obtener la raíz cuadrada del valor debemos elevar la
suma a la 0.5 o ½.
lstR.AddItem "MODULO DEL VECTOR"
lstR.AddItem "Primer valor: " & Abs(i) ^ 2
lstR.AddItem "Segundo valor:" & Abs(j) ^ 2
lstR.AddItem "Tercer valor: " & Abs(k) ^ 2
lstR.AddItem "----------------------------------"
lstR.AddItem "Modulo del vector es: " & modulo

Finalmente, se imprimen los valores en el control ListBox.

Si queremos obtener la raíz cuadrada con la función SQR el código podría ser de la si-
guiente manera: modulo = Sqr(Abs(i) ^ 2 + Abs(j) ^ 2 + Abs(k) ^ 2).


siguiente código para su impresión: lstR.AddItem «Modulo del vector es: « & Round(-
modulo, 3)
en la respuesta.
Aplicaciones VBA con Excel
210

4.1.3 Funciones de fecha


Date, veremos a


Date: Función que permite devolver la fecha actual del sistema. Su formato es Date.
DateAdd: -
 
función DateAdd.

Intervalo de Fecha Formato


"d" Día
"y" Año
"h" Hora
"n" Minuto
"m" Mes
"q" Trimestre
"s" Segundo
"w" Semana
"ww" Semana del calendario
"yyyy" Año

      




DateDi: Función que permite devolver la diferencia entre 2 fechas esta se puede dar
en días, meses o años.
DatePart: Función que permite devolver parte de una determinada fecha como el
mes, año, etc. Si necesitamos el mes actual, el código sería DatePart("m", Date).
Year: Función que permite devolver el año de una determinada fecha. Si necesitamos
obtener el año actual, el código sería Year(Date)
fecha, el código podría ser Year(Fecha).
Month: Función que permite devolver el mes de una determinada fecha. Si necesita-

mos el número de mes actual, el código sería Month(Date).


Day: Función que permite devolver el día de una determinada fecha. Si necesitamos
el número del día actual, el código sería Day(Date).
Hour:-
mos capturar la hora actual, el código sería Hour(Time).
Minute:        
necesitamos obtener los minutos de la hora actual, el código sería Minute(Time).
Cap.4: Funciones VBA
211

Second: 


Se-
cond(Time).
Now: Función que permite devolver la fecha actual del sistema. Su formato es Now.


Time: Función que permite devolver la hora actual del sistema. Su formato es Time.


WeekDay: Función que permite devolver el número correspondiente al día de la se-




mana de una determinada fecha. Si necesitamos obtener el número de día en la


semana actual, el código sería WeekDay(Date).

Debemos tener en cuenta que el número de día para VBA es considerado de la siguien-
te manera:

0 Domingo
 4 Jueves
1 Lunes
 5 Viernes
2 Martes
 6 Sábado
3 Miércoles


Veamos una aplicación que permita mostrar el monto mensual y las fechas de pago
para un préstamo, para lo cual, se deberá ingresar el nombre del cliente y el monto
prestado, y por medio de opciones se debe seleccionar las letras de pago para 3, 6 o 9
cuotas. Debemos tener en cuenta que al seleccionar directamente la opción se mostra-
rán los datos solicitados tal como se muestra en la siguiente imagen:

Formulario propuesto:

Fig. 4.6 UserForm de generación de fechas con DateAdd


Aplicaciones VBA con Excel
212

Código VBA:

Private Sub opt3_Click()


Dim monto@
monto = getMonto

lstR.Clear
lstR.AddItem "**RESUMEN DE PAGO Y FECHAS**"
lstR.AddItem "MONTO MENSUAL $ " & Format(monto / 3, "0.00")
lstR.AddItem "-----------------------------------------------"
lstR.AddItem DateAdd("m", 1, Date)
lstR.AddItem DateAdd("m", 2, Date)
lstR.AddItem DateAdd("m", 3, Date)
End Sub

Private Sub opt6_Click()


Dim monto@
monto = getMonto

lstR.Clear
lstR.AddItem "**RESUMEN DE PAGO Y FECHAS**"
lstR.AddItem "MONTO MENSUAL $ " & Format(monto / 6, "0.00")
lstR.AddItem "-----------------------------------------------"
lstR.AddItem DateAdd("m", 1, Date)
lstR.AddItem DateAdd("m", 2, Date)
lstR.AddItem DateAdd("m", 3, Date)
lstR.AddItem DateAdd("m", 4, Date)
lstR.AddItem DateAdd("m", 5, Date)
lstR.AddItem DateAdd("m", 6, Date)
End Sub

Private Sub opt9_Click()


Dim monto@
monto = getMonto

lstR.Clear
lstR.AddItem "**RESUMEN DE PAGO Y FECHAS**""
lstR.AddItem "MONTO MENSUAL $ " & Format(monto / 9, "0.00")
lstR.AddItem "-----------------------------------------------"
lstR.AddItem DateAdd("m", 1, Date)
lstR.AddItem DateAdd("m", 2, Date)
lstR.AddItem DateAdd("m", 3, Date)
lstR.AddItem DateAdd("m", 4, Date)
lstR.AddItem DateAdd("m", 5, Date)
lstR.AddItem DateAdd("m", 6, Date)
lstR.AddItem DateAdd("m", 7, Date)
lstR.AddItem DateAdd("m", 8, Date)
lstR.AddItem DateAdd("m", 9, Date)
End Sub

Private Sub UserForm_Activate()


lblFecha.Caption = Date
End Sub

Function getMonto() As Currency


getMonto = CCur(txtMonto.Text)
End Function
Cap.4: Funciones VBA
213

Explicando el código implementado:

Para crear los procedimientos se debe hacer doble clic sobre los controles. Por ejem-
plo, para Private Sub opt3_Click() se hace doble clic sobre , en caso de Private
Sub UserForm_Acvate se hace doble clic sobre el fondo del UserForm y se cambia


Se implementó la función getMonto para obtener el monto registrado por el usuario


en el control txtMonto.

Finalmente, tenga en cuenta que para obtener las posible fechas de pago se usa como
base la fecha actual obtenida desde la función Date.

Veamos una aplicación que permita mostrar los días de mora y el total a pagar por
la entrega de un libro en una biblioteca, es así que debemos ingresar el nombre del
cliente y la fecha de entrega que se indica en su recibo; de tal manera que, según la
fecha actual, deberá calcular los días de mora si se sabe que por cada día se le cobra
 6   -
rres Lázaro» debió entregar el libro el 08/02/2016, la aplicación determinará los días
de mora y el total a pagar, tal como se muestra en la siguiente imagen:

Formulario propuesto:

Fig. 4.7 UserForm de cálculo de mora con DateDi


Aplicaciones VBA con Excel
214

Código VBA:

Private Sub btnProcesar_Click()


Dim cliente$, fechaEnt As Date
cliente = txtCliente.Text
fechaEnt = CDate(txtFechaEnt.Text)

Dim mora%
mora = DateDiff("d", fechaEnt, Date)

lstR.AddItem "RESUMEN DE MORA"


lstR.AddItem "CLIENTE: " & cliente
lstR.AddItem "FECHA ACTUAL: " & Date
lstR.AddItem "FECHA DE ENTREGA" & fechaEnt
lstR.AddItem "---------------------------"
lstR.AddItem "DIAS DE MORA:" & mora
lstR.AddItem "TOTAL A PAGAR:" & mora * 5
End Sub

Private Sub UserForm_Activate()


lblFecha.Caption = Date
End Sub

Explicando el código implementado:

Dim mora%
mora = DateDiff("d", fechaEnt, Date)


fecha actual y la fecha que el usuario debió pagar la cuota. En la función DateDi se
hace referencia a d para el conteo de días, fechaEnt es la fecha de entrega y Date la
fecha actual.

4.1.4 Funciones de comprobación de valor


La comprobación de valor se basa en la evaluación del valor ingresado por el usuario,

usan comúnmente para validar dichos valores que pueden ser numéricos, de texto o
de fechas.

IsNumeric: Función que permite determinar si un valor es numérico o no. Debemos



Su formato es IsNumeric(cadena).

Por ejemplo, si necesitamos validar el registro de la edad en un control txtEdad, el


código sería IsNumeric(txtEdad.Text); y si queremos validar el registro de un monto
en dólares, el código sería IsNumeric(txtMonto.Text).
Cap.4: Funciones VBA
215

IsEmpty:-


mente para saber si se ingresó o no valor en una cadena, número o fecha.

Por ejemplo, si queremos validar el ingreso del nombre de un cliente en el control


txtCliente, el código sería Not IsEmpty(txtCliente.Text) o también podría ser Not
Trim(txtCliente.Text) = Empty
la cadena Len(txtCliente.Text)=0.

IsDate:-


Date.

Por ejemplo, si necesitamos validar la fecha de nacimiento de un alumno, el código


podría ser de la siguiente manera IsDate(txtFechaNac.Text).
5
Cap.
Gestión de errores

Capacidad

usuario.

5.1 Gestión de errores



controlar los valores ingresados por el usuario o por los valores generados por la misma
aplicación, de tal manera que la aplicación se proteja de dichos errores y los administre



Cuando no se declara una variable.




Cuando se deja vacío un valor numérico.


Cuando un número se divide entre cero.


Muchos de los errores que se puedan ocasionar en una aplicación, se deben al ingreso de
datos errados por parte del usuario, así es que en este capítulo veremos cómo controlar


5.2 Tipos de errores VBA



aplicación en VBA:

ͫErrores de compilación
-
lador convierte el código fuente en código legible por la computadora, los errores de
compilación son errores que impiden que una aplicación se ejecute correctamente.
Aplicaciones VBA con Excel
218

Estos errores se podrían ocasionar por:

 
 
 
 

ͫErrores en empo de ejecución




a que también son considerados como errores lógicos, los cuales solo pueden ser
solucionados por el desarrollador de la aplicación haciendo una depuración de los
valores que está evaluando.




ͫErrores lógicos
-


de detectar y corregir, ya que toda aplicación realizada en VBA debe pasar por un
control de calidad que solo lo puede hacer el desarrollador de la aplicación.

5.3 Control básico de errores con On Error Goto


La instrucción On Error Goto-
viando mensajes o dando una salida adecuada al error; hay que tener en cuenta que
el error se podría ocasionar en cualquier línea del código del procedimiento o función.
Veamos el formato de la instrucción On Error Goto:

On Error { GoTo [ line | 0 | -1 ] | Resume Next }

Donde:

GoTo line: -



un mensaje al usuario indicándole que ocasionó un error.

GoTo 0: 
la aplicación.
Cap.5: Gestión de errores
219

Resume Next:           



5.4 La Clase Err


El objeto Err-
ministra el error con las siguientes propiedades:

Descripon: Devuelve la descripción del error encontrado en la aplicación VBA. Su forma-


to es Err.Descripon.

Number:-
guaje VBA, en el futuro este número puede ser parte de una condicional. Su formato
es Err.Number.
mismos:

Número de Error Descripción del Error


5 La llamada al procedimiento Sub no es válido.
Error de desbordamiento de datos, esto
6 ocurre cuando la variable es declarada de

El subíndice está fuera del intervalo,
9 solo sucede cuando se usa objetos que
contengan elementos matriciales.
Error de división por cero, solo ocurre en el
11
caso que se divida un número entre cero.

13 
asignado a dicha variable es de otro.

ͫCaso desarrollado: Capitalización


-


       
fórmula:

tasa ) años × periodo


Monto = Capital ( 1 + periodo
Aplicaciones VBA con Excel
220

Formulario propuesto:

Fig. 5.1 UserForm de control de errores

Código VBA:

Private Sub btnProcesar_Click()


On Error GoTo Imprevisto
Dim monto@, años%, tasa#
monto = CCur(txtMonto.Text)
años = CInt(txtAños.Text)
tasa = CDbl(txtTasa.Text)

Dim periodo%
If optBimestral.Value = True Then periodo = 6
If optTrimestral.Value = True Then periodo = 4
If optSemestral.Value = True Then periodo = 2

Dim capital@
capital = monto / (1 + (tasa / 100) / periodo) ^ (años * periodo)

lstR.Clear
lstR.AddItem "** RESUMEN **"
lstR.AddItem "MONTO: $ " & Format(monto, "0.00")"
lstR.AddItem "AÑOS: " & años
lstR.AddItem "TASA: " & Format(tasa / 100, "Percent")
lstR.AddItem "--------------------------------------"
lstR.AddItem "CAPITAL: $ " & Format(capital, "0.00")
Exit Sub
Imprevisto:
MsgBox "Error en la aplicacion...!!! - " & Err.Description
End Sub
Cap.5: Gestión de errores
221

Explicando el código:
On Error GoTo Imprevisto
Dim monto@, años%, tasa#
monto = CCur(txtMonto.Text)
años = CInt(txtAños.Text)
tasa = CDbl(txtTasa.Text)

Se inicializa el control de errores con On Error, el nombre «Imprevisto» será la clave


para el acceso al bloque de mensajes si en la aplicación hubiera algún error. Luego,
declaramos las variables y obtenemos los valores desde los controles TextBox.

Dim periodo%
If optBimestral.Value = True Then periodo = 6
If optTrimestral.Value = True Then periodo = 4
If optSemestral.Value = True Then periodo = 2


4 trimestres, o 2 semestres.

Dim capital@
capital = monto / (1 + (tasa / 100) / periodo) ^ (años * periodo)

Determinar el monto capital según la fórmula de la aplicación.


lstR.Clear
lstR.AddItem "** RESUMEN **"
lstR.AddItem "MONTO: $ " & Format(monto, "0.00")
lstR.AddItem "AÑOS: " & años
lstR.AddItem "TASA: " & Format(tasa / 100, "Percent")
lstR.AddItem "--------------------------------------"
lstR.AddItem "CAPITAL: $ " & Format(capital, "0.00")
Exit Sub

Los resultados se imprimen al control ListBox. Solo debemos tener en cuenta que
Exit Sub para que no acceda al
mensaje implementado en el bloque Imprevisto.

Imprevisto:
MsgBox "Error en la aplicacion...!!! - " & Err.Description

Implementación del bloque de mensajes, esta sección solo será accesible si dentro
de la aplicación ocurriera algún error. Debemos tener en cuenta que la sentencia Err.
Descripon emite un mensaje desde el compilador VBA.
6
Cap.
Estructuras condicionales

Capacidad

desarrollar casos que involucren un nivel de lógica intermedia.

6.1 Introducción
Hasta ahora hemos implementado aplicaciones VBA de forma secuencial, es decir, una
sentencia sigue a la otra en descendencia y de la misma forma se ejecutan las sentencias.

En nuestra vida diaria se nos puede presentan situaciones donde debemos decidir por
ejemplo:
¿Qué carrera profesional elijo?
¿Qué ropa me pondré?
¿Aprobaré mi examen?

Si estamos en una carretera bifurcada, ¿cuál camino tomaré?

<Fuente: http://modaengustosycolores.blogspot.com/2013>

Algo así nos sucederá en nuestra aplicaciones VBA para lo cual combinaremos las sen-

veremos en este capítulo.
Aplicaciones VBA con Excel
224

6.2 Implementación de una condición



condición de manera correcta, ya que es un requisito obligatorio en las estructuras con-
dicionales. Debemos tener en cuenta los siguientes aspectos:

True o False.
Por cada juego variable-valor debemos usar operadores relacionales como >, >=, <,

<=, <> (revise el capítulo II, «Fundamentos de programación»).


En una estructura If        
operadores lógicos como And y Or (revise el capítulo II «Fundamentos de programa-
ción»).
True y False-
diciones en una misma sentencia If, el resultado True y False se basará en las tablas
de la verdad del And o Or:

Para la Y lógica:

P Q P AND Q
True True True
True False False
False True False
False False False

P Q P OR Q
True True True
True False True
False True True
False False True

Para la O lógica:
Veamos algunas implementaciones de condiciones simples y compuestas:

 Condicionar la edad de una persona mayor de edad, esta es considerada así cuando
su edad es mayor a 18 años:
Edad > 17
Edad >= 18

 Condicionar la categoría de un empleado sabiendo que se busca solo aquellos em-


pleados de categoría «B»:
Categoría = "B"
Cap.6: Estructuras condicionales
225

Condicionar la nota de un alumno el cual se puede encontrar entre 0 y 20:


Nota >= 0 And Nota <= 20
Nota > –1 And Nota < 21

Condicionar el sueldo de un empleado el cual puede encontrarse entre 1500 y 3000:


Sueldo >=1500 And Sueldo<=3000

Condicionar la categoría de un empleado sabiendo que se busca solo aquellos em-


pleados de categoría «A», «C»:
Categoría = "A" Or Categoría = "C"

6.3 Estructura If simple


Se le llama así cuando la estructura If ejecuta un bloque de instrucciones solo si cumple
             
sentencia siguiendo con la secuencialidad del código. Presenta los siguientes formatos:

Primera forma: If condición Then Acción

Segunda forma:

If condición Then
Acción o acciones
End If

Donde:

If: Indica el inicio de la estructura condicional.


Condición: Es la expresión que se evaluará en la estructura.
Then: Indica la acción True que toma la estructura según la condición.
Acción: Son las sentencias o expresiones que se realizarán solo si la condición es
verdadera.
End If: 

La forma gráca de la condición If simple es la siguiente:

True

Condición Acción
False
Aplicaciones VBA con Excel
226

6.4 Estructura If doble


La estructura If doble evalúa una condición lógica; en caso resulte True efectúa un bloque

acciones, llamadas también sentencias por defecto.

Presenta los siguientes formatos:

Primera forma: If condición Then Accion_True Else Accion_False

Segunda forma:

If condición Then
Accion_True
Else
Accion_False
End If

Donde:

If: Indica el inicio de la estructura condicional.


Condición: Es la expresión que se evaluará en la estructura.

Then: Indica la acción True que toma la estructura según la condición.




Else: Indica la acción False que toma la estructura según la condición.




Accion_True: Son las sentencias o expresiones que se realizarán solo si la condición




es verdadera.
Accion_False: Son las sentencias o expresiones que se efectuarán solo si la condición


es falsa.
End If: 


La forma gráca de la condición If doble es la siguiente:

False True

Condición

Acción_false Acción_true
Cap.6: Estructuras condicionales
227

6.5 Estructura If doblemente encadenada


La estructura If doblemente encadenada evalúa una condición lógica; en caso resulte
True
similar a colocar un If dentro de otro.

Presenta el siguiente formato:

If condición Then
Accion1
ElseIf condicion Then
Accion2
ElseIf condicion Then
Accion3
Else
Accion_False
End If

Donde:

If: Indica el inicio de la estructura condicional.


Condición: Es la expresión que se evaluará en la estructura.

Then: Indica la acción True que toma la estructura según la condición.


ElseIf:
resultado False de la primera evaluación.
Else: Es tomada como el valor por defecto de todo el bloque de comparaciones del Id
doblemente encadenada.
Accion1: Son las sentencias o expresiones que se realizarán solo si la condición inicial
es verdadera.
Accion2: Son las sentencias o expresiones que se efectuarán solo si la condición es-
ElseIf sea True.
End If:
Aplicaciones VBA con Excel
228

La forma gráca de la condición If doblemente encadenada es la siguiente:

True

Condición
Acción_true
Condición
Acción1

Condición

Acción_false Acción2

6.6 Estructura de selección múltiple Select-Case


-







«A», «B», «C», «D» o «E».


Cuando se evalúa un rango de valores de un dato numérico, por ejemplo, la nota de



forma se podría tratar un rango de fechas.


acción:

 Se evalúa el valor contenido en la variable.


 
sentencias.
 
defecto de la sentencia.
Cap.6: Estructuras condicionales
229

Presenta el siguiente formato:

Select Case Variable


Case Valor1: Acción1
Case Valor2: Acción2
Case ValorN:AccionN
Else
AccionFalsa
End Select

Donde:

Select Case: 


Variable:
Case:
Valor1: Es el valor posible que puede tomar una variable.
Acción1: Es la acción que se realizará solo si la variable es igual al valor.

Else: Es la acción que se efectuará, si una vez evaluado, no se encuentra el valor


buscado.
End Select: 

La forma gráca de la condición múlple:

Variable

Acción1 Acción2 Acción3 Acción4 AcciónN


Aplicaciones VBA con Excel
230

Operadores válidos en los cases:


Operador Ejemplo
Case Valor Case 1
Case Valor1, Valor2 Case 1,2
Case ValorInicio To ValorFinal Case 1 To 5
Case Is>Valor Case Is>100
Case Is<100

6.7 Casos desarrollados


ͫCaso desarrollado 1: If simple - Registro de personal
Implemente una aplicación que permita registrar los datos del personal nuevo de
la empresa, para lo cual se pide que se autogenere el código basado en el orden de
-
ComboBox, tal como se muestra en la siguiente
imagen:

Fig. 6.1 UserForm de registro de personal

Debe tener en cuenta los siguientes aspectos:


palabra «PER» y cinco cifras numéricas, por ejemplo, 00004.


 (Name) frmRegistro


 
Label1  
Label2  
Label3 (Name) lblCodigo
 
Label3  
Cap.6: Estructuras condicionales
231

Label4  


Label5  
Label6  
Label7  
Label8  
Combobox1 (Name) cboSexo
Combobox2 (Name) cboEstadoCivil
 (Name) btnProcesar

Default True
 (Name) btnAnular
 
 (Name) btnSalir

Cancel True
TextBox1 (Name) txtNombres
TextBox2 (Name) txtPaterno
TextBox3 (Name) txtMaterno
TextBox4 (Name) txtFechaNac

Los nombres y apellidos completos deberán ser concatenados y enviados a la hoja de


Excel en mayúsculas.


civil.
En todo momento se debe controlar los errores con la sentencia On Error Goto y


mostrar el mensaje:

Al seleccionar el botón Procesar y Enviar, se le debe preguntar al usuario si está se-




guro del envío tal como se muestra en la siguiente ventana:


Aplicaciones VBA con Excel
232

En la hoja de Excel los datos deben mostrarse de la siguiente manera:

Fig. 6.2 Entorno de registro de personal

Código VBA:
Dim uFila%
Private Sub btnAnular_Click()
Call limpiarControles
End Sub

Private Sub btnProcesar_Click()


On Error GoTo Imprevisto
'Capturando los datos
Dim codigo$, paterno$, materno$, nombres$, sexo$
Dim estadoCivil$, fechaNac As Date
codigo = lblCodigo.Caption
paterno = txtPaterno.Text
materno = txtMaterno.Text
nombres = txtNombres.Text

'Asignando Masculino y Femenino a la variable sexo


If cboSexo = "(M)asculino" Then sexo = "Masculino"
If cboSexo = "(F)emenino" Then sexo = "Femenino"

'Asignando el estado civil del personal


If cboEstadoCivil = "(S)oltero" Then estadoCivil = "Soltero"
If cboEstadoCivil = "(C)asado" Then estadoCivil = "Casado"
If cboEstadoCivil = "(V)iudo" Then estadoCivil = "Viudo"
If cboEstadoCivil="(D)ivorciado" Then estadoCivil="Divorciado"

fechaNac = CDate(txtFechaNac.Text)

'Condicionando al usuario si desea registrar al personal


Dim op%
op = MsgBox("Esta seguro de registrar y enviar a Excel..? ",
vbYesNo + vbInformation, “Registro")

'Si seleccionar Si entonces enviara todos los datos a Excel


If op = 6 Then
Cells(uFila, 2).Value = codigo
Cells(uFila, 3).Value = UCase(nombres) & Space(1) & _
UCase(paterno) & Space(1) & UCase(materno)
Cells(uFila, 4).Value = sexo
Cells(uFila, 5).Value = fechaNac
Cells(uFila, 6).Value = estadoCivil
Cap.6: Estructuras condicionales
233

End If

'Limpiando los controles y generando un nuevo codigo


Call generaCodigo
Call limpiarControles
Exit Sub

Imprevisto:
MsgBox "Error al enviar información...
Revise antes de enviar..!!"
End Sub

Private Sub btnSalir_Click()


Dim r%
r = MsgBox("Esta seguro de salir..!!", vbYesNo + vbCritical,
"Salir")
If r = 6 Then Unload Me
End Sub

Private Sub UserForm_Activate()


uFila = determinaUltimaFila
Call generaCodigo
Call llenaSexo
Call llenaEstadoCivil
End Sub

Function determinaUltimaFila() As Integer


uFila=Sheets(1).Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Row
determinaUltimaFila = uFila
End Function

Sub llenaSexo()
cboSexo.AddItem "(M)asculino"
cboSexo.AddItem "(F)emenino"
End Sub

Sub llenaEstadoCivil()
cboEstadoCivil.AddItem "(S)oltero"
cboEstadoCivil.AddItem "(C)asado"
cboEstadoCivil.AddItem "(V)iudo"
cboEstadoCivil.AddItem "(D)ivorciado"
End Sub

Sub generaCodigo()
lblCodigo.Caption="PER-" & Format(determinaUltimaFila-12, "00000")
End Sub

Sub limpiarControles()
txtNombres.Text = ""
txtPaterno.Text = ""
txtMaterno.Text = ""
cboSexo.ListIndex = 0
cboEstadoCivil.ListIndex = 0
txtFechaNac.Text = ""
txtNombres.SetFocus
End Sub
Aplicaciones VBA con Excel
234

ͫCaso desarrollado 2: If simple - Registro de venta de productos



aplicación que permita controlar las ventas realizadas exclusivamente de sus 3 cremas
dentales más vendidas del mercado, la cual cuenta con la siguiente tabla de precios:

Producto Precio Detalle


  
  
 


de la compra de acuerdo a lo siguiente:

Pack adquiridos Porcentaje de descuento


  
   
   

     


-
pra, descuento y el neto a pagar por la compra.

Se debe tener en cuenta los siguientes aspectos:

Los productos deben seleccionarse desde el control ComboBox.


Implemente funciones o procedimientos necesarios para la aplicación.
En todo momento se debe controlar los errores con la sentencia On Error Goto
mostrando un mensaje al usuario.
Implemente un botón Procesar que mostrará en un control ListBox el resultado de
la aplicación.
Implemente un botón Enviar a Excel para generar un reporte de las ventas realizadas.

-

En la hoja de Excel los datos deben mostrarse de la siguiente manera:
Cap.6: Estructuras condicionales
235

Fig. 6.3 Entorno de la hoja de Excel

El UserForm debe tener el siguiente aspecto:




Fig. 6.4 UserForm de registro de venta

Asigne las siguiente propiedades a los siguientes controles:




 (Name) frmVenta



Label1 
Label2 (Name) lblFecha

Label3 
Label4 
Label5 (Name) lblDescripcion

Combobox1 (Name) cboProducto
 (Name) btnProcesar


Aplicaciones VBA con Excel
236

 
 
 
 
 

Cancel True
TextBox1  
ListBox1 (Name) lstR

Código VBA:

Dim producto$, cantidad%, precio@, iCompra@, iNeto@, iDescuento@

'Procedimiento que envía toda la información a Excel


Private Sub btnExcel_Click()
uFila = determinaUltimaFila
Cells(uFila, 2).Value = uFila - 11
Cells(uFila, 3).Value = producto
Cells(uFila, 4).Value = precio
Cells(uFila, 5).Value = cantidad
Cells(uFila, 6).Value = lblFecha.Caption
Cells(uFila, 7).Value = iCompra
Cells(uFila, 8).Value = iDescuento
Cells(uFila, 9).Value = iNeto

'Calculando el acumulado del importe neto


Cells(uFila + 1, 8).Value = "TOTAL"
Cells(uFila + 1, 9).Formula = "=sum(I12:I" & uFila & ")"
End Sub

Private Sub btnProcesar_Click()


On Error GoTo Imprevisto
'Capturando los valores ingresados por el usuario
producto = cboProducto.Text
cantidad = CInt(txtCantidad.Text)

'Calculando el importe de compra


precio = determinaPrecio
iCompra = cantidad * precio

'Calculando el descuento
If cantidad<5 Then iDescuento=0.05 * iCompra
If cantidad>5 And cantidad<=15 Then iDescuento=0.1*iCompra
If cantidad > 15 Then iDescuento = 0.2 * iCompra

'Calculando importe neto


iNeto = iCompra - iDescuento

'Mostrando en el cuadro de lista


lstR.Clear
lstR.AddItem "**RESUMEN DE VENTA**"
lstR.AddItem "---------------------------------------"
lstR.AddItem "PRODUCTO: " & producto
lstR.AddItem "CANTIDAD: " & cantidad
lstR.AddItem "PRECIO: " & precio
Cap.6: Estructuras condicionales
237

lstR.AddItem "---------------------------------------"
lstR.AddItem "IMPORTE DE COMPRA $ :" & iCompra
lstR.AddItem "IMPORTE DE DESCUENTO $ :" & iDescuento
lstR.AddItem "IMPORTE NETO $ :" & iNeto
Exit Sub
Imprevisto:
MsgBox "Error en la aplicación..!!", vbCritical, "Error"
End Sub

'Procedimiento que muestra la descripción del producto


Private Sub cboProducto_Click()
Dim descripcion$
If cboProducto.Text = "Oral-B complete" Then
descripcion = "Pack 6 unidades"
End If
If cboProducto.Text = "Kolynos herbal" Then
descripcion = "Pack 12 unidades"
End If
If cboProducto.Text = "Colgate Triple Acción" Then
descripcion = "Pack 12 unidades"
End If
lblDescripcion.Caption = descripcion
End Sub

'Llenando los productos en el ComboBox


Private Sub UserForm_Activate()
Call llenaProductos
lblFecha.Caption = Date
End Sub

'Procedimiento que llena el ComboBox de productos


Sub llenaProductos()
cboProducto.Text = "(Seleccione producto)"
cboProducto.AddItem "Oral-B complete"
cboProducto.AddItem "Kolynos herbal"
cboProducto.AddItem "Colgate Triple Acción"
End Sub

'Función que permite determinar el precio del producto


'desde el control ComboBox
Function determinaPrecio() As Currency
Dim precio@
If cboProducto.Text = "Oral-B complete" Then precio = 17.49
If cboProducto.Text = "Kolynos herbal" Then precio = 18.2
If cboProducto.Text = "Colgate Triple Acción” Then precio = 21.79
determinaPrecio = precio
End Function

Function determinaUltimaFila() As Integer


uFila=Sheets(1).Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Row
determinaUltimaFila = uFila
End Function
Aplicaciones VBA con Excel
238

ͫCaso desarrollado 3: If doble - Boleta de Venta


-
llares) de sus productos correspondientes a papel bond; de acuerdo a los siguientes
criterios:




Implemente una aplicación en VBA que permita determinar el importe bruto, el im-
porte del descuento y el importe a pagar por la compra.

Debe tener en cuenta los siguientes aspectos:

Los productos deben seleccionarse desde el control ComboBox.


Implemente funciones o procedimientos necesarios para la aplicación.
En todo momento se debe controlar los errores con la sentencia On Error Goto

mostrando un mensaje al usuario.


Implemente un botón Procesar, que mostrará en un control ListBox el resultado
de la aplicación.
Implemente un botón Enviar a Excel para generar un reporte de las ventas realizadas.
-

En la hoja de Excel los datos deben mostrarse de la siguiente manera:

Fig. 6.5 Entorno de la hoja de Excel


Cap.6: Estructuras condicionales
239

El UserForm debe tener el siguiente aspecto:




Fig. 6.6 UserForm de registro de venta

Asigne las siguientes propiedades a los siguientes controles:




 
 
Label1  
Label2 
 
Label3  
Label4  
Label5  
Label6  
Label5 
 
Combobox1  
 

Default True
 
 
 

 

Cancel True
Aplicaciones VBA con Excel
240

TextBox1 (Name) txtCliente


TextBox2 (Name) txtDireccion
TextBox3  
ListBox1 (Name) LstR

Código VBA:

'Declaración de variables globales


Dim cliente$, direccion$
Dim precio@, producto$, cantidad%
Dim subtotal@, descuento@, neto@
Dim uFila%

'Enviando la información a Excel


Private Sub btnGenerar_Click()
Range("D10").Value = cliente
Range("D11").Value = direccion
Range("I11").Value = lblFecha.Caption

uFila = determinaUltimaFila
Sheets(1).Cells(uFila, 3).Value = cantidad
Sheets(1).Cells(uFila, 4).Value = producto
Sheets(1).Cells(uFila, 7).Value = precio
Sheets(1).Cells(uFila, 9).Value = neto

Range("I24").Formula = "=sum(I14:I23)"
End Sub

'Limpiar todos los controles


Private Sub btnLimpiar_Click()
cboProducto.ListIndex = 0
txtCantidad.Text = ""
lstR.Clear
End Sub

Private Sub btnProcesar_Click()


'Capturando los datos del formulario
cliente = txtCliente.Text
direccion = txtDireccion.Text
producto = cboProducto.Text
cantidad = CInt(txtCantidad.Text)

'Calculando el subtotal a pagar


subtotal = precio * cantidad

'Determinando el descuento según el caso


If cantidad <= 5 Then
descuento = cantidad * (0.1 * precio)
Else
descuento = cantidad * (0.15 * precio)
End If

'Determinando el neto
neto = subtotal - descuento

'Imprimir los resultados


lstR.Clear
lstR.AddItem "**RESUMEN DE VENTA**"
Cap.6: Estructuras condicionales
241

lstR.AddItem "PRODUCTO: " & producto


lstR.AddItem "PRECIO: $ " & Format(precio, "0.00")
lstR.AddItem "CANTIDAD: " & cantidad & " millares"
lstR.AddItem "-----------------------------------------------"
lstR.AddItem "SUBTOTAL: $ " & Format(subtotal, "0.00")
lstR.AddItem "DESCUENTO: $ " & Format(descuento, "0.00")
lstR.AddItem "NETO: $ “ & Format(neto, “0.00”)
End Sub

Private Sub btnSalir_Click()


Unload Me
End Sub

'Al seleccionar un producto se muestra el precio


Private Sub cboProducto_Click()
lblPrecio.Caption = "$" & Format(determinaPrecio, "0.00")
lstR.Clear
End Sub

Private Sub UserForm_Activate()


Call llenaPapel
Call muestraFecha
Call generaNumero
End Sub
'Procedimiento que llena los tipos de papel
Sub llenaPapel()
With cboProducto
.Text = "(Seleccione un producto)"
.AddItem "InkJet A4/75GR. 500 Hojas"
.AddItem "Xerox A4/75GR. 500 Hojas"
.AddItem "Atlas A4/75GR. 500 Hojas"
.AddItem "Graphos A4/75GR. 500 Hojas"
End With
End Sub

'Procedimiento que muestra la fecha


Sub muestraFecha()
lblFecha.Caption = Date
End Sub

'Función que determina el precio del producto


Function determinaPrecio() As Currency
producto = cboProducto.Text
If (producto = "InkJet A4/75GR. 500 Hojas") Then precio = 9.79
If (producto = "Xerox A4/75GR. 500 Hojas") Then precio = 10.75
If (producto = "Atlas A4/75GR. 500 Hojas") Then precio = 12.5
If (producto = "Graphos A4/75GR. 500 Hojas") Then precio = 10
determinaPrecio = precio
End Function

Function determinaUltimaFila() As Integer


uFila=Sheets(1).Cells(Rows.Count, 3).End(xlUp).Offset(1, 0).Row
determinaUltimaFila = uFila
End Function

'Genera el número de Boleta


Sub generaNumero()
Dim numero$
Range("I6").Select
Selection.NumberFormat = "000000"
Selection.Value = Range("I6").Value + 1
End Sub
Aplicaciones VBA con Excel
242

ͫCaso desarrollado 4: If doblemente encadenado - Boleta de pago


Implemente una aplicación en VBA para controlar el pago que se realiza a sus trabaja-
dores considerando que si trabaja más de 40 horas, el exceso será considerado como




Debe tener en cuenta los siguientes aspectos:

Los cargos de los trabajadores deben seleccionarse desde el control ComboBox.


OponBuon.
Implemente funciones o procedimientos necesarios para la aplicación.
El costo por hora se aplica de acuerdo a los cargos de los trabajadores, según la
siguiente tabla:
Cargo Costo por hora
Jefe 
Supervisor 
Vendedor 
Apoyo 

En todo momento se debe controlar los errores con la sentencia On Error Goto
mostrando un mensaje al usuario.
Implemente un botón Procesar, que mostrará en un control ListBox el resultado
de la aplicación.
Implemente un botón Generar boleta para enviar los datos solicitados en la boleta
de pago del trabajador.
En la hoja de Excel los datos deben mostrarse de la siguiente manera:

Fig. 6.7 Entorno de boleta de pago en Excel


Cap.6: Estructuras condicionales
243

El UserForm debe tener el siguiente aspecto:




Fig. 6.8 UserForm de pago de trabajadores




 (Name) frmPago


 
Label1  
Label2  
Label3  
Label4  
Label5  
Combobox1 (Name) cboCargo
 (Name) optHorizonte
 
 (Name) optIntegra
 
 (Name) optNuevaVida
 
 

Default True
 (Name) btnGenerar
 
Aplicaciones VBA con Excel
244

 (Name) btnSalir



Cancel True
TextBox1 (Name) txtTrabajador
TextBox2 (Name) txtDNI
MaxLength 8
TextBox3 (Name) txtHoras
ListBox1 (Name) LstR

Código VBA:

'Variables globales
Dim trabajador$, dni$, cargo$, horas%, hExtras%
Dim salarioBruto@, descuento@, neto@
Dim AFP$

Private Sub btnEnviar_Click()


Range("E7").Value = trabajador
Range("E8").Value = cargo
Range("E9").Value = salarioBruto
Range("E10").Value = horas
Range("E11").Value = determinaCosto

Range("H8").Value = dni
Range("H9").Value = Date
Range("H10").Value = hExtras
Range("H11").Value = determinaCosto * 1.5

Range("K9").Value = AFP
Range("K10").Value = "DÓLARES"

Range("E14").Value = salarioBruto
Range("H14").Value = determinaAFP * salarioBruto
Range("H15").Value = "0"
Range("K14").Value = determinaAporte

Range("E17").Value = salarioBruto
Range("H17").Value = determinaAFP * salarioBruto
Range("K17").Value = determinaAporte

Range("E19").Value = neto
End Sub

Private Sub btnProcesar_Click()


On Error GoTo Imprevisto
trabajador = txtTrabajador.Text
dni = txtDNI.Text
cargo = cboCargo.Text
horas = CInt(txtHoras.Text)

Call DeterminaHoras
salarioBruto = (horas * determinaCosto) + (hExtras * (determinaCosto * 1.5))
descuento = determinaAFP * salarioBruto
neto = salarioBruto - descuento - determinaAporte

lstR.Clear
Cap.6: Estructuras condicionales
245

lstR.AddItem "**RESUMEN DE PAGO**"


lstR.AddItem "IMPORTE BRUTO: $ " & Format(salarioBruto, "0.00")
lstR.AddItem "IMPORTE DESCUENTO: $ " & Format(descuento, "0.00")
lstR.AddItem "IMPORTE NETO: $ " & Format(neto, "0.00")
Exit Sub
Imprevisto:
MsgBox "Error en la aplicación..!!!"
End Sub

Private Sub btnSalir_Click()


Unload Me
End Sub

Private Sub UserForm_Activate()


Call llenaCargos
End Sub

'Procedimiento que llena los cargos


Sub llenaCargos()
cboCargo.AddItem "Jefe"
cboCargo.AddItem "Supervisor"
cboCargo.AddItem "Vendedor"
cboCargo.AddItem "Apoyo"
End Sub

'Procedimiento que determine las horas normales y extras


Sub DeterminaHoras()
If horas > 40 Then
hExtras = horas - 40
horas = 40
Else
hExtras = 0
End If
End Sub

'Función que determine la tarifa por hora


Function determinaCosto() As Double
Dim costo@
If cargo = "Jefe" Then
costo = 40
ElseIf cargo = "Supervisor" Then
costo = 30
ElseIf cargo = "Vendedor" Then
costo = 20
Else
costo = 10
End If
determinaCosto = costo
End Function

'Función que determina el porcentaje de AFP


Function determinaAFP() As Double
Dim porcentajeAFP@
If optHorizonte.Value = True Then
AFP = "Horizonte"
porcentajeAFP = 12.5 / 100
ElseIf optIntegra.Value = True Then
AFP = "Integra"
porcentajeAFP = 11.75 / 100
ElseIf optNuevaVida.Value = True Then
AFP = "Nueva Vida"
Aplicaciones VBA con Excel
246

porcentajeAFP = 14.5 / 100


End If
determinaAFP = porcentajeAFP
End Function

'Función que determina los aportes


Function determinaAporte() As Double
determinaAporte = salarioBruto * 0.09
End Function

ͫCaso desarrollado 5: Select Case - Control de viajes


Implemente una aplicación en VBA para controlar los viajes de un determinado pasa-


Debe tener en cuenta los siguientes aspectos:

ComboBox.
OponBuon.



Desno Monto
Trujillo 
Arequipa 
Chiclayo 
Tacna 


En la hoja de Excel los datos deben mostrarse de la siguiente manera:

Fig. 6.9 Entorno de control de viajes en Excel


Cap.6: Estructuras condicionales
247

El UserForm debe tener el siguiente aspecto:




Fig. 6.10 UserForm de venta de productos

Asigne las siguientes propiedades a los siguientes controles:




 (name) frmVentaPasajes



Heihgt 325.5
Label1 
AutoSize True
Label2 
AutoSize True
Label3 
AutoSize True
Label4 
AutoSize True
Frame1  
 (Name) btnMostrar


 (Name) btnAnular


 (Name) btnEnviarExcel


 (Name) btnSalir


ComboBox1  
ListBox1 (Name) lstR
Aplicaciones VBA con Excel
248

Código VBA:

Private Sub btnAnular_Click()


'Limpiando los Cuadros de texto
txtPasajero.Text = Empty
txtDni.Text = Empty

'Limpiando el Cuadro Combinado


cboDestino.ListIndex = -1

'Deshabilitando a los botones de opción


opt8.Value = False
opt6.Value = False
opt12.Value = False

'Limpiando el contenido de la lista


lstR.Clear
End Sub

Private Sub btnEnviarExcel_Click()


'Capturando la ultima la vacia
Dim uFila%
uFila=Sheets(2).Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Row

If txtPasajero.Text = Empty Then


MsgBox "Debe llenar los Nombres del Pasajero",
vbCritical, "Sistema"
End If

'Enviando los valores del combo a la hoja


Sheets(2).Cells(uFila, 2).Value = uFila - 10
Sheets(2).Cells(uFila, 3).Value = txtPasajero.Text
Sheets(2).Cells(uFila, 4).Value = txtDni.Text
Sheets(2).Cells(uFila, 5).Value = cboDestino.Text

If opt8.Value=False And opt12.Value=False And opt6.Value=False Then


MsgBox "Debe seleccionar una hora de salida",
vbCritical, "Sistema"
End If

If opt8.Value=True Then Sheets(2).Cells(uFila,6).Value=opt8.Caption


If opt12.Value=True Then Sheets(2).Cells(uFila,6).Value=opt12.Caption
If opt6.Value=True Then Sheets(2).Cells(uFila,6).Value=opt6.Caption

'Aplicando una alineación


Sheets(2).Cells(uFila, 2).HorizontalAlignment = xlCenter
Sheets(2).Cells(uFila, 4).HorizontalAlignment = xlCenter
Sheets(2).Cells(uFila, 5).HorizontalAlignment = xlCenter

'Aplicando un recuadro a los valores ya insertados en la hoja


Range(Cells(uFila, 2), Cells(uFila, 6)).Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
Cap.6: Estructuras condicionales
249

End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
End With
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
End With
End Sub

Private Sub btnMostrar_Click()

If cboDestino.ListIndex = -1 Then
MsgBox "Debe seleccionar un Destino", vbCritical, "Sistema"
End If

'Capturando el destino seleccionado


Dim Destino$
Destino = cboDestino.Text

'Determinar el precio del pasaje según destino


Dim Pasaje@
Select Case Destino
Case "Trujillo": Pasaje = 50
Case "Arequipa": Pasaje = 70
Case "Chiclayo": Pasaje = 30
Case "Tacna": Pasaje = 80
End Select

'Calculando los pagos


Dim Descuento@, Neto@
Descuento = Pasaje * 0.1
Neto = Pasaje - Descuento

'Imprimir en la lista
lstR.Clear
lstR.AddItem "***RESUMEN DE PAGOS***"
lstR.AddItem "DESTINO:" & Destino
lstR.AddItem "MONTO PASAJE:" & Format(Pasaje, "0.00")
lstR.AddItem "DESCUENTO:" & Format(Descuento, "0.00")
lstR.AddItem "NETO A PAGAR:" & Format(Neto, "0.00")
End Sub

Private Sub btnSalir_Click()


Dim r%
r = MsgBox("Esta seguro de Salir",
vbYesNo + vbInformation, "Pasajes")
If r = vbYes Then
Unload Me
End If
End Sub

Private Sub UserForm_Activate()


'Llenando el Combo de Destinos
With cboDestino
.AddItem "Trujillo"
.AddItem "Arequipa"
.AddItem "Chiclayo"
.AddItem "Tacna"
End With
End Sub
Aplicaciones VBA con Excel
250

ͫCaso desarrollado 6: Validación - Venta de productos


-
da comercial, el cual ofrece a sus clientes la venta al crédito y al contado.

Debe tener en cuenta los siguientes aspectos:

Los productos deben seleccionarse desde el control ComboBox.


OponBuon.
Se aplica un porcentaje de interés según el número de letras seleccionado por el
cliente de la siguiente manera:

N.º Letras Porcentaje de Interés


6 
12 
24 

El costo de los productos se muestra en la siguiente tabla:

Producto Costo
Lavadora 
Televisor 
RadioGrabadora 
Refrigeradora 
Blue Ray 

A través de una función se debe validar el ingreso de los valores del UserForm mos-
trando un mensaje adecuado.
En la hoja de Excel los datos deben mostrarse de la siguiente manera:

Fig. 6.11 Entorno del registro de venta de producto en Excel


Cap.6: Estructuras condicionales
251

El UserForm debe tener el siguiente aspecto:




Fig. 6.12 UserForm de venta de productos




 (name) frmVentaCredito



Heihgt 535.5
Label1 
AutoSize True
Frame1  
Frame2  
Frame3  
Frame4  
Label2 
AutoSize True
Label3 
AutoSize True
Label4 
AutoSize True
Label5 
AutoSize True
Label6 
AutoSize True
Label7 
AutoSize True
Aplicaciones VBA con Excel
252

Label8 
AutoSize True


Picture C:\VentaCredito\Carrito.jpg


Picture C:\VentaCredito\Eliminar.jpg
(Name) btnBorrar

 


 
(Name) btnSalir

 


 
 


TextBox1 (Name) txtCliente
TextBox2  
TextBox3  
 

 
 

Value False
 

Value False
 

Value False
ComboBox1 (Name) cboProducto
Cap.6: Estructuras condicionales
253

Código VBA:
'Declaración de variables globales
Dim montoSubtotal@, Descuento@, Neto@, PagoMensual@

Private Sub btnAnular_Click()


Call limpiaTodo
End Sub

Private Sub btnBorrar_Click()


Call LimpiaListas
End Sub

Private Sub btnComprar_Click()


Dim r$, Precio@, Subtotal@, Cantidad%
r = ValidaProducto()
If r = "" Then
'Capturando los datos necesarios del UserForm
Cantidad = CInt(txtCantidad.Text)

'Calculando el subtotal
Precio = AsignaPrecio(cboProducto.ListIndex)
Subtotal = Precio * Cantidad

'Enviando los datos a las listas


lstProductos.AddItem cboProducto.Text
lstCantidad.AddItem txtCantidad.Text
lstSubTotal.AddItem Format(Subtotal, "0.00")
Else
MsgBox r, vbCritical, "Sistema"
End If
End Sub

Private Sub btnEliminar_Click()


'Vericar que se ha seleccionado el producto a eliminar
If lstProductos.ListIndex = -1 Then
MsgBox "Debe seleccionar el producto a Eliminar",
vbCritical, "Sistema"
Else

'Capturando la posición del Elemento seleccionado


Dim Pos%
Pos = lstProductos.ListIndex

'Eliminando el producto seleccionado


lstProductos.RemoveItem (Pos)
lstCantidad.RemoveItem (Pos)
lstSubTotal.RemoveItem (Pos)
MsgBox "Producto eliminado Correctamente",
vbInformation, "Sistema"
End If
End Sub

Private Sub btnEnviarExcel_Click()


Dim r$
r = validaCliente()

If r = "" And lstR.ListCount > 0 Then


Dim UFila%
UFila = Sheets(1).Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Row
Aplicaciones VBA con Excel
254

Sheets(1).Cells(UFila, 2).Value = UFila - 8


Sheets(1).Cells(UFila, 3).Value = txtCliente.Text
Sheets(1).Cells(UFila, 4).Value = txtRuc.Text

'Enviar todos los productos seleccionados a una celda


Dim i%
For i = 0 To lstProductos.ListCount - 1
Sheets(1).Cells(UFila, 5).Value =
Sheets(1).Cells(UFila, 5).Value & _
(lstProductos.List(i) & Chr(10))
Next

Sheets(1).Cells(UFila, 6).Value = montoSubtotal


Sheets(1).Cells(UFila, 7).Value = Descuento
Sheets(1).Cells(UFila, 8).Value = Neto
Sheets(1).Cells(UFila, 9).Value = DeterminaLetras()
Sheets(1).Cells(UFila, 10).Value = Neto

Call formatoImpresion(UFila)
Call limpiaTodo
Else
MsgBox r, vbCritical, "Sistema"
End If
End Sub

Private Sub btnResumen_Click()


lstR.Clear

'Determinar el Monto Acumulado de la venta


montoSubtotal = DeterminaMontoAcumulado()
Descuento = montoSubtotal * 0.1
Neto = montoSubtotal - Descuento

'Determinar las letras seleccionadas


Dim Letras%: Letras = DeterminaLetras()

'Determinar el interés por Letras


Dim Interes@: Interes = DeterminaInteres(Letras, Neto)

'Calculando el Pago Mensual


PagoMensual = Neto / Letras + Interes

'Enviando a la Lista de Respuestas


lstR.AddItem "EL Monto Acumulado es: $ " &
Format(montoSubtotal, "0.00")
lstR.AddItem "EL Descuento es: $ " & Format(Descuento, "0.00")
lstR.AddItem "EL Neto a Pagar es: $ " & Format(Neto, "0.00")
lstR.AddItem "----------------------------------------------"
lstR.AddItem "La Cantidad de Letras es: " & Letras
lstR.AddItem "El Pago Mensual es: $" &
Format(PagoMensual, "0.00")
End Sub

Private Sub btnSalir_Click()


If MsgBox("Esta seguro de Salir",
vbYesNo + vbInformation, "Sistema") = vbYes Then
Unload Me
End If
End Sub
Cap.6: Estructuras condicionales
255

Private Sub chkCredito_Click()


If chkCredito.Value = True Then
opt6.Locked = False
opt12.Locked = False
opt24.Locked = False
Else
Call BloqueOpciones
End If
End Sub

Private Sub UserForm_Activate()


Call llenaProductos
Call BloqueListas
Call BloqueOpciones
End Sub

'Procedimiento que permite llenar


'el cuadro combinado de productos
Sub llenaProductos()
With cboProducto
.AddItem "Lavadora"
.AddItem "Televisor"
.AddItem "RadioGrabadora"
.AddItem "Refrigeradora"
.AddItem "Blue Ray"
End With
End Sub

'Función que permite asignar un precio


'según el producto seleccionado
Function AsignaPrecio(ByVal Pos%) As Currency
Dim Precio@
Select Case Pos
Case 0: Precio = 2500 'Lavadora
Case 1: Precio = 1500 'Televisor
Case 2: Precio = 500 'RadioGrabadora
Case 3: Precio = 4500 'Refrigeradora
Case 4: Precio = 1000 'Blue Ray
End Select
AsignaPrecio = Precio
End Function

'Función que valida los datos ingresados


'para un determinado producto
Function ValidaProducto() As String
Dim r$
If cboProducto.ListIndex = -1 Then
r = "Debe seleccionar un Producto de la Lista"
ElseIf txtCantidad.Text = Empty Then
r = "Debe ingresar una cantidad"
ElseIf Not IsNumeric(txtCantidad.Text) Then
r = "La Cantidad debe ser un valor numérico"
Else
r = ""
End If
ValidaProducto = r
End Function

'Procedimiento que limpiar los controles


'de tipo ListBox
Aplicaciones VBA con Excel
256

Sub LimpiaListas()
lstP'roductos.Clear
lstCantidad.Clear
lstSubTotal.Clear
End Sub

'Procedimiento que bloque los controles


'de tipo ListBox
Sub BloqueListas()
lstCantidad.Locked = True
lstSubTotal.Locked = True
End Sub

'Procedimiento que permite bloquear


'las opciones del crédito
Sub BloqueOpciones()
opt6.Locked = True
opt12.Locked = True
opt24.Locked = True
opt6.Value = False
opt12.Value = False
opt24.Value = False
End Sub

'Función que permite determinar el monto


'acumulado de la venta
Function DeterminaMontoAcumulado()
Dim i%
Dim S@
For i = 0 To lstSubTotal.ListCount - 1
S = S + lstSubTotal.List(i)
Next
DeterminaMontoAcumulado = S
End Function

'Función que asigna el número de letras seleccionado


'por el cliente
Function DeterminaLetras()
Dim Letras%
If opt6.Value = True Then
Letras = 6
ElseIf opt12.Value = True Then
Letras = 12
ElseIf opt24.Value = True Then
Letras = 24
Else
Letras = 1
End If
DeterminaLetras = Letras
End Function

'Función que determina el monto de interés del crédito


Function DeterminaInteres(ByVal Letras%, ByVal Neto@)
Dim Interes@
If Letras = 6 Then
Interes = 0.05 * Neto
ElseIf Letras = 12 Then
Interes = 0.1 * Neto
ElseIf Letras = 24 Then
Cap.6: Estructuras condicionales
257

Interes = 0.15 * Neto


Else
Interes = 0
End If
DeterminaInteres = Interes / Letras
End Function

'Función que valida los datos del cliente


Function validaCliente()
Dim r$
If txtCliente.Text = Empty Then
r = "Debe registrar los datos del Cliente"
ElseIf txtRuc.Text = Empty Then
r = "Debe registrar el RUC del Cliente"
Else
r = ""
End If
validaCliente = r
End Function

'Procedimiento que permite enmarcar los resultados en la


'hoja de Excel
Sub formatoImpresion(ByVal UFila%)
'Aplicando una alineación a cada valor contenido en la celda
Sheets(1).Cells(UFila, 2).VerticalAlignment = xlTop
Sheets(1).Cells(UFila, 2).HorizontalAlignment = xlCenter
Sheets(1).Cells(UFila, 3).VerticalAlignment = xlTop
Sheets(1).Cells(UFila, 4).VerticalAlignment = xlTop
Sheets(1).Cells(UFila, 4).HorizontalAlignment = xlCenter
Sheets(1).Cells(UFila, 5).VerticalAlignment = xlTop
Sheets(1).Cells(UFila, 6).VerticalAlignment = xlTop
Sheets(1).Cells(UFila, 7).VerticalAlignment = xlTop
Sheets(1).Cells(UFila, 8).VerticalAlignment = xlTop
Sheets(1).Cells(UFila, 9).VerticalAlignment = xlTop
Sheets(1).Cells(UFila, 9).HorizontalAlignment = xlCenter
Sheets(1).Cells(UFila, 10).VerticalAlignment = xlTop

'Aplicando un recuadro a los valores ya insertados en la hoja


Range(Cells(UFila, 2), Cells(UFila, 10)).Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
End With
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
Aplicaciones VBA con Excel
258

End With
End Sub

'Procedimiento que permite limpiar todos los controles


Sub limpiaTodo()
txtCliente.Text = Empty
txtRuc.Text = Empty
cboProducto.ListIndex = -1
txtCantidad.Text = Empty

Call LimpiaListas
Call BloqueOpciones
chkCredito.Value = False

lstR.Clear
End Sub
7
Cap.
Estructuras repetitivas

Capacidad

desarrollar casos que involucren un nivel de lógica avanzada.

7.1 Introducción
    -
locidad en la que ejecuta sus procesos, la precisión que presentan sus resultados y la



Estas se caracterizan por ejecutar un bloque de instrucciones o sentencias un número de-


terminado de veces, es decir, podemos ahorrar espacio en código y variables ante el uso


en la estructura While, For y Do While.

En este capítulo, comenzaremos analizando y comprendiendo los contadores y acumu-


-
While,
For, Do While
vistos en este capítulo.

7.2 Contadores
Como su nombre lo indica un contador se implementa solo para iniciar un conteo de
valores bajo una determinada condición. Su mayor desempeño se puede dar cuando se

de forma global.

Su formato es contador = contador+1 cuando el conteo se realiza de forma ascendente;


de manera descendente, sería contador = contador–1. Debe tener en cuenta que la va-
riable contador debe ser declarada como numérico entero.
Aplicaciones VBA con Excel
260

Veamos algunos casos del uso de los contadores:

Determine el total de personas consideradas como mayores de edad que registran su


edad por medio del control TextBox llamada txtEdad.

'Variables globales
Dim c%

'Procedimiento que cuenta las edades superiores a 17


Sub realizaConteo()
Dim edad%
edad=CInt(txtEdad.Text)
If edad>17 Then
c= c + 1
End If
End Sub

Determine el total de empleados con el cargo de jefe basado en la selección median-


te un control ComboBox llamado cboCargo.

'Variables globales
Dim c%

'Procedimiento que cuenta la cantidad de Jefes


Sub cuentaJefes()
Dim cargo$
cargo = cboCargo.Text
If cargo="Jefe" Then
c = c + 1
End If
End Sub

7.3 Acumuladores
También llamado totalizador. Es una variable cuya misión es registrar cierto número de
-
rencia radica en que un contador realiza una sentencia de valor constante, mientras que
en el acumulador su valor es variable.

Su formato es acumulador = acumulador + valorVariable donde el valorVariable puede



acumuladora debe ser declarada como numérico.

Veamos algunos casos del uso de los acumuladores:

Determinar el total acumulado de precios de productos ingresados desde un control


TextBox llamada txtPrecio.
Cap.7: Estructuras repetitivas
261

'Declaración de variables globales


Dim total@

'Procedimiento que acumula los precios


Sub acumulaPrecios()
Dim precio@
precio = CCur(txtPrecio.Text)
total = total + precio
End Sub




un mes, el dinero será ingresado en un control TextBox llamado txtDeposito.

'Declaración de variables globales


Dim dinero@

'Procedimiento que acumula los precios


Sub acumulaDeposito()
Dim deposito@
deposito = CCur(txtDeposito.Text)
dinero = dinero + deposito
End Sub

7.4 Estructura For… Next


También son llamados bucles o ciclos controlados por contador, ya que ejecuta un blo-

estructura.

      




Formato:
For Variable = ValorInicio TO ValorTope [Step +Valor]
'Cuerpo del Bucle
Next

For Variable = ValorInicio TO ValorTope [Step -Valor]


'Cuerpo del Bucle
Next

Donde:
For: 

Variable:

declarada como Integer.


ValorInicial:



To: Indica el otro valor del rango.

Aplicaciones VBA con Excel
262

ValorFinal: 

Step Valor:-
te o descendente.
Cuerpo del bucle: Son las sentencias que se ejecutarán mientras se encuentre en el

Next:For.

Veamos algunos casos de la estructura For:

Imprimir en una lista los 10 primeros números.

Dim i%
For i = 1 To 10
lstN.AddItem i
Next

Imprimir en una lista los 10 primeros números en forma descendente.


Dim i%
For i = 10 To 1 Step -1
lstN.AddItem i
Next

Imprimir los 10 primeros números pares (forma 1).


Dim i%
For i = 2 To 20 Step +2
lstN.AddItem i
Next

Imprimir los 10 primeros números pares (forma 2).


Dim i%
For i = 1 To 10
lstN.AddItem i*2
Next

Imprimir los 10 primeros números impares.


Dim i%
For i = 1 To 10
lstN.AddItem i*2-1
Next

Imprimir dentro de una lista N veces la palabra VBA Macros.


Dim i%,n%
N=Inputbox("Ingrese Valor para N:")
For i = 1 To N
lstN.AddItem "VBA Macros"
Next
Cap.7: Estructuras repetitivas
263

7.5 Estructura While


La estructura While -
nes. La estructura For-
While




ͫFormato 1
     While sea


obligatoriamente verdadera por lo menos la primera vez.

Do While condición
'Cuerpo del Bucle
Loop

Veamos cómo imprimir los diez primeros números enteros en forma ascendente
usando el formato 1:

Dim i%
i = 1
Do While i <= 10
Sheets(1).Cells(i, 1).Value = i
i = i + 1
Loop

ͫFormato 2
           
decir, la condición debe ser falsa para iniciar el ciclo; cuando el resultado de evaluar


Do Until condición
'Cuerpo del Bucle
Loop

Veamos cómo imprimir los diez primeros números enteros en forma ascendente
usando el formato 2:
Dim i%
i = 1
Do Until i > 10
Sheets(1).Cells(i, 2).Value = i
i = i + 1
Loop
Aplicaciones VBA con Excel
264

ͫFormato 3:



Do
'Cuerpo del Bucle
Loop While condición

Veamos cómo imprimir los diez primeros números enteros en forma ascendente
usando el formato 3:
Dim i%
i = 1
Do
Sheets(1).Cells(i, 3).Value = i
i = i + 1
Loop While i <= 10

ͫFormato 4:



Do
'Cuerpo del Bucle
Loop Until Condición

Veamos cómo imprimir los diez primeros números enteros en forma ascendente
usando el formato 4:
Dim i%
i = 1
Do
Sheets(1).Cells(i, 4).Value = i
i = i + 1
Loop Until i > 10

7.6 Casos desarrollados

ͫCaso desarrollado 1: Contadores y acumuladores - Movimientos bancarios


Implemente una aplicación en VBA que permita controlar los movimientos bancarios
que puede realizar un determinado cliente.

Debe tener en cuenta los siguientes aspectos:

-
cionarse desde el control ComboBox.



Cap.7: Estructuras repetitivas
265


necesario implementar un reloj digital en el UserForm que muestra en forma diná-
mica la hora actual.
Implemente funciones o procedimientos necesarios para la aplicación.
-
vimiento y el monto ingresado por el cliente.
Implemente un botón Procesar el cual permita mostrar el número de movimiento,
ListBox; también debe considerar

Implemente un botón Enviar a Excel para generar un registro de movimientos ban-

carios.
En la hoja de Excel los datos deben mostrarse de la siguiente manera:

Fig. 7.1 Entorno de la hoja de Excel




El UserForm debe tener el siguiente aspecto:

Fig. 7.2 UserForm de registro de movimientos bancarios


Aplicaciones VBA con Excel
266

Asigne las propiedades a los siguientes controles:

 
 
Label1  
Label2 (Name) lblFecha
 
Label3 (Name) lblHora
 
Label4 (Name) lblSaldo
 
Label5  
Label6  
Label7  
Label8  
Label9  
Label10  
Label11  
Label12  
Label13  
Combobox1 (Name) cboMovimiento
 

Default True
 (Name) btnExcel
 
 (Name) btnSalir

Cancel True
TextBox1 (Name) txtMonto
ListBox1 (Name) LstR

Código VBA:
'Variables globales
Dim cm As Boolean
Dim saldoActual@
Dim numeroMovimiento%, i%, cr%, cd%

Private Sub btnExcel_Click()


Dim uFila%
uFila = determinaUltimaFila

Sheets(1).Cells(uFila, 2).Value = lblFecha.Caption


Sheets(1).Cells(uFila, 3).Value = cr + cd
Sheets(1).Cells(uFila, 4).Value = cr
Cap.7: Estructuras repetitivas
267

Sheets(1).Cells(uFila, 5).Value = cd
Sheets(1).Cells(uFila, 6).Value = saldoActual
End Sub

Private Sub btnProcesar_Click()


If valida = "" Then
Dim tipo$, monto@

tipo = cboMovimiento.Text
monto = CCur(txtMonto.Text)

'Acumulador
Select Case tipo
Case "Retiro"
saldoActual = saldoActual - monto
cr = cr + 1
Case "Deposito"
saldoActual = saldoActual + monto
cd = cd + 1
End Select

'Contador
numeroMovimiento = numeroMovimiento + 1

'Imprimir los resultados


lstR.ColumnCount = 4
lstR.AddItem numeroMovimiento
lstR.List(i, 1) = tipo
lstR.List(i, 2) = lblHora.Caption
lstR.List(i, 3) = "$ " & Format(monto, "0.00")
i = i + 1

'Mostrando el saldo actualizado


lblSaldo.Caption = "$ " & Format(saldoActual, "0.00")
Else
MsgBox "El error se encuentra en " & valida
End If
End Sub

Private Sub btnSalir_Click()


End
End Sub

Private Sub UserForm_Activate()


Call llenaMovimientos

'Deniendo el valor inicial del saldo


saldoActual = 10000
lblSaldo.Caption = "$ " & Format(saldoActual, "0.00")
Range("C11").Value = saldoActual

Call muestraFecha_Hora
End Sub

'Mostrando la fecha y hora de la transacción


Sub muestraFecha_Hora()
lblFecha.Caption = Date
Do
If cm = True Then Exit Sub
lblHora.Caption = Format(Now, "hh:mm:ss")
DoEvents
Loop
End Sub
Aplicaciones VBA con Excel
268

'Llena tipos de movimientos


Sub llenaMovimientos()
cboMovimiento.Text = "(Seleccione)"
cboMovimiento.AddItem "Retiro"
cboMovimiento.AddItem "Deposito"
End Sub

'Función que determina la última la


Function determinaUltimaFila() As Integer
uFila = Sheets(1).Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Row
determinaUltimaFila = uFila
End Function

Private Sub UserForm_Terminate()


End
End Sub

'Función que valida el ingreso de valores


Function valida() As String
Dim mensaje$
If cboMovimiento.ListIndex = -1 Then
mensaje = "Tipo de movimiento"
cboMovimiento.SetFocus
ElseIf Len(Trim(txtMonto.Text)) = 0 Then
mensaje = "Monto"
txtMonto.SetFocus
ElseIf Not IsNumeric(txtMonto.Text) Then
mensaje = "Monto"
txtMonto.SetFocus
Else
mensaje = ""
End If
valida = mensaje
End Function

ͫCaso desarrollado 2: Estructura For - Registro de notas


Implemente una aplicación en VBA que permita controlar el registro de las notas de
los alumnos.

Debe tener en cuenta los siguientes aspectos:

En el UserForm se debe registrar el nombre del alumno, tres notas y un crédito por
cada uno de ellos.
La aplicación debe devolver el promedio simple y ponderado los cuales se mues-

tran a través de las siguientes fórmulas:

Promedio simple = n1 + n2 + n3
3

Promedio ponderado = n1xc1 + n2xc2 + n3xc3


(c1 + c2 + c3)

Donde: n1, n2 y n3 representan las tres notas del alumno, mientras que c1, c2 y c3
representan los créditos por cada nota.
Cap.7: Estructuras repetitivas
269

Luego de registrar los valores, estos deberán mostrarse en los cuadros de lista en el


siguiente orden: número de orden, nombre completo del alumno, nota1, crédito1,
nota2, crédito2, nota3, crédito3, promedio simple y promedio ponderado.
Implemente funciones o procedimientos necesarios para la aplicación.


Se debe implementar una función que permita validar el ingreso de valores en los


nombres del alumno, las notas deben encontrarse de 0 a 20 y el ingreso de valores


en crédito.
Implemente un botón llamado Registrar que permita mostrar los datos ingresados

Implemente un botón llamado Procesar que permita mostrar el nombre del alumno

con el mayor promedio ponderado además de su promedio ponderado. Finalmente


mostrar el número de alumnos aprobados y desaprobados.
Implemente un botón Enviar a Excel para enviar el número de orden, nombre com-


pleto del alumno, promedio simple y promedio ponderado a la hoja de Excel, tal
como se muestra en la siguiente imagen:

Fig. 7.3 Entorno de la hoja de Excel


Aplicaciones VBA con Excel
270

El UserForm debe tener el siguiente aspecto:

Fig. 7.4 UserForm de control de notas

Asigne las propiedades a los siguientes controles:

(Name) frmPromedio

 
Frame1  
Frame2  
Label1  
Label2  
Label3  
Label4  
Label5  
Label6  
Label7  
Label8  
Label9  
Label10  

Label11
 
(Name) lblPromedio
Label12
 
Cap.7: Estructuras repetitivas
271

(Name) lblAprobados
Label13
 
(Name) lblDesaprobados
Label14
 

 
Default True
(Name) btnLimpiar

 
(Name) btnProcesar

 
(Name) btnSalir
 
Cancel True
TextBox1 (Name) txtAlumno
TextBox2 (Name) txtN1
TextBox3 (Name) txtC1
TextBox4 (Name) txtN2
TextBox5 (Name) txtC2
TextBox6 (Name) txtN3
TextBox7 (Name) txtC3

Código VBA:

'Declaración de variables globales


Dim n%

Private Sub btnEnviar_Click()


Dim uFila%
uFila = determinaUltimaFila

For i = 0 To lstNumero.ListCount - 1
Sheets(1).Cells(uFila + i, 2).Value = lstNumero.List(i)
Sheets(1).Cells(uFila + i, 3).Value = lstAlumno.List(i)
Sheets(1).Cells(uFila + i, 4).Value = lstPromedioS.List(i)
Sheets(1).Cells(uFila + i, 5).Value = lstPromedioP.List(i)
Next
End Sub

Private Sub btnProcesar_Click()


On Error GoTo Imprevisto
Dim mayorPromedio#, i%, posicion%
For i = 0 To lstPromedioP.ListCount - 1
If CInt(lstPromedioP.List(i)) > mayorPromedio Then
mayorPromedio = CInt(lstPromedioP.List(i))
posicion = i
End If
Next
lblPromedio.Caption = mayorPromedio
lblMejorAlumno.Caption = lstAlumno.List(posicion)
Aplicaciones VBA con Excel
272

Dim cAprobados%, cDesaprobados%


For i = 0 To lstPromedioS.ListCount - 1
If CInt(lstPromedioS.List(i)) > 10 Then
cAprobados = cAprobados + 1
Else
cDesaprobados = cDesaprobados + 1
End If
Next
lblAprobados.Caption = cAprobados
lblDesaprobados.Caption = cDesaprobados
Exit Sub
Imprevisto:
MsgBox "Error en el proceso..!!"
End Sub

Private Sub btnRegistrar_Click()


If valida = "" Then
Dim alumno$, n1%, n2%, n3%, c1%, c2%, c3%

'Capturando los datos


alumno = txtAlumno.Text
n1 = CInt(txtN1.Text)
n2 = CInt(txtN2.Text)
n3 = CInt(txtN3.Text)
c1 = CInt(txtC1.Text)
c2 = CInt(txtC2.Text)
c3 = CInt(txtC3.Text)

'Calculando los promedios


Dim promedioSimple#, promedioPonderado#
promedioSimple = (n1 + n2 + n3) / 3
promedioPonderado=(n1*c1 + n2*c2 + n3*c3) / (c1 + c2 + c3)

'Enviando a las listas


n = n + 1
lstNumero.AddItem n
lstAlumno.AddItem UCase(alumno)
lstN1.AddItem n1
lstC1.AddItem c1
lstN2.AddItem n2
lstC2.AddItem c2
lstN3.AddItem n3
lstC3.AddItem c3
lstPromedioS.AddItem Format(promedioSimple, "0.00")
lstPromedioP.AddItem Format(promedioPonderado, "0.00")
Call limpiaControles
Else
MsgBox "El error se encuentra en " & valida
End If
End Sub

'Función que valida el ingreso de valores


Function valida() As String
Dim mensaje$
If Len(Trim(txtAlumno.Text)) = 0 Then
mensaje = "Nombre del alumno"
txtAlumno.SetFocus
ElseIf Not IsNumeric(txtN1.Text) Or
CInt(txtN1.Text) > 20 Or CInt(txtN1.Text) < 0 Then
mensaje = "Nota 1"
txtN1.SetFocus
Cap.7: Estructuras repetitivas
273

ElseIf Not IsNumeric(txtN2.Text) Or


CInt(txtN2.Text) > 20 Or CInt(txtN2.Text) < 0 Then
mensaje = "Nota 2"
txtN2.SetFocus
ElseIf Not IsNumeric(txtN3.Text) Or
CInt(txtN3.Text) > 20 Or CInt(txtN3.Text) < 0 Then
mensaje = "Nota 3"
txtN3.SetFocus
ElseIf Not IsNumeric(txtC1.Text) Or
CInt(txtC1.Text) > 20 Or CInt(txtC1.Text) < 0 Then
mensaje = "Credito 1"
txtC1.SetFocus
ElseIf Not IsNumeric(txtC2.Text) Or
CInt(txtC2.Text) > 20 Or CInt(txtC2.Text) < 0 Then
mensaje = "Credito 2"
txtC2.SetFocus
ElseIf Not IsNumeric(txtC3.Text) Or
CInt(txtC3.Text) > 20 Or CInt(txtC3.Text) < 0 Then
mensaje = "Credito 3"
txtC3.SetFocus
Else
mensaje = ""
End If
valida = mensaje
End Function

'Procedimiento que limpia los controles para un nuevo registro


Sub limpiaControles()
txtAlumno.Text = ""
txtN1.Text = ""
txtN2.Text = ""
txtN3.Text = ""
txtC1.Text = ""
txtC2.Text = ""
txtC3.Text = ""
txtAlumno.SetFocus
End Sub

'Función que determina la última la


Function determinaUltimaFila() As Integer
uFila = Sheets(1).Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Row
determinaUltimaFila = uFila
End Function

ͫCaso desarrollado 3: Estructura While - Registro de personal


Implemente una aplicación en VBA que permita controlar el registro de personal.

Debe tener en cuenta los siguientes aspectos:

En el UserForm
La aplicación inicialmente debe mostrar el código autogenerado con el siguiente
formato PER0001 donde PER es un valor constante y 0001
que dependerá de cuántos registros se encuentren en la hoja de Excel. Además de
ComboBox, con respecto a
los cargos se presentan los siguientes montos:
Aplicaciones VBA con Excel
274

Cargo Monto mensual


Jefe 
Administrador 
Operario 
Servicio 

La aplicación puede registrar N


por medio del botón Enviar a Excel.
Implemente funciones o procedimientos necesarios para la aplicación.
Implemente un botón Registrar que envíe el código autogenerado, nombre completo
-
pondientes.
En la hoja de Excel los datos deben mostrarse de la siguiente manera:

Fig. 7.5 Entorno de la hoja de Excel

Asimismo, desde el botón Registrar también se debe enviar información al control


Listbox con la siguiente información:



Promedio de salarios.
El porcentaje de mujeres que trabajan en la empresa.

El porcentaje de hombres que trabajan en la empresa.


Cap.7: Estructuras repetitivas
275

El UserForm debe tener el siguiente aspecto:




Fig. 7.6 UserForm de registro de venta

Asigne las propiedades a los siguientes controles:




(Name) frmRegistro

 
Label1  
Label2  
(Name) lblCodigo
Label3
 
Label4  
Label5  
Label6  
Label7  
Label8  
Label9  
Label10  
Label11  
Label12  
Combobox1 (Name) cboCargo
Aplicaciones VBA con Excel
276

Combobox2 (Name) cboSexo



 
Default True
(Name) btnExcel

 
TextBox1 (Name) txtApellidos
TextBox2 (Name) txtNombres
ListBox1 (Name) lstCodigo
ListBox2 (Name) lstPersonal
ListBox3 (Name) lstCargo
ListBox4 (Name) lstSexo
ListBox5 (Name) lstSueldo
ListBox6  

Código VBA:

'Declaración de variables globales


Dim numero%
Dim i%, C1200%, C5000%, C1200_5000%
Dim aSueldos@
Dim cMasculino%, cFemenino%

Private Sub btnExcel_Click()


Dim uFila%
uFila = determinaUltimoRegistro

For i = 0 To lstCodigo.ListCount - 1
Sheets(1).Cells(uFila + i, 2).Value = lstCodigo.List(i)
Sheets(1).Cells(uFila + i, 3).Value = lstPersonal.List(i)
Sheets(1).Cells(uFila + i, 4).Value = lstCargo.List(i)
Sheets(1).Cells(uFila + i, 5).Value = lstSexo.List(i)
Sheets(1).Cells(uFila + i, 6).Value = lstSueldo.List(i)
Next
Range("J4").Value = C1200
Range("J5").Value = C1200_5000
Range("J6").Value = C5000
Range("J7").Value = aSueldos / lstCodigo.ListCount
Range("J8").Value =
Format(cFemenino / (cFemenino + cMasculino), "0.00")
Range("J9").Value =
Format(cMasculino / (cFemenino + cMasculino), "0.00")
End Sub

Private Sub btnRegistrar_Click()


If valida = "" Then
'Capturando los datos
Dim apellidos$, nombres$, cargo$, sexo$
apellidos = txtApellidos.Text
nombres = txtNombres.Text
cargo = cboCargo.Text
sexo = cboSexo.Text
Cap.7: Estructuras repetitivas
277

'Enviando los valores a las listas


lstCodigo.AddItem lblCodigo.Caption
lstPersonal.AddItem UCase(apellidos) &
Space(1) & UCase(nombres)
lstCargo.AddItem cargo
lstSexo.AddItem sexo
lstSueldo.AddItem determinaSueldo

Call limpiaControles
lblCodigo.Caption = generaCodigo
Call realizaConteos
Else
MsgBox "El error se encuentra en " & valida
End If
End Sub

Private Sub UserForm_Activate()


Call llenaCargos
Call llenaSexo
numero = determinaUltimoRegistro - 12
lblCodigo.Caption = generaCodigo
End Sub

'Procedimiento que llena los cargos


Sub llenaCargos()
cboCargo.AddItem "Jefe"
cboCargo.AddItem "Administrador"
cboCargo.AddItem "Operario"
cboCargo.AddItem "Servicio"
End Sub

'Procedimiento que llena los tipo de sexo


Sub llenaSexo()
cboSexo.AddItem "(M)asculino"
cboSexo.AddItem "(F)emenino"
End Sub

‘Función que determina el sueldo del personal


Function determinaSueldo() As Currency
Dim sueldo@
Select Case cboCargo.Text
Case "Jefe": sueldo = 5500
Case "Administrador": sueldo = 3500
Case "Operario": sueldo = 1500
Case "Servicio": sueldo = 850
End Select
determinaSueldo = sueldo
End Function

'Función que genera codigo del nuevo personal


Function generaCodigo() As String
Dim codigo$
codigo = “PER” & Format(numero, “0000”)
numero = numero + 1
generaCodigo = codigo
End Function

'Función que determina el último registro


Function determinaUltimoRegistro() As Integer
uFila = Sheets(1).Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Row
determinaUltimoRegistro = uFila
Aplicaciones VBA con Excel
278

End Function

'Procedimiento que limpia los controles del formulario


Sub limpiaControles()
txtApellidos.Text = ""
txtNombres.Text = ""
cboCargo.ListIndex = -1
cboSexo.ListIndex = -1
txtApellidos.SetFocus
End Sub

'Conteos para estadística usando While


Sub realizaConteos()
Do While i < lstCodigo.ListCount
‘Realizando los conteos
If CCur(lstSueldo.List(i)) < 1200 Then
C1200 = C1200 + 1
ElseIf CCur(lstSueldo.List(i)) >= 1200 And
CCur(lstSueldo.List(i)) < 2500 Then
C1200_2500 = C1200_2500 + 1
Else
C5000 = C5000 + 1
End If
'Totalizando los sueldos
aSueldos = aSueldos + CCur(lstSueldo.List(i))

'Conteos por tipo de sexo


If lstSexo.List(i) = "(M)asculino" Then
cMasculino = cMasculino + 1
Else
cFemenino = cFemenino + 1
End If
i = i + 1
Loop

'Imprimir los resultados en las listas


lstEstadistica.Clear
lstEstadistica.AddItem
"La cantidad personal que gana menos a $1200: " & C1200
lstEstadistica.AddItem
"La cantidad personal que ganan entre $1200 a $2500: "
& C1200_2500
lstEstadistica.AddItem
"La cantidad personal que gana más a $2500: " & C5000
lstEstadistica.AddItem
"El promedio de los salarios: $ "
& Format(aSueldos / lstCodigo.ListCount, “0.00")
lstEstadistica.AddItem
"El porcentaje de mujeres que trabajan en la empresa: "
& Format((cFemenino * 100)/(cFemenino + cMasculino), "0.00")
lstEstadistica.AddItem "El porcentaje de hombres
que trabajan en la empresa: "
& Format((cMasculino*100)/(cFemenino+cMasculino), "0.00")
End Sub

'Función de validación
Function valida() As String
Dim mensaje$
If Len(Trim(txtApellidos.Text)) = 0 Then
mensaje = "apellidos del personal"
txtApellidos.SetFocus
Cap.7: Estructuras repetitivas
279

ElseIf Len(Trim(txtNombres.Text)) = 0 Then


mensaje = "nombre del personal"
txtNombres.SetFocus
ElseIf cboCargo.ListIndex = -1 Then
mensaje = "cargo del personal"
cboCargo.SetFocus
ElseIf cboSexo.ListIndex = -1 Then
mensaje = "sexo del personal"
cboSexo.SetFocus
Else
mensaje = ""
End If
valida = mensaje
End Function

ͫCaso desarrollado 4: Estructura Do Loop - Tienda comercial de electrodoméscos


Implemente una aplicación en VBA que permita controlar las ventas realizadas en una


Debe tener en cuenta los siguientes aspectos:

En el UserForm se debe registrar los datos del cliente como el nombre completo o

En el UserForm se debe registrar los datos del producto, como la descripción del
producto desde un control Combobox
Los precios de los productos se dan de acuerdo a la siguiente tabla:

Producto Precio en dólares


Lavadora 
Refrigeradora 
Televisión 
RadioGrabadora 
Cocina 
Licuadora 

Implemente un botón Comprar que permita enviar la información del producto



lista de resumen el subtotal a pagar por todos los productos seleccionados, el des-

-
nes para «eliminar» un determinado producto y «borrar» todos los productos, solo
cuando el cliente desea anular los productos seleccionados.
En las opciones de pago, deberá mostrar un check que permita habilitar la venta
al crédito, en caso sea seleccionado se deberán habilitar las opciones de 3, 6 y 9
cuotas.
Aplicaciones VBA con Excel
280

 Al seleccionar una opción de cuota (3, 6 o 9) se deberá mostrar las fechas y los
ListBox.
 Implemente un botón llamado Otra venta
 Implemente un botón llamado Enviar a Excel que enviará los datos referentes de la
venta, tal como se muestra en la siguiente imagen:

Fig. 7.7 Entorno de la hoja de Excel

El UserForm debe tener el siguiente aspecto:

Fig. 7.8 UserForm de sistema de pagos


Cap.7: Estructuras repetitivas
281

Asigne las propiedades a los siguientes controles:




(Name) frmTienda

 
Label1  
Label2  
Label3  
Label4  
Label5  
Label6  
Label7  
Label8  
Label9  
Label10  
Label11  
Frame1  
Frame2  
Frame3  
Frame4  
Frame5  
ComboBox1 (Name) cboProducto
(Name) btnComprar
 
Default True
(Name) btnEliminar
 
 
(Name) btnBorrar

 
(Name) btnExcel

 
(Name) btnOtro

 
(Name) btnSalir

 
TextBox1 (Name) txtCliente
TextBox2  
TextBox3  
ListBox1 (Name) lstProducto
Aplicaciones VBA con Excel
282

ListBox2  


ListBox3 (Name) lstSubtotal
ListBox4 (Name) lstResumen
ListBox5 (Name) lstFechas
ListBox6 (Name) lstMontos


 
(Name) opt3

 
(Name) opt6

 
(Name) opt9

 

Código VBA:

'Variables GLOBALES
Dim Neto@, letras%

Private Sub UserForm_Activate()


'Envia los productos al combo
Call llenaProductos

'Inhabilita las Opciones


HabilitaOpciones (False)
End Sub

Private Sub btnComprar_Click()


If validaProducto = "" Then
'Capturar la cantidad de productos
Dim cantidad%
cantidad = Val(txtCantidad.Text)

'Asignando el Precio a un producto


Dim Precio@
Precio = asignaPrecio(cboProducto.Text)

'Determinar el Subtotal
Dim SubTotal@
SubTotal = Precio * cantidad

'Enviar los datos a las listas


lstProductos.AddItem cboProducto.Text
lstCantidad.AddItem txtCantidad.Text
lstSubtotal.AddItem SubTotal

Call imprimirResumen(SubTotal)
chkCredito.Value = False
Else
MsgBox "El error esta en " & validaProducto
End If
Cap.7: Estructuras repetitivas
283

End Sub
Private Sub btnEliminar_Click()
If lstProductos.ListIndex = -1 Then
MsgBox "Debe seleccionar un producto a eliminar", vbCritical
Else
'Capturamos el índice del producto a eliminar
Dim Indice%
Indice = lstProductos.ListIndex

'Eliminar los elementos de las listas


Call EliminaListas(Indice)
End If
End Sub

Private Sub chkcredito_Click()


If chkCredito.Value = True Then
Call HabilitaOpciones(True)
Else
Call HabilitaOpciones(False)
lstFechas.Clear
lstMontos.Clear
End If
End Sub

'Imprime el pago y fechas para 3 letras


Private Sub opt3_Click()
Call ImprimePagos(3, Neto)
End Sub

'Imprime el pago y fechas para 6 letras


Private Sub opt6_Click()
Call ImprimePagos(6, Neto)
End Sub

'Imprime el pago y fechas para 9 letras


Private Sub opt9_Click()
Call ImprimePagos(9, Neto)
End Sub

Private Sub btnBorrar_Click()


lstProductos.Clear
lstCantidad.Clear
lstSubtotal.Clear
End Sub

'Función que permite asignar un precio a un producto


Function asignaPrecio(ByVal producto As String) As Currency
If producto = "Lavadora" Then
Precio = 1500
ElseIf producto = "Refrigeradora" Then
Precio = 3500
ElseIf producto = "Television" Then
Precio = 1600
ElseIf producto = "RadioGrabadora" Then
Precio = 500
ElseIf producto = "Cocina" Then
Precio = 1000
ElseIf producto = "Licuadora" Then
Precio = 300
Aplicaciones VBA con Excel
284

End If
asignaPrecio = Precio
End Function
'Función que valida el ingreso de datos del cliente
Function validaCliente()
Dim mensaje$
If Trim(txtCliente.Text) = Empty Then
mensaje = "Nombre del Cliente"
ElseIf Trim(txtRUC.Text) = Empty Or
Not IsNumeric(txtRUC.Text) Then
mensaje = "Ruc del Cliente"
End If
validaCliente = mensaje
End Function

'Función que valida el ingreso de datos del producto


Function validaProducto()
Dim mensaje$
If cboProducto.ListIndex = -1 Then
mensaje = "descripcion del producto"
ElseIf Not IsNumeric(txtCantidad.Text) Then
mensaje = "cantidad de producto"
End If
validaProducto = mensaje
End Function

'Procedimiento que imprime los montos y las


'fechas de pago
Sub ImprimePagos(ByVal letras%, Neto@)
lstFechas.Clear
lstMontos.Clear

'Determinar el Monto por Mes


Dim Monto@
Monto = Neto / letras

'Imprime las fechas y las montos mensuales


Dim i%
i = 0
Do
lstFechas.AddItem DateAdd("M", i, Date)
lstMontos.AddItem "$ " & Format(Monto, "0.00")
i = i + 1
Loop While i < letras
End Sub

'Procedimiento que bloquea los controles


'de tipo OptionButton
Sub HabilitaOpciones(ByVal Opcion As Boolean)
opt3.Enabled = Opcion
opt6.Enabled = Opcion
opt9.Enabled = Opcion
End Sub

'Función que asigna el número de cuotas seleccionada


'por el usuario
Function determinaLetras()
If opt3.Value = True Then
determinaLetras = 3
Cap.7: Estructuras repetitivas
285

ElseIf opt6.Value = True Then


determinaLetras = 6
ElseIf opt9.Value = True Then
determinaLetras = 9
Else
determinaLetras = 1
End If
End Function

'Procedimiento que llena los productos


'en el control ComboBox
Sub llenaProductos()
With cboProducto
.AddItem "Lavadora"
.AddItem "Refrigeradora"
.AddItem "Television"
.AddItem "RadioGrabadora"
.AddItem "Cocina"
.AddItem "Licuadora"
End With
End Sub

'Procedimiento que elimina un producto de la lista


Sub EliminaListas(ByVal Indice As Integer)
lstProductos.RemoveItem (Indice)
lstCantidad.RemoveItem (Indice)
lstSubtotal.RemoveItem (Indice)
End Sub

'Función que calcula el monto acumulado del subtotal


Function calculaSubTotal()
Dim i%, s@
s = 0
i = 0
Do
s = s + CCur(lstSubtotal.List(i))
i = i + 1
Loop While i < lstSubtotal.ListCount
calculaSubTotal = s
End Function

'Procedimiento que imprime el resultado en el


'control ListBox
Sub imprimirResumen(ByVal SubTotal As Currency)
lstResumen.Clear

'Calcular el Descuento
Dim Descuento@
Descuento = calculaSubTotal * 0.06

'Calcular el Neto
Neto = calculaSubTotal - Descuento

'Imprimir Resumen
lstResumen.AddItem "El SubTotal es: $"
& Format(calculaSubTotal, "0.00")
lstResumen.AddItem "El Descuento es: $"
& Format(Descuento, "0.00")
Aplicaciones VBA con Excel
286

lstResumen.AddItem "El Neto es: $" & Format(Neto, "0.00")


End Sub

Private Sub btnExcel_Click()


If validaCliente = "" Then
Dim uFila%
uFila = determinaUltimoRegistro

Sheets(1).Cells(uFila, 2).Value = uFila - 10


Sheets(1).Cells(uFila, 3).Value = UCase(txtCliente.Text)
Sheets(1).Cells(uFila, 4).Value = Date
Sheets(1).Cells(uFila, 5).Value = Neto

Dim fechaLetras$
For i = 0 To determinaLetras - 1
fechaLetras = fechaLetras & lstFechas.List(i)
& vbNewLine
Next
Sheets(1).Cells(uFila, 6).Value = fechaLetras
Sheets(1).Cells(uFila, 7).Value = Neto / determinaLetras
Call limpiarTodo
Else
MsgBox "El error se encuentra en " & valida
End If
End Sub

'Función que determina el último registro


Function determinaUltimoRegistro() As Integer
uFila = Sheets(1).Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Row
determinaUltimoRegistro = uFila
End Function

Private Sub btnOtro_Click()


Call limpiarTodo
End Sub

'Procedimiento que limpia todos los controles


Sub limpiarTodo()
txtCliente.Text = Empty
txtRUC.Text = Empty
cboProducto.ListIndex = -1
txtCantidad.Text = Empty
lstProductos.Clear
lstCantidad.Clear
lstSubtotal.Clear
lstResumen.Clear
lstFechas.Clear
lstMontos.Clear
chkCredito.Value = False
End Sub
Cap.7: Estructuras repetitivas
287

ͫCaso desarrollado 5: Estructura Do While - Registro de autos (papeletas)


Implemente una aplicación en VBA que permita controlar el registro de papeletas en
una comisaría del sector.
Debe tener en cuenta los siguientes aspectos:

Agregar un módulo en el entorno VBA de tal manera que implemente los siguientes
procedimientos:

'Procedimiento que determina el número de autos


'que no han cancelado la deuda
Sub determinaTotalNOCancelado()
Range("G12").Select
Dim i%
Do While ActiveCell.Value <> ""
If ActiveCell.Value = "No" Then
i = i + 1
End If
ActiveCell.Offset(1, 0).Select
Loop
MsgBox "El total de autos no cancelados es: " & i
End Sub

'Procedimiento que determina el numero de autos


'que han cancelado la deuda
Sub determinaTotalCancelado()
Range("G12").Select
Dim i%
Do While ActiveCell.Value <> ""
If ActiveCell.Value = "Sí" Then
i = i + 1
End If
ActiveCell.Offset(1, 0).Select
Loop
MsgBox "El total de autos cancelados es: " & i
End Sub

'Procedimiento que determina el monto acumulado generado por autos


'que no han cancelado la deuda
Sub determinaMontoTotalNOCancelado()
Range("G12").Select
Dim s@
Do While ActiveCell.Value <> ""
If ActiveCell.Value = "No" Then
s = s + CDbl(ActiveCell.Offset(0, -2).Value)
End If
ActiveCell.Offset(1, 0).Select
Loop
MsgBox "El monto total generado por autos no cancelados es: $ "
& Format(s, "0.00")
End Sub

'Procedimiento que determina el monto acumulado generado por autos


'que han cancelado la deuda
Sub determinaMontoTotalCancelado()
Range("G12").Select
Dim s@
Aplicaciones VBA con Excel
288

Do While ActiveCell.Value <> ""


If ActiveCell.Value = "Sí" Then
s = s + CDbl(ActiveCell.Offset(0, -2).Value)
End If
ActiveCell.Offset(1, 0).Select
Loop
MsgBox "El monto total generado por autos cancelados es: $ "
& Format(s, "0.00")
End Sub

La hoja de Excel debe agregar botones para determinar el total de autos no cancelados,


total de autos cancelados, monto total de autos que no cancelan y monto total de autos
que cancelan la deuda, tal como se muestra en la siguiente imagen:

Fig. 7.9 Entorno de la hoja de Excel


Cap.7: Estructuras repetitivas
289

ͫCaso desarrollado 6: Estructura Do Loop - Eliminar celdas vacías


Implemente una aplicación en VBA que permita eliminar celdas vacías que se puedan
encontrar en un registro de autos.

Debe tener en cuenta los siguientes aspectos:

 Agregar un módulo en el entorno VBA de tal manera que implemente el siguiente


procedimiento:

Sub eliminaCeldasVacias()
Dim uFila%
Range("B1000").Select
Selection.End(xlUp).Select
uFila = ActiveCell.Row

Range("B12").Select
Dim i%
i = 1
Do
If ActiveCell = "" Then
Selection.EntireRow.Delete
Else
ActiveCell.Offset(1, 0).Select
End If
i = i + 1
Loop While i <= uFila
End Sub

La hoja de Excel debe agregar un botón para acceder al procedimiento eliminaCel-




dasVacias, tal como se muestra en la siguiente imagen:

Fig. 7.10 Entorno de la hoja de Excel


Aplicaciones VBA con Excel
290

ͫCaso desarrollado 7: Estructura Do While - Copiar celdas a otra hoja


Implemente una aplicación en VBA que permita copiar los datos del registro de autos
según la condición establecida. Para este caso debemos ingresar el nombre de la

Excel previamente preparada.

Debe tener en cuenta los siguientes aspectos:

Agregar un módulo en el entorno VBA de tal manera que implemente el siguiente


procedimiento:

Sub Copiar_Rango()
Dim marca$
marca = InputBox("Ingrese marca de auto: ", "Ingreso")
Sheets("Original").Select
Range("B12").Select

Do While ActiveCell <> ""


If ActiveCell = UCase(marca) Then
ActiveCell.Select
Range(ActiveCell, ActiveCell.Offset(0, 5)).Select
Selection.Copy

Sheets("Copias").Select
Range("B12").Select
Do While ActiveCell <> ""
ActiveCell.Offset(1, 0).Select
Loop
ActiveSheet.Paste
End If
Sheets("Original").Select
ActiveCell.Offset(1, 0).Select
Loop
Range("B12").Select
Application.CutCopyMode = False
End Sub
Cap.7: Estructuras repetitivas
291

En la hoja de Excel (Origen) se debe agregar un botón para acceder al procedimiento




Copiar_Rango, tal como se muestra en la siguiente imagen:

Fig. 7.11 Entorno de la hoja de Excel (Original)




Fig. 7.12 Entorno de la hoja de Excel (Copias)


8
Cap.
Base de datos

Capacidad
Implementa aplicaciones VBA haciendo uso de todas las sentencias aprendidas, además
         
dicha información de manera profesional.

8.1 Introducción
Existen muchos conceptos para base de datos, pero el más adecuado es el que se des-
prende inmediatamente de su nombre, quiere decir, el de un conjunto de datos, al mismo


La necesidad de una base de datos surge en los años 60 como respuesta a la anarquía que

información redundante. La propuesta de una base de datos como concepto tecnológico
comenzó con las siguientes ideas:

Registrar los datos que son importantes para una organización y decidir el nivel de
prioridad de los mismos.
Organizarlos de manera correcta.
Colocarlos en un repositorio único, es decir, asignarle un nombre como Base de Datos.
Impedir que las aplicaciones externas accedan a los datos directamente, esto es, solo
podrán ser accesibles por medio de una conexión hacia dicha base, para esto SQL
como gestor de base de datos pondrá las reglas de juego para dicho acceso.

En este capítulo trataremos el manejo de información cuya fuente sea propiamente Ex-
cel, es decir, una hoja de Excel donde se encontrará toda la información que se necesita
consultar, copiar o eliminar.

ͫCaso desarrollado 1: Consulta de datos desde la hoja de Excel (Agenda de clientes)


Implemente una aplicación en VBA que permita mostrar información de un determi-
nado cliente registrado en una hoja de Excel.
Aplicaciones VBA con Excel
294

Debe tener en cuenta los siguientes aspectos:

Debemos contar con dos hojas en un libro de Excel, la primera debe contener los
datos de los clientes (Clientes), y la segunda, otra hoja (Distritos) con el código y des-
cripción del distrito.
Se debe implementar una función que permita validar el ingreso del código de cliente.
Implemente un botón Buscar el cual permita mostrar los datos del cliente en los
TextBox. Hay que tener en cuenta que en la lista de clientes no se
encuentra la descripción de los distritos; por tanto, la aplicación deberá buscar en la
hoja de distritos el código adecuado.
En la hoja de Excel (Clientes) los datos deben mostrarse de la siguiente manera:

Fig. 8.1 Entorno de la hoja de Excel(Clientes)

La segunda hoja (Distritos) debe tener el siguiente aspecto, hay que tomar en cuenta
que se puede agregar los distritos que crea conveniente:

Fig. 8.2 Entorno de la hoja de Excel (Distritos)


Cap.8: Base de datos
295

El UserForm debe tener el siguiente aspecto:




Fig. 8.3 UserForm de consulta de datos (Agenda)

Asigne las propiedades a los siguientes controles:




 (Name) frmBusqueda


 
Label1  
Label2  
Label3  
Label4 (Name) lblCodigo
Label5  
Label6  
Label7  
TextBox1 (Name) txtCodigo
TextBox2 (Name) txtPersona
TextBox3 (Name) txtDistrito
TextBox4 (Name) txtEdad
TextBox5 (Name) txtEmpleador
 (Name) btnBuscar

Default True
 (Name) btnLimpiar
 
 (Name) btnSalir

Cancel True
Aplicaciones VBA con Excel
296

Código VBA:

Private Sub btnBuscar_Click()


If valida = "" Then
Dim codigo$
codigo = Trim(txtCodigo.Text)

Worksheets("Clientes").Activate
Range("A13").Select
Do
If ActiveCell.Value = codigo Then
lblCodigo.Caption = ActiveCell.Value
txtPersona.Text=ActiveCell.Offset(0,3).Value & Space(1) & _
ActiveCell.Offset(0, 1).Value & Space(1) & _
ActiveCell.Offset(0, 2).Value
txtDistrito.Text=muestraDistrito(ActiveCell.Offset(0,4).Value)
txtEdad.Text = ActiveCell.Offset(0, 5).Value
txtEmpleador.Text = ActiveCell.Offset(0, 6).Value
End If
ActiveCell.Offset(1, 0).Select
Loop While ActiveCell.Value <> ""
Range("A13").Select
Else
MsgBox "El error se encuentra en " & valida
End If
End Sub

Function muestraDistrito(ByVal codigo$) As String


Worksheets("Distritos").Activate
Range("C5").Select

Do
If ActiveCell.Value = codigo Then
muestraDistrito = ActiveCell.Offset(0, -1).Value
End If
ActiveCell.Offset(1, 0).Select
Loop While ActiveCell.Value <> ""
Worksheets("Clientes").Activate
End Function

Private Sub btnLimpiar_Click()


txtPersona.Locked = Empty
txtEdad.Locked = Empty
txtDistrito.Locked = Empty
txtEmpleador.Locked = Empty
txtCodigo.Text = Empty
lblCodigo.Caption = ""
txtCodigo.SetFocus
End Sub

Private Sub UserForm_Activate()


txtPersona.Locked = True
txtEdad.Locked = True
txtDistrito.Locked = True
txtEmpleador.Locked = True
End Sub

'Función que valida el codigo del cliente


Function valida() As String
Cap.8: Base de datos
297

Dim mensaje$
If Len(Trim(txtCodigo.Text)) = 0 Then
mensaje = "codigo del cliente"
txtCodigo.SetFocus
End If
valida = mensaje
End Function

ͫCaso desarrollado 2: Listado de clientes por distrito (Agenda de clientes)


Implemente una aplicación en VBA que permita mostrar los datos de los clientes
según el distrito.

Debe tener en cuenta los siguientes aspectos:

Debemos contar con tres hojas en un libro de Excel, la primera debe contener los
datos de los clientes (Clientes), la segunda hoja con los datos de los distritos y sus
códigos, y la tercera hoja (Listado) con la información de los clientes según el dis-
trito seleccionado.
Implemente un botón Buscar, el cual permita mostrar los datos del cliente como

ListBox.
Implemente un botón Enviar a Excel, el cual permita enviar la información obtenida
ListBox y enviarlos a la hoja de Excel (Listado).
En la hoja de Excel (Clientes) los datos deben mostrarse de la siguiente manera:

Fig. 8.4 Entorno de la hoja de Excel (Clientes)


Aplicaciones VBA con Excel
298

La segunda hoja (Distritos) debe tener el siguiente aspecto, hay que tomar en cuenta
que se puede agregar los distritos que crea conveniente:

Fig. 8.5 Entorno de la hoja de Excel (Distritos)

La tercera hoja (Listado) debe tener el siguiente aspecto:

Fig. 8.6 Entorno de la hoja de Excel (Listado)


Cap.8: Base de datos
299

El UserForm debe tener el siguiente aspecto:




Fig. 8.7 UserForm listado de clientes por distrito

Asigne las propiedades a los siguientes controles:




 (Name) frmBusqueda


 
Label1  
Label2  
Label3  
Label4  
Label5  
ComboBox1 (Name) cboDistrito
ListBox1 (Name) lstCodigo
ListBox2 (Name) lstCliente
ListBox3 (Name) lstDistrito
 (Name) btnBuscar

Default True
 (Name) btnLimpiar

 (Name) btnSalir

 
 
 
Aplicaciones VBA con Excel
300

Código VBA:
Private Sub btnBuscar_Click()
Call limpiarListas
If valida = "" Then
Dim distrito$, codigoDistrito$
distrito = cboDistrito.Text

codigoDistrito = devuelveCodigo(distrito)

Worksheets("Clientes").Activate
Range("E13").Select
Do
If ActiveCell.Value = codigoDistrito Then
lstCodigo.AddItem ActiveCell.Offset(0, -4).Value
lstCliente.AddItem ActiveCell.Offset(0, -1).Value & _
Space(1) & ActiveCell.Offset(0, -3).Value & _
Space(1) & ActiveCell.Offset(0, -2).Value

lstDistrito.AddItem ActiveCell.Value
End If
ActiveCell.Offset(1, 0).Select
Loop While ActiveCell.Value <> ""
Range("E13").Select
Else
MsgBox "El error se encuentra en " & valida
End If
End Sub

'Procedimiento que llena el control Combobox


'con los distritos
Sub muestraDistrito()
Worksheets("Distritos").Activate
Range("B5").Select

Do
cboDistrito.AddItem ActiveCell.Value
ActiveCell.Offset(1, 0).Select
Loop While ActiveCell.Value <> ""

Worksheets("Clientes").Activate
End Sub

'Procedimiento que limpia las listas


Sub limpiarListas()
lstCliente.Clear
lstCodigo.Clear
lstDistrito.Clear
End Sub

Private Sub btnExcel_Click()


Sheets("Listado").Activate
Range("B15:D1000").ClearContents
Range("C12").Value = cboDistrito.Text
uFila = Sheets("Listado")
.Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Row
For i = 0 To lstCodigo.ListCount - 1
Sheets("Listado").Cells(uFila+i, 2).Value=lstCodigo.List(i)
Sheets("Listado").Cells(uFila+i,3).Value=lstCliente.List(i)
Sheets("Listado").Cells(uFila+i,4).Value=lstDistrito.List(i)
Next
End Sub
Cap.8: Base de datos
301

Private Sub btnLimpiar_Click()


lstCliente.Clear
lstDistrito.Clear
lstCodigo.Clear
End Sub

Private Sub UserForm_Activate()


Call muestraDistrito
End Sub

'Función que valida el codigo del cliente


Function valida() As String
Dim mensaje$
If cboDistrito.ListIndex = -1 Then
mensaje = "descripción del distrito"
cboDistrito.SetFocus
End If
valida = mensaje
End Function

'Función que devuelva el codigo de distrito


Function devuelveCodigo(ByVal distrito$) As String
Worksheets("Distritos").Activate
Range("B5").Select

Do
If ActiveCell.Value = distrito Then
devuelveCodigo = ActiveCell.Offset(0, 1).Value
End If
ActiveCell.Offset(1, 0).Select
Loop While ActiveCell.Value <> ""

Worksheets("Clientes").Activate
End Function

ͫCaso desarrollado 3: Listado de clientes por letra inicial de su apellido paterno


(Agenda de clientes)
Implemente una aplicación en VBA que permita mostrar los datos de los clientes se-
gún la selección de la letra inicial de su apellido paterno.

Debe tener en cuenta los siguientes aspectos:

Debemos contar con tres hojas en un libro de Excel, la primera debe contener los
datos de los clientes (Clientes), la segunda hoja con los datos de los distritos y la
tercera hoja (Listado) con la información de los clientes según la letra inicial de su
apellido paterno.
      
mostrar los datos del cliente como código, nombre completo y el nombre del distri-
ListBox.
Implemente un botón Enviar a Excel el cual permita enviar la información obteni-
ListBox y enviarlos a la hoja de Excel (Listado).
• En la hoja de Excel (Clientes) los datos deben mostrarse de la siguiente manera:
Aplicaciones VBA con Excel
302

Fig. 8.8 Entorno de la hoja de Excel (Clientes)

La segunda hoja (Distritos) debe tener el siguiente aspecto, hay que tomar en cuenta
que se puede agregar los distritos que crea conveniente:

Fig. 8.9 Entorno de la hoja


de Excel (Distritos)

La tercera hoja (Listado) debe tener el siguiente aspecto:

Fig. 8.10 Entorno de la hoja de Excel (Listado)


Cap.8: Base de datos
303

El UserForm debe tener el siguiente aspecto:




Fig. 8.11 UserForm listado de clientes por letra inicial

Asigne las propiedades a los siguientes controles:




 (Name) frmBusqueda


 
Label1  
Label2  
Label3  
Label4  
ListBox1 (Name) lstCodigo
ListBox2 (Name) lstCliente
ListBox3 (Name) lstDistrito
 (Name) btnA
 
 (Name) btnB
 
 (Name) btnC
 
 (Name) btnD
 
Aplicaciones VBA con Excel
304

 
 
 
 
 
 
 (Name) btnH
 
 (Name) btnI
 
 (Name) btnJ
 
 (Name) btnK
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 (Name) btnT
 
 
 
 (Name) btnV
 
 
 
 (Name) btnY
 
Cap.8: Base de datos
305

 
 
 
 
 
 
 
 
Cancel True
 
 

Código VBA:

Dim Letra$

Sub muestracliente(ByVal Letra$)


Worksheets("Clientes").Activate
Range("B13").Select
Do
If Left(ActiveCell.Value, 1) = Letra Then
lstCodigo.AddItem ActiveCell.Offset(0, -1).Value
lstCliente.AddItem ActiveCell.Offset(0, 2).Value & _
Space(1) & ActiveCell.Value & _
Space(1) & ActiveCell.Offset(0, 1).Value

lstDistrito.AddItem muestraDistrito(ActiveCell.Offset(0,3).Value)
End If
ActiveCell.Offset(1, 0).Select
Loop While ActiveCell.Value <> ""
Range("B13").Select
End Sub

'Función que muestra el nombre del distrito


Function muestraDistrito(ByVal codigoDistrito) As String
Worksheets("Distritos").Activate
Range("C5").Select
Do
If ActiveCell.Value = codigoDistrito Then
muestraDistrito = ActiveCell.Offset(0, -1).Value
End If
ActiveCell.Offset(1, 0).Select
Loop While ActiveCell.Value <> ""
Worksheets("Clientes").Activate
End Function

Private Sub btnExcel_Click()


Sheets("Listado").Activate
Range("B15:D1000").ClearContents
Range("C12").Value = Letra
uFila=Sheets("Listado").Cells(Rows.Count,2).End(xlUp)
.Offset(1, 0).Row
For i = 0 To lstCodigo.ListCount - 1
Sheets("Listado").Cells(uFila+i,2).Value=lstCodigo.List(i)
Sheets("Listado").Cells(uFila+i,3).Value=lstCliente.List(i)
Sheets("Listado").Cells(uFila+i,4).Value=lstDistrito.List(i)
Next
Aplicaciones VBA con Excel
306

End Sub

Private Sub btnA_Click()


Call limpiarListas
Letra = "A"
Call muestracliente("A")
End Sub

Private Sub btnB_Click()


Call limpiarListas
Letra = "B"
Call muestracliente("B")
End Sub

Private Sub btnC_Click()


Call limpiarListas
Letra = "C"
Call muestracliente("C")
End Sub

Private Sub btnD_Click()


Call limpiarListas
Letra = "D"
Call muestracliente("D")
End Sub

Private Sub btnE_Click()


Call limpiarListas
Letra = "E"
Call muestracliente("E")
End Sub

Private Sub btnF_Click()


Call limpiarListas
Letra = "F"
Call muestracliente("F")
End Sub

Private Sub btnG_Click()


Call limpiarListas
Letra = "G"
Call muestracliente("G")
End Sub

Private Sub btnH_Click()


Call limpiarListas
Letra = "H"
Call muestracliente("H")
End Sub

Private Sub btnI_Click()


Call limpiarListas
Letra = "I"
Call muestracliente("I")
End Sub

Private Sub btnJ_Click()


Call limpiarListas
Letra = "J"
Call muestracliente("J")
End Sub
Cap.8: Base de datos
307

Private Sub btnK_Click()


Call limpiarListas
Letra = "K"
Call muestracliente("K")
End Sub

Private Sub btnL_Click()


Call limpiarListas
Letra = "L"
Call muestracliente("L")
End Sub

Private Sub btnM_Click()


Call limpiarListas
Letra = "M"
Call muestracliente("M")
End Sub

Private Sub btnN_Click()


Call limpiarListas
Letra = "N"
Call muestracliente("N")
End Sub

Private Sub btnÑ_Click()


Call limpiarListas
Letra = "Ñ"
Call muestracliente("Ñ")
End Sub

Private Sub btnO_Click()


Call limpiarListas
Letra = "O"
Call muestracliente("O")
End Sub

Private Sub btnP_Click()


Call limpiarListas
Letra = "P"
Call muestracliente("P")
End Sub

Private Sub btnQ_Click()


Call limpiarListas
Letra = "Q"
Call muestracliente("Q")
End Sub

Private Sub btnR_Click()


Call limpiarListas
Letra = "R"
Call muestracliente("R")
End Sub

Private Sub btnS_Click()


Call limpiarListas
Letra = "S"
Call muestracliente("S")
End Sub

Private Sub btnT_Click()


Aplicaciones VBA con Excel
308

Call limpiarListas
Letra = "T"
Call muestracliente("T")
End Sub

Private Sub btnU_Click()


Call limpiarListas
Letra = "U"
Call muestracliente("U")
End Sub

Private Sub btnV_Click()


Call limpiarListas
Letra = "V"
Call muestracliente("V")
End Sub

Private Sub btnW_Click()


Call limpiarListas
Letra = "W"
Call muestracliente("W")
End Sub

Private Sub btnY_Click()


Call limpiarListas
Letra = "Y"
Call muestracliente("Y")
End Sub

Private Sub btnZ_Click()


Call limpiarListas
Letra = "Z"
Call muestracliente("Z")
End Sub

Private Sub btnTodos_Click()


Worksheets("Clientes").Activate
Range("B13").Select
Do
lstCodigo.AddItem ActiveCell.Offset(0, -1).Value
lstCliente.AddItem ActiveCell.Offset(0, 2).Value & _
Space(1) & ActiveCell.Value & _
Space(1) & ActiveCell.Offset(0, 1).Value
lstDistrito.AddItem muestraDistrito(ActiveCell.Offset(0, 3).Value)
ActiveCell.Offset(1, 0).Select
Loop While ActiveCell.Value <> ""
Range("B13").Select
End Sub

Private Sub btnLimpiar_Click()


lstCliente.Clear
lstDistrito.Clear
lstCodigo.Clear
End Sub

'Procedimiento que limpia las listas


Sub limpiarListas()
lstCliente.Clear
lstCodigo.Clear
lstDistrito.Clear
End Sub
Cap.8: Base de datos
309

8.2 Recuperación de datos mediante la sentencia SELECT


de SQL
Select 
desde un conjunto de datos, en nuestro caso usaremos a Select
obtenida desde Excel. Cuenta con el siguiente formato:

SELECT ListaCampos
[ FROM Tabla ]
[ WHERE Condición ]
[ GROUP BY ExpresionGrupo ]
[ HAVING CondicionBusqeuda ]
[ ORDER BY [ASC|DESC]]

Donde:

Select: Indica el inicio de la sentencia.


ListaCampos:
From Tabla:
Where condición:
Group by ExpresionGrupo: 
una tabla.
Having condicionBusqueda:

un Group By.
Order By ASC|DESC: 
y DESC la descendencia.

Para demostrar la forma de trabajo de la sentencia SELECT haremos uso de la siguiente


base de datos implementada en Access.

Fig. 8.12 Relaciones de las tablas en Access de la base de datos Ventas


Aplicaciones VBA con Excel
310



Tabla: Clientes

Tabla: Detalle

Tabla: Facturas
Cap.8: Base de datos
311

Tabla: Producto

8.2.1 Agregar una referencia


Para conectarse a una base de datos de Access necesitamos agregar la siguiente refe-
rencia:

Ingrese al entorno VBA <ALT+F11>.




Desde el menú Herramientas > Referencias….




Microso AcveX Data Objects 2.7 Library, tal como se muestra




en la siguiente imagen:

Fig. 8.13 Referencias del entorno VBA


Aplicaciones VBA con Excel
312

8.3 Listado de registros simple


  
tabla, de tal forma que podemos administrar toda la información de los registros sin res-
tricciones. Su formato es:

SELECT * FROM NombreTabla

Donde:

* (asterisco): Representa a todos los registros de la tabla.


NombreTabla: Es el nombre de la tabla del cual queremos obtener información.

ͫCaso desarrollado 1: Listado de clientes


Implemente una aplicación que permita listar los registros de la tabla clientes en una
hoja de Excel.

Debe tener en cuenta los siguientes aspectos:

 Debemos contar con una carpeta que contenga la base de datos de Access llama-
da Ventas.accdb y el propio archivo de Excel, de tal forma que tenga el siguiente
aspecto:

Fig. 8.14 Contenido de la carpeta Ventas

 Agregue la referencia Microso AcveX Data Objects 2.7 Library al proyecto, des-
de el entorno VBA.
 Implemente el siguiente modelo de hoja de Excel:
Cap.8: Base de datos
313

Implemente el siguiente código en un módulo agregado al proyecto desde el en-




torno VBA:
'Variables globales
Dim cn As New ADODB.Connection

'Función que permite crear la cadena de conexión a Access


Function getConecta()
cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & ThisWorkbook.Path & "\" & "Ventas.accdb"
getConecta = cn
End Function

'Procedimiento que limpia el contenido de las celdas


Sub LimpiaCeldas()
Sheets(1).Range("B7:N1000").ClearContents
End Sub

'Procedimiento que lista todos los clientes .


Sub listaClientes()
Call LimpiaCeldas
cn = getConecta()
cn.Open

Dim rs As New ADODB.Recordset


rs.Open "Select * from clientes", cn
Worksheets(1).Cells(7, 2).CopyFromRecordset rs
rs.Close
cn.Close
End Sub

Finalmente, asocie el botón LISTADO DE CLIENTES al procedimiento listaClientes y el




botón LIMPIAR CELDAS al procedimiento LimpiaCeldas.

ͫCaso desarrollado 2: Listado de productos


Implemente una aplicación que permita listar los registros de la tabla productos en
una hoja de Excel.

Debe tener en cuenta los siguientes aspectos:


 Debemos contar con una carpeta que contenga la base de datos de Access llama-
da Ventas.accdb y el propio archivo de Excel, de tal forma que tenga el siguiente
aspecto:

Fig. 8.15 Contenido de la carpeta Ventas


Aplicaciones VBA con Excel
314

Agregue la referencia Microso AcveX Data Objects 2.7 Library al proyecto, desde
el entorno VBA.
Implemente el siguiente modelo de hoja de Excel:

Fig. 8.16 Entorno de la hoja de Excel para el listado de productos

Implemente el siguiente código en un módulo agregado al proyecto desde el entorno


VBA:

'Variables globales
Dim cn As New ADODB.Connection

'Función que permite crear la cadena de conexión a Access


Function getConecta()
cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & ThisWorkbook.Path & "\" & "Ventas.accdb"
getConecta = cn
End Function

'Procedimiento que limpia el contenido de las celdas


Sub LimpiaCeldas()
Sheets(1).Range("B7:E1000").ClearContents
End Sub

'Procedimiento que lista todos los clientes .


Sub listaProductos()
Call LimpiaCeldas
cn = getConecta()
cn.Open

Dim rs As New ADODB.Recordset


rs.Open "Select * from producto", cn
Worksheets(1).Cells(7, 2).CopyFromRecordset rs
rs.Close
cn.Close
End Sub

Finalmente, asocie el botón LISTADO DE PRODUCTOS al procedimiento listaProduc-


tos y el botón LIMPIAR CELDAS al procedimiento LimpiaCeldas.
Cap.8: Base de datos
315

8.4 Listado de registros usando alias



sus registros, en ocasiones la cláusula FROM hará referencia a más de una tabla; por lo
         
común. Su formato es:

SELECT Alias.* FROM NombreTabla Alias

Donde:

Alias.* (asterisco): Representa a todos los registros de la tabla según su alias asignado.
NombreTabla Alias: Es el nombre de la tabla del cual queremos obtener información



ͫCaso desarrollado: Listado de facturas


Implemente una aplicación que permita listar los registros de la tabla facturas usando
alias, en una hoja de Excel.

Debe tener en cuenta los siguientes aspectos:

 Debemos contar con una carpeta que contenga la base de datos de Access llama-
da Ventas.accdb y el propio archivo de Excel, de tal forma que tenga el siguiente
aspecto:

Fig. 8.17 Contenido de la carpeta Ventas


Aplicaciones VBA con Excel
316

Agregue la referencia Microso AcveX Data Objects 2.7 Library al proyecto, desde
el entorno VBA.
Implemente el siguiente modelo de hoja de Excel:

Fig. 8.18 Entorno de la hoja de Excel para el listado de facturas

Implemente el siguiente código en un módulo agregado al proyecto desde el entorno


VBA:

'Variables globales
Dim cn As New ADODB.Connection

'Función que permite crear la cadena de conexión a Access


Function getConecta()
cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & ThisWorkbook.Path & "\" & "Ventas.accdb"
getConecta = cn
End Function

'Procedimiento que limpia el contenido de las celdas


Sub LimpiaCeldas()
Sheets(1).Range("B7:D10000").ClearContents
End Sub

'Procedimiento que lista todos las facturas.


Sub listaFacturas()
Call LimpiaCeldas
cn = getConecta()
cn.Open

Dim rs As New ADODB.Recordset


rs.Open "Select F.* from facturas F", cn
Worksheets(1).Cells(7, 2).CopyFromRecordset rs
rs.Close
cn.Close
End Sub

Finalmente, asocie el botón LISTADO DE FACTURAS al procedimiento listaFacturas y


el botón LIMPIAR CELDAS al procedimiento LimpiaCeldas.
Cap.8: Base de datos
317

8.5 Listado de registros especificando campos



obtener. Su formato es:

SELECT Campo1,Campo2… FROM NombreTabla

Donde:

Campo: FROM hay


que tener en cuenta que dichas columnas sean exactamente iguales a las implemen-
tadas en Access.
NombreTabla: Es el nombre de la tabla del cual queremos obtener información.

ͫCaso desarrollado: Listado de clientes especicando campos


Implemente una aplicación que permita listar los registros de la tabla clientes, en la

hoja de Excel.

Debe tener en cuenta los siguientes aspectos:

 Debemos contar con una carpeta que contenga la base de datos de Access llama-
da Ventas.accdb y el propio archivo de Excel, de tal forma que tenga el siguiente
aspecto:

Fig. 8.19 Contenido de la carpeta Ventas

 Agregue la referencia Microso AcveX Data Objects 2.7 Library al proyecto, des-
de el entorno VBA.
 Implemente el siguiente modelo de hoja de Excel:
Aplicaciones VBA con Excel
318

Fig. 8.20 Entorno de la hoja de Excel para el listado de clientes

Implemente el siguiente código en un módulo agregado al proyecto desde el en-


torno VBA:

'Variables globales
Dim cn As New ADODB.Connection

'Función que permite crear la cadena de conexión a Access


Function getConecta()
cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & ThisWorkbook.Path & "\" & “Ventas.accdb"
getConecta = cn
End Function

'Procedimiento que limpia el contenido de las celdas


Sub LimpiaCeldas()
Sheets(1).Range("B7:F1000").ClearContents
End Sub

'Procedimiento que lista los clientes


Sub listaClientes()
Call LimpiaCeldas
cn = getConecta()
cn.Open

Dim rs As New ADODB.Recordset


rs.Open "Select RUC,CODIGO,NOMCLI,TELEFONO,DIRECCION
from CLIENTES", cn
Worksheets(1).Cells(7, 2).CopyFromRecordset rs
rs.Close
cn.Close
End Sub

Finalmente, asocie el botón LISTADO DE CLIENTES al procedimiento listaClientes y


el botón LIMPIAR CELDAS al procedimiento LimpiaCeldas.
Cap.8: Base de datos
319

8.6 Listado de registros ordenados



obtener. Su formato es:

SELECT Campo1,Campo2… FROM NombreTabla ORDER BY Campo ORDEN

Donde:

Campo: FROM hay


que tener en cuenta que dichas columnas sean exactamente iguales a las implemen-

NombreTabla: Es el nombre de la tabla del cual queremos obtener información.

Order by: 


ascendente se asigna ASC y para descendente DESC.

ͫCaso desarrollado 1: Listado de clientes ordenados


Implemente una aplicación que permita listar los registros de la tabla clientes, en

           
nombre del cliente en una hoja de Excel.

Debe tener en cuenta los siguientes aspectos:

 Debemos contar con una carpeta que contenga la base de datos de Access llama-
da Ventas.accdb y el propio archivo de Excel, de tal forma que tenga el siguiente
aspecto:

Fig. 8.21 Contenido de la carpeta Ventas

 Agregue la referencia Microso AcveX Data Objects 2.7 Library al proyecto, des-
de el entorno VBA.
Aplicaciones VBA con Excel
320

Implemente el siguiente modelo de hoja de Excel:

Fig. 8.22 Entorno de la hoja de Excel para el listado de clientes

Implemente el siguiente código en un módulo agregado al proyecto desde el en-


torno VBA:
'Variables globales
Dim cn As New ADODB.Connection

'Función que permite crear la cadena de conexión a Access


Function getConecta()
cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & ThisWorkbook.Path & "\" & "Ventas.accdb"
getConecta = cn
End Function

'Procedimiento que limpia el contenido de las celdas


Sub LimpiaCeldas()
Sheets(1).Range("B7:F1000").ClearContents
End Sub

'Procedimiento que lista los clientes


Sub listaClientes()
Call LimpiaCeldas
cn = getConecta()
cn.Open

Dim rs As New ADODB.Recordset


rs.Open "Select RUC,CODIGO,NOMCLI,TELEFONO,DIRECCION
from CLIENTES", cn
Worksheets(1).Cells(7, 2).CopyFromRecordset rs
rs.Close
cn.Close
End Sub

'Procedimiento que lista los clientes de forma ascendente


Sub listaClientesAscendente()
Call LimpiaCeldas
cn = getConecta()
Cap.8: Base de datos
321

cn.Open

Dim rs As New ADODB.Recordset


rs.Open "Select RUC,CODIGO,NOMCLI,TELEFONO,DIRECCION
from CLIENTES Order By NOMCLI Asc", cn
Worksheets(1).Cells(7, 2).CopyFromRecordset rs
rs.Close
cn.Close
End Sub
'Procedimiento que lista los clientes de forma descendente
Sub listaClientesDescendente()
Call LimpiaCeldas
cn = getConecta()
cn.Open

Dim rs As New ADODB.Recordset


rs.Open "Select RUC,CODIGO,NOMCLI,TELEFONO,DIRECCION
from CLIENTES Order By NOMCLI Desc", cn
Worksheets(1).Cells(7, 2).CopyFromRecordset rs
rs.Close
cn.Close
End Sub

Finalmente, asocie el botón LISTADO DE CLIENTE al procedimiento listaClientes,


el botón NOMBRES ASCENDENTE al procedimiento listaClientesAscendente, el
botón NOMBRES DESCENDENTE al procedimiento listaClientesDescendente y el
botón LIMPIAR CELDAS al procedimiento LimpiaCeldas.

ͫCaso desarrollado 2: Listado de clientes desde un UserForm


Implemente una aplicación que permita listar los registros de la tabla clientes, me-
 

de los registros en ascendente o descendente, tal como se muestra en el siguiente
formulario:

Fig. 8.23 Formulario de ordenamiento de registros

Debe tener en cuenta los siguientes aspectos:

Debemos contar con una carpeta que contenga la base de datos de Access llama-
da Ventas.accdb y el propio archivo de Excel, de tal forma que tenga el siguiente
aspecto:
Aplicaciones VBA con Excel
322

Fig. 8.24 Contenido de la carpeta Ventas

Agregue la referencia Microso AcveX Data Objects 2.7 Library al proyecto, des-
de el entorno VBA.
Implemente el siguiente modelo de hoja de Excel:

Fig. 8.25 Entorno de la hoja de Excel para el listado de clientes


Implemente el siguiente código dentro del formulario frmOrdenamiento:

'Variables globales
Dim cn As New ADODB.Connection

Private Sub btnAplicar_Click()


Dim campo$, orden$
orden = “Ascendente”
campo = cboCampo.Text

If optA.Value = True Then orden = "Ascendente"


If optD.Value = True Then orden = "Descendente"

Select Case campo


Case "RUC": Call listaClientesxRUC(orden)
Case "CODIGO": Call listaClientesxCodigo(orden)
Case "CLIENTE": Call listaClientesxNombres(orden)
End Select
End Sub
Cap.8: Base de datos
323

Private Sub UserForm_Activate()


cboCampo.AddItem "RUC"
cboCampo.AddItem "CODIGO"
cboCampo.AddItem "CLIENTE"
End Sub

'Función que permite crear la cadena de conexión a Access


Function getConecta()
cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & ThisWorkbook.Path & "\" & "Ventas.accdb"
getConecta = cn
End Function

'Procedimiento que limpia el contenido de las celdas


Sub LimpiaCeldas()
Sheets(1).Range("B7:F1000").ClearContents
End Sub

'Procedimiento que lista los clientes ordenados por RUC


Sub listaClientesxRUC(ByVal orden$)
Call LimpiaCeldas
cn = getConecta()
cn.Open

Dim rs As New ADODB.Recordset


If orden = "Ascendente" Then
rs.Open "Select RUC,CODIGO,NOMCLI,TELEFONO,DIRECCION from CLIENTES
Order by RUC Asc", cn
Else
rs.Open "Select RUC,CODIGO,NOMCLI,TELEFONO,DIRECCION from CLIENTES
Order by RUC Desc", cn
End If

Worksheets(1).Cells(7, 2).CopyFromRecordset rs
rs.Close
cn.Close
End Sub

'Procedimiento que lista los clientes ordenados por Código


Sub listaClientesxCodigo(ByVal orden$)
Call LimpiaCeldas
cn = getConecta()
cn.Open

Dim rs As New ADODB.Recordset


If orden = "Ascendente" Then
rs.Open "Select RUC,CODIGO,NOMCLI,TELEFONO,DIRECCION from CLIENTES
Order by CODIGO Asc", cn
Else
rs.Open "Select RUC,CODIGO,NOMCLI,TELEFONO,DIRECCION from CLIENTES
Order by CODIGO Desc", cn
End If
Worksheets(1).Cells(7, 2).CopyFromRecordset rs
rs.Close
cn.Close
End Sub

'Procedimiento que lista los clientes ordenados por nombres


Sub listaClientesxNombres(ByVal orden$)
Call LimpiaCeldas
cn = getConecta()
Aplicaciones VBA con Excel
324

cn.Open

Dim rs As New ADODB.Recordset


If orden = "Ascendente" Then
rs.Open "Select RUC,CODIGO,NOMCLI,TELEFONO,DIRECCION from CLIENTES Order
by NOMCLI Asc", cn
Else
rs.Open "Select RUC,CODIGO,NOMCLI,TELEFONO,DIRECCION from CLIENTES Order
by NOMCLI Desc", cn
End If
Worksheets(1).Cells(7, 2).CopyFromRecordset rs
rs.Close
cn.Close
End Sub

 Finalmente, asocie el botón FORMULARIO DE ORDENAMIENTO al formulario por


medio del código frmOrdenamiento.Show.

8.7 Listado de los primeros registros


-
sulta. Su formato es:

SELECT TOP Numero Campo FROM NombreTabla

Donde:

TOP: Representa dos opciones, cuando es un valor numérico entero devolverá dicha

según el porcentaje solicitado.
Campo:
NombreTabla: Es el nombre de la tabla del cual queremos obtener información.

ͫCaso desarrollado: Consulta de productos desde un UserForm


Implemente una aplicación que permita realizar diferentes consultas a la tabla pro-
ductos, tal como se muestra en el siguiente formulario:

Fig. 8.26 Formulario de consulta de productos


Cap.8: Base de datos
325

Debe tener en cuenta los siguientes aspectos:

Debemos contar con una carpeta que contenga la base de datos de Access llama-
da Ventas.accdb y el propio archivo de Excel, de tal forma que tenga el siguiente
aspecto:

Fig. 8.27 Contenido de la carpeta Ventas

Agregue la referencia Microso AcveX Data Objects 2.7 Library al proyecto, desde
el entorno VBA.
Implemente el siguiente modelo de hoja de Excel:

Fig. 8.28 Entorno de la hoja de Excel para el listado de productos

Implemente el siguiente código dentro del formulario frmTop:

'Variables globales
Dim cn As New ADODB.Connection

'Función que permite crear la cadena de conexión a Access


Function getConecta()
cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & ThisWorkbook.Path & "\" & “Ventas.accdb"
getConecta = cn
Aplicaciones VBA con Excel
326

End Function

'Procedimiento que limpia el contenido de las celdas


Sub LimpiaCeldas()
Sheets(1).Range("B7:E1000").ClearContents
End Sub

Private Sub bntSalir_Click()


Unload Me
End Sub

Private Sub btn50PrimerosProductos_Click()


Call LimpiaCeldas
cn = getConecta()
cn.Open

Dim rs As New ADODB.Recordset


rs.Open "Select Top 50 Percent * from producto
Order By codigoP Asc", cn
Worksheets(1).Cells(7, 2).CopyFromRecordset rs
rs.Close
cn.Close
End Sub

Private Sub btn50UltimosProductos_Click()


Call LimpiaCeldas
cn = getConecta()
cn.Open

Dim rs As New ADODB.Recordset


rs.Open "Select Top 50 Percent * from producto
Order By codigoP Desc", cn
Worksheets(1).Cells(7, 2).CopyFromRecordset rs
rs.Close
cn.Close
End Sub

Private Sub btnProductoAlto_Click()


Call LimpiaCeldas
cn = getConecta()
cn.Open

Dim rs As New ADODB.Recordset


rs.Open “Select Top 1 * from producto Order By Precio Desc",cn
Worksheets(1).Cells(7, 2).CopyFromRecordset rs
rs.Close
cn.Close
End Sub

Private Sub btnProductoBajo_Click()


Call LimpiaCeldas
cn = getConecta()
cn.Open

Dim rs As New ADODB.Recordset


rs.Open "Select Top 1 * from producto Order By Precio Asc",cn
Worksheets(1).Cells(7, 2).CopyFromRecordset rs
rs.Close
cn.Close
End Sub
Cap.8: Base de datos
327

Private Sub btnProductoStockMayor_Click()


Call LimpiaCeldas
cn = getConecta()
cn.Open

Dim rs As New ADODB.Recordset


rs.Open "Select Top 3 * from producto Order By Stock Desc",cn
Worksheets(1).Cells(7, 2).CopyFromRecordset rs
rs.Close
cn.Close
End Sub

Private Sub btnProductoStockMenor_Click()


Call LimpiaCeldas
cn = getConecta()
cn.Open

Dim rs As New ADODB.Recordset


rs.Open "Select Top 3 * from producto Order By Stock Asc",cn
Worksheets(1).Cells(7, 2).CopyFromRecordset rs
rs.Close
cn.Close
End Sub

Private Sub btnTodos_Click()


Call LimpiaCeldas
cn = getConecta()
cn.Open

Dim rs As New ADODB.Recordset


rs.Open "Select * from producto", cn
Worksheets(1).Cells(7, 2).CopyFromRecordset rs
rs.Close
cn.Close
End Sub

 Finalmente, asocie el botón FORMULARIO DE CONSULTAS al formulario por medio


del código frmTop.Show.

8.8 Listado de registros sin repetir valores


-
sulta. Su formato es:

SELECT DISTINCT Campo FROM NombreTabla

Donde:

DISTINCT:
Campo: 

NombreTabla: Es el nombre de la tabla del cual queremos obtener información.


Aplicaciones VBA con Excel
328

ͫCaso desarrollado: Consulta de facturas desde un UserForm


Implemente una aplicación que permita listar las facturas de acuerdo a una fecha
-
 ComboBox 
Luego, se consultará las facturas basadas en dicha fecha, tal como se muestra en el
siguiente formulario:

Fig. 8.29 Formulario de consulta de facturas por fecha

Debe tener en cuenta los siguientes aspectos:

Debemos contar con una carpeta que contenga la base de datos de Access llama-
da Ventas.accdb y el propio archivo de Excel, de tal forma que tenga el siguiente
aspecto:

Fig. 8.30 Contenido de la carpeta Ventas

Agregue la referencia Microso AcveX Data Objects 2.7 Library al proyecto, des-
de el entorno VBA.
Implemente el siguiente modelo de hoja de Excel:
Cap.8: Base de datos
329

Fig. 8.31 Entorno de la hoja de Excel para el listado de facturas

 Implemente el siguiente código dentro del formulario frmDisnct:

'Variables globales
Dim cn As New ADODB.Connection

Private Sub btnListar_Click()


Call LimpiaCeldas
cn = getConecta()
cn.Open

Dim rs As New ADODB.Recordset


rs.Open "SELECT * FROM facturas WHERE fecha=#"
& cboFechas.Text & "#", cn
Worksheets(1).Cells(7, 2).CopyFromRecordset rs
rs.Close
cn.Close
End Sub

Private Sub UserForm_Activate()


cn = getConecta()
cn.Open

Dim rs As New ADODB.Recordset

'Llenando el control ComboBox


rs.Open "Select Distinct fecha from facturas", cn
Do While Not rs.EOF
cboFechas.AddItem rs!fecha
rs.MoveNext
Loop
rs.Close
cn.Close
End Sub

'Función que permite crear la cadena de conexión a Access


Function getConecta()
cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & ThisWorkbook.Path & "\" & “Ventas.accdb"
getConecta = cn
End Function

'Procedimiento que limpia el contenido de las celdas


Sub LimpiaCeldas()
Sheets(1).Range("B7:E1000").ClearContents
End Sub

Finalmente, asocie el botón FORMULARIO DE CONSULTA al formulario por medio del




código frmDiscnct.Show.
Aplicaciones VBA con Excel
330

8.9 Listado de registros condicionados




SELECT Campos FROM NombreTabla WHERE Condicion

Donde:

DISTINCT:
Campo:

NombreTabla: Es el nombre de la tabla del cual queremos obtener información.


WHERE:            
sean mostrados.

Veamos algunos casos para entender el funcionamiento de la cláusula Where en la sen-


tencia SELECT:

Mostrar todos los productos cuya descripcion empiecen con «L»


Select * From Producto Where descrip LIKE ''

Mostrar a todos los clientes que vivan en algún distrito cuyo contenido sea «Juan»,

Select * From clientes Where distrito LIKE ''

Mostrar a todos los clientes de los distritos que inicien con «San».
Select * From clientes Where distrito LIKE ''

Mostrar todos los productos cuyo segunda letra sea «A».


Select * From Producto Where descrip LIKE ''

Mostrar los productos cuya descripción empiece con «A», «D» o «J».
Select * From Producto Where descrip LIKE ''

Mostrar todos los productos cuya descripción esté en el rango de la «A» hasta la «J».
Select * From Producto Where descrip LIKE ''

Mostrar los productos cuya descripción sea de «K» hasta «Z».


Select * From Producto Where descrip LIKE ''


Select * From Producto Where
Cap.8: Base de datos
331




Select * From facturas Where fecha BETWEEN '01/05/2010' And '31/05/2010'

Mostrar las facturas cuyos números son 100001 y 100002.




Select * From Facturas Where numfact IN (100001,100002)

Mostrar la fecha y hora actual desde el sistema.




Select GETDATE()

Mostrar el día actual del sistema.




Select DAY(getDate())

Mostrar el mes actual.




Select MONTH(getDate())

Mostrar solo los años desde el campo fecha de las facturas.




Select YEAR(Fecha) From facturas




Select
From Facturas F
INNER JOIN Detalle D
ON F.NumFact = D.NumFact

ͫCaso desarrollado 1: Consulta de facturas por años desde un UserForm


Implemente una aplicación que permita listar las facturas de acuerdo a un año se-
leccionado, hay que tener en cuenta que los años provienen de la tabla Facturas y
ComboBox

como como se muestra en el siguiente formulario:

Fig. 8.32 Formulario de consulta de facturas por año


Aplicaciones VBA con Excel
332

Debe tener en cuenta los siguientes aspectos:

Debemos contar con una carpeta que contenga la base de datos de Access llamada
Ventas.accdb y el propio archivo de Excel, de tal forma que tenga el siguiente aspecto:

Fig. 8.33 Contenido de la carpeta Ventas

Agregue la referencia Microso AcveX Data Objects 2.7 Library al proyecto, desde
el entorno VBA.
Implemente el siguiente modelo de hoja de Excel:

Fig. 8.34 Entorno de la hoja de Excel para el listado de facturas


Implemente el siguiente código dentro del formulario frmWhere:

'Variables globales
Dim cn As New ADODB.Connection

Private Sub btnListar_Click()


Call LimpiaCeldas
cn = getConecta()
cn.Open

Dim rs As New ADODB.Recordset


rs.Open "SELECT * FROM facturas
WHERE YEAR(fecha)=" & cboAños.Text, cn
Cap.8: Base de datos
333

Worksheets(1).Cells(7, 2).CopyFromRecordset rs
rs.Close
cn.Close
End Sub

Private Sub btnTodos_Click()


cn = getConecta()
cn.Open

Dim rs As New ADODB.Recordset

'Llenando el control ComboBox


rs.Open "Select * from facturas", cn
Worksheets(1).Cells(7, 2).CopyFromRecordset rs
rs.Close
cn.Close
End Sub

Private Sub UserForm_Activate()


cn = getConecta()
cn.Open

Dim rs As New ADODB.Recordset

'Llenando el control ComboBox


rs.Open "Select Distinct year(fecha) As Año from facturas",cn
Do While Not rs.EOF
cboAños.AddItem rs!Año
rs.MoveNext
Loop
rs.Close
cn.Close
End Sub

'Función que permite crear la cadena de conexión a Access


Function getConecta()
cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & ThisWorkbook.Path & "\" & "Ventas.accdb”
getConecta = cn
End Function

'Procedimiento que limpia el contenido de las celdas


Sub LimpiaCeldas()
Sheets(1).Range("B7:E1000").ClearContents
End Sub




ͫCaso desarrollado 2: Consulta de clientes desde un UserForm (Agenda)


Implemente una aplicación que permita listar los clientes de tal forma que dentro de
un UserForm se mostrará el código, nombre completo del cliente y el distrito y, por

 
medio del botón Enviar a Excel, tal como como se muestra en el siguiente formulario:
Aplicaciones VBA con Excel
334

Fig. 8.35 Formulario de listado de clientes

Debe tener en cuenta los siguientes aspectos:

Debemos contar con una carpeta que contenga la base de datos de Access llamada
Ventas.accdb y el propio archivo de Excel, de tal forma que tenga el siguiente aspecto:

Fig. 8.36 Contenido de la carpeta Ventas

Agregue la referencia Microso AcveX Data Objects 2.7 Library al proyecto, desde
el entorno VBA.
Cap.8: Base de datos
335

Implemente el siguiente modelo de hoja de Excel:




Fig. 8.37 Entorno de la hoja de Excel para el listado de clientes

Implemente el siguiente código dentro del formulario frmWhere:




'Variables globales
Dim cn As New ADODB.Connection

'Función que permite crear la cadena de conexión a Access


Function getConecta()
cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & ThisWorkbook.Path & "\" & “Ventas.accdb"
getConecta = cn
End Function

'Procedimiento que limpia el contenido de las celdas


Sub LimpiaCeldas()
Sheets(1).Range("B7:N1000").ClearContents
End Sub

Private Sub btnExcel_Click()


Range("B7:D10000").ClearContents
uFila=Sheets(1).Cells(Rows.Count, 2).End(xlUp).Offset(1,0).Row

For i = 0 To lstCliente.ListCount - 1
Sheets(1).Cells(uFila + i, 2).Value = lstCodigo.List(i)
Sheets(1).Cells(uFila + i, 3).Value = lstCliente.List(i)
Sheets(1).Cells(uFila + i, 4).Value = lstDistrito.List(i)
Next
End Sub

Private Sub UserForm_Activate()


Call ListaClientes
End Sub

Sub ltra(ByVal Letra$)


Call limpiarListas
cn = getConecta()
cn.Open
Aplicaciones VBA con Excel
336

Dim rs As New ADODB.Recordset


rs.Open "Select codigo,nomcli,distrito from clientes
where nomcli like '" & Letra & "%'", cn
Do While Not rs.EOF
lstCodigo.AddItem rs!codigo
lstCliente.AddItem rs!nomcli
lstDistrito.AddItem rs!distrito
rs.MoveNext
Loop
rs.Close
cn.Close
End Sub

Sub limpiarListas()
lstCliente.Clear
lstCodigo.Clear
lstDistrito.Clear
End Sub

Sub ListaClientes()
cn = getConecta()
cn.Open
Call limpiarListas
Dim rs As New ADODB.Recordset
rs.Open "Select codigo,nomcli,distrito from clientes", cn
Do While Not rs.EOF
lstCodigo.AddItem rs!codigo
lstCliente.AddItem rs!nomcli
lstDistrito.AddItem rs!distrito
rs.MoveNext
Loop
rs.Close
cn.Close
End Sub

Private Sub btnA_Click()


Call ltra("A")
End Sub
Private Sub btnB_Click()
Call ltra("B")
End Sub

Private Sub btnC_Click()


Call ltra("C")
End Sub

Private Sub btnD_Click()


Call ltra("D")
End Sub

Private Sub btnE_Click()


Call ltra("E")
End Sub

Private Sub btnF_Click()


Call ltra("F")
End Sub

Private Sub btnG_Click()


Call ltra("G""")
End Sub
Cap.8: Base de datos
337

Private Sub btnH_Click()


Call ltra("H")
End Sub

Private Sub btnI_Click()


Call ltra("I")
End Sub

Private Sub btnJ_Click()


Call ltra("J")
End Sub

Private Sub btnK_Click()


Call ltra("K")
End Sub

Private Sub btnL_Click()


Call ltra("L")
End Sub

Private Sub btnM_Click()


Call ltra("M")
End Sub

Private Sub btnN_Click()


Call ltra("N")
End Sub

Private Sub btnÑ_Click()


Call ltra("Ñ")
End Sub

Private Sub btnO_Click()


Call ltra("O")
End Sub

Private Sub btnP_Click()


Call ltra("P")
End Sub

Private Sub btnQ_Click()


Call ltra("Q")
End Sub

Private Sub btnR_Click()


Call ltra("R")
End Sub

Private Sub btnS_Click()


Call ltra("S")
End Sub

Private Sub btnT_Click()


Call ltra("T”)
End Sub

Private Sub btnU_Click()


Call ltra("U")
End Sub

Private Sub btnV_Click()


Aplicaciones VBA con Excel
338

Call ltra("V")
End Sub

Private Sub btnW_Click()


Call ltra("W")
End Sub

Private Sub btnY_Click()


Call ltra("Y")
End Sub

Private Sub btnZ_Click()


Call ltra("Z")
End Sub

Private Sub btnTodos_Click()


Call ListaClientes
End Sub

Finalmente, asocie el botón FORMULARIO DE CONSULTA al formulario por medio del


código frmClientes.Show.

ͫCaso desarrollado 3: Mantenimiento de productos


Implemente una aplicación que permita realizar el mantenimiento de los productos,
tal como se muestra en el siguiente formulario:

Fig. 8.38 Formulario de mantenimiento de productos

Debe tener en cuenta los siguientes aspectos:

 Debemos contar con una carpeta que contenga las imágenes de los productos a

forma que tenga el siguiente aspecto:
Cap.8: Base de datos
339

Fig. 8.39 Contenido de la carpeta FotosProductos

En el control Combobox se debe ingresar la descripción de un producto; si dicho pro-




ducto ya se encontraba registrado, se deberá mostrar sus datos en los demás contro-


Implemente el botón Agregar/Modicar


o actualizar los datos del mismo.


Implemente el botón Eliminar      


Excel.
Implemente el siguiente modelo de hoja de Excel:


Implemente el siguiente código dentro del formulario frmMantenimiento:




Option Explicit
'Variables globales
Dim rutaImagen$

Sub limpiaControles()
Call generaCodigo
Call llenaProductos
txtPrecio.Text = ""
txtStock.Text = ""
cboDescripcion.SetFocus
Aplicaciones VBA con Excel
340

End Sub

Private Sub btnAgregar_Click()


If valida = "" Then
Dim posProducto%
posProducto = validaProducto(cboDescripcion.Text)

If posProducto = 0 Then
Do While Not IsEmpty(ActiveCell)
ActiveCell.Offset(1, 0).Activate
Loop
Else
Cells(posProducto, 1).Select
End If

'Aqui es cuando agregamos o modicamos el registro


ActiveCell.Offset(0, -1) = lblCodigo.Caption
ActiveCell.Value = UCase(cboDescripcion.Text)
ActiveCell.Offset(0, 1) = txtPrecio.Text
ActiveCell.Offset(0, 2) = txtStock.Text
ActiveCell.Offset(0, 3) = rutaImagen
Call limpiaControles
Else
MsgBox "El error se encuentra en " & valida
End If
End Sub

Private Sub btnEliminar_Click()


Dim posProducto%
posProducto = validaProducto(cboDescripcion.Text)

If posProducto = 0 Then
MsgBox "El producto no existe"
cboDescripcion.SetFocus
Exit Sub
End If

Dim r%
r = MsgBox("Está seguro de eliminar el producto?",
vbCritical + vbYesNo)

If r = 6 Then
Cells(posProducto, 1).Select
ActiveCell.EntireRow.Delete
limpiaControles
MsgBox "Producto eliminado correctamente..!"
cboDescripcion.SetFocus
End If

End Sub

Private Sub btnImagen_Click()


On Error GoTo Imprevisto
rutaImagen=Application.GetOpenFilename("Imágenes JPG,*.jpg",
0, "Seleccione una imagen del producto")
imgFoto.Picture = LoadPicture("")
imgFoto.Picture = LoadPicture(rutaImagen)
imgFoto.PictureSizeMode = fmPictureSizeModeStretch
Exit Sub
Imprevisto:
Cap.8: Base de datos
341

MsgBox "Error al seleccionar la imagen del producto", vbCritical


End Sub

Private Sub btnSalir_Click()


Dim r%
r = MsgBox("Está seguro de salir?", vbCritical + vbYesNo)
If r = 6 Then End
End Sub

Private Sub cboDescripcion_Change()


If validaProducto(cboDescripcion) <> 0 Then
Cells(cboDescripcion.ListIndex + 11, 2).Select
lblCodigo.Caption = ActiveCell.Value
txtPrecio.Text = ActiveCell.Offset(0, 2)
txtStock = ActiveCell.Offset(0, 3)

imgFoto.Picture = LoadPicture(“”)
imgFoto.Picture = LoadPicture(ActiveCell.Offset(0, 4))
imgFoto.PictureSizeMode = fmPictureSizeModeStretch
rutaImagen = ActiveCell.Offset(0, 4)
Else
Call generaCodigo
txtPrecio.Text = ""
txtStock.Text = ""
rutaImagen = ""
imgFoto.Picture = LoadPicture("")
End If
End Sub

Private Sub UserForm_Activate()


Call generaCodigo
Call llenaProductos
End Sub

'Función que determina la existencia de un producto


Function validaProducto(descripcion$) As Integer
Range("C11").Activate
validaProducto = 0
Do While Not IsEmpty(ActiveCell)
If descripcion = ActiveCell Then
validaProducto = ActiveCell.Row
End If
ActiveCell.Offset(1, 0).Select
Loop
End Function

'Función que determina el último código registrado


Function determinaUltimoCodigo() As String
Dim uFila%
uFila=Sheets(1).Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Row
determinaUltimoCodigo = Sheets(1).Cells(uFila - 1, 2).Value
End Function

'Procedimiento que genera el codigo de producto


Sub generaCodigo()
lblCodigo.Caption = "P" &
Format(Right(determinaUltimoCodigo, 3) + 1, "000")
End Sub

'Procedimiento que llena de productos el control


'de tipo ComboBox
Aplicaciones VBA con Excel
342

Sub llenaProductos()
cboDescripcion.Clear

Range("C11").Select
Do While Not IsEmpty(ActiveCell)
cboDescripcion.AddItem ActiveCell.Value
ActiveCell.Offset(1, 0).Select
Loop
End Sub

'Función de validación de datos


Function valida() As String
Dim mensaje$
If Len(Trim(cboDescripcion.Text)) = 0 Then
mensaje = "descripción del producto"
cboDescripcion.SetFocus
ElseIf Not (Mid(cboDescripcion.Text, 1, 1) Like "[a-z]"
Or Mid(cboDescripcion.Text, 1, 1) Like "[A-Z]") Then
mensaje = "descripción del producto"
cboDescripcion.SetFocus
ElseIf Len(txtPrecio.Text) = 0 Or
Not IsNumeric(txtPrecio.Text) Then
mensaje = "precio del producto"
txtPrecio.SetFocus
ElseIf Len(txtStock.Text) = 0 Or
Not IsNumeric(txtStock.Text) Then
mensaje = "stock del producto"
txtStock.SetFocus
ElseIf rutaImagen = "" Then
mensaje = "imagen del producto"
Else
mensaje = ""
End If
valida = mensaje
End Function

Finalmente, asocie el botón FORMULARIO DE MANTENIMIENTO al formulario por


medio del código frmMantenimiento.Show.
Bibliograa
Shepherd, Richard. (2010). Excel 2007 VBA Macro Programming. EE.UU.: Mc-Graw-Hill.

Perry, Gail. (2009). Macros Made EASY. EE.UU.: Mc-Graw-Hill.

Katz, Abbo. (2011). Excel 2010 Made Simple. EE.UU.: Apress.


Descargado en: ey books.co m


EDITORIAL

https://www.facebook.com/groups/2703670239892266

También podría gustarte