100% encontró este documento útil (4 votos)
2K vistas177 páginas

81.macros. Aplicaciones VBA Con Excel

Este documento presenta una guía práctica sobre aplicaciones VBA con Excel. Explica conceptos básicos de VBA como macros, el entorno de desarrollo y la implementación de funciones. Luego describe el modelo de objetos en VBA y fundamentos de programación como tipos de datos, variables, operadores y estructuras condicionales. También cubre UserForms, controles visuales y funciones VBA. El objetivo es proporcionar los conocimientos necesarios para crear aplicaciones personalizadas en Excel usando Visual Basic for Applications.

Cargado por

Paco Porras
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
100% encontró este documento útil (4 votos)
2K vistas177 páginas

81.macros. Aplicaciones VBA Con Excel

Este documento presenta una guía práctica sobre aplicaciones VBA con Excel. Explica conceptos básicos de VBA como macros, el entorno de desarrollo y la implementación de funciones. Luego describe el modelo de objetos en VBA y fundamentos de programación como tipos de datos, variables, operadores y estructuras condicionales. También cubre UserForms, controles visuales y funciones VBA. El objetivo es proporcionar los conocimientos necesarios para crear aplicaciones personalizadas en Excel usando Visual Basic for Applications.

Cargado por

Paco Porras
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 177

Guía Práctica

Aplicaciones VBA con Excel

Conceptos básicos de VBA - Fundamentos de programación en VBA -


EDITORIAL
UseForm, objetos visuales y funciones VBA - Estructuras condicionales y
repetitivas - Manejo de base de datos
GUÍA PRÁCTICA

Macros Aplicaciones

VBA
Excel
con

EDITORIAL

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

© Derechos de autor registrados:


Empresa Editora Macro EIRL

© Derechos de edición, arte gráfico 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
Av. Paseo de la República N.° 5613, Miraflores, Lima, Perú

 Teléfono: (511) 748 0560


 E-mail: [email protected]
Página web: www.editorialmacro.com

Primera edición: abril de 2015


Tiraje: 1000 ejemplares

Impresión
Talleres gráficos de la Empresa Editora Macro EIRL
Jr. San Agus n N.° 612-624, Surquillo, Lima, Perú

ISBN N.° 978-612-304-274-5


Hecho el depósito legal en la Biblioteca Nacional del Perú N.° 2015-05103
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.
ÍNDICE
Introducción .......................................................................................7

Sesión 1: Conceptos básicos


1.1 Introducción al VBA ...........................................................................9
1.2 Definición de VBA ..............................................................................9
1.3 Macros y su relación con VBA............................................................9
1.4 Ac var la ficha Desarrollador en el entorno de Excel......................10
1.5 Principales botones de la ficha Desarrollador ................................11
1.6 Acceso al entorno VBA ....................................................................11
1.7 Habilitar la seguridad de las macros ................................................12
1.8 Grabar una aplicación VBA ..............................................................12
1.9 Descripción del editor VBA .............................................................13
1.9.1 Botones de ejecución y parar una aplicación ...........................14
1.9.2 Operaciones desde la barra de herramienta estándar ............14
1.10 El Explorador de Proyectos ............................................................15
1.11 La ventana Propiedades .................................................................16
1.12 La ventana de código .....................................................................16
1.13 Implementación de funciones VBA y su uso en Excel....................16
Caso desarrollado 1: Determinar la edad de una persona ...............18
Caso desarrollado 2: Determinar el promedio de notas....................18
Caso desarrollado 3: Determinar el pago por la compra de un
producto ..............................................................................................19
Caso desarrollado 4: Determinar la hora, minuto y segundos ..........20
Caso desarrollado 5: Determinar el pago de un empleado ...............22

Sesión 2: Modelo de objetos


2.1 Modelo de objetos de Excel en VBA ................................................23
2.2 Objeto Applica on ..........................................................................24
2.3 Objeto WorkBook ............................................................................25
2.4 Objeto WorkSheets..........................................................................27
2.5 Objeto Range ...................................................................................28
2.6 Objeto Cells ......................................................................................31
Caso desarrollado 1: Conversión de medidas ....................................32
ÍNDIICE
Caso desarrollado 2: Repar ción de capital...................................... 34
Caso desarrollado 3: Compra de productos.......................................36

Sesión 3: Fundamentos de programación


3.1 Fases para la solución de un programa............................................39
3.1.1 Fase 1: Análisis del problema ....................................................39
3.1.2 Fase 2: Diseño del algoritmo.....................................................41
3.1.3 Fase 3: Codificación de un programa en VBA ..........................43
3.1.4 Fase 4: Ejecución del programa en VBA .................................. 46
3.2 Elementos de un programa VBA ......................................................48
3.3 Tipos de datos .................................................................................48
3.3.1 Enteros...................................................................................... 48
3.3.2 Reales ........................................................................................49
3.3.3 Caracteres y cadenas ................................................................49
3.3.4 Lógicos .......................................................................................49
3.3.5 Fechas........................................................................................49
3.3.6 Variante .....................................................................................49
3.4 Variables ..........................................................................................50
3.5 Operadores .....................................................................................50
3.5.1 Asignación .................................................................................50
3.5.2 Aritmé cos ................................................................................51
3.5.3 Relacionales ..............................................................................51
3.5.4 Lógicos ......................................................................................51
3.5.5 Orden de prioridad ...................................................................52
3.6 Conversiones de po .......................................................................52
3.7 Mensajes en VBA .............................................................................53
3.8 Ingreso de valor con la función InputBox ........................................54
3.9 Funciones definidas por el usuario .................................................54
3.9.1 Función sin parámetros............................................................ 54
3.9.2 Función con parámetros ...........................................................55
3.10 Procedimientos ..............................................................................56
Caso desarrollado: Compra de productos..........................................56
ÍNDIC
CE
Sesión 4: UserForm y objetos visuales
4.1 UserForm .........................................................................................59
4.2 Administración de UserForm en VBA ..............................................59
4.3 Asociar el formulario a la hoja de Excel ..........................................60
4.4 Nomenclatura para los nombres de los objetos .............................61
4.5 Principales controles visuales .........................................................62
4.5.1 Control UserForm......................................................................62
4.5.2 Control Label ...........................................................................62
4.5.3 Control TextBox .......................................................................63
4.5.4 Control CommandBu on ........................................................63
4.5.5 Control ListBox ......................................................................... 64
4.5.6 Control ComboBox ................................................................... 64
4.5.7 Control Op onBu on .............................................................. 64
4.5.8 Control CheckBox ..................................................................... 64
Caso desarrollado 1: Control de registro de alumnos .......................65
Caso desarrollado 2: Registro de pago a vendedores ........................67
Caso desarrollado 3: Venta de ar culos .............................................71

Sesión 5: Funciones VBA


5.1 Introducción a las funciones ............................................................75
5.2 Funciones para cadena de caracteres .............................................75
5.3 Funciones numéricas .......................................................................76
5.4 Funciones de fecha ..........................................................................76
Caso desarrollado 1: Registro de personal........................................ 77
Caso desarrollado 2: Conversiones de base .......................................82
Caso desarrollado 3: Distribución de fechas ......................................87

Sesión 6: Estructuras condicionales


6.1 Introducción ....................................................................................93
6.2 Operadores usados en la estructura condicional ............................93
6.3 Estructura If simple..........................................................................94
6.4 Estructura If… Else ...........................................................................95
6.5 Estructura If… ElseIf .........................................................................96
6.6 Estructura Select Case ....................................................................... 97
Caso desarrollado 1: Registro de alumnos ...........................................98
Caso desarrollado 2: Registro de compra de productos ...................102
Caso desarrollado 3: Boleta de venta .................................................106
Caso desarrollado 4: Registro de seguros .......................................112
Caso desarrollado 5: Registro de eventos .......................................... 117

Sesión 7: Estructuras repe vas


7.1 Introducción ..................................................................................... 123
7.2 Contadores y acumuladores ............................................................ 123
7.3 Estructura repe va For… Next ....................................................... 123
7.4 Estructura repe va While .............................................................. 124
Caso desarrollado 1: Registro de venta de productos .......................125
Caso desarrollado 2: Registro de alumnos .........................................131
Caso desarrollado 3: Conteos de números aleatorios .......................139
Caso desarrollado 4: Control de libros ............................................... 142

Sesión 8: Base de datos I


8.1 Introducción ..................................................................................... 147
Caso Desarrollado 1: Consulta de datos simple ................................. 147
Caso Desarrollado 2: Consulta de datos usando un criterio..............150
Caso Desarrollado 3: Consulta de datos usando dos criterios ..........153
Caso Desarrollado 4: Consulta de datos por la inicial de una palabra..... 157

Sesión 9: Base de datos II


9.1 Introducción ..................................................................................... 161
9.2 Sentencia SELECT ............................................................................ 163
9.2.1 Listado simple............................................................................163
9.2.2 Listado ordenado ......................................................................164
9.2.3 Listado sin repe r valores .........................................................164
9.2.4 Listado de registros topes.........................................................164
9.2.5 Listado por condición................................................................165
9.3 Agregar una referencia de acceso a Access ..................................... 165
Caso desarrollado 1: Listado de barcos..............................................166
Caso desarrollado 2: Listado de empleados ordenados ....................167
Caso desarrollado 3: Listado de barcos filtrado por el año de compra... 170

Bibliogra a ....................................................................................... 173


INTRODUCCIÓN

El presente libro le ayudará a crear aplicaciones comerciales usando el lenguaje VBA


de Excel. Para cumplir con dicho obje vo se ha dividido la guía en nueve capítulos,
en cada uno de las cuales se incluye un porcentaje de temas teóricos necesarios para
fundamentar los casos expuestos.

En la sesión uno se exponen los temas generales que permi rán entender el desarrollo
de las aplicaciones VBA mediante Excel; es muy importante la lectura de esta parte,
especialmente para quienes se inician en programación. En la sesión dos se exponen los
temas propios al entorno VBA que hacen referencia a los objetos asociados con Excel y
que interactúan con el mismo. En la sesión tres se desarrollan los aspectos preliminares
en programación, aquí podrá conver r procesos de negocios en algoritmos, de tal
manera que pueda resolver cualquier po de programa siguiendo un estándar. En la
sesión cuatro se aborda sobre los entornos gráficos de usuario a través del conocimiento
de todos los controles presentes en VBA; desde aquí ya podremos implementar
aplicaciones que solucionen problemas en un proceso de negocio. En la sesión cinco
se desarrollan aplicaciones que usan todos los componentes de VBA, además de las
principales funciones según el po de datos de VBA. En la sesión seis se exponen
diversas aplicaciones usando las diferentes estructuras condicionales que soporta VBA;
las aplicaciones que se encuentran en esta sección podrán dar solución a las reglas de
negocio en una determinada organización. En la sesión siete se abordan las diferentes
estructuras repe vas que soporta VBA; en esta parte la información toma un
enfoque dinámico, es decir, se podrá reu lizar objetos, de tal forma que el código de
programación se reduzca. En la sesión ocho se implementan aplicaciones de manejo
de datos tomando como fuente a Excel; aquí usted podrá desarrollar aplicaciones
que permitan buscar información y exponerla en un Userform. Finalmente, en la
sesión nueve se desarrolla el uso de las bases de datos de Access para implementar
aplicaciones complejas con datos masivos.

Es importante, además, señalar que este material presenta los temas de manera
prác ca, sencilla y resumida. Por ende, resulta muy ú l e imprescindible para
estudiantes de Informá ca y para todos aquellos que deseen iniciarse en programación
y posean conocimientos de Excel básico o avanzado; también para quienes busquen
soluciones empresariales mediante el entorno Excel.
Conceptos básicos Sesión

1
1.1 Introducción al VBA
Excel es una aplicación desarrollada y bajo ese sen do todas las fórmulas, funciones y
demás acciones que realice bajo Excel en realidad son ejecutadas mediante un código que
no es visible por el usuario, este se realiza en un entorno de programación llamada VBA.

1.2 Definición de VBA


Las iniciales VBA provienen del inglés Visual Basic for Applica ons, el cual podemos
traducirlo como «Aplicaciones para Visual Basic», este es un entorno de desarrollo que
se encuentra dentro de cualquier aplicación de Office.

Finalmente, podríamos decir que «VBA permite automa zar las tareas que usted realiza
en Excel», convir endo así una tarea simple en una tarea dinámica e interac va.

1.3 Macros y su relación con VBA


Una macro en Excel permite automa zar tareas repe vas de modo que el usuario grabe
sus tareas co dianas y las ejecute cuando crea conveniente; es así que dichas tareas serán
registradas debidamente mediante códigos en VBA y podrán ser usadas en cualquier
momento a través de una invocación. Veamos un ejemplo:

Subtitulo()
Range("B4:J4").Select
With wwSelection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Selection.Merge
Selection.Font.Size = 20
With Selection.Font
.Name = "Tahoma"

9
Macros - Aplicaciones VBA con Excel

.Size = 20
.Underline = xlUnderlineStyleNone
.ThemeColor = xlThemeColorLight1
.TintAndShade = 0
.ThemeFont = xlThemeFontNone
End With
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
.PatternTintAndShade = 0
End With
With Selection.Font
.ThemeColor = xlThemeColorAccent6
.TintAndShade = 0.799981688894314
End With
With Selection.Font
.Color = -16776961
.TintAndShade = 0
End With
End Sub

1.4 Activar la ficha Desarrollador en el entorno de Excel


Inicialmente Excel presenta las siguientes fichas:

Fig. 1.1 Cinta de opciones de Excel inicial

Para iniciar el trabajo de VBA necesitamos ac var la ficha Desarrollador, para lo cual
debemos realizar los siguientes pasos:

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 Opciones.
3. Le aparecerá la ventana de Opciones de Excel, aquí deberá seleccionar Personalizar
cinta de opciones y ac var el check .

Fig. 1.2 Cinta de opciones de Excel con la ficha Desarrollador ac va

10
Se
sió
1
n
Conceptos básicos

1.5 Principales botones de la ficha Desarrollador


Veamos la descripción de los principales botones de la ficha Desarrollador:

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

Abre la ventana editora de VBA, desde aquí podemos


iniciar las aplicaciones VBA tanto en código como de <ALT+F11>
modo visual.

Abre la ventana de diálogo de selección de macros,


desde aquí podemos seleccionar una macro para
<ALT+F8>
ejecutarlo, inspeccionarlo paso a paso, modificarlo,
eliminarlo y/o crear uno nuevo.
Permite iniciar la grabación de una macro a par r
de 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.
Permite personalizar la configuración de la seguridad en
la macro. Más adelante explicaremos este punto, por
-
ahora solo podemos mencionar que al iniciar una apli-
cación VBA debe configurar la seguridad de las macros.
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 Acceso al entorno VBA


Primera forma: Ficha Desarrollador > Visual Basic.
Segunda forma: <ALT+F11> .
Tercera forma: Ficha Desarrollador > Ver Código.

Fig. 1.3 Entorno inicial de VBA


11
Macros - Aplicaciones VBA con Excel

1.7 Habilitar la seguridad de las macros


Es necesario habilitar el acceso al trabajo con macros, ya que cuando se desarrolle una
aplicación VBA Excel solicitará la habilitación del contenido tal como se muestra en la
siguiente imagen:

Fig. 1.4 Seguridad de macros

Para que no realice dicha pregunta, se debe deshabilitar las no ficaciones en Excel,
realizando los siguientes pasos:

• Ficha Desarrollador > Seguridad de macros.


• Seleccione Deshabilitar todas las macros sin noƟficación.
• Ac var el check Confiar en el acceso al modelo de objeto de proyectos VBA.

Fig. 1.5 Ventana de configuración de macros

1.8 Grabar una aplicación VBA


Es necesario aprender cómo se guarda un documento implementado en VBA, ya que no
es igual a guardar un documento de Excel, para nuestro caso seleccionaremos solo dos
opciones:

Opción 1: Desde Excel


• Presione <F12> o Archivo > Guardar como…
• Asigne un nombre al archivo.
• Seleccione el po de archivo Libro habilitado para macros (*.xlsm).

12
Se
sió
1
n
Conceptos básicos

Fig. 1.6 Ventana de grabación de Excel con macros

• Seleccione la ubicación de su archivo y finalmente haga clic en Guardar.

Opción 2: Desde el entorno VBA


• Desde la ficha Desarrollador > Visual Basic.
• Archivo > Guardar libro…
• Asigne un nombre al archivo
• Seleccione el po de archivo Libro habilitado para macros (*.xlsm).
• Seleccione la ubicación de su archivo y finalmente haga clic en Guardar.

1.9 Descripción del editor VBA


Debemos tener en cuenta que a pesar de las diferentes versiones de Excel el entorno VBA
no ha sufrido cambios, el cual ene el siguiente aspecto:

Fig. 1.7 Editor VBA para Excel 2013


13
Macros - Aplicaciones VBA con Excel

1.9.1 Botones de ejecución y parar una aplicación


Estos son los botones más usados al momento de desarrollar una aplicación VBA.

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

Botón de ejecución
El cual permite ejecutar un procedimiento o visu- <F5>
alizar el empo de ejecución de un UserForm.

Botón de parar
El cual permite salir de una ejecución como un proce- <ALT+F4>
dimiento o un UserForm.

1.9.2 Operaciones desde la barra de herramienta estándar


Veamos algunas opciones que puede realizar con los botones de la barra de herramientas
estándar.

• ¿Cómo grabar el proyecto?


Archivo > Guardar Libro.

• ¿Cómo exportar código VBA?


Archivo > Exportar > Asignar nombre > Botón Guardar.
La exportación permite guardar un código (.cls) u objeto (.frm) en un archivo
independiente.

• ¿Cómo importar código VBA?


Archivo > Importar > Seleccionar el archivo.
La importación permite abrir un código u objeto en un proyecto VBA nuevo.

• ¿Cómo visualizar el Explorador de Proyectos y la ventana Propiedades?


Ver > Explorador de Proyectos.
Ver > Ventana Propiedades.

• ¿Cómo modificar el tamaño y po de letra del editor de código de VBA?


Herramientas > Opciones > Formato del Editor > Texto Normal > Modificar la
fuente y su tamaño.

• ¿Cómo cambiar el nombre del proyecto VBA?


Herramientas > Propiedades de… > General > Asignar un nombre al proyecto.

• ¿Cómo proteger el código u objetos implementados en un proyecto VBA?


Herramientas > Propiedades de… > Protección > AcƟvar el check Bloquear proyecto
para visualización y asignar una contraseña para visualizar sus propiedades.

14
Se
sió
1
n
Conceptos básicos

1.10 El Explorador de Proyectos


Permite visualizar la estructura general que puede llegar a tener un proyecto en VBA. Tiene
el siguiente aspecto:

Fig. 1.8 Ventana exploradora de proyectos

Desde aquí podemos desprender las siguientes operaciones:

• ¿Cómo cambiar el nombre del proyecto?


Haga clic derecho sobre el nombre del proyecto > Seleccione Propiedades de
VBAProject… > Asigne un nombre.

• ¿Cómo modificar el nombre de las hojas de Excel?


Seleccione una hoja de Excel desde MicrosoŌ Excel Objects > Propiedades > Name >
Asigne un nombre.

• ¿Cómo agregar un módulo al proyecto?


Haga clic derecho sobre el proyecto > Insertar > Módulo.

• ¿Cómo agregar un UserForm al proyecto?


Haga clic derecho sobre el proyecto > Insertar > UserForm.

• ¿Cómo eliminar un módulo del proyecto?


Haga clic derecho sobre el módulo > Quitar Módulo.

• ¿Cómo eliminar un formulario del proyecto?


Haga clic derecho sobre el formulario > Quitar UserForm.

15
Macros - Aplicaciones VBA con Excel

1.11 La ventana Propiedades


Muestra las caracterís cas que puede tener un
determinado objeto en VBA y que pueden ser
modificadas como el color, tamaño, es lo, etc. La
siguiente imagen muestra la ventana de propiedades del
objeto ThisWorkBook.

Fig. 1.9 Ventana de propiedades del


ThisWorkBook

1.12 La ventana de código


Aquí es donde podemos colocar código VBA que luego puede ser ejecutado en los objetos
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.10 Ventana de código del ThisWorkbook

1.13 Implementación de funciones VBA y su uso en Excel


Para iniciar con el trabajo en VBA debemos comprender cómo relacionar las funciones
implementadas en VBA con una hoja de Excel. Para lo cual debemos realizar los siguientes
pasos:

 Paso 1: Habilite la ficha Desarrollador.

• Haga clic en el botón ARCHIVO de la cinta de opciones de Excel.


• De la lista de opciones mostrada en el lado izquierdo de la ventana, seleccione Opciones.
• Le aparecerá la ventana Opciones de Excel, aquí deberá seleccionar Personalizar
cinta de opciones y ac var el check .
16
Se
sió
1
n
Conceptos básicos

 Paso 2: Deshabilite la seguridad de las macros.


• Ficha Desarrollador > Seguridad de macros.
• Seleccione Deshabilitar todas las macros sin noƟficación.
• Ac var el check Confiar en el acceso al modelo de objeto de proyectos VBA.

 Paso 3: Acceda al entorno VBA.


• Presione <ALT+F11>.

 Paso 4: Agregue un módulo al proyecto.


• Desde el entorno VBA, seleccionar el menú Insertar > Módulo.

 Paso 5: Implemente una función.


Para la prueba, implementaremos una función que muestra la fecha actual, recuerde
que el código mostrado debe ser implementado dentro del módulo creado en el paso 4:

Function muestraFecha() As String


muestraFecha = Format(Date, "d/m/yyyy")
End Function

Explicación del código:

Toda función en VBA se inicia con la palabra reservada Func on, luego se especifica
el nombre de la función; aquí se debe tener especial cuidado pues un nombre
de función no puede tener espacios en blanco, también se pudo haber usado el
siguiente nombre muestra_fecha(). La sentencia As String define el po de salida
que tendrá la función.

La segunda línea especifica la salida de la función, es decir, Format(Date, "d/m/


yyyy") enviará la fecha actual a la función y cuando alguien invoca a muestraFecha;
este le enviará la fecha actual con el año de cuatro cifras.

Finalmente, End FuncƟon especifica el fin de la función.

 Paso 6: Pruebe la función VBA en Excel.


Una función implementada en VBA es tratada como una función de Excel; así es que los
pasos para invocar una función sería de la siguiente manera:

• Ubíquese en una celda de la hoja de Excel


• Coloque la siguiente sentencia: =muestraFecha()

17
Macros - Aplicaciones VBA con Excel

» Caso desarrollado 1: Determinar la edad de una persona


Se repiten los pasos 1, 2, 3 y 4 usados en el punto 1.13; solo haremos referencia a los
pasos 5 y 6. Implemente una función que permita calcular la edad de una persona para
lo cual debe ingresar como parámetro la fecha de su nacimiento.

Implemente una función


Debe tener en cuenta que el código mostrado debe ser implementado dentro de un
módulo:

Function calculaEdad(ByVal fecha As Date) As Integer


calculaEdad = Year(Date) - Year(fecha)
End Function

Explicación del código:

La función calculaEdad recibe como parámetro la fecha de nacimiento de una


persona, esta debe ser recibida como po Date y al final de la línea se especifica el
po de salida de la función para este caso se usó Integer, porque la edad resultante
será un número entero.

Year(Date) determine el año de la fecha actual y Year(fecha) determina el año de


la fecha ingresada a la función. Finalmente, el resultado es enviado a la función.

Pruebe la función VBA en Excel


Implemente el siguiente entorno en Excel:

Fig. 1.11 Hoja de Excel

• En la celda C5 coloque una fecha de nacimiento


• Ubíquese en una celda C7 y coloque la siguiente sentencia: =calculaEdad(C5).

» Caso desarrollado 2: Determinar el promedio de notas


Se repiten los pasos 1, 2, 3 y 4 usados en el punto 1.13; solo haremos referencia a los
pasos 5 y 6. Implemente una función que permita calcular el promedio de notas de un
alumno, para lo cual deberá ingresar dos notas a la función.

18
Se
sió
1
n
Conceptos básicos

Implemente una función


Debe tener en cuenta que el código mostrado debe ser implementado dentro de un
módulo:

Function calculaPromedio(ByVal n1 As Integer, n2 As Integer) As Double


calculaPromedio = Format((n1 + n2) / 2, "0.00")
End Function

Explicación del código:

La función calculaPromedio recibe como parámetro las dos notas del alumno estos
deben ser declarados como enteros y la salida de la función como Double porque
estos podrían resultar decimales al promediar ambas notas.

Finalmente, asignamos la fórmula del promedio a la función usando la función


Format que nos permi rá mostrar a dos decimales el promedio de notas.

Pruebe la función VBA en Excel


Implemente el siguiente entorno en Excel:

Fig. 1.12 Hoja de Excel

• En la celda C5 y C6 ingrese dos notas de po entero


• Ubíquese en una celda C8 y coloque la siguiente sentencia: =calculaPromedio(C5,C6).

» Caso desarrollado 3: Determinar el pago por la compra de un producto


Se repiten los pasos 1, 2, 3 y 4 usados en el punto 1.13; solo haremos referencia a los
pasos 5 y 6. Implemente una función que permita determinar el pago por la compra de
un producto para lo cual deberá ingresar el precio del producto y la can dad comprada.

19
Macros - Aplicaciones VBA con Excel

Implemente una función


Debe tener en cuenta que el código mostrado debe ser implementado dentro de un
módulo:

Function calculaPago(ByVal precio as Currency,


Byval cantidad as Integer) As Currency
calculaPago = Format(precio * cantidad, "0.00")
End Function

Explicación del código:

La función calculaPago recibe como parámetro el precio del producto el cual es


declarado como Currency por tratarse de un valor monetario y la can dad de po
entero por tratarse de la can dad de productos comprados. La salida de la función
debe ser declarada como Currency por ser un valor monetario.

Finalmente, se asigna el producto del precio y la can dad al nombre de la función,


usamos la función Format para especificar la can dad de decimales a mostrar en
el resultado.

Pruebe la función VBA en Excel


Implemente el siguiente entorno en Excel:

Fig. 1.13 Hoja de Excel

• En la celda C5 coloque el precio del producto.


• En la celda C6 coloque la can dad comprada.
• Ubíquese en una celda C8 y coloque la siguiente sentencia: =calculaPago(C5,C6)

» Caso desarrollado 4: Determinar la hora, minuto y segundos


Se repiten los pasos 1, 2, 3 y 4 usados en el punto 1.13; solo haremos referencia a los
pasos 5 y 6. Implemente una función que permita determinar la hora a par r de un
valor en segundos. Por ejemplo, 7200 segundos representa 2 horas, 1 minuto y 20
segundos.

20
Se
sió
1
n
Conceptos básicos

Implemente una función


Debe tener en cuenta que el código mostrado debe ser implementado dentro de un
módulo:

Function calculaTiempo(ByVal segundos As Integer) As String


Dim hora As Integer, minutos As Integer, seg As Integer

hora = segundos \ 3600


minutos = (segundos Mod 3600) \ 60
seg = (segundos Mod 3600) Mod 60

calculaTiempo = hora & ":" & Format(minutos, "00") & ":"


& Format(seg, "00")
End Function

Explicación del código:

La función calculaTiempo recibe como parámetro un valor entero en segundos, la


salida de esta función será del po cadena por combinar números y símbolos (:) en
una determinada hora.

Dim hora As Integer, permite declarar la variable hora dentro de la función; aquí se
almacenará la hora a par r de los segundos enviados como parámetro. Asimismo,
la variable minutos y seg son declaradas como enteros; este úl mo se declaró como
seg para no confundirlo con el parámetro segundos.

El símbolo \ devuelve un valor entero entre la división de dos números, la función


Mod devuelve un valor que representa al resto de la división entre dos números.
Finalmente, el resultado es enviado a la función, debe tener en cuenta que en el
formato se asignó 00 para que los minutos y segundos se muestren siempre a dos
cifras.

Pruebe la función VBA en Excel


Implemente el siguiente entorno en Excel:

Fig. 1.14 Hoja de Excel

21
Macros - Aplicaciones VBA con Excel

• En la celda C5 coloque la can dad de segundos


• Ubíquese en una celda C7 y coloque la siguiente sentencia: =calculaTiempo(C5)

» Caso desarrollado 5: Determinar el pago de un empleado


Se repiten los pasos 1, 2, 3 y 4 usados en el punto 1.13; solo haremos referencia a los
pasos 5 y 6. Implemente una función que permita determinar el pago de un empleado
a par r del costo por hora y las horas de trabajo.

Implemente una función


Debe tener en cuenta que el código mostrado debe ser implementado dentro de un
módulo:

Function calculaPago(ByVal pago As Currency,


ByVal horas As Integer) As Currency
Dim descuento As Currency
descuento = (pago * horas) * 0.1
calculaPago = Format((pago * horas) - descuento, "0.00")
End Function

Explicación del código:

La función calculaPago recibe como parámetro el pago por hora de po Currency


por ser un valor monetario y también las horas de trabajo de po entero. La salida
de la función será Currency por ser un valor monetario.

Pruebe la función VBA en Excel


Implemente el siguiente entorno en Excel:

Fig. 1.15 Hoja de Excel

• En la celda C5 coloque el pago por hora de trabajo


• En la celda C6 coloque la can dad de horas trabajadas
• Ubíquese en una celda C8 y coloque la siguiente sentencia: =calculaPago(C5,C6)

22
Modelo de objetos Sesión

2
2.1 Modelo de objetos de Excel en VBA
En Excel los objetos presentan la siguiente jerarquía:

Debemos tener en cuenta los siguientes aspectos:

• Todo objeto VBA ene «propiedades», es decir, un objeto puede presentar caracterís cas
idén cas a otros; y estos podrán ser modificados por el usuario, por ejemplo:

Asignar el color azul a la ficha de la Hoja1 y verde a la Hoja2.

Application.ThisWorkbook.Sheets(1).Tab.Color = vbBlue
Application.ThisWorkbook.Sheets(2).Tab.Color = vbGreen

Asignar el tulo «Gráfico Estadís co» a la Hoja1 y «Reporte 2016» a la Hoja2.

Application.ThisWorkbook.Sheets(1).Name = "Gráfico Estadístico"


Application.ThisWorkbook.Sheets(2).Name = "Reporte 2016"

23
Macros - Aplicaciones VBA con Excel

• Todo objeto también ene «métodos», estos se caracterizan por realizar una ac vidad
directamente, por ejemplo:

Seleccionar la celda A2.

Range("A2").Select
Sheets(1).Cells(2,1).Select

Seleccionar las celdas desde A1 hasta A1000.

Range("A1:A1000").Select

Añadir una hoja al libro de Excel.


Worksheets.Add

Ac var la hoja del libro 4 que ene por tulo «Reportes».


Sheets(4).Activate
Sheets("Reportes").Activate

2.2 Objeto Application


Representa la propia aplicación Excel y, mayormente, funciona como contenedor de
otros objetos.

Propiedades

• Ac veCell
Representa la celda ac va dentro de una hoja de Excel.

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

• Ac veSheet
Representa la hoja ac va dentro de un libro de Excel. Veamos cómo ac var la celda
A5 de la hoja ac va:
Application.ActiveSheet.Range("A5").Select

• Ac veWindow
Representa la ventana ac va dentro del entorno Excel. Veamos cómo mostrar el
nombre del libro ac vo:
MsgBox Application.ActiveWindow.Caption

24
Se
sió
2
n
Modelo de objetos

• Ac veWorkbook
Representa al libro ac vo dentro del entorno Excel. Veamos cómo mostrar el nombre
completo del libro ac vo:

MsgBox Application.ActiveWorkbook.Name

• Cap on
Representa el contenido de la barra de tulo de la ventana principal de Excel. Veamos
cómo mostrar el tulo de la ventana ac va:

MsgBox Application.Caption

• Selec on
Representa una o más celdas seleccionadas a par r de una hoja ac va. Veamos cómo
mostrar el rango de un conjunto de celdas seleccionadas:

MsgBox Application.Selection.Address

• ThisWorkbook
Representa el libro ac vo en la cual nos encontramos implementando el código VBA.
Veamos cómo mostrar el nombre del libro actual:

MsgBox Application.ThisWorkbook.Name

Métodos

• Quit
Método que permite salir de la aplicación Excel. Veamos cómo salir de la aplicación
Excel:
Application.Quit

2.3 Objeto WorkBook


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

Propiedades

• Name
Representa el nombre del libro actual de Excel. Veamos cómo mostrar el nombre del
libro actual:
MsgBox ThisWorkbook.Name

25
Macros - Aplicaciones VBA con Excel

• Path
Representa la ubicación del archivo de Excel a par r de las unidades de almacenamiento.
Veamos cómo mostrar la ruta de donde se guardó el libro:

MsgBox ThisWorkbook.Path

Métodos

• Open
Permite abrir un archivo de Excel. Veamos cómo abrir el archivo Listado.xlsx almacenado
en la unidad C:\.
Workbooks.Open "C:\Listado.xlsx"

• Add
Permite crear un nuevo Libro de Excel. Veamos cómo agregar un nuevo libro:
Workbooks.Add

• Ac vate
Permite ac var un determinado libro siempre y cuando se encuentre abierto. Veamos
cómo ac var el libro ReporteVentas.xlsx abierto como segundo libro.

Workbooks("ReporteVentas.xlsx").Activate

Workbooks(2).Activate

• Close
Permite cerrar un determinado libro. Veamos cómo cerrar el libro actual:

ThisWorkbook.Close

Otra posibilidad de salir de un libro es guardando los cambios realizados, para lo cual
podríamos usar el siguiente código:

Workbooks(1).Close SaveChanges:=False

• Save
Permite guardar los cambios en un determinado libro. Veamos cómo guardar el libro
ac vo:

ThisWorkbook.Save

26
Se
sió
2
n
Modelo de objetos

También podemos usar los siguiente códigos para la misma acción:


ActiveWorkbook.Save

Workbooks("Save - miLibro.xlsm").Save

Workbooks(1).Save

• Save As
Permite crear un nuevo archivo a par r del archivo de Excel actual. Veamos cómo crear
una copia del archivo actual y registrarlo en la unidad C:\
ActiveWorkbook.SaveAs "C:\reporte2016.xlsx"

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


ThisWorkbook.SaveAs "C:\reporte2016.xlsx"

Workbooks(1).SaveAs "C:\reporte2016.xlsx"

• SaveCopyAs
Permite crear una copia del libro actual. Veamos cómo crear una copia de seguridad
del libro actual:
ActiveWorkbook.SaveCopyAs "C:\reporte2016.xlsx"

2.4 Objeto WorkSheets


El objeto WorkSheet representa a una hoja de cálculo de Excel, a la colección de hojas se
le llama WorkSheets.

Propiedades

• Count
Representa el número total de hojas por libro. Veamos cómo mostrar el número total
de hojas del libro actual:
MsgBox WorkSheets.Count

• Name
Representa el nombre de la hoja actual. Veamos cómo mostrar el nombre de la primera
hoja:
MsgBox Worksheets(1).Name

27
Macros - Aplicaciones VBA con Excel

También podríamos usar los siguientes códigos:


MsgBox ActiveSheet.Name

MsgBox Hoja1.Name

Métodos

• Ac vate
Permite ac var una hoja de un conjunto de hojas en un determinado libro. Veamos
cómo ac var la hoja 2 de un libro ac vo.
WorkSheets(2).Activate

O también podríamos hacer referencia por medio de su nombre. Así, por ejemplo:
WorkSheets("Hoja2").Activate

• Add
Permite agregar un determinado número de hojas a un libro. Veamos cómo agregar
una hoja al final de todas:

Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name="Nueva Hoja"

• Delete
Permite eliminar una determinada hoja. Veamos el código para eliminar la segunda
hoja del libro actual:

Worksheets(2).Delete

2.5 Objeto Range


El objeto Range puede representar una celda específica, un conjunto de celdas ya sean
con nuas o disjuntas, así como también toda una fila o columna.

Propiedades

• Cells
Permite hacer referencia a un conjunto de celdas en una determinada hoja. Veamos
cómo seleccionar las celdas A1 hasta A10:

Range(Cells(1, 1), Cells(10, 1)).Select

28
Se
sió
2
n
Modelo de objetos

• End
Devuelve una ubicación al inicio o al final de un bloque de celdas seleccionadas.
Veamos cuatro procedimientos que permitan mover la celda ac va por los extremos
de un determinado conjunto de datos, sabiendo que la celda B5 ene un conjunto de
registros:
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

• Formula
Permite implementar una fórmula de Excel desde VBA. Veamos cómo sumar las celdas
A1 hasta A10 en la celda A11:
Range("A11").Formula = "=sum(A1:A10)"

• FormulaLocal
Debemos considerar que en VBA para hacer referencia a la funciones de Excel se debe
especificar dicha función en el formato VBA. Veamos cómo sumar el rango A1 hasta
A10 en la celda A11:

Range("A11").FormulaLocal = "=SUMA(A1:A10)"

• Value
Tiene un trabajo de asignación y recuperación de valor sobre una celda, es decir,
podemos enviar un valor o especificar una fórmula tal como se realiza con la propiedad
Formula; así también podemos obtener un valor desde las celdas de la hoja de Excel
hacia VBA. Veamos cómo limpiar el contenido de las celdas A1 y A2:
Range("A1").Value = ""
Range("A2").Value = ""

También podríamos enviar una fórmula a la celda actual de la siguiente manera:


ActiveCell.Value = "=sum(A1:A10)"

29
Macros - Aplicaciones VBA con Excel

Métodos

• Ac vate
Método que permite conver r una celda seleccionada en una celda ac va mediante el
objeto Range. Veamos algunos casos:

Ac var la celda A1:

Range("A1").Activate

En la celda A1 mostrar la fecha actual:

Range("A1").Activate
Range("A1").FormulaLocal = "=Hoy()"

• ClearContents
Método que permite limpiar el contenido de un determinado rango de celdas
especificadas en el objeto Range. Veamos cómo limpiar el contenido de las celdas A1
hasta A100:

Range("A1:A100").ClearContents

• Delete
Método que elimina un determinado número de celdas. Veamos cómo eliminar las
celdas A1 hasta A10:

Range("A1:A10").Delete

Si necesitamos eliminar una fila completa podríamos usar el siguiente código:

Range("A1").Activate
Selection.EntireRow.Delete

Si necesitamos eliminar una columna completa podríamos usar el siguiente código:

Range("A1").Activate
Selection.EntireColumn.Delete

30
Se
sió
2
n
Modelo de objetos

2.6 Objeto Cells


Cells cuenta con las mismas funcionalidades que el objeto Range, la diferencia es la
especificación de las celdas; mientras que Range especifica directamente al rango, Cells
lo hace por medio del número de fila y columna.

Al respecto, podemos decir que Cells ofrece la ventaja de recorrer por varias celdas
haciendo referencia a las filas y columnas por medio de una estructura repe va. Veamos,
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

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

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

Procedimiento que permita modificar el po de letra y tamaño de la celda D2:

Sub modificaFuente()
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

31
Macros - Aplicaciones VBA con Excel

» Caso desarrollado 1: Conversión de medidas


Implemente un procedimiento que permita conver r una can dad dada en metros
a sus equivalentes en cen metros, pulgadas, pies y yardas. Considere la siguiente
información:

1 metro = 100 cen metros


1 pie = 12 pulgadas
1 yarda = 3 pies
1 pulgada = 2.54 cen metros

Pasos:

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

Fig. 2.1 Hoja de Excel mostrando el entorno del problema

2. Acceda al entorno VBA presionando <ALT+F11>.


3. Agregar un módulo al proyecto.

Desde el entorno VBA, seleccionar el menú Insertar > Módulo.

4. Digite el siguiente código dentro del módulo:

Sub muestraConversion1()
metros = Range("C4").Value

centímetros = metros * 100


pulgadas = centímetros / 2.54
pies = pulgadas / 12
yardas = pies / 3

Range("C6").Value = centimetros
Range("C7").Value = Format(pulgadas, "0.00")
Range("C8").Value = Format(pies, "0.00")
Range("C9").Value = Format(yardas, "0.00")
End Sub

32
Se
sió
2
n
Modelo de objetos

Explicación del código:

Capturamos el valor de la celda con la sentencia metros = Range("C4").Value,


luego calculamos los valores de la conversión según los datos del problema.

Finalmente, enviamos la información resultante a las celdas correspondientes por


medio de la sentencia Range("C6").Value.

5. Agregaremos un botón en la hoja de Excel. Desde la ficha Desarrollador seleccione


Botón desde Controles de formulario del botón . Forme un cuadro en la hoja de
Excel y le aparecerá la siguiente ventana:

Fig. 2.2 Ventana de diálogo de la «Selección de macro»

Seleccione el procedimiento muestraConversion1 desde la ventana y haga clic en el


botón Aceptar.

6. Cambie el nombre del botón por Conversión 01.


7. Pruebe la aplicación, ingresando un valor en la celda C4 y presionando en el botón
Conversión 01.
8. Finalmente, la hoja de Excel quedará de la siguiente manera:

Fig. 2.3 Entorno final de la hoja de Excel


33
Macros - Aplicaciones VBA con Excel

» Caso desarrollado 2: ReparƟción de capital


Implemente un procedimiento que permita determinar el monto capital y el porcentaje
que le corresponde a cada uno de los socios de una determinada empresa a par r de
montos que aportan cada uno.

Pasos:

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

Fig. 2.4 Hoja de Excel mostrando el entorno del


problema

2. Acceda al entorno VBA presionando <ALT+F11>.


3. Agregar un módulo al proyecto.
Desde el entorno VBA, seleccionar el menú Insertar > Módulo.

4. Digite el siguiente código dentro del módulo:

Sub muestraReparticion01()
mSocio1 = Range("C4").Value
mSocio2 = Range("C5").Value
mSocio3 = Range("C6").Value

capital = mSocio1 + mSocio2 + mSocio3

pSocio1 = (mSocio1 * 100) / capital


pSocio2 = (mSocio2 * 100) / capital
pSocio3 = (mSocio3 * 100) / capital

Range("C8").Value = capital
Range("C9").Value = Format(pSocio1, "0.00")
Range("C10").Value = Format(pSocio2, "0.00")
Range("C11").Value = Format(pSocio3, "0.00")
End Sub

34
Se
sió
2
n
Modelo de objetos

Explicación del código:

Iniciamos capturando cada monto registrado por los socios con la sentencia mSocio1
= Range("C4").Value de la misma forma se realizará para los demás socios, luego
se calcula el monto capital sumando todos los montos, seguidamente calculamos
el porcentaje que le corresponde a cada socio usando regla básica de tres simples.

Finalmente, se envía toda la información resultante a las celdas correspondientes


en la hoja de Excel.

5. Agregaremos un botón en la hoja de Excel. Desde la ficha Desarrollador seleccione


Botón desde Controles de formulario del botón . Forme un cuadro en la hoja de
Excel y le aparecerá la siguiente ventana:

Fig. 2.5 Ventana de diálogo de la «Selección de macro»

Seleccione el procedimiento muestraReparƟcion01 desde la ventana y haga clic en


el botón Aceptar.

6. Cambie el nombre del botón por «Mostrar repar ción».


7. Pruebe la aplicación, ingresando montos en las celdas C4, C5, C6 y haciendo clic en
el botón Mostrar reparƟción.

35
Macros - Aplicaciones VBA con Excel

8. Finalmente, la hoja de Excel quedará de la siguiente manera:

Fig. 2.6 Entorno final de la hoja de Excel

» Caso desarrollado 3: Compra de productos


Implemente un procedimiento que permita determinar el importe de compra,
descuento y neto por la compra de un producto en un enda comercial, sabiendo que
se le aplica el 11% de descuento.

Pasos:

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

Fig. 2.7 Hoja de Excel mostrando el entorno del problema

2. Acceda al entorno VBA presionando <ALT+F11>.


3. Agregar un módulo al proyecto.

Desde el entorno VBA, seleccionar el menú Insertar > Módulo.

36
Se
sió
2
n
Modelo de objetos

4. Digite el siguiente código dentro del módulo:

Sub calculaPago()
precio = Range("C5").Value
cantidad = Range("C6").Value

iCompra = precio * cantidad


descuento = iCompra * 0.11
neto = iCompra - descuento

Range("C8").Value = Format(iCompra, "0.00")


Range("C9").Value = Format(descuento, "0.00")
Range("C10").Value = Format(neto, "0.00")
End Sub

Explicación del código:

Iniciamos capturando el precio del producto y la can dad comprada, no será


necesario capturar el nombre del producto. Luego realizamos los cálculos de los
importes solicitados por el problema.

Finalmente, se envía toda la información resultante a las celdas correspondientes


en la hoja de Excel.

5. Agregaremos un botón en la hoja de Excel. Desde la ficha Desarrollador seleccione


Botón desde el Controles de formulario del botón . Forme un cuadro en la hoja
de Excel y le aparecerá la siguiente ventana:

Fig. 2.8 Ventana de diálogo de la «Selección de macro»

37
Macros - Aplicaciones VBA con Excel

Seleccione el procedimiento calculaPago desde la ventana y haga clic en el botón


Aceptar.

6. Cambie el nombre del botón por Muestra cálculos.


7. Pruebe la aplicación, ingresando el nombre del producto en la celda C5, precio en
la celda C6, la can dad en la celda C7 y haciendo clic en el botón Muestra cálculos.
8. Finalmente, la hoja de Excel quedará de la siguiente manera:

Fig. 2.9 Entorno final de la hoja de Excel

38
Fundamentos de Sesión

programación
3
3.1 Fases para la solución de un programa
La idea de programar en VBA es tener claro el obje vo de la aplicación, solo así podremos
determinar las variables o sentencias que necesita para su aplicación. Por tal mo vo,
primero debe realizar las siguientes fases:

AcƟvidades Fases
Determinar cuál es el obje vo del problema. Análisis del problema
Plantear una solución adecuada. Diseño del algoritmo
Implementar las funciones o procedimientos
Codificación del problema
que den solución al problema.
Ejecutar la aplicación VBA. Ejecución del programa
Comprobar que el resultado sea adecuado. Verificación y depuración

3.1.1 Fase 1: Análisis del problema


En esta fase podremos determinar las variables que se necesita para la solución del
problema, así como las funciones que se debe emplear. Responda las siguientes
preguntas para encontrar dichas variables:

Preguntas Valores de solución


¿Qué datos necesito para la
Valores de entrada de la aplicación.
solución del problema?
¿Cómo proceso la solución Fórmulas o funciones que se emplean
del problema? para la solución del problema.
Representa la salida de la aplicación,
¿Cuál es el resultado?
es decir, el resultado esperado.

Veamos algunos casos para entender mejor cómo debemos analizar un problema antes
de codificarlo en VBA.

39
Macros - Aplicaciones VBA con Excel

Problema 1:
En una empresa inmobiliaria necesitan tener el control del empo que se demoran en
realizar una obra. Si doce obreros, trabajando 8 horas diarias, terminan un proyecto en
25 días, ¿cuánto tardarán en hacer ese mismo proyecto N obreros trabajando T horas
diarias?

Analizando el problema, encontramos los siguientes datos:

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


12 N 25
5 T X

Ahora organizaremos los valores encontrados de tal forma que sa sfaga el patrón de
valores Entrada-Proceso-Salida.

Entrada Can dad de obreros, horas de trabajo


Proceso días = 25  12  8
N T
Salida Días trabajados

Problema 2:
Una casa de cambio en el centro de la ciudad necesita conocer el monto total en euros
a par r de tres can dades de dinero: soles, dólares y marcos. La casa considera los
siguientes pos de cambio:

1 dólar = 3.51 soles


1 dólar = 1.09 euros
1 dólar = 2.12 marcos

Analizando el problema, encontramos los siguientes datos:

Variables Posibles valores


Soles 10 000.00
Dólares 7500.00
Marcos 1500.00
EUROS X

40
Se
sió
3
n
Fundamentos de programación

Ahora organizaremos los valores encontrados de tal forma que sa sfaga el patrón de
valores Entrada-Proceso-Salida.

Entrada Soles, dólares, marcos


Proceso Euros = (Soles / 3.51+dólares+ marcos / 2.12) * 1.09
Salida Euros

Problema 3:
Implemente una aplicación que permita leer una temperatura en grados cen grados
(ºC) y la convierta a sus equivalentes en grados Fahrenheit (ºF), grados Kelvin (K) y grados
Rankine(R). Use las siguientes fórmulas:

F = 9C/5 + 32
K = R – 187
R = C + 460

Analizando el problema, encontramos los siguientes datos:


Variables Posibles valores
Grados cen grados 90
Fahrenheit X
Kelvin X
Rankine X

Ahora organizaremos los valores encontrados de tal forma que sa sfaga el patrón de
valores Entrada-Proceso-Salida.

Entrada Cen grados

Fahrenheit = (9 * cen grados) / 5 +32


Proceso Rankine = cen grados + 460
Kelvin = Rankine -187

Salida Fahrenheit, Kelvin, Rankine

3.1.2 Fase 2: Diseño del algoritmo


En esta fase pasaremos los valores de entrada, proceso y salida hacia un algoritmo de
solución. Para esto usaremos los pseudocódigos ya que son los más cercanos a una
aplicación de código VBA. Para ello, emplearemos los casos expuestos anteriormente:

41
Macros - Aplicaciones VBA con Excel

Problema 1:
En una empresa inmobiliaria necesitan tener el control del empo que se demoran en
realizar una obra. Si doce obreros, trabajando 8 horas diarias, terminan un proyecto en
25 días, ¿cuánto tardarán en hacer ese mismo proyecto N obreros trabajando T horas
diarias?

Análisis del problema:

Entrada Can dad de obreros, horas de trabajo


Proceso Días = 25  12  8
 N  T
Salida Días trabajados

Pseudocódigo:
Inicio
Leer obreros, horas
Días = 25 * (12/obreros) * (8/horas)
Escribir Días
Fin

Problema 2:
Una casa de cambio en el centro de la ciudad necesita conocer el monto total en euros
a par r de tres can dades de dinero: soles, dólares y marcos. La casa considera los
siguientes pos de cambio:

1 dólar = 3.51 soles


1 dólar = 1.09 euros
1 dólar = 2.12 marcos

Análisis del problema:

Entrada Soles, dólares, marcos


Proceso Euros = (Soles / 3.51+dólares+ marcos / 2.12) * 1.09
Salida Euros

Pseudocódigo:
Inicio
Leer soles, dólares, marcos
euros = (soles/3.51 + dólares + marcos/2.12) * 1.09
Escribir euros
Fin

42
Se
sió
3
n
Fundamentos de programación

Problema 3:
Implemente una aplicación que permita leer una temperatura en grados cen grados
(ºC) y la convierta a sus equivalentes en grados Fahrenheit (ºF), grados Kelvin (K) y grados
Rankine(R). Use las siguientes fórmulas:

F = 9C/5 + 32
K = R – 187
R = C + 460

Análisis del problema:


Entrada Cen grados

Fahrenheit = (9 * cen grados) / 5 +32


Proceso Rankine = cen grados + 460
Kelvin = Rankine -187

Salida Fahrenheit, Kelvin, Rankine

Pseudocódigo:

Inicio
Leer centígrados
Fahrenheit = (9 * Centigrados) / 5 +32
rankine = Centigrados + 460
kelvin = Rankine - 187
Escribir Fahrenheit, rankine, kelvin
Fin

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


La codificación en VBA se da por pasos que representaremos a con nuación:

Problema 1:
En una empresa inmobiliaria necesitan tener el control del empo que se demoran en
realizar una obra. Si doce obreros, trabajando 8 horas diarias, terminan un proyecto
en 25 días, ¿cuánto tardarán en hacer ese mismo proyecto N obreros trabajando T
horas diarias?

Análisis del problema:

Entrada Can dad de obreros, horas de trabajo


Proceso Días = 25  12  8
 N  T
Salida Días trabajados

43
Macros - Aplicaciones VBA con Excel

Pseudocódigo:

Inicio
Leer obreros, horas
Días = 25 * (12/obreros) * (8/horas)
Escribir Días
Fin

El código en VBA se puede representar en una función o procedimiento de la siguiente


manera:

Function determinaDias(ByVal obreros As Integer,


ByVal horas As Integer) As Integer
determinaDias = 25*(12/obreros)*(8/horas)
End Function

Sub determinaDias(ByVal obreros As Integer,


ByVal horas As Integer)
Días = 25*(12/obreros)*(8/horas)
End Sub

Problema 2:
Una casa de cambio en el centro de la ciudad necesita conocer el monto total en euros
a par r de tres can dades de dinero: soles, dólares y marcos. La casa considera los
siguientes pos de cambio:

1 dólar = 3.51 soles


1 dólar = 1.09 euros
1 dólar = 2.12 marcos

Análisis del problema:

Entrada Soles, dólares, marcos


Proceso Euros = (Soles / 3.51+dólares+ marcos / 2.12) * 1.09
Salida Euros

Pseudocódigo:

Inicio
Leer soles, dólares, marcos
euros = (soles/3.51 + dólares + marcos/2.12) * 1.09
Escribir euros
Fin

44
Se
sió
3
n
Fundamentos de programación

El código en VBA se puede representar en una función o procedimiento de la siguiente


manera:
Function determinaEuros(ByVal soles As Currency,
ByVal dolares As Currency,
ByVal marcos As Currency) As Currency
determinaEuros = (soles/3.51 + dólares + marcos/2.12) * 1.09
End Function

Sub determinaEuros(ByVal soles As Currency,


ByVal dolares As Currency,
ByVal marcos As Currency)
Euros = (soles/3.51 + dólares + marcos/2.12) * 1.09
End Sub

Problema 3:
Implemente una aplicación que permita leer una temperatura en grados cen grados
(ºC) y la convierta a sus equivalentes en grados Fahrenheit (ºF), grados Kelvin (K) y grados
Rankine(R). Use las siguientes fórmulas:

F = 9C/5 + 32
K = R – 187
R = C + 460

Análisis del problema:

Entrada Cen grados


Proceso Fahrenheit = (9 * Cen grados) / 5 +32
Rankine = Cen grados + 460
Kelvin = Rankine – 187
Salida Fahrenheit, Kelvin, Rankine

Pseudocódigo:

Inicio
Leer centígrados
Fahrenheit = (9 * Centigrados) / 5 +32
rankine = Centigrados + 460
kelvin = Rankine -187
Escribir Fahrenheit, rankine, kelvin
Fin

45
Macros - Aplicaciones VBA con Excel

El código en VBA se puede representar en un procedimiento de la siguiente manera:

Sub calculaGrados(ByVal centígrados As Double)


fahrenheit = (9 * Centígrados) / 5 +32
rankine = Centigrados + 460
kelvin = Rankine -187
End Sub

3.1.4 Fase 4: Ejecución del programa en VBA


En esta fase integraremos el código VBA con la hoja de Excel.

Problema 1:
En una empresa inmobiliaria necesitan tener el control del empo que se demoran en
realizar una obra. Si doce obreros, trabajando 8 horas diarias, terminan un proyecto
en 25 días, ¿cuánto tardarán en hacer ese mismo proyecto N obreros trabajando T
horas diarias?

Pseudocódigo:

Inicio
Leer obreros, horas
Días = 25 * (12/obreros) * (8/horas)
Escribir Días
Fin

Función en VBA:

Function determinaDias(ByVal obreros As Integer,


ByVal horas As Integer) As Integer
determinaDias = 25*(12/obreros)*(8/horas)
End Function

En Excel podemos contar con el siguiente entorno, no se olvide que la función debe
ser implementada en un módulo:

Fig. 3.1 Entorno de la hoja de Excel

46
Se
sió
3
n
Fundamentos de programación

Problema 2:
Una casa de cambio en el centro de la ciudad necesita conocer el monto total en euros
a par r de tres can dades de dinero: soles, dólares y marcos. La casa considera los
siguientes pos de cambio:

1 dólar = 3.51 soles


1 dólar = 1.09 euros
1 dólar = 2.12 marcos

Análisis del problema:

Entrada Soles, dólares, marcos


Proceso Euros = (Soles / 3.51+dólares+ marcos / 2.12) * 1.09
Salida Euros

Pseudocódigo:

Inicio
Leer soles, dólares, marcos
euros = (soles/3.51 + dólares + marcos/2.12) * 1.09
Escribir euros
Fin

El código en VBA se puede representar en una función o procedimiento de la siguiente


manera:

Function determinaEuros(ByVal soles As Currency,


ByVal dolares As Currency,
ByVal marcos As Currency) As Currency
determinaEuros = (soles/3.51 + dólares + marcos/2.12) * 1.09
End Function

En Excel podemos contar con el siguiente entorno, no se olvide que la función debe ser
implementada en un módulo:

Fig. 3.2 Entorno de la hoja de Excel

47
Macros - Aplicaciones VBA con Excel

3.2 Elementos de un programa VBA


Una aplicación VBA cuenta con muchos elementos los cuales veremos a con nuación:

Elementos Descripción
Iden ficador Es el nombre que se le da a todos los
elementos que componen el modelo
de objetos de VBA, por ejemplo:

Válidos:
• nota1
• aPaterno
• a_paterno
• fechaNac

No válidos:

• nota 1
• apellido paterno
• a@paterno
• fecha nacimiento
Comentario Un comentario permite definir un
mensaje simple dentro del código de
programación, los símbolos a usar son:

' comilla simple o también


REM comentario de una línea

3.3 Tipos de datos


Un po de datos define el po de valor que se almacenará en una determinada variable.
Los pos de datos se agrupan en enteros, reales, caracteres, cadenas y lógicos.

3.3.1 Enteros

Tipo de datos Capacidad Símbolo


Byte 0.255

Integer -32768 a +32767 %

-2.147.483.648 a
Long !
+2.147.483.647

48
Se
sió
3
n
Fundamentos de programación

3.3.2 Reales

Tipo de datos Capacidad Símbolo


+1,401298E-45 a
Single &
+3.402823E38
+4,94065645841247E-324 a
Double #
+1.79769313486232E308
-7,9228162514264337593543950335
Decimal
a 7,9228162514264337593543950335

Adicionalmente, veremos el siguiente po:

-922.337.000.000.000 a
Currency @
+922.337.000.000.000

3.3.3 Caracteres y cadenas

Tipo de datos Capacidad Símbolo


Tiene un máximo de 2 millones de carac-
String $
teres.

3.3.4 Lógicos

Tipo de datos Capacidad Símbolo


Boolean True/False No cuenta

3.3.5 Fechas

Tipo de datos Capacidad Símbolo


1 de enero de 100 a
Date No cuenta
31 de diciembre de 9999

3.3.6 Variante

Tipo de datos Capacidad Símbolo


Variant - No cuenta

49
Macros - Aplicaciones VBA con Excel

3.4 Variables
Una variable representa un espacio de la memoria que puede ser ocupado por cualquier
valor. Su formato de declaración en VBA es:

Dim nombre_variable As tipoDatos

Donde:
• Dim: Es la palabra reservada que indica el inicio de la declaración de una o más variables;
por línea de declaración solo puede haber un DIM.
• Variable: Es el nombre que el programador asignara a la variable.
• As poDatos: Es el po de datos asignado a la variable los cuales pueden ser Integer,
Double, Currency, etc.

3.5 Operadores
Los operadores son elementos que pueden ser usados en una expresión que especifican
un cálculo, así como una expresión matemá ca, financiera, etc.

3.5.1 Asignación
Un operador de asignación permita asignar un valor a una variable. Su formato es:

Variable = valor

Veamos algunas asignaciones:

• Asignar la condición «Desaprobado» a un alumno.

Dim condicion As String


condicion = "Desaprobado"

• Determinar el 7.52% de descuento al pago de un empleado y asignarlo a una variable.

Dim pago As Currency


pago = 2500
Dim descuento As Currency
descuento = pago * 7.52/100

50
Se
sió
3
n
Fundamentos de programación

3.5.2 Aritméticos
Son operadores usados en expresiones aritmé cas:

Operadores Descripción Ejemplo


+ Suma o adición. A+B
- Resta o sustracción. A-B
* Mul plicación o producto. A*B
/ División real. A/B
\ División entera. A\B
^ Exponenciación o potencia. A^B
MOD Resto de la división. A MOD B

3.5.3 Relacionales
Son operadores que permiten comparar dos valores, es a par r de aquí que podemos
obtener un resultado verdadero o falso según la condición.

Operadores Descripción Ejemplo


= Igualdad. A=B
> Mayor que. A>B
< Menor que. A<B
>= Mayor o igual que. A>=B
<= Menor o igual que. A<=B
<> Diferente o desigual. A<>B

3.5.4 Lógicos
Son operadores que permiten unir dos o más expresiones relacionales. Podemos
dis nguir los siguientes operadores:

Operadores Descripción Ejemplo


AND Y lógica A>B AND B>C
OR O lógica A>B OR B>C
NOT Negación NOT A>B AND B>C

51
Macros - Aplicaciones VBA con Excel

3.5.5 Orden de prioridad


La prioridad es determinar qué expresión se operará primero en una sentencia VBA.

Categoría Operadores Descripción


() Paréntesis
^ Exponenciación
+- Iden dad, negación de un número
Operadores */ Mul plicación, división
aritmé cos \ División entera
MOD Resto de la división
+- Suma, resta
& Concatenación
= Igualdad
Operadores de <> Diferente
comparación >=, <= Mayor o igual, menor o igual
>, < Mayor, menor
NOT Negación
Operado-
AND Y lógica
res lógicos
OR O lógica

3.6 Conversiones de tipo


Las conversiones en VBA permiten enviar un valor adecuado a una variable declarada.
Veamos las principales funciones de conversión para el lenguaje VBA:

Función Tipo Descripción

CBool Boolean Convierte cualquier po de datos al po Boolean.

CByte Byte Convierte cualquier po de datos al po Byte.

CCur Currency Convierte cualquier po de datos al po Currency.

CDate Date Convierte cualquier po de datos al po Date.

CDbl Double Convierte cualquier po de datos al po Double.

CDec Decimal Convierte cualquier po de datos al po Decimal.

CInt Integer Convierte cualquier po de datos al po Integer.

CLng Long Convierte cualquier po de datos al po Long.

CSng Single Convierte cualquier po de datos al po Single.

CStr String Convierte cualquier po de datos al po String.

52
Se
sió
3
n
Fundamentos de programación

3.7 Mensajes en VBA


Es una ventana informa va al usuario, desde la cual podemos determinar una u otra
opción dependiendo del botón seleccionado:

Título

Ícono Mensaje

Botón

Fig. 3.3 Cuadro de dialogo de mensaje

Formato:

MsgBox "Mensaje", Botones, "Titulo"


Variable = MsgBox("Mensaje", Botones+Icono, "Titulo")

Listado de botones que se pueden implementar en un mensaje:

Constante Valor Descripción

Muestra el botón Aceptar, considere también


vbOkOnly 0 que es tomado como un valor por defecto cuando
no se especifican los botones en un mensaje.

vbOkCancel 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.

vbCri cal 16 Muestra el ícono CríƟco.

vbQues on 32 Muestra el ícono de consulta de Advertencia.

vbExclama on 48 Muestra el ícono de mensaje de Advertencia.

vbInforma on 64 Muestra el ícono de mensaje de Información.

53
Macros - Aplicaciones VBA con Excel

Los valores devueltos por los botones son:

Constante Valor obtenido Descripción


VbOk 1 Ocurre al hacer clic en el botón Aceptar.
VbCancel 2 Ocurre al hacer clic en el botón Cancelar.
VbAbort 3 Ocurre al hacer clic en el botón Anular.
VbRetry 4 Ocurre al hacer clic en el botón Reintentar.
VbIgnore 5 Ocurre al hacer clic en el botón OmiƟr.
VbYes 6 Ocurre al hacer clic en el botón Sí.
VbNo 7 Ocurre al hacer clic en el botón No.

3.8 Ingreso de valor con la función InputBox


Es también conocido como cuadro de entrada, ene la misión de solicitar al usuario
un determinado valor, inicialmente el valor será capturado como cadena de texto. Su
formato es:

Variable = InputBox("Mensaje", "Titulo", Defecto,


PosicionX, PosicionY)

Por ejemplo, podemos ingresar un año de nacimiento de una persona de la siguiente


manera:

Dim año As Integer


año=InputBox("Ingrese año:")

3.9 Funciones definidas por el usuario


Una función se define como una porción de código que permite agrupar un conjunto de
sentencias y que a su vez tengan un obje vo específico. Podemos dis nguir dos pos de
funciones:

3.9.1 Función sin parámetros


Este po de función no cuenta con parámetros de entrada, podría ser usado para
capturar algún valor o para devolver un valor fijo. Su formato es:

FUNCTION NOMBRE() AS TIPO


SENTENCIAS
NOMBRE=VALOR DE SALIDA
END FUNCTION

54
Se
sió
3
n
Fundamentos de programación

Ejemplos:

• Función que permita devolver la fecha actual.

Function devuelveFecha() As Date


devuelveFecha = Now
End Function

• Función que permita devolver el valor de Pi.

Function devuelvePI() As Double


devuelvePI = 3.1416
End Function

3.9.2 Función con parámetros


Este po de función cuenta con parámetros de entrada, que pueden ser considerados
como valores de entrada de la función. Su formato es:

FUNCTION NOMBRE(PARAMETROS) AS TIPO


SENTENCIAS
NOMBRE=VALOR DE SALIDA
END FUNCTION

Ejemplos:

• Función que permita calcular el descuento de 10% sobre un monto.

Function calculaDescuento(ByVal monto As Currency) As Currency


Dim descuento As Double
descuento = 0.1 * monto
calculaDescuento = descuento
End Function

• Función que permita devolver el promedio de dos números enteros.

Function calculaPromedio(ByVal n1 As Integer,


ByVal n2 As Integer) As Double
Dim promedio As Double
promedio = (n1+n2)/2
calculaPromedio = promedio
End Function

55
Macros - Aplicaciones VBA con Excel

3.10 Procedimientos
Los procedimientos son bloques de código que pueden recibir datos por medio de
parámetros o a través de variables pero que no devuelven ningún resultado a quien los
invoque. Su formato es:

• Sin parámetros:

SUB NOMBRE()
SENTENCIAS
END SUB

• Con parámetros:

SUB NOMBRE(PARAMETROS)
SENTENCIAS
END SUB

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

» Caso desarrollado: Compra de productos


Una enda comercial vende un producto cuyo costo unitario es $20.00. Como oferta,
la enda ofrece un descuento fijo del 10% del importe de compra. Adicionalmente la
enda obsequia una agenda por cada docena de productos adquiridos. Implemente
una aplicación en VBA usando las funciones correctas para determinar el importe de la
compra, el importe del descuento y el importe a pagar por la compra de cierta can dad
de unidades del producto. Debe considerar los siguientes aspectos:

56
Se
sió
3
n
Fundamentos de programación

• Implemente en Excel el siguiente entorno:

Fig. 3.4 Entorno de compra de productos en Excel

• Implemente funciones necesarias para la aplicación.


• Declare todas las variables usadas en la aplicación.
• Declare la constante precio del producto con el valor 20.

Pasos:

1. Diseñe el modelo de la aplicación.


2. Agregue un módulo al proyecto.
3. Implemente las siguientes funciones dentro del módulo:

'Función que captura el costo desde la


'hoja de Excel
Function capturaCosto() As Currency
capturaCosto = CCur(Range("F6").Value)
End Function

'Función que captura la cantidad ingresada desde la


'hoja de Excel
Function capturaCantidad() As Integer
capturaCantidad = CInt(Range("D8").Value)
End Function

'Función que calcula el importe de compra


Function calculaImporteCompra(ByVal costo As Currency,
ByVal cantidad As Integer) As Currency
Dim iCompra As Currency
iCompra = costo * cantidad
calculaImporteCompra = iCompra
End Function

'Función que calcula el importe de descuento


Function calculaImporteDescuento(ByVal iCompra As Currency) As Currency
Dim iDescuento As Currency
iDescuento = iCompra * 0.1
calculaImporteDescuento = iDescuento
End Function

57
Macros - Aplicaciones VBA con Excel

'Función que calcula el importe neto a pagar


Function calculaImportePagar(ByVal iCompra As Currency,
ByVal iDescuento As Currency) As Currency
calculaImportePagar = iCompra - iDescuento
End Function

'Función que determina la cantidad de agendas


Function determinaRegalo(ByVal cantidad As Integer) As String
determinaRegalo = cantidad \ 12
End Function

4. Implemente los siguientes procedimientos dentro del módulo.

'Procedimiento que invoca a todas las funciones


'para la solución al problema
Sub calculaImportes()
Dim costo As Currency, cantidad As Integer
costo = capturaCosto
cantidad = capturaCantidad

Dim iCompra As Currency, iDescuento As Currency


Dim iNeto As Currency
iCompra = calculaImporteCompra(costo, cantidad)
iDescuento = calculaImporteDescuento(iCompra)
iNeto = calculaImportePagar(iCompra, iDescuento)

Dim agendas As Integer


agendas = determinaRegalo(cantidad)

Range("D10").Value = iCompra
Range("D11").Value = iDescuento
Range("D12").Value = iNeto
Range("D13").Value = agendas
Range("D8").Select
End Sub

Sub limpiarCeldas()
Range("D8").ClearContents
Range("D10").ClearContents
Range("D11").ClearContents
Range("D12").ClearContents
Range("D13").ClearContents
Range("D8").Select
End Sub

5. Agregue un botón desde la ficha Desarrollador el cual tenga por tulo «CALCULA
IMPORTES» y que se encuentre asociado al procedimiento calculaImportes.
6. Agregue un botón desde la ficha Desarrollador el cual tenga por tulo «LIMPIAR
CELDAS» y que se encuentre asociado al procedimiento limpiarCeldas.
7. Pruebe la aplicación ingresando una can dad comprada en la celda D8, luego haga
clic en el botón CALCULA IMPORTES.

58
UserForm y objetos Sesión

visuales
4
4.1 UserForm
Proporciona un mecanismo para implementar aplicaciones VBA de forma gráfica. Para
integrar un UserForm con la hoja de Excel debemos seguir los siguientes pasos:

• Coloque inserte un UserForm al libro de trabajo.


• Coloque agregue los controles visuales al UserForm.
• Mediante las propiedades, configure los controles y el mismo formulario de tal manera
que pueda ser legible para el usuario.
• Agregue funciones o procedimientos a los controles.
• Enlace el formulario en la hoja de Excel mediante un botón.

4.2 Administración de UserForm en VBA


Veremos algunas funcionalidades que presentan los UserForm.

Agregar un UserForm Desde el menú Insertar seleccionar la opción UserForm.

Fig. 4.1 Menú Insertar

Desde el panel Explorador de Proyectos, haga


clic derecho, seleccionar Insertar > UserForm

Fig. 4.2 Agregando un UserForm

59
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

Modificar el nombre • Seleccione un UserForm desde la ventana Exploradora de


del UserForm Proyecto.
• Ubique (Name) en la propiedades y modifique su nombre,
se recomienda que dicho nombre inicie con la palabra
frm, por ejemplo, frmPago o frmVenta.
Eliminar un UserForm • Seleccione un UserForm desde la ventana Exploradora de
Proyecto.
• Haga clic derecho sobre dicho UserForm y seleccione
la opción Quitar, normalmente está acompañado del
nombre que se le asignó al UserForm.
• A la pregunta: «¿Desea exportar frm antes de quitarlo?»,
seleccione No para eliminarlo defini vamente.

Fig. 4.3 Exportar un UserForm antes de eliminarlo


Ejecutar un UserForm Presione <F5> o desde el menú Ejecutar > seleccione
Ejecutar o también podríamos ejecutar con el botón que
se encuentra en la barra de herramientas estándardaar del
entorno VBA.

4.3 Asociar el formulario a la hoja de Excel


La asociación entre un UserForm y la hoja de Excel se pueden realizar por diferentes
medios los cuales nombraremos a con nuación:

• Por medio de un botón


Desde la ficha Desarrollador, seleccione la opción Botón de los Controles de formulario
que se encuentra dentro de Insertar y arrastre formando un cuadro en la hoja de Excel.
Luego, se mostrará la siguiente ventana, desde la cual debe seleccionar el botón Nuevo:

Fig. 4.4 Ventana de asignación de Macro


60
Se
sió
4
n
UserForm y objetos visuales

Finalmente, debemos hacer la invocación del UserForm por medio de código VBA, el
cual se muestra en la siguiente imagen:

Fig. 4.5 Código implementado al botón

.Show es un método que permite mostrar un objeto visual del po UserForm.


Finalmente, no se olvide de modificar el texto que se visualiza en el botón pues,
inicialmente se muestra el texto «Botón 1»; para modificar haga clic derecho sobre el
botón y seleccione Modificar texto, quedando de la siguiente manera:

Fig. 4.6 Botón que invoca al UserForm frmVenta

• Por medio de una imagen


Agregue una imagen a la hoja de Excel, luego haga clic derecho sobre dicha imagen y
seleccione Agregar macro… y los siguientes pasos son los mismos aplicados en «Por
medio de un botón».

• Por medio de una forma


Agregue una forma a la hoja de Excel, luego haga clic derecho sobre dicha forma y
seleccione Agregar macro… y los siguientes pasos son los mismos aplicados en «Por
medio de un botón».

4.4 Nomenclatura para los nombres de los objetos

Clase Prefijo Ejemplo


UserForm frm frmVenta
E queta (Label) lbl lblTotal
Cuadro de Texto (TextBox) txt txtFecha
Botón de Comando btn btnCalcular
(CommandBu on) cmd cmCalcular
Cuadro de Lista (ListBox) lst lstPaises
Cuadro combinado (ComboBox) cbo cboProductos
Casilla de Verificación (CheckBox) chk chkEstado
Botón de opción (Op onBu on) opt optCasado
Imagen (Image) img imgFoto
Marco (Frame) fra fraEstadis cas

61
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

4.5 Principales controles visuales


Haremos una lista de los controles y sus principales propiedades:

Fig. 4.7 Controles visuales


Fuente: <h p://www.globaliconnect.com>

4.5.1 Control UserForm


Es el formulario donde colocaremos todos los controles visuales de VBA y en el que
implementaremos las aplicaciones. Cuenta con las siguientes propiedades:

• (Name): Es el nombre que se le asignará al objeto de po Form.


• Cap on: Permite definir el tulo del control UserForm, desde aquí podremos
iden ficar qué po de aplicación estamos desarrollando.
• Picture: Permite definir una imagen de po JPG o PNG para el fondo del UserForm.
• PictureSizeMode: Propiedad que determina la forma en que la imagen se adaptará
al UserForm.

4.5.2 Control Label


Es también llamada control de e queta el cual permite mostrar textos está cos dentro
de UserForm. Cuenta con las siguientes propiedades:

• (Name): Es el nombre que se le asignará al objeto de po Label. Según la nomenclatura


de nombres deberá empezar con lbl, por ejemplo, lblTitulo, lblPension, etc.
• AutoSize: Permite ajustar el marco que controla el ancho de las e quetas sobre el
contenido del mismo.
• BorderStyle: Permite definir si se va a visualizar el marco del control 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
permi rá modificar el contenido inicial del control llamado «Label 1».
62
Se
sió
4
n
UserForm y objetos visuales

• Font: Permite modificar la fuente, es lo y tamaño del texto mostrado en el control


Label. Es similar al cambio de fuente realizado en Microso Word.
• ForeColor: Permite asignar de color al texto mostrado en el control Label.

4.5.3 Control TextBox


También llamado «Caja de texto» o «Cuadro de texto», en el cual podemos ingresar o
registrar un valor que será usado en el código VBA. Veamos sus principales propiedades:

• (Name): Es el nombre que se le asignará al control de po TextBox, según la


nomenclatura de nombres debe empezar con txt, por ejemplo, txtCanƟdad.
• MaxLength: Permite definir una longitud de caracteres dentro del control TextBox.
• Text: Permite asignar un valor al control TextBox, normalmente esta propiedad debe
encontrarse vacía, pues el usuario ingresará un valor en empo de ejecución, a menos
que se trate de un valor predeterminado que el usuario podrá modificar.
• TextAlign: Permite alinear el texto contenido en el control TextBox.

4.5.4 Control CommandButton


También llamado «botón de comando» o «simplemente botón», este nos permi rá
accionar algún evento dentro del UserForm. Sus principales propiedades son:

• (Name): Es el nombre que se le asignará al control de po CommandBuƩon, según


la nomenclatura de nombres debe empezar con btn, por ejemplo, btnProcesar,
btnLimpiar o btnSalir.
• BackColor: Permite asignar un color de fondo al botón, esto se podría dar en botones
que enen diferentes prioridades en una aplicación.
• 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: Permite modificar el contenido textual del control botón, es decir, es el tulo
que se mostrará en el botón.
• 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.
• Picture: Permite asignar una imagen de po JPG o GIF al control botón de comando.
La imagen asignada puede tener diferentes posiciones dentro del botón la cual puede
ser modificada con la propiedad PicturePosiƟon.
• PicturePosi on: Permite asignar una posición dentro del marco que presenta el
control botón de comando.

63
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

4.5.5 Control ListBox


Es también llamado cuadro de lista el cual ene como función mostrar una lista de
textos una debajo de otra como un listado. Sus principales propiedades son:

• (Name): Es el nombre que se le asignará al control ListBox, de acuerdo a la


nomenclatura debemos usar la palabra lst, por ejemplo, lstVendedores.
• ColumnCount: Determina la can dad de columnas que puede tener un control
ListBox, el valor predeterminado es uno.
• Mul Select: Define la forma de selección de los elementos contenidos en el control
ListBox.

4.5.6 Control ComboBox


Es también llamado cuadro combinado el cual presenta una lista de opciones
desplegables. Las principales propiedades son:

• (Name): Es el nombre que se le asignará al control ComboBox de acuerdo a la


nomenclatura debemos usar la palabra cbo, por ejemplo, cboProducto.
• DropBu onStyle: Define el es lo de botón para el despliegue de los elementos del
control ComboBox.

4.5.7 Control OptionButton


Es también llamado botón de opción el cual permite asignar opciones predeterminadas
en una aplicación. Sus principales propiedades son:

• (Name): Es el nombre que se le asignará al control OpƟonBuƩon según la nomenclatura


debe iniciar con la palabra opt como, por ejemplo, optCredito u optContado.
• Cap on: Permite definir el tulo que presenta el control OpƟonBuƩon.

4.5.8 Control CheckBox


Es también llamado casilla de verificación o simplemente casilla. Sus principales
propiedades son:

• (Name): Es el nombre que se le asignará al control CheckBox según la nomenclatura


debe iniciar con la palabra chk como, por ejemplo, chkDescuento.
• Cap on: Permite definir el tulo que presenta el control CheckBox.

64
Se
sió
4
n
UserForm y objetos visuales

» Caso desarrollado 1: Control de registro de alumnos


Implemente una aplicación que permita registrar los datos de los alumnos de un
colegio; para lo cual se deberá ingresar los apellidos, nombres, fecha de nacimiento
y dirección domiciliaria, asimismo debemos tener en cuenta los siguientes aspectos:

• Implemente en Excel el siguiente entorno:

Fig. 4.8 Registro de alumnos en Excel

• Implemente el siguiente UserForm:

Fig. 4.9 Userform de registro de alumnos

• El código de alumno debe empezar con la palabra «ALU» seguido de números


consecu vos conforme se registren en la hoja de Excel.
• Implemente un procedimiento para limpiar los controles colocados dentro del
UserForm.
• Implemente una función que permita determinar la úl ma fila registrada en Excel,
esto hará que se pueda agregar usuarios uno debajo de otro como un listado.

65
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

Pasos:

1. Diseñe el modelo de la aplicación tanto en la hoja de Excel como en el UserForm.


2. Asigne las respec vas propiedades a los siguientes controles:

UserForm1 (Name)   frmRegistro


Cap on Registro de alumnos
Label1 Cap on REGISTRO DE ALUMNOS
Label2 Cap on CÓDIGO GENERADO
Label3 (Name)  lblCodigo
Label4 Cap on APELLIDOS
Label5 Cap on NOMBRES
Label6 Cap on FECHA DE NAC.
Label7 Cap on DIRECCION
CommandBu on1 (Name)  btnRegistrar
Cap on REGISTRAR
Default True
Picture Grabar.gif
CommandBu on2 (Name)  btnLimpiar
Cap on LIMPIAR
Picture  limpiar.gif
CommandBu on3 (Name)  btnSalir
Cap on    SALIR
Cancel   True
Picture Salir.gif
TextBox1 (Name) txtApellidos
TextBox2 (Name) txtNombres
TextBox3 (Name) txtFechaNac
MaxLenght 10
TextBox4 (Name) txtDireccion

3. Implemente los siguientes códigos dentro del UserForm:

Private Sub btnLimpiar_Click()


Call limpiaControles
End Sub

Private Sub btnRegistrar_Click()


Dim codigo$, apellido$, nombres$, direccion$
Dim fechaNac As Date

codigo = lblCodigo.Caption
apellidos = txtApellidos.Text
nombres = txtNombres.Text
fechaNac = CDate(txtFechaNac.Text)

66
Se
sió
4
n
UserForm y objetos visuales

direccion = txtDireccion.Text

Cells(uFila, 2).Value = codigo


Cells(uFila, 3).Value = UCase(apellidos) & Space(1)
& UCase(nombres)
Cells(uFila, 4).Value = fechaNac
Cells(uFila, 5).Value = direccion
End Sub
Private Sub btnSalir_Click()
Unload Me
End Sub

Private Sub UserForm_Activate()


lblCodigo.Caption = generaCodigo
End Sub
Function generaCodigo() As String
generaCodigo="ALU" & Format(determinaUltimaFila - 9, "0000")
End Function

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 = ""
txtDireccion.Text = ""
txtFechaNac.Text = ""
txtApellidos.SetFocus
lblCodigo.Caption = generaCodigo
End Sub

4. Agregue un botón desde la ficha Desarrollador, seleccione el botón Nuevo, asigne el


siguiente código:
Sub Botón1_Haga_clic_en()
frmRegistro.Show
End Sub

Luego, cambie el tulo del botón por «REGISTRO DE ALUMNO».

5. Pruebe la aplicación presionando sobre el botón Registro de alumno.

» Caso desarrollado 2: Registro de pago a vendedores


Una empresa requiere tener el control de los pagos que se realiza a sus vendedores
para lo cual se calcula el sueldo bruto, el descuento por EsSalud (seguro de salud), el
descuento por AFP (jubilación) y el sueldo neto del vendedor de acuerdo a los siguientes
criterios:

• El sueldo bruto se calcula mul plicando el número de horas trabajadas por una tarifa
horaria.
• El descuento por EsSalud es igual al 8.5% del sueldo bruto.
• El descuento por AFP es igual al 11.5% del sueldo bruto.
• El sueldo neto es la diferencia entre el sueldo bruto y el descuento total.
67
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

Debe considerar los siguientes aspectos:

• Implemente en Excel el siguiente entorno:

Fig. 4.10 Registro de pago a vendedores en Excel

• Implemente el siguiente UserForm:

Fig. 4.11 Entorno de pago de vendedores

• Implemente un botón de Proceso que permita determinar el resumen de pago


mostrando así el nombre del vendedor, horas trabajadas, tarifa, monto bruto, monto
descuento EsSalud, monto descuento AFP y monto neto.
• Implemente un botón que envíe toda la información resultante a la hoja de Excel,
además de enviar un número correla vo de registro empezando en uno.
• Implemente una función que permita determinar la úl ma fila registrada en Excel.
• Implemente un procedimiento que permita limpiar los controles contenidos en el
UserForm.

68
Se
sió
4
n
UserForm y objetos visuales

Pasos:

1. Diseñe el modelo de la aplicación tanto en la hoja de Excel como en el UserForm.


2. Asigne las respec vas propiedades a los siguientes controles:

UserForm1 (name) frmPago


Cap on Pago de vendedores
Label1 Cap on PAGO DE VENDEDORES
Label2 Cap on VENDEDOR
Label3 Cap on HORAS TRAB.
Label4 Cap on TARIFA
CommandBu on1 (Name)  btnProcesar
Cap on PROCESAR
Default True
CommandBu on2 (Name)  btnExcel
Cap on ENVIAR A EXCEL
CommandBu on3 (Name)  btnLimpiar
Cap on LIMPIAR
CommandBu on3 (Name)  btnSalir
Cap on SALIR
Cancel True
TextBox1 (Name) txtVendedor
TextBox2 (Name) txtHoras
TextBox3 (Name) txtTarifa
ListBox (Name) lstR

3. Implemente los siguientes códigos dentro del UserForm:

Dim vendedor As String, horas As Integer, tarifa As Currency


Dim bruto As Currency, descuentoEsSalud As Currency
Dim descuentoAFP As Currency, neto As Currency

Private Sub btnProcesar_Click()


vendedor = txtVendedor.Text
horas = CInt(txtHoras.Text)
tarifa = CCur(txtTarifa.Text)

bruto = horas * tarifa


descuentoEsSalud = bruto * 8.5 / 100
descuentoAFP = bruto * 11.5 / 100
neto = bruto - (descuentoEsSalud + descuentoAFP)

lstR.AddItem "** RESUMEN DE PAGO **"


lstR.AddItem "VENDEDOR: " & vendedor
lstR.AddItem "HORAS: " & Format(horas, "00")
lstR.AddItem "TARIFA: $ " & Format(tarifa, "00")
lstR.AddItem "------------------------------------------------"

69
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

lstR.AddItem "MONTO BRUTO: $ " & Format(bruto, "0.00")


lstR.AddItem "MONTO DESCUENTO ESSALUD: $ "
& Format(descuentoEsSalud, "0.00")
lstR.AddItem "MONTO DESCUENTO AFP: $ " &
Format(descuentoAFP, "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 = UCase(vendedor)
Sheets(1).Cells(uFila, 4).Value = horas
Sheets(1).Cells(uFila, 5).Value = tarifa
Sheets(1).Cells(uFila, 6).Value = bruto
Sheets(1).Cells(uFila, 7).Value = descuentoEsSalud
Sheets(1).Cells(uFila, 8).Value = descuentoAFP
Sheets(1).Cells(uFila, 9).Value = neto
Call limpiarControles
End Sub

Private Sub btnSalir_Click()


Unload Me
End Sub

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 = ""
txtHoras.Text = ""
txtTarifa.Text = ""
lstR.Clear
txtVendedor.SetFocus
End Sub

70
Se
sió
4
n
UserForm y objetos visuales

» Caso desarrollado 3: Venta de arơculos


Una enda comercial en el centro de la ciudad ha puesto en oferta la venta de todos sus
ar culos de verano ofreciendo un «20% + 20%» de descuento en todos sus ar culos. El
primer 20% se aplica al importe de la compra, mientras que el segundo 20% se aplica
al importe que resulta de restar el importe de la compra menos el primer descuento.
Dada la can dad de unidades adquiridas de un mismo po de ar culo por parte de un
cliente y el precio unitario del producto, diseñe una aplicación en VBA que determine
el importe de la compra, importe de descuento y el importe a pagar.

Debe considerar los siguientes aspectos:

• Implemente en Excel el siguiente entorno:

Fig. 4.12 Registro de venta de productos en Excel

• Implemente el siguiente UserForm:

Fig. 4.13 UserForm de venta de productos

71
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

• Implemente un botón de Proceso que permita determinar el importe de compra


(subtotal), primer descuento (20%), segundo descuento (20%) y el neto a pagar.
• Implemente un botón que envíe toda la información resultante a la hoja de Excel;
dicha información consta del número de venta, fecha de venta, nombre del vendedor,
descripción del producto, precio, can dad, importe de compra, descuento 20% (1),
descuento 20% (2), importe neto a pagar.
• Implemente una función que permita determinar la úl ma fila registrada en Excel.

Pasos:

1. Diseñe el modelo de la aplicación tanto en la hoja de Excel como en el UserForm.


2. Asigne las respec vas propiedades a los siguientes controles:

UserForm1 (name)  frmVenta


Cap on Venta de productos
Label1 Cap on VENTA DE PRODUCTOS
Label2 Cap on DESCRIPCIÓN
Label3 Cap on CANTIDAD
Label4 Cap on PRECIO
Label5 Cap on Subtotal $
Label6 Cap on Primer descuento $
Label7 Cap on Segundo descuento $
Label8 Cap on Neto a pagar $
Label9 (Name) lblSubtotal
Label10 (Name) lblDescuento1
Label11 (Name) lblDescuento2
Label12 (Name) lblNeto
Frame1 Cap on Datos del producto
ComboBox1 (Name) cboDescripcion
CommandBu on1 (Name)  btnProcesar
Cap on PROCESAR
Default True
CommandBu on2 (Name)  btnExcel
Cap on ENVIAR A EXCEL
CommandBu on3 (Name)  btnSalir
Cap on SALIR
Cancel True
TextBox1 (Name) txtCan dad
TextBox2 (Name) txtPrecio
ListBox1 (Name) lstVendedor

72
Se
sió
4
n
UserForm y objetos visuales

3. Implemente los siguientes códigos dentro del UserForm:

Private Sub btnEnviar_Click()


Dim uFila As Integer
uFila = ultimaFila()
Sheets(1).Cells(uFila, 2).Value = uFila - 11
Sheets(1).Cells(uFila, 3).Value = Date
Sheets(1).Cells(uFila, 4).Value =
lstVendedor.List(lstVendedor.ListIndex)
Sheets(1).Cells(uFila, 5).Value = cboDescripcion.Text
Sheets(1).Cells(uFila, 6).Value = txtPrecio.Text
Sheets(1).Cells(uFila, 7).Value = txtCantidad.Text
Sheets(1).Cells(uFila, 8).Value = lblSubtotal.Caption
Sheets(1).Cells(uFila, 9).Value = lblDescuento1.Caption
Sheets(1).Cells(uFila, 10).Value = lblDescuento2.Caption
Sheets(1).Cells(uFila, 11).Value = lblNeto.Caption
End Sub

Private Sub btnProcesar_Click()


Dim cantidad As Integer, precio As Currency
cantidad = CInt(txtCantidad.Text)
precio = CCur(txtPrecio.Text)

Dim iCompra As Currency, descuento1 As Currency


Dim descuento2 As Currency, neto As Currency
iCompra = cantidad * precio
descuento1 = iCompra * 0.2
descuento2 = (iCompra - descuento1) * 0.2
neto = (iCompra - descuento1) - descuento2

lblSubtotal.Caption = Format(iCompra, "0.00")


lblDescuento1.Caption = Format(descuento1, "0.00")
lblDescuento2.Caption = Format(descuento2, "0.00")
lblNeto.Caption = Format(neto, "0.00")

End Sub

Private Sub UserForm_Activate()


Call llenaVendedores
Call llenaProductos
End Sub

'Procedimiento que llena de vendedores el control


'de tipo ComboBox
Sub llenaVendedores()
lstVendedor.AddItem "Fernanda Torres"
lstVendedor.AddItem "Luz Lazaro"
lstVendedor.AddItem "Lucero Mendoza"
End Sub

'Procedimiento que llena de productos el control


'de tipo ComboBox
Sub llenaProductos()
cboDescripcion.Text = "(Seleccione producto)"
cboDescripcion.AddItem "Polo"
cboDescripcion.AddItem "Short"
cboDescripcion.AddItem "Camisa playera"
cboDescripcion.AddItem "Sandalias"

73
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

End Sub

'Función que determina la última posición vacía


Function ultimaFila() As Integer
Dim uFila%
uFila=Sheets(1).Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Row
ultimaFila = uFila
End Function

Private Sub btnSalir_Click()


Unload Me
End Sub

74
Funciones VBA Sesión

5
5.1 Introducción a las funciones
En los capítulos anteriores se implementaron funciones definidas por el usuario, estos
tenían la caracterís ca principal de realizar una tarea específica según el criterio del
programador. 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 funciones de texto, fecha, numéricos, etc.

5.2 Funciones para cadena de caracteres


Estas funciones solo se implementan a variables declaradas del po String, veremos a
con nuación las principales funciones y su uso en una aplicación:

Función Descripción
ASC Devuelve el código ASCII de un determinado carácter.

CHR Devuelve el carácter asociado desde la tabla ASCII.

LCASE Convierte una cadena de caracteres en minúsculas.

UCASE Convierte una cadena de caracteres en mayúsculas.

Determinar el número de caracteres contenido en una


LEN
cadena de caracteres.

Devuelve un número determinado de caracteres del lado


LEFT
izquierdo.
Devuelve un número determinado de caracteres del lado
RIGHT
derecho.
Permite eliminar los espacios en blanco que se encuentren
LTRIM
en el lado izquierdo de una cadena de caracteres.

Permite eliminar los espacios en blanco del lado derecho de


RTRIM
una determinada cadena de caracteres.

Permite eliminar los espacios en blanco de ambos lados de


TRIM
una cadena de caracteres.

Permite añadir una can dad determinada de espacios en


SPACE
blanco dentro de una cadena de caracteres.

75
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

5.3 Funciones numéricas


Estas funciones solo se implementan a variables declaradas del po Integer, Double,
Single o Currency, veremos a con nuación las principales funciones y su uso en una
aplicación:

Función Descripción
Función que permite devolver el valor absoluto de un número
Abs
posi vo o nega vo. Su formato es Abs(Numero).
Función que permite devolver el seno de un número entero o real.
Sin
Su formato es Sin(Numero).
Función que permite devolver el coseno de un número entero o
Cos
real. Su formato es Cos(Numero).
Función que permite devolver la tangente de un número entero o
Tan
real. Su formato es Tan(Numero).
Función que permite devolver la raíz cuadrada de un número
Sqr
entero. Su formato es Sqr(Numero).
Función que permite devolver el valor entero redondeando al
Fix
exceso a un número real. Su formato es Fix(Numero).
Función que permite devolver un valor entero en un valor hexade-
Hex
cimal. Su formato es Hex(Numero).
Función que permite devolver solo la parte entera de una
Int operación, expresión o número. Tenga en cuenta que esta función
no redondea el valor solo captura la parte entera.
Función que permite devolver el logaritmo natural de un número
Log
entero en base e.
Rnd Función que permite devolver un número aleatorio entre 0 y 1.

5.4 Funciones de fecha


Estas funciones solo se implementan a variables declaradas del po Date, veremos a
con nuación las principales funciones y su uso en una aplicación:

Función Descripción
Date Función que permite devolver la fecha actual del sistema.
DateAdd Función que permite devolver una fecha añadiéndole un intervalo
de empo. Estos intervalos se basan en el siguiente 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

76
Se
sió
5
n
Funciones VBA

DateDiff Función que permite devolver la diferencia entre dos fechas lo


cual se puede dar en días, meses o años.
DatePart Función que permite devolver parte de una determinada
fecha. Por ejemplo, si necesitamos el año actual el código sería
DatePart("y", Date).
Year Función que permite devolver el año de una determinada fecha.
Month Función que permite devolver el mes de una determinada fecha.
Day Función que permite devolver el día de una determinada fecha.
Hour Función que permite devolver la hora de un determinado empo.
Now Función que permite devolver la fecha actual del sistema.
Time Función que permite devolver la hora actual del sistema

» Caso desarrollado 1: Registro de personal


Implemente una aplicación que permita registrar los datos del personal de una
empresa; para lo cual se deberá ingresar el apellido paterno, materno, nombres, fecha
de nacimiento y distrito, asimismo debemos tener en cuenta los siguientes aspectos:

• Implemente en Excel el siguiente entorno:

Fig. 5.1 Registro de personal en Excel

• Implemente el siguiente UserForm:

Fig. 5.2 Userform de registro de personal


77
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

• El código del personal está formado por los dos primeros caracteres del apellido
paterno, los dos úl mos caracteres del apellido materno, un guion bajo y la can dad
total de caracteres del apellido paterno expresado en dos cifras, además el código debe
representarse en mayúsculas.
• El correo electrónico del personal está formado por la primera letra de su nombre, las
cuatro primeras letras de su apellido paterno y los caracteres «@miempresa.com.pe»
además de expresarlo en minúsculas.
• Cuando se digite el apellido paterno, materno y nombres estos deberán aceptar solo
letras en mayúsculas además de no permi r el registro de valores numéricos.
• Implemente un procedimiento para limpiar los controles colocados dentro del
UserForm.
• Implemente una función que permita determinar la úl ma fila registrada en Excel, esto
hará que se pueda agregar personal 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 respec vas propiedades a los siguientes controles:

(Name) frmRegistro
UserForm1
Cap on Registro de personal
Label1 Cap on REGISTRO DE PERSONAL
Label2 Cap on PATERNO
Label3 Cap on MATERNO

Label4 Cap on NOMBRES


Label5 Cap on FECHA DE NAC.
Label6 Cap on DISTRITO
(Name) btnRegistrar
CommandBu on1 Cap on REGISTRAR
Default True
(Name) btnLimpiar
CommandBu on2
Cap on LIMPIAR
(Name) btnSalir
CommandBu on3 Cap on SALIR
Cancel True
TextBox1 (Name) txtPaterno
TextBox2 (Name) txtMaterno
TextBox3 (Name) txtNombres
TextBox4 (Name) txtFechaNac
Combobox1 (Name) cboDistrito
ListBox1 (Name) lstR
78
Se
sió
5
n
Funciones VBA

3. Implemente los siguientes códigos dentro del UserForm:

'Declaración de variables globales


Dim codigo As String, correo As String

Private Sub btnRegistrar_Click()


Dim paterno As String, materno As String, nombres As String
Dim fechaNac As Date, distrito As String

paterno = txtPaterno.Text
materno = txtMaterno.Text
nombres = txtNombres.Text
fechaNac = CDate(txtFechaNac.Text)
distrito = cboDistrito.Text

'Generando código del personal


codigo = Left(Trim(paterno), 2) & Right(Trim(materno), 2)
& "_" & Format(Len(paterno), "00")
correo = LCase(Left(nombres, 1) & Left(Trim(paterno), 4))
& "@miempresa.com.pe"

'Enviando a la impresión
Call imprimir(codigo, correo)
End Sub

'Validando solo el ingreso de valores textuales


Private Sub txtMaterno_Change()
Dim Texto As Variant
Dim Caracter As Variant
Dim Largo As String
On Error Resume Next
Texto = txtMaterno.Value
Largo = Len(txtMaterno.Value)
For i = 1 To Largo
Caracter = CInt(Mid(Texto, i, 1))
If Caracter <> "" Then
If Not Application.WorksheetFunction.
IsText(Caracter) Then
txtPaterno.Value = Replace(Texto, Caracter, "")
Else
End If
End If
Next i
On Error GoTo 0
End Sub

'Fuerza a escribir en Mayúsculas


Private Sub txtMaterno_KeyPress()
KeyAscii = Asc(UCase(Chr$(KeyAscii)))
End Sub

'Validando solo el ingreso de valores textuales


Private Sub txtNombres_Change()
Dim Texto As Variant
Dim Caracter As Variant
Dim Largo As String
On Error Resume Next
Texto = txtNombres.Value

79
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

Largo = Len(txtNombres.Value)
For i = 1 To Largo
Caracter = CInt(Mid(Texto, i, 1))
If Caracter <> "" Then
If Not Application.WorksheetFunction
.IsText(Caracter) Then
txtPaterno.Value = Replace(Texto, Caracter, "")
Else
End If
End If
Next i
On Error GoTo 0
End Sub

'Fuerza a escribir en Mayúsculas


Private Sub txtNombres_KeyPress()
KeyAscii = Asc(UCase(Chr$(KeyAscii)))
End Sub

'Validando solo el ingreso de valores textuales


Private Sub txtPaterno_Change()
Dim Texto As Variant
Dim Caracter As Variant
Dim Largo As String
On Error Resume Next
Texto = txtPaterno.Value
Largo = Len(txtPaterno.Value)
For i = 1 To Largo
Caracter = CInt(Mid(Texto, i, 1))
If Caracter <> "" Then
If Not Application.WorksheetFunction
.IsText(Caracter) Then
txtPaterno.Value = Replace(Texto, Caracter, "")
Else
End If
End If
Next i
On Error GoTo 0
End Sub

'Fuerza a escribir en Mayúsculas


Private Sub txtPaterno_KeyPress()
KeyAscii = Asc(UCase(Chr$(KeyAscii)))
End Sub

Private Sub UserForm_Activate()


Call llenaDistritos
End Sub

'Procedimiento que llena los distritos en el control


'de tipo Combobox
Sub llenaDistritos()
cboDistrito.Text = "(Seleccione distrito)"
cboDistrito.AddItem "Miraflores"
cboDistrito.AddItem "San Borja"
cboDistrito.AddItem "Surco"
cboDistrito.AddItem "Surquillo"
cboDistrito.AddItem "Monterrico"

80
Se
sió
5
n
Funciones VBA

cboDistrito.AddItem "San Juan de Lurigancho"


cboDistrito.AddItem "Los Olivos"
cboDistrito.AddItem "Ancon"
End Sub

'Función que devuelve el número de la última fila


Function determinaUltimaFila() As Integer
uFila=Sheets(1).Cells(Rows.Count,2).End(xlUp).Offset(1,0).Row
determinaUltimaFila = uFila
End Function

'Procedimiento que imprime los valores al control


'de tipo ListBox
Sub imprimir(ByVal codigo As String, ByVal correo As String)
lstR.AddItem "** RESUMEN DE REGISTRO **"
lstR.AddItem "CODIGO: " & codigo
lstR.AddItem "CORREO: " & correo
End Sub

Private Sub btnExcel_Click()


Dim uFila As Integer
uFila = determinaUltimaFila

Sheets(1).Cells(uFila, 2).Value = codigo


Sheets(1).Cells(uFila, 3).Value = txtNombres.Text & Space(1)
& txtPaterno.Text & Space(1) & txtMaterno.Text
Sheets(1).Cells(uFila, 4).Value = txtFechaNac.Text
Sheets(1).Cells(uFila, 5).Value = correo
Call limpiarControles
End Sub

Private Sub btnLimpiar_Click()


Call limpiarControles
End Sub

Sub limpiarControles()
txtPaterno.Text = ""
txtMaterno.Text = ""
txtNombres.Text = ""
txtFechaNac.Text = ""
cboDistrito.Text = "(Seleccione distrito)"
txtPaterno.SetFocus
End Sub

Private Sub btnSalir_Click()


Unload Me
End Sub

4. Agregue un botón desde la ficha Desarrollador, seleccione el botón Nuevo y asigne el


siguiente código:

Sub Botón1_Haga_clic_en()
frmRegistro.Show
End Sub

Luego, cambie el tulo de botón por «FORMULARIO DE REGISTRO».

5. Pruebe la aplicación presionando sobre el botón FORMULARIO DE REGISTRO.


81
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

» Caso desarrollado 2: Conversiones de base


Implemente una aplicación que permita ingresar un valor numérico de tal forma que el
usuario pueda seleccionar el sistema de conversión para hexadecimal, decimal, octal y
binario, la aplicación debe conver r de cualquier sistema a su valor decimal, asimismo
debemos tener en cuenta los siguientes aspectos:

• Implemente el siguiente entorno para la hoja de Excel:

Fig. 5.3 Entorno de la hoja de Excel

• Implemente el siguiente UserForm:

Fig. 5.4 Userform del sistema de conversión

• Al iniciar la aplicación, la opción Decimal debe encontrarse ac vada como una opción
predeterminada.
• Al seleccionar una opción del sistema de conversión, se debe limpiar el control
de ingreso de valor, asimismo solo debe permi r el ingreso de valores numéricos
correspondientes a su sistema. Por ejemplo, si el usuario selecciona la opción Binario
la caja de texto, solo permi rá el ingreso de valores entre 1 y 0 bloqueando los
demás caracteres; de la misma forma si se selecciona la opción Hexadecimal, Octal
y Decimal.

82
Se
sió
5
n
Funciones VBA

Pasos:

1. Diseñe el modelo de la aplicación tanto en la hoja de Excel como en el UserForm.


2. Asigne las respec vas propiedades a los siguientes controles:

(Name)  frmConversion
UserForm1
Cap on Funciones matemá cas
Label1 Cap on Sistema de conversión
Label2 Cap on Ingrese valor numérico
Frame1 Cap on Sistema de conversión
Op on1 Cap on Hexadecimal
Op on2 Cap on Decimal
Op on3 Cap on Octal
Op on4 Cap on Binario
(Name)  btnProcesar
CommandBu on1 Cap on PROCESAR
Default True
(Name)  btnLimpiar
CommandBu on2
Cap on LIMPIAR
(Name)  btnSalir
CommandBu on3 Cap on SALIR
Cancel True
TextBox1 (Name) txtValor
ListBox1 (Name) lstR

3. Implemente los siguientes códigos dentro del UserForm:

Private Sub btnProcesar_Click()


On Error GoTo Imprevisto
Dim valor As String
valor = txtValor.Text

Dim base As String


If optBinario.Value = True Then
base = "Binario"
ElseIf optOctal.Value = True Then
base = "Octal"
ElseIf optDecimal.Value = True Then
base = "Decimal"
Else
base = "Hexadecimal"
End If

Dim respuesta As String


respuesta = convierteBase(valor, base)
Call imprimir(valor, base, respuesta)
'Enviando a Excel

83
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

Range("B5").Value = valor
Range("C5").Value = base
Range("E5").Value = respuesta

Exit Sub

Imprevisto:
txtValor.Text = Empty
txtValor.SetFocus
MsgBox "Error en la aplicación"
End Sub

Sub imprimir(ByVal valor As String, ByVal base As String,


ByVal respuesta As String)
lstR.Clear
lstR.AddItem "**CONVERSION A DECIMAL**"
lstR.AddItem "VALOR: " & valor
lstR.AddItem "BASE: " & base
lstR.AddItem "-------------------------------------"
lstR.AddItem "RESPUESTA: " & respuesta
End Sub

Function convierteBase(ByVal valor As String,


ByVal base As String) As Double
Select Case base
Case "Binario"
convierteBase = binario_decimal(valor)
Case "Octal"
convierteBase = octal_decimal(valor)
Case "Hexadecimal"
convierteBase = hexadecimal_decimal(valor)
Case "Decimal"
convierteBase = valor
End Select
End Function

Public Function octal_decimal(ByVal valor As String) As Long


Dim n As Long, i As Integer
For i = 1 To Len(valor)
n = n + (Mid(valor, Len(valor) - i + 1, 1) * (8 ^ (i - 1)))
Next
octal_decimal = n
End Function

Public Function binario_decimal(ByVal valor As String) As Long


Dim n As Long, i As Integer
For i = 1 To Len(valor)
n = n + (Mid(valor, Len(valor) - i + 1, 1) * (2 ^ (i - 1)))
Next
binario_decimal = n
End Function

Function hexadecimal_decimal(valor As Variant) As Variant


hexadecimal_decimal = ""
On Error Resume Next
hexadecimal_decimal = CLng("&H" & valor)
End Function

Private Sub btnSalir_Click()

84
Se
sió
5
n
Funciones VBA

Unload Me
End Sub

Private Sub optBinario_Click()


txtValor.Text = Empty
txtValor.SetFocus
End Sub

Private Sub optDecimal_Click()


txtValor.Text = Empty
txtValor.SetFocus
End Sub

Private Sub optHexadecimal_Click()


txtValor.Text = Empty
txtValor.SetFocus
End Sub

Private Sub optOctal_Click()


txtValor.Text = Empty
txtValor.SetFocus
End Sub

Private Sub txtValor_Change()


Dim Texto As Variant
Dim Caracter As Variant
Dim Largo As Integer

If optBinario.Value = True Then


On Error Resume Next
Texto = txtValor.Value
Largo = Len(txtValor.Value)
For i = 1 To Largo
Caracter = Mid(Texto, i, 1)
If Caracter <> "" Then
If Caracter < Chr(48) Or Caracter > Chr(49) Then
txtValor.Value = Replace(Texto, Caracter, "")
Else
End If
End If
Next i
On Error GoTo 0
Caracter = 0
Caracter1 = 0
ElseIf optDecimal.Value = True Then
On Error Resume Next
Texto = txtValor.Value
Largo = Len(txtValor.Value)
For i = 1 To Largo
Caracter = Mid(Texto, i, 1)
If Caracter <> "" Then
If Caracter < Chr(48) Or Caracter > Chr(57) Then
txtValor.Value = Replace(Texto, Caracter, "")
Else
End If
End If
Next i
On Error GoTo 0
Caracter = 0

85
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

Caracter1 = 0
ElseIf optOctal.Value = True Then
On Error Resume Next
Texto = txtValor.Value
Largo = Len(txtValor.Value)
For i = 1 To Largo
Caracter = Mid(Texto, i, 1)
If Caracter <> "" Then
If Caracter < Chr(48) Or Caracter > Chr(55) Then
txtValor.Value = Replace(Texto, Caracter, "")
Else
End If
End If
Next i
On Error GoTo 0
Caracter = 0
Caracter1 = 0
ElseIf optHexadecimal.Value = True Then
On Error Resume Next
Texto = txtValor.Value
Largo = Len(txtValor.Value)
For i = 1 To Largo
Caracter = Mid(Texto, i, 1)
If Caracter <> "" Then
If (Caracter >= Chr(48) And Caracter <= Chr(57)) Or
(Caracter >= Chr(65) And Caracter <= Chr(69)) Then
Else
txtValor.Value = Replace(Texto, Caracter, "")
End If
End If
Next i
On Error GoTo 0
Caracter = 0
Caracter1 = 0
End If
End Sub

'Convierte a mayúsculas los caracteres en letras


Private Sub txtValor_KeyPress()
KeyAscii = Asc(UCase(Chr$(KeyAscii)))
End Sub

Private Sub UserForm_Activate()


optDecimal.Value = True
End Sub

4. Agregar un botón desde la ficha Desarrollador, seleccione el botón Nuevo, asigne el


siguiente código:

Sub Botón1_Haga_clic_en()
frmConversion.Show
End Sub

Luego, cambie el tulo de botón por «FORMULARIO DE CONVERSIÓN».

5. Pruebe la aplicación presionando sobre el botón FORMULARIO DE CONVERSIÓN.


86
Se
sió
5
n
Funciones VBA

» Caso desarrollado 3: Distribución de fechas


Implemente una aplicación que permita distribuir las fechas en la cual se dictará un
determinado curso de extensión, para lo cual deberá seleccionar un curso y registrar el
número de sesiones programadas para el curso; asimismo, debemos tener en cuenta
los siguientes aspectos:

• Implemente el siguiente entorno para la hoja de Excel:

Fig. 5.5 Entorno de la hoja de Excel

• Implemente el siguiente UserForm:

Fig. 5.6 Userform de la distribución de fechas

• Al iniciar la aplicación los cursos deberán encontrarse precargados en el control de


po Combobox.
• Las sesiones deberán seleccionarse por medio de botones de opción.
• De acuerdo a la can dad de sesiones, la aplicación deberá mostrar las fechas de las
sesiones semanalmente.

87
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

Pasos:

1. Diseñe el modelo de la aplicación tanto en la hoja de Excel como en el UserForm.


2. Asigne las respec vas propiedades a los siguientes controles:

(Name)   frmGeneraFechas
UserForm1
Cap on Funciones de fecha

Label1 Cap on DISTRIBUCIÓN DE FECHAS

Label2 Cap on SELECCIONE CURSO

Frame1 Cap on Sesiones

(Name)   opt3
Op on1
Cap on 3

(Name)  opt6
Op on2
Cap on 6

(Name)   opt9
Op on3
Cap on 9

(Name)   btnMostrar
CommandBu on1 Cap on MOSTRAR FECHAS
Default True

(Name)  btnLimpiar
CommandBu on2
Cap on LIMPIAR

(Name)  btnExcel
CommandBu on3
Cap on ENVIAR A EXCEL

Combobox1 (Name) cboCurso

ListBox1 (Name) lstR

3. Implemente los siguientes códigos dentro del UserForm:

Dim numSesion As Integer

Private Sub btnMostrar_Click()


Dim curso As String
curso = cboCurso.Text

If opt3.Value = True Then numSesion = 3


If opt6.Value = True Then numSesion = 6
If opt9.Value = True Then numSesion = 9

Call imprimir(curso, numSesion)


End Sub

88
Se
sió
5
n
Funciones VBA

Private Sub btnExcel_Click()


Range("C5").Value = cboCurso.Text
Range("C6").Value = Date

Select Case numSesion


Case 3:
Range("B9:C17").ClearContents
Range("B9").Value = 1
Range("B10").Value = 2
Range("B11").Value = 3

Range("C9").Value = DateAdd("w", 1, Date)


Range("C10").Value = DateAdd("w", 2, Date)
Range("C11").Value = DateAdd("w", 3, Date)
Case 6:
Range("B9:C17").ClearContents
Range("B9").Value = 1
Range("B10").Value = 2
Range("B11").Value = 3
Range("B12").Value = 4
Range("B13").Value = 5
Range("B14").Value = 6

Range("C9").Value = DateAdd("w", 1, Date)


Range("C10").Value = DateAdd("w", 2, Date)
Range("C11").Value = DateAdd("w", 3, Date)
Range("C12").Value = DateAdd("w", 4, Date)
Range("C13").Value = DateAdd("w", 5, Date)
Range("C14").Value = DateAdd("w", 6, Date)

Case 9:
Range("B9:C17").ClearContents
Range("B9").Value = 1
Range("B10").Value = 2
Range("B11").Value = 3
Range("B12").Value = 4
Range("B13").Value = 5
Range("B14").Value = 6
Range("B15").Value = 7
Range("B16").Value = 8
Range("B17").Value = 9

Range("C9").Value = DateAdd("w", 1, Date)


Range("C10").Value = DateAdd("w", 2, Date)
Range("C11").Value = DateAdd("w", 3, Date)
Range("C12").Value = DateAdd("w", 4, Date)
Range("C13").Value = DateAdd("w", 5, Date)
Range("C14").Value = DateAdd("w", 6, Date)
Range("C15").Value = DateAdd("w", 7, Date)
Range("C16").Value = DateAdd("w", 8, Date)
Range("C17").Value = DateAdd("w", 9, Date)
End Select
End Sub

Sub imprimir(ByVal curso As String, ByVal numSesion As Integer)


lstR.Clear
lstR.AddItem "**RESUMEN DE FECHAS**"

89
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

lstR.AddItem "CURSO: " & curso


lstR.AddItem "NÚMERO DE SESIONES: " & numSesion
lstR.AddItem "------------------------------------------------------"
Select Case numSesion
Case 3:
lstR.AddItem "SESION 1: " & DateAdd("ww", 1, Date)
lstR.AddItem "SESION 2: " & DateAdd("ww", 2, Date)
lstR.AddItem "SESION 3: " & DateAdd("ww", 3, Date)
Case 6:
lstR.AddItem "SESION 1: " & DateAdd("w", 1, Date)
lstR.AddItem "SESION 2: " & DateAdd("w", 2, Date)
lstR.AddItem "SESION 3: " & DateAdd("w", 3, Date)
lstR.AddItem "SESION 4: " & DateAdd("w", 4, Date)
lstR.AddItem "SESION 5: " & DateAdd("w", 5, Date)
lstR.AddItem "SESION 6: " & DateAdd("w", 6, Date)
Case 9:
lstR.AddItem "SESION 1: " & DateAdd("w", 1, Date)
lstR.AddItem "SESION 2: " & DateAdd("w", 2, Date)
lstR.AddItem "SESION 3: " & DateAdd("w", 3, Date)
lstR.AddItem "SESION 4: " & DateAdd("w", 4, Date)
lstR.AddItem "SESION 5: " & DateAdd("w", 5, Date)
lstR.AddItem "SESION 6: " & DateAdd("w", 6, Date)
lstR.AddItem "SESION 7: " & DateAdd("w", 7, Date)
lstR.AddItem "SESION 8: " & DateAdd("w", 8, Date)
lstR.AddItem "SESION 9: " & DateAdd("w", 9, Date)
End Select
End Sub

Private Sub UserForm_Activate()


opt3.Value = True
Call llenaCursos
End Sub

Private Sub btnLimpiar_Click()


Call limpiar
End Sub

Sub limpiar()
cboCurso.Text = "(Seleccione curso)"
cboCurso.SetFocus
End Sub

Sub llenaCursos()
cboCurso.AddItem "Visual Basic"
cboCurso.AddItem "Java"
cboCurso.AddItem "VBA"
cboCurso.AddItem "PHP"
cboCurso.AddItem "Power Builder"
End Sub

90
Se
sió
5
n
Funciones VBA

4. Agregar un botón desde la ficha Desarrollador, seleccione el botón Nuevo y asigne


el siguiente código:

Sub Botón1_Haga_clic_en()
frmGeneraFechas.Show
End Sub

Luego, cambie el tulo del botón por «FORMULARIO».

5. Pruebe la aplicación presionando sobre el botón FORMULARIO.

91
Estructuras Sesión

condicionales
6
6.1 Introducción
La estructura condicional permite cambiar el sen do de la programación, es decir, la
programación secuencial tomará caminos dis ntos según la condición que el desarrollador
implemente.

Existen diferentes estructuras condicionales para VBA los cuales veremos en este capítulo,
esto permi rá al desarrollador tener múl ples opciones para el uso de esta estructura,
esto mayormente dependerá de la situación que se presente en el problema.

6.2 Operadores usados en la estructura condicional


Operadores relacionales:
Permiten comparar dos valores del mismo po y devolver True o False en cada
comparación.

Operador Descripción

= Igualdad, permite comparar dos valores del mismo po.

> Mayor que, determina si un valor es mayor a otro.

>= Mayor o igual que, determina si un valor es mayor o igual a otro.

< Menor que, determina si un valor es menor a otro.

<= Menor o igual que, determina si un valor es menor o igual a otro.

Diferente, determina si un valor es diferente a otro también


<>
llamado «No es igual».

Operadores lógicos:
Permiten unir dos o más expresiones condicionales de tal forma que devuelve True o
False en cada bloque de comparaciones.

93
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

Operador Descripción
And Y lógica.

P Q P AND Q
True True True
True False False
False True False
False False False

Or O lógica.

P Q P OR Q
True True True
True False True
False True True
False False True

Not Negación, modifica el sen do del resultado en una condición; si


la condición True el operador Not lo invierte y devuelve False.

6.3 Estructura If simple


If simple solo ejecuta un bloque de sentencias pertenecientes al valor True resultante de
una condición. Presenta los siguientes formatos:

Primera forma:
If condición Then Acción

Segunda forma:
If condición Then
Acción o acciones
End If

94
Se
sió
6
n
Estructuras condicionales

Donde:

• Condición: Es la expresión en la cual se evalúan los valores según el criterio del


problema, aquí es donde usamos los operadores relacionales y lógicos.
• Acción: Son las sentencias que se realizan solo si la condición resulta True.

6.4 Estructura If… Else


If doble ejecuta un bloque de sentencias pertenecientes al valor True resultante de una
condición en caso el valor resulte False. 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:

• Condición: Es la expresión en la cual se evalúan los valores según el criterio del


problema, aquí es donde usamos los operadores relacionales y lógicos.
• Acción_True: Son las sentencias que se realizan solo si la condición resulta True.
• Acción_False: Son las sentencias que se realizan solo si la condición no resulta True.

95
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

6.5 Estructura If… ElseIf


La estructura If doblemente encadenada evalúa una condición lógica; en caso resulte
True efectúa un bloque de sentencias especificadas, caso contrario sigue evaluando, es
similar a colocar un If dentro de otro.

Presenta el siguiente formato:

If condición Then
Accion1
ElseIf condicion Then
Accion2
Else
Accion_False
End If

Donde:

• Condición: Es la expresión en la cual se evalúan los valores según el criterio del


problema, aquí es donde usamos los operadores relacionales y lógicos.
• ElseIf: Es la expresión que se evalúa solo si la condición anterior emite el resultado
False.
• Acción: Son las sentencias que se realizan solo si la condición resulta True.

96
Se
sió
6
n
Estructuras condicionales

6.6 Estructura Select Case


También llamada estructura de decisión múl ple, porque evalúa los posibles valores que
puede tener una determinada variable. Presenta el siguiente formato:

Select Case Variable


Case Valor1: Acción1
Case Valor2: Acción2
Case ValorN:AccionN
Else
AccionFalsa
End Select

Donde:

• Variable: Es el valor que evalúa la sentencia, según esto se tomará una acción
especificada, hay que tener en cuenta que dicho valor puede ser de cualquier po de
datos.
• Valor: Es el valor que puede tomar una variable.
• Acción: Representa a las sentencias que se ejecutarán cuando se acceda a una opción
del Case.
• AccionFalsa: Representa a las sentencias que se ejecutarán cuando el valor no coincida
con la especificación Case.

Operadores válidos en los casos:

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>1000
Case Is<1000

97
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

» Caso desarrollado 1: Registro de alumnos


Implemente una aplicación que permita registrar los datos de un alumno, asimismo
debemos tener en cuenta los siguientes aspectos:

• Implemente el siguiente entorno para la hoja de Excel:

Fig. 6.1 Entorno de la hoja de Excel

• Implemente el siguiente UserForm:

Fig. 6.2 Userform de registro de alumnos

• Al iniciar la aplicación el po de sexo (Masculino y Femenino) y colegio de procedencia


(Par cular y Nacional), deberán encontrarse precargados en controles de po
Combobox.
• El código autogenerado del alumno debe iniciar con las letras ALU-, seguido de un
número consecu vo obtenido desde los registros de la hoja de Excel.
• Implemente un botón de «Registrar y Enviar», que permi rá enviar los datos a la hoja
de Excel mostrando el código, nombres completos, po de sexo (M y F), colegio de
donde proviene el alumno (P y N) y la fecha de nacimiento de un alumno.

98
Se
sió
6
n
Estructuras condicionales

Pasos:

1. Diseñe el modelo de la aplicación tanto en la hoja de Excel como en el UserForm.


2. Asigne las respec vas propiedades a los siguientes controles:

(Name)  frmRegistro
UserForm1
Cap on Registro de alumno
Label1 Cap on REGISTRO DE ALUMNOS
Label2 Cap on CÓDIGO AUTOGENERADO
Label3 Cap on NOMBRES
Label4 Cap on PATERNO
Label5 Cap on MATERNO
Label6 Cap on SEXO
Label7 Cap on FECHA NAC.
Label8 Cap on COLEGIO DE PROC.
Label9 (Name) lblCodigo
TextBox1 (Name) txtNombres
TextBox2 (Name) txtPaterno
TextBox3 (Name) txtMaterno
TextBox4 (Name) txtFechaNac
ComboBox1 (Name) cboSexo
ComboBox2 (Name) cboColegio
(Name)  btnRegistrar
CommandBu on1 Cap on REGISTRAR Y ENVIAR
Default True
(Name)  btnAnular
CommandBu on2
Cap on ANULAR
(Name)  btnSalir
CommandBu on3
Cap on SALIR

3. Implemente los siguientes códigos dentro del UserForm:

'Declaración de variables global


Dim uFila%

Private Sub btnAnular_Click()


Call limpiarControles
End Sub

Private Sub btnRegistrar_Click()


If valida = "" Then
Dim codigo As String, paterno As String, materno As String
Dim nombres As String, sexo As String, estadoCivil As String
Dim colegio As String, fechaNac As Date

codigo = lblCodigo.Caption
paterno = txtPaterno.Text
materno = txtMaterno.Text
nombres = txtNombres.Text
sexo = cboSexo.Text

99
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

colegio = cboColegio.Text
fechaNac = CDate(txtFechaNac.Text)

If sexo = "Masculino" Then sexo = "M"


If sexo = "Femenino" Then sexo = "F"

If colegio = "Nacional" Then colegio = "N"


If colegio = "Particular" Then colegio = "P"

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 = colegio

Call generaCodigo
Call limpiarControles
Else
MsgBox "El error se encuentra en " & valida
End If
End Sub

'Función que valida los datos ingresados


'por el usuario
Function valida() As String
Dim mensaje As String
If Trim(txtNombres.Text) = Empty Then
mensaje = "nombres del alumno"
ElseIf Trim(txtPaterno.Text) = Empty Then
mensaje = "apellido paterno del alumno"
ElseIf Trim(txtMaterno.Text) = Empty Then
mensaje = "apellido materno del alumno"
ElseIf cboSexo.ListIndex = -1 Then
mensaje = "tipo de sexo"
ElseIf cboColegio.ListIndex = -1 Then
mensaje = "tipo de colegio"
ElseIf Not IsDate(txtFechaNac.Text) Then
mensaje = "fecha de nacimiento del alumno"
Else
mensaje = ""
End If
valida = mensaje
End Function

Private Sub btnSalir_Click()


Dim r%
r=MsgBox("Está seguro de salir..!!", vbYesNo + vbCritical, "Salir")
If r = 6 Then Unload Me
End Sub

'Convierte a mayúsculas el texto ingresado


Private Sub txtMaterno_KeyPress()
KeyAscii = Asc(UCase(Chr$(KeyAscii)))
End Sub

'Convierte a mayúsculas el texto ingresado


Private Sub txtNombres_KeyPress()
KeyAscii = Asc(UCase(Chr$(KeyAscii)))
End Sub

100
Se
sió
6
n
Estructuras condicionales

'Convierte a mayúsculas el texto ingresado


Private Sub txtPaterno_KeyPress()
KeyAscii = Asc(UCase(Chr$(KeyAscii)))
End Sub

Private Sub UserForm_Activate()


uFila = determinaUltimaFila
Call generaCodigo
Call llenaSexo
Call llenaColegio
End Sub

Function determinaUltimaFila() As Integer


uFila = Sheets(1).Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Row
determinaUltimaFila = uFila
End Function

'Llena los tipos de sexo


Sub llenaSexo()
cboSexo.AddItem "Masculino"
cboSexo.AddItem "Femenino"
End Sub

'Llena los colegios de procedencia


Sub llenaColegio()
cboColegio.AddItem "Nacional"
cboColegio.AddItem "Particular"
End Sub

'Procedimiento que genera el nuevo código


'del alumno
Sub generaCodigo()
lblCodigo.Caption="ALU-" & Format(determinaUltimaFila-12, "0000")
End Sub

'Procedimiento que limpia los controles


'del formulario
Sub limpiarControles()
txtNombres.Text = ""
txtPaterno.Text = ""
txtMaterno.Text = ""
cboSexo.ListIndex = 0
cboColegio.ListIndex = 0
txtFechaNac.Text = ""
txtNombres.SetFocus
End Sub

4. Agregue un botón desde la ficha Desarrollador, seleccione Insertar > botón y asigne
el siguiente código:

Sub Botón1_Haga_clic_en()
frmRegistro.Show
End Sub

Luego, cambie el tulo del botón por «FORMULARIO DE REGISTRO».

5. Pruebe la aplicación presionando sobre el botón FORMULARIO DE REGISTRO.

101
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

» Caso desarrollado 2: Registro de compra de productos


Implemente una aplicación que permita registrar la compra de diccionarios en una
enda comercial, asimismo debemos tener en cuenta los siguientes aspectos:

• Implemente el siguiente entorno para la hoja de Excel:

Fig. 6.3 Entorno de la hoja de Excel

• Implemente el siguiente UserForm:

Fig. 6.4 Userform de registro de compra de productos

• Al iniciar la aplicación los diccionarios deberán encontrarse precargados en un control


de po Combobox.
• Los precios de los productos son como se muestran en la siguiente tabla:

Producto Precio
Diccionario Español $ 10.50
Diccionario Ingles-Español $ 11.00
Diccionario Sinónimos-Antónimos $ 9.90

• El descuento cuenta con los siguientes criterios

Criterio Porcentaje de descuento


Menor o igual a 50 0%
Entre 51 y 150 10%
Mayor a 150 15%
102
Se
sió
6
n
Estructuras condicionales

• El número autogenerado de la compra se ob ene de la can dad de registros obtenidos


desde la hoja de Excel con ceros a la izquierda hasta un límite de siete caracteres.
• Al seleccionar un elemento desde el control Combobox se deberá mostrar el precio
de dicho producto.
• Implemente un botón «Procesar» que permita mostrar el monto subtotal, descuento
y neto a pagar.
• Implemente una función de validación para los controles del usuario de tal forma que
le muestre al usuario donde está ocurriendo un error.
• Implemente un botón de «Enviar a Excel», que permi rá enviar los datos a la hoja de
Excel mostrando el número autogenerado, producto, precio, subtotal, descuento y
neto a pagar.

Pasos:

1. Diseñe el modelo de la aplicación tanto en la hoja de Excel como en el UserForm.


2. Asigne las respec vas propiedades a los siguientes controles:

(Name)  frmVenta
UserForm1
Cap on Registro de compra de productos
Label1 Cap on REGISTRO DE COMPRA DE PRODUCTOS
Label2 Cap on Nº
Label3 Cap on PRODUCTO
Label4 Cap on CANTIDAD
Label5 Cap on SUBTOTAL
Label6 Cap on DESCUENTO
Label7 Cap on NETO A PAGAR
Label8 (Name) lblNumero
Label9 (Name) lblPrecio
Label10 (Name) lblSubtotal
Label11 (Name) lblDescuento
Label12 (Name) lblNeto
TextBox1 (Name) txtCan dad
Combobox1 (Name)  cboProducto
(Name) btnProcesar
CommandBu on1 Cap on  PROCESAR
Default True
(Name) btnCancelar
CommandBu on2
Cap on  CANCELAR
(Name) btnSalir
CommandBu on3
Cap on SALIR
(Name) btnExcel
CommandBu on4
Cap on ENVIAR A EXCEL

103
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

3. Implemente los siguientes códigos dentro del UserForm:

'Variables globales
Dim precio As Currency, iCompra As Currency
Dim descuento As Currency, iPagar As Currency

Private Sub btnCancelar_Click()


Call limpiaControles
End Sub

Private Sub UserForm_Activate()


Call llenaProductos
Call generaNumero
End Sub

Private Sub btnProcesar_Click()


If valida = "" Then
'Capturando los valores ingresados por el usuario
Dim producto As String, cantidad As Integer
producto = cboProducto.ListIndex
cantidad = CInt(txtCantidad.Text)

'Determinar el precio del producto


precio = determinaPrecio(producto)

'Calculando el importe de compra


iCompra = cantidad * precio

'Calculando el descuento
descuento = calculaDescuento(iCompra)

'Calculando importe a pagar


iPagar = iCompra - descuento

Call imprimir(iCompra, descuento, iPagar)


Else
MsgBox "Error en " & valida
End If
End Sub

'Procedimiento que muestra la descripcion del producto


Private Sub cboProducto_Click()
Dim producto As Integer
producto = cboProducto.ListIndex
lblPrecio.Caption="$" & Format(determinaPrecio(producto), "0.00")
End Sub

'Función que determina el precio del producto


Function determinaPrecio(ByVal producto As Integer) As Currency
Select Case producto
Case 0: determinaPrecio = 10.5
Case 1: determinaPrecio = 11
Case 2: determinaPrecio = 9.9
End Select
End Function

'Función que determina el descuento de la compra


Function calculaDescuento(ByVal subtotal As Currency) As Currency
If subtotal<=50 Then calculaDescuento = 0
If subtotal>50 And subtotal <= 150 Then
calculaDescuento = 0.1 * subtotal

104
Se
sió
6
n
Estructuras condicionales

End If
If subtotal>150 Then calculaDescuento = 0.15 * subtotal
End Function

'Procedimiento que imprime los resultados


Sub imprimir(ByVal iCompra As Currency,
ByVal descuento As Currency, ByVal iPagar As Currency)
lblSubtotal.Caption = "$" & Format(iCompra, "0.00")
lblDescuento.Caption = "$" & Format(descuento, "0.00")
lblNeto.Caption = "$" & Format(iPagar, "0.00")
End Sub

'Procedimiento que envía toda la informacion a Excel


Private Sub btnExcel_Click()
uFila = determinaUltimaFila
Cells(uFila, 2).Value = uFila - 11
Cells(uFila, 3).Value = cboProducto.Text
Cells(uFila, 4).Value = precio
Cells(uFila, 5).Value = txtCantidad.Text
Cells(uFila, 6).Value = Date
Cells(uFila, 7).Value = iCompra
Cells(uFila, 8).Value = descuento
Cells(uFila, 9).Value = iPagar
Call generaNumero
Call limpiaControles
End Sub

'Función que valida los valores


Function valida() As String
If cboProducto.ListIndex = -1 Then
valida = "producto"
cboProducto.SetFocus
ElseIf Trim(txtCantidad.Text)=0
Or Not IsNumeric(txtCantidad.Text) Then
txtCantidad.Text = ""
txtCantidad.SetFocus
valida = "cantidad del producto"
Else
valida = ""
End If
End Function

'Procedimiento que llena el ComboBox de productos


Sub llenaProductos()
cboProducto.Text = "(Seleccione producto)"
cboProducto.AddItem "Diccionario Español"
cboProducto.AddItem "Diccionario Ingles-Español"
cboProducto.AddItem "Diccionario Sinónimos-Antónimos"
End Sub
Sub generaNumero()
Dim uFila As Integer
uFila = determinaUltimaFila
lblNumero.Caption = Format(uFila - 11, "0000000")
End Sub

Function determinaUltimaFila() As Integer


uFila = Sheets(1).Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Row
determinaUltimaFila = uFila
End Function

Sub limpiaControles()

105
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

Call generaNumero
cboProducto.Text = "(Seleccione producto)"
txtCantidad.Text = ""
lblPrecio.Caption = ""
lblSubtotal.Caption = ""
lblDescuento.Caption = ""
lblNeto.Caption = ""
End Sub

4. Agregue un botón desde la ficha Desarrollador, seleccione Insertar > botón y asigne
el siguiente código:
Sub Botón1_Haga_clic_en()
frmCompra.Show
End Sub

Luego, cambie el tulo del botón por «FORMULARIO DE COMPRA».

Pruebe la aplicación presionando sobre el botón FORMULARIO DE COMPRA.

» Caso desarrollado 3: Boleta de venta


Implemente una aplicación que permita generar una boleta de venta a par r de la
venta de diccionarios en una enda comercial, asimismo debemos tener en cuenta los
siguientes aspectos:

• Implemente el siguiente entorno para la hoja de Excel y llámelo «Boleta».

Fig. 6.5 Entorno de la hoja Boleta en Excel

106
Se
sió
6
n
Estructuras condicionales

• Implemente el siguiente entorno para la hoja de Excel y llámelo «Registro»

Fig. 6.6 Entorno de la hoja Registro de Excel

• Implemente el siguiente UserForm.

Fig. 6.7 Userform de registro de generación de boletas

• Al iniciar la aplicación, los diccionarios deberán encontrarse precargados en un


control de po Combobox.
• Los precios de los productos son como se muestran en la siguiente tabla:

Producto Precio
Diccionario Español $ 10.50
Diccionario Ingles-Español $ 11.00
Diccionario Sinónimos-Antónimos $ 9.90

• El descuento cuenta con los siguientes criterios:

Criterio Porcentaje de descuento


Menor o igual a 50 0%
Entre 51 y 250 10%
Mayor a 250 15%

107
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

• Al seleccionar un elemento desde el control Combobox se deberá mostrar el precio


de dicho producto.
• Implemente una función de validación para los controles del usuario de tal forma que
le muestre al usuario donde está ocurriendo un error.
• Implemente un botón de «Agregar a la boleta», que permi rá enviar los datos a la
hoja «BOLETA» de Excel mostrando el número de la boleta (dependerá de la can dad
de registros realizadas), nombre del cliente, RUC, descripción del producto, can dad,
precio, importe (can dad por precio).
• Agregue un módulo al proyecto para implementar funciones y procedimientos que
permitan enviar los datos de la boleta a un registro de venta ubicada en la hoja
«Registros».

Pasos:

1. Diseñe el modelo de la aplicación tanto en la hoja de Excel como en el UserForm.


2. Asigne las respec vas propiedades a los siguientes controles:

(Name)  frmBoleta
UserForm1
Cap on boleta de venta
Label1 Cap on GENERACIÓN DE BOLETA
Label2 Cap on CLIENTE
Label3 Cap on RUC
Label4 Cap on PRODUCTO
Label5 Cap on CANTIDAD
Label6 Cap on PRECIO
Label7 (Name) lblPrecio
TextBox1 (Name) txtCliente
TextBox1 (Name) txtRuc
TextBox1 (Name) txtCan dad
Combobox1 (Name) cboProducto

(Name) btnAgregar
CommandBu on1 Cap on AGREGAR A LA BOLETA
Default True

(Name) btnAnular
CommandBu on2
Cap on ANULAR BOLETA

(Name) btnSalir
CommandBu on3
Cap on SALIR

108
Se
sió
6
n
Estructuras condicionales

3. Implemente los siguientes códigos dentro del UserForm:

'Función que determina el precio del producto


Function determinaPrecio(ByVal producto As Integer) As Currency
Select Case producto
Case 0: determinaPrecio = 10.5
Case 1: determinaPrecio = 11
Case 2: determinaPrecio = 9.9
End Select
End Function

Private Sub btnAgregar_Click()


If valida = "" Then
Dim uFila As Integer
uFila = determinaUltimaFila

If uFila <> 17 Then


'Capturando los datos del formulario
Dim cliente As String, ruc As String
Dim producto As Integer, cantidad As Integer

cliente = UCase(txtCliente.Text)
ruc = txtRUC.Text
producto = cboProducto.ListIndex
cantidad = CInt(txtCantidad.Text)

'Calculando el subtotal a pagar


Dim importe As Currency
importe = determinaPrecio(producto) * cantidad

'Imprimir los resultados


Call imprimir(determinaPrecio(producto), importe)
Else
MsgBox "Ya no puede registrar más productos"
End If
Else
MsgBox "El error esta en " & valida
End If
End Sub

Private Sub btnAnular_Click()


Call limpiaControles
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(cboProducto.ListIndex), "0.00")
End Sub

Private Sub txtCliente_KeyPress()


KeyAscii = Asc(UCase(Chr$(KeyAscii)))
End Sub

Private Sub UserForm_Activate()

109
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

Call generaNumero
Call llenaProductos
Call limpiaControles
End Sub

'Función que determina la última fila de la hoja boleta


Function determinaUltimaFila() As Integer
uFila = Sheets(1).Cells(Rows.Count, 3).End(xlUp).Offset(1, 0).Row
determinaUltimaFila = uFila
End Function

'Función que determina la última fila de la hoja de registros


Function UltimaFilaRegistros() As Integer
Dim uFila As Integer
uFila = Sheets(2).Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Row
UltimaFilaRegistros = uFila
End Function

'Genera el número de Boleta


Sub generaNumero()
Dim numero As String
Range("I6").Value = UltimaFilaRegistros - 4
Range("I6").Select
Selection.NumberFormat = "000000"
End Sub

'Función que determina el descuento de la compra


Function calculaDescuento(ByVal subtotal As Currency) As Currency
If subtotal <= 50 Then calculaDescuento = 0
If subtotal > 50 And subtotal <= 250 Then
calculaDescuento = 0.1 * subtotal
End If
If subtotal > 250 Then calculaDescuento = 0.15 * subtotal
End Function

'Procedimiento que imprime los resultados


Sub imprimir(ByVal precio As Currency, ByVal importe As Currency)
Range("D10").Value = txtCliente.Text
Range("D11").Value = txtRUC.Text
Range("I11").Value = Date

Dim uFila As Integer


uFila = determinaUltimaFila

Cells(uFila, 3).Value = txtCantidad.Text


Cells(uFila, 4).Value = cboProducto.Text

Cells(uFila, 7).Value = precio


Cells(uFila, 9).Value = importe
Range("I18").Formula = "=sum(I14:I16)"
Dim subtotal As Currency, descuento As Currency
subtotal = Range("I18").Value
descuento = calculaDescuento(subtotal)
Range("I19").Value = descuento
Range("I20").Formula = "=I18-I19"
End Sub

'Función que valida los valores


Function valida() As String

110
Se
sió
6
n
Estructuras condicionales

If cboProducto.ListIndex = -1 Then
cboProducto.SetFocus
valida = "producto"
ElseIf Trim(txtCantidad.Text) = 0
Or Not IsNumeric(txtCantidad.Text) Then
txtCantidad.Text = ""
txtCantidad.SetFocus
valida = "cantidad del producto"
ElseIf Trim(txtCliente.Text) = 0 Then
txtCliente.Text = ""
txtCliente.SetFocus
valida = "nombre del cliente"
ElseIf Trim(txtRUC.Text) = 0 Then
txtRUC.Text = ""
txtRUC.SetFocus
valida = "RUc del cliente"
Else
valida = ""
End If
End Function

'Procedimiento que llena el ComboBox de productos


Sub llenaProductos()
cboProducto.Text = "(Seleccione producto)"
cboProducto.AddItem "Diccionario Español"
cboProducto.AddItem "Diccionario Ingles-Español"
cboProducto.AddItem "Diccionario Sinónimos-Antónimos"
End Sub

Sub limpiaControles()
txtCliente.Text = Empty
txtRUC.Text = Empty
txtCantidad.Text = Empty
cboProducto.Text = "(Seleccione producto)"
lblPrecio.Caption = ""

Range("D10").Value = ""
Range("D11").Value = ""
Range("I11").Value = ""
Range("C14:I16").Value = ""
Range("I18:I20").Value = ""

txtCliente.SetFocus
End Sub

4. Implemente los siguientes códigos dentro de un módulo:

Sub Botón1_Haga_clic_en()
frmBoleta.Show
End Sub

Sub enviarRegistro()
Dim uFila As Integer
uFila = determinaUltimaFila
Sheets(2).Cells(uFila, 2).Value = Sheets(1).Range("I6").Value
Sheets(2).Cells(uFila, 3).Value = Sheets(1).Range("I11").Value
Sheets(2).Cells(uFila, 4).Value = Sheets(1).Range("D10").Value

111
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

Sheets(2).Cells(uFila, 5).Value = Sheets(1).Range("D11").Value


Sheets(2).Cells(uFila, 6).Value = Sheets(1).Range("I20").Value
MsgBox "Registro enviado correctamente..!!!"
Call limpiaCeldas
End Sub

Function determinaUltimaFila() As Integer


Dim uFila As Integer
uFila = Sheets(2).Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Row
determinaUltimaFila = uFila
End Function

Sub limpiaCeldas()
Range("D10").Value = ""
Range("D11").Value = ""
Range("I11").Value = ""
Range("C14:I16").Value = ""
Range("I18:I20").Value = ""
End Sub

5. Agregue un botón desde la ficha Desarrollador, seleccione el botón y asigne el


siguiente código:

Sub Botón1_Haga_clic_en()
frmBoleta.Show
End Sub

Luego, cambie el tulo del botón por «FORMULARIO DE VENTA».

6. Agregue un botón desde la ficha Desarrollador, seleccione Insertar > botón y asocie
el botón al procedimiento enviarRegistro.
7. Pruebe la aplicación presionando sobre el botón FORMULARIO DE VENTA.

» Caso desarrollado 4: Registro de seguros


Implemente una aplicación que permita tener el control de registro de seguros de una
compañía.

Máximo número Pago mensual


Tipo
de personas ($.)
A 8 40.00
B 6 30.00
C 4 20.00
D 2 10.00

Contamos con las siguientes reglas de negocio:

• Si el cliente selecciona el po A o B pagará $8.00 adicionales por cada persona.


• Si el cliente selecciona el po C o D pagará $5.00 adicionales por cada persona.
• Calcular el monto anual que ene que pagar un determinado cliente.
112
Se
sió
6
n
Estructuras condicionales

Asimismo, debemos tener en cuenta los siguientes aspectos:

• Implemente el siguiente entorno para la hoja de Excel y llámelo «Seguros».

Fig. 6.8 Entorno de la hoja de registros de seguros en Excel

• Implemente el siguiente UserForm:

Fig. 6.9 Userform de registro de seguros

• Al iniciar la aplicación, los pos de seguros deberán encontrarse precargados en el


control Combobox, además se bloquea la caja de ingreso de asegurados adicionales.
• Al seleccionar un po de seguro desde el control cuadro combinado deberá mostrar
un mensaje en la cual indique el total de asegurados que cubre el po de seguro
seleccionado.
• Al ac var el check «Adiciona asegurados» el usuario podrá ingresar el número de
asegurados adicionales a lo ofrecido en el po de seguro.
• Implemente el botón «Mostrar montos» que permita mostrar el nombre del
cliente, po de seguro, número de asegurados (cobertura), can dad de asegurados
adicionales, subtotal mensual según la categoría, monto adicional por los asegurados
adicionales, pago total mensual (el cual une el monto subtotal mensual y el monto
adicional) y, finalmente, el pago total anual que calcula el monto total mensual por
12 meses del año.

113
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

Pasos:

1. Diseñe el modelo de la aplicación tanto en la hoja de Excel como en el UserForm.


2. Asigne las respec vas propiedades a los siguientes controles:

(Name) frmSeguros
UserForm1
Cap on Seguros
Label1 Cap on COMPAÑÍA DE SEGUROS
Label2 Cap on SEGURO DE SEPELIO
Label3 Cap on CLIENTE
Label4 Cap on TIPO DE SEGURO
Label5 (Name) lblMensaje
Label6 Cap on N°
TextBox1 (Name) txtCliente
TextBox2 (Name) txtCan dad
Combobox1 (Name) cboTipo
(Name) btnMostrar
CommandBu on1 Cap on  MOSTRAR MONTOS
Default  True
(Name) btnCancelar
CommandBu on2
Cap on  CANCELAR
(Name) btnSalir
CommandBu on3
Cap on SALIR
(Name) btnRegistrar
CommandBu on4
Cap on  REGISTRAR
ListBox1 (Name) lstR
CheckBox1 (Name) chkAdiciona

3. Implemente los siguientes códigos dentro del UserForm:

'Variables globales
Dim Cobertura As Integer, pago As Currency
Dim cliente As String, tipo As String

Private Sub btnCancelar_Click()


txtCliente.Text = Empty
cboTipo.ListIndex = -1
lblMensaje.Caption = ""
lstR.Clear
End Sub

Private Sub btnMostrar_Click()


If valida() = "" Then
'Capturando los datos del formulario
cliente = txtCliente.Text
tipo = cboTipo.Text

'Imprimir resultados
lstR.Clear
lstR.AddItem "**RESUMEN DE VENTA DE SEGUROS**"
lstR.AddItem "CLIENTE:" & cliente

114
Se
sió
6
n
Estructuras condicionales

lstR.AddItem "TIPO DE SEGURO:" & tipo


lstR.AddItem "COBERTURA MAXIMA: " & Cobertura
lstR.AddItem "ASEGURADOS ADICIONALES:" & txtCantidad.Text
lstR.AddItem "-------------------------------------------"
lstR.AddItem "SUBTOTAL MENSUAL: " & pago
lstR.AddItem "MONTO ADICIONAL: " & determinaMontoAdicional
lstR.AddItem "-------------------------------------------"
lstR.AddItem "PAGO TOTAL MENSUAL: " &
pago + determinaMontoAdicional
lstR.AddItem "PAGO TOTAL ANUAL: " &
(pago + determinaMontoAdicional) * 12
Else
MsgBox "El error se encuentra en " & valida
End If
End Sub

Private Sub btnRegistrar_Click()


Dim uFila As Integer
uFila = determinaUltimaFila
Cells(uFila, 2).Value = uFila - 4
Cells(uFila, 3).Value = cliente
Cells(uFila, 4).Value = tipo
Cells(uFila, 5).Value = Cobertura
Cells(uFila, 6).Value = txtCantidad.Text
Cells(uFila, 7).Value = pago
Cells(uFila, 8).Value = determinaMontoAdicional
Cells(uFila, 9).Value = pago + determinaMontoAdicional
Cells(uFila, 10).Value = (pago + determinaMontoAdicional) * 12
End Sub

Private Sub btnSalir_Click()


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

'Método que asigna el valor de la cobertura y pago


'según el tipo de seguro
Private Sub cboTipo_Change()
Select Case cboTipo.Text
Case "A":
Cobertura = 8
pago = 40
Case "B":
Cobertura = 6
pago = 30
Case "C":
Cobertura = 4
pago = 20
Case "D":
Cobertura = 2
pago = 10
End Select
lblMensaje.Caption = "Cuenta con una cobertura de: " & Cobertura
End Sub

'Si se activa el check de asegurados adicionales


'la caja de texto se accionará con un valor inicial de cero
Private Sub chkAdiciona_Click()
If chkAdiciona.Value = True Then
Call activaCantidad(True)

115
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

txtCantidad.Text = ""
txtCantidad.SetFocus
Else
Call activaCantidad(False)
txtCantidad.Text = "0"
End If
End Sub

Private Sub UserForm_Activate()


Call llenaTipo
Call activaCantidad(False)
txtCantidad.Text = 0
End Sub

'Procedimiento que llena el cuadro


'combinado de tipo de seguros
Sub llenaTipo()
cboTipo.AddItem "A"
cboTipo.AddItem "B"
cboTipo.AddItem "C"
cboTipo.AddItem "D"
End Sub

'Procedimiento que habilita e inhabilita la


'caja de texto para asegurados adicionales
Sub activaCantidad(ByVal valor As Boolean)
txtCantidad.Enabled = valor
End Sub

'Función que determina el monto por cada


'asegurado adicional determinado desde el tipo
Function determinaMontoAdicional() As Currency
Dim cantidad As Integer
cantidad = CInt(txtCantidad.Text)
If cantidad > 0 Then
Select Case cboTipo.Text
Case "A", "B": determinaMontoAdicional = 8 * cantidad
Case "C", "D": determinaMontoAdicional = 5 * cantidad
End Select
End If
End Function

'Función que valida el ingreso de valores al formulario


Function valida() As String
If Len(Trim(txtCliente.Text)) = 0 Then
valida = "nombre del cliente"
ElseIf cboTipo.ListIndex = -1 Then
valida = "tipo de seguro"
ElseIf cboTipo.ListIndex = -1 Then
valida = "tipo de seguro"
Else
valida = ""
End If
End Function
'Función que determina la última fila registrada
Function determinaUltimaFila() As Integer
Dim uFila As Integer
uFila = Sheets(1).Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Row
determinaUltimaFila = uFila
End Function

116
Se
sió
6
n
Estructuras condicionales

4. Agregue un botón desde la ficha Desarrollador, seleccione Insertar > botón y asigne
el siguiente código:

Sub Botón1_Haga_clic_en()
frmSeguros.Show
End Sub

Luego, cambie el tulo de botón por «FORMULARIO DE REGISTRO».

5. Pruebe la aplicación haciendo clic sobre el botón FORMULARIO DE REGISTRO.

» Caso desarrollado 5: Registro de eventos


Implemente una aplicación que permita tener el control de registro de los eventos que
realiza un club social.

Por polí ca de los socios fundadores, el club realiza mensualmente un evento como,
por ejemplo, almuerzos, baile social, etc.; de esta manera, todos los socios están en la
obligación de recibir una can dad de boletos según la categorización que se les asignó al
asociarlos. Por otro lado, si un determinado socio vende más boletos de los asignados,
se le descuenta $2.00 por cada boleto vendido a su pago mensual. La aplicación deberá
calcular el descuento que ene el socio y monto del mes, de acuerdo a la siguiente
tabla, la cual muestra la can dad de boletos asignados, así como el pago mensual y el
descuento que se le realiza al socio según su categoría.

Categoría Cant. Boletos Pago Mensual ($) Dscto. (%)


A 25 200 4
B 20 150 3
C 15 100 2

Asimismo, debemos tener en cuenta los siguientes aspectos:

• Implemente el siguiente entorno para la hoja de Excel y llámelo «Club Social».

Fig. 6.10 Entorno de la hoja de registros de seguros en Excel


117
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

• Implemente el siguiente UserForm:

Fig. 6.11 Userform de registro de eventos

• Al iniciar la aplicación, las categorías de los socios deberán encontrarse pre-cargados


en el control Combobox, además de asignar el valor inicial cero al control de po
TextBox que registra la can dad de boletos adicionales.
• Al seleccionar un po de categoría, se deberá mostrar en el control de po TextBox
el número de boletos asignados.
• Podrá modificar dicha can dad de boletos solo si desac va el check Cant. Boletos.
• Implemente el botón «Registrar» que permita mostrar el nombre, categoría, número
de boletos del socio, además de mostrar los montos correspondientes al descuento
por categoría, descuento adicional de boletos y monto mensual.
• Implemente el botón «Enviar a Excel» que permita enviar toda la información
correspondiente al registro en una hoja de Excel.

Pasos:

1. Diseñe el modelo de la aplicación tanto en la hoja de Excel como en el UserForm.


2. Asigne las respec vas propiedades a los siguientes controles:

(Name) frmClub
UserForm1
Cap on Club Social
Label1 Cap on CLUB SOCIAL – Registro de Eventos
Label2 Cap on NOMBRE DEL SOCIO
Label3 Cap on CATEGORIA
CheckBox1 (Name) chkBoletos
TextBox1 (Name) txtSocio
TextBox2 (Name) txtBoletos
Combobox1 (Name) cboCategoria

118
Se
sió
6
n
Estructuras condicionales

(Name)   btnRegistrar
CommandBu on1 Cap on  REGISTRAR
Default True
(Name) btnCancelar
CommandBu on2
Cap on  CANCELAR
(Name) btnSalir
CommandBu on3
Cap on  SALIR
(Name) btnRegistrar
CommandBu on4
Cap on  REGISTRAR
(Name) btnEnviar
CommandBu on5
Cap on  ENVIAR A EXCEL
ListBox1 (Name)  LstR

3. Implemente los siguientes códigos dentro del UserForm:

'Variables globales
Dim Boletos As Integer, pagoMensual As Currency
Dim Descuento As Currency

Private Sub btnEnviar_Click()


Dim r As Integer
r = MsgBox("Esta seguro de enviar a la hoja de Excel?",
vbYesNo + vbInformation)
If r = 6 Then
Dim uFila As Integer
uFila = determinaUltimaFila

Cells(uFila, 2).Value = uFila - 11


Cells(uFila, 3).Value = UCase(txtSocio.Text)
Cells(uFila, 4).Value = cboCategoria.Text
Cells(uFila, 5).Value = txtBoletos.Text
Cells(uFila, 6).Value = CInt(txtBoletos.Text) - Boletos
Cells(uFila, 7).Value = Descuento
Cells(uFila, 8).Value = calculaDescuentoAdicional
Cells(uFila, 9).Value = pagoMensual
Call limpiarControles
End If
End Sub

Private Sub btnRegistrar_Click()


If valida = "" Then
Dim socio As String, categoria As String
Dim Boletos As Integer

socio = txtSocio.Text
categoria = cboCategoria.Text
Boletos = CInt(txtBoletos.Text)

Call AsignacionxTipo

lstR.Clear
lstR.AddItem "**REGISTRO DE EVENTOS**"
lstR.AddItem "SOCIO: " & txtSocio.Text
lstR.AddItem "CATEGORIA: " & cboCategoria.Text
lstR.AddItem "BOLETOS: " & Boletos

119
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

lstR.AddItem "-----------------------------------"
lstR.AddItem "DESCUENTO POR CATEGORIA: $"
& Format(Descuento, "0.00")
lstR.AddItem "DESCUENTO POR ADICIONAL DE BOLETOS: $"
& Format(calculaDescuentoAdicional, "0.00")
lstR.AddItem "MONTO MENSUAL: $" &
Format(pagoMensual-Descuento-calculaDescuentoAdicional,"0.00")
Else
MsgBox "El error se encuentra en " & valida
End If
End Sub

Private Sub cboCategoria_Change()


Call AsignacionxTipo
txtBoletos.Text = Boletos
End Sub

Private Sub chkBoletos_Click()


If chkBoletos.Value = True Then
txtBoletos.Enabled = True
txtBoletos.SetFocus
Else
Call cboCategoria_Change
txtBoletos.Enabled = False
End If
End Sub

Private Sub UserForm_Activate()


Call llenaTipo
txtBoletos.Enabled = False
txtBoletos.Text = 0
End Sub

'Procedimiento que llena los tipos de socios


'en el control de tipo ComboBox
Sub llenaTipo()
cboCategoria.AddItem "A"
cboCategoria.AddItem "B"
cboCategoria.AddItem "C"
End Sub

'Procedimiento que asigna valor a boletos, pago mensual


'y descuento según la categoría del socio
Sub AsignacionxTipo()
Select Case cboCategoria.Text
Case "A":
Boletos = 25
pagoMensual = 200
Descuento = 0.04 * pagoMensual
Case "B":
Boletos = 20
pagoMensual = 150
Descuento = 0.03 * pagoMensual
Case "C":
Boletos = 15
pagoMensual = 100
Descuento = 0.02 * pagoMensual

120
Se
sió
6
n
Estructuras condicionales

End Select
End Sub
'Función que calcula el descuento por boletos adicionales
'a su categoría
Function calculaDescuentoAdicional() As Double
Call AsignacionxTipo
Dim categoria As String
categoria = cboCategoria.Text
If categoria = "A" And CInt(txtBoletos.Text) > 25 Then
calculaDescuentoAdicional = 2 * (CInt(txtBoletos.Text) - 25)
ElseIf categoria = "B" And CInt(txtBoletos.Text) > 20 Then
calculaDescuentoAdicional = 2 * (CInt(txtBoletos.Text) - 20)
ElseIf categoria = "C" And CInt(txtBoletos.Text) > 15 Then
calculaDescuentoAdicional = 2 * (CInt(txtBoletos.Text) - 15)
Else
calculaDescuentoAdicional = 0
End If
End Function

'Función que valida los datos ingresados en el formulario


Function valida() As String
If Len(Trim(txtSocio.Text)) = 0 Then
valida = "nombre del socio"
txtSocio.SetFocus
ElseIf cboCategoria.ListIndex = -1 Then
valida = "categoria del socio"
cboCategoria.SetFocus
ElseIf Len(Trim(txtBoletos.Text)) = 0 Or
Not IsNumeric(txtBoletos.Text) Then
valida = "cantidad de boletos"
txtBoletos.SetFocus
Else
valida = ""
End If
End Function

'Función que determina la última fila registrada


Function determinaUltimaFila() As Integer
Dim uFila As Integer
uFila = Sheets(1).Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Row
determinaUltimaFila = uFila
End Function

'Procedimiento que limpia los controles del formulario


Sub limpiarControles()
txtSocio.Text = ""
cboCategoria.ListIndex = -1
txtBoletos.Text = 0
chkBoletos.Value = False
lstR.Clear
End Sub

121
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

4. Agregue un botón desde la ficha Desarrollador, seleccione Insertar > botón y asigne
el siguiente código:

Sub Botón1_Haga_clic_en()
frmClub.Show
End Sub

Luego, cambie el tulo de botón por «FORMULARIO DE REGISTRO».

5. Pruebe la aplicación haciendo clic sobre el botón FORMULARIO DE REGISTRO.

122
Estructuras repetitivas Sesión

7
7.1 Introducción
En este capítulo, haremos uso de las estructuras repe vas, los cuales permiten reu lizar
una variable de tal forma que se ahorra en el uso de la memoria y op miza el trabajo que
se realiza en el desarrollo de una aplicación.

Asimismo, iniciaremos estudiando los contadores-acumuladores, la estructura For, luego


While y sus variaciones con sus respec vos casos prác cos.

7.2 Contadores y acumuladores


Las estructuras de repe ción permiten recorrer ciclos o bucles que son controlados
mediante contadores, los cuales trabajan como controladores de ciclo haciendo que la
estructura repe va pueda tener un límite. El formato de un contador es como sigue:

Contador = Contador + 1

Los acumuladores permiten realizar sumas sucesivas de tal forma que al final se ob ene un
único resultado, el cual también es llamado totalizador. El formato de un acumulador es:

Acumulador = Acumulador + valor

7.3 Estructura repetitiva For… Next


Tiene la misión de recorrer ciclos de repe ciones controladas por el usuario, de tal forma
que se debe definir el punto de inicio y fin del ciclo For. Su formato es:

For Variable = ValorInicial TO ValorFinal [Step +Valor]


'Cuerpo del Bucle
Next

123
Macros - Aplicaciones VBA con Excel

Donde:

• Variable: Es una variable declarada de po entero el cual actúa como contador del ciclo
de repe ciones.
• ValorInicial: Aquí se asigna el punto de inicio del ciclo de repe ciones el cual será un
valor numérico inferior a su valor final.
• ValorFinal: Aquí se asigna el punto final del ciclo de repe ciones, es decir hasta donde
debe recorrer el For; este valor debe ser mayor al valor inicial.
• Step Valor: Indica cual será la dirección del ciclo de repe ciones los cuales pueden ser
ascendente o descendente.
• Cuerpo del bucle: Son las sentencias que se ejecutarán mientras se encuentre en el
rango del ciclo de repe ciones.

Veamos cómo imprimir los 10 primeros números enteros:

Dim i%
For i = 1 To 10
lstN.AddItem "Valor >" & i
Next

7.4 Estructura repetitiva While


La estructura While presenta la misma polí ca que la estructura For, la diferencia radica
en que While condiciona al ciclo de repe ciones, es decir, solo dará ciclos si cumple con
una determinada condición. Cuenta con los siguientes formatos:

Do While condición
'Cuerpo del Bucle
Loop

Do Until condición
'Cuerpo del Bucle
Loop

Do
'Cuerpo del Bucle
Loop While condición

Do
'Cuerpo del Bucle
Loop Until Condición

124
Se
sió
7
n
Estructuras repe vas

» Caso desarrollado 1: Registro de venta de productos


Implemente una aplicación que permita registrar las ventas de partes de computadoras,
asimismo debemos tener en cuenta los siguientes aspectos:

• Implemente el siguiente entorno para la hoja de Excel:

Fig. 7.1 Entorno de la hoja de Excel

• Implemente el siguiente UserForm:

Fig. 7.2 Userform de registro de venta

• Al iniciar la aplicación los productos, deben encontrarse precargadas en el control de


po Combobox.

125
Macros - Aplicaciones VBA con Excel

• Implemente una función que permita asignar los precios a los productos tal como se
muestra en el siguiente cuadro:

Producto Precio
PROCESADOR INTEL CORE I5 - 3.00GHZ LGA 1155 $ 180.00

MEMORIA DDR3 8GB KINGSTON 1600 HYPERX $ 120.00

PLACA ASROCK H61M-VS S/V/R DDR3 LGA 1155 $ 250.00

CASE SLIM MICROATX HALION $ 90.00

MONITOR SAMSUNG LED 18 5' LS19D300NY VGA $ 100.00

TARJETA DE VIDEO ATI XFX ONE


$ 70.00
HD 5450 1GB DDR3

TECLADO LOGITECH KIT $ 20.00

MOUSE USB MK-120 $ 10.00

• Al seleccionar un producto, se debe también registrar la can dad comprada para


poder añadirlo a la lista.
• Una vez agregado el producto a las listas, el usuario podrá administrarlos de tal
forma que podrá seleccionar un producto y eliminarlo de la lista, mientras que el
botón «Borrar todo» limpiará todas las listas de forma que el usuario podrá registrar
nuevamente sus productos.
• Luego de registrar todos los productos a comprar se debe mostrar el subtotal,
descuento y neto a pagar por la compra.
• Los descuentos cuentan con los siguientes criterios:

Subtotal Porcentaje de descuento


Menor a 500 5%
Entre 500 a 1000 10%
Mayor a 1000 15%

• Implemente un botón de «Enviar a Excel», que permi rá enviar los datos a la hoja
de Excel mostrando el número de registro, nombre del cliente, descripción de los
productos, can dad de cada producto, precio de cada producto, importe de cada
producto, subtotal, descuento y neto.

Pasos:

1. Diseñe el modelo de la aplicación tanto en la hoja de Excel como en el UserForm.


2. Asigne las respec vas propiedades a los siguientes controles:

126
Se
sió
7
n
Estructuras repe vas

(Name) FrmVenta
UserForm1
Cap on Control de ventas
Label1 Cap on VENTA DE PRODUCTOS
Label2 Cap on Cliente o razón social
Label3 Cap on Producto
Label4 Cap on Can dad
Label5 Cap on Listado de productos
Label6 Cap on Can dad
Label7 Cap on Precio $
Label8 Cap on Importe $
Label9 Cap on Subtotal
Label10 Cap on Descuento
Label11 Cap on Neto
Label12 (Name) lblSubtotal
Label13 (Name) lblDescuento
Label14 (Name) lblNeto
TextBox1 (Name) txtCliente
TextBox2 (Name) txtCan dad
ComboBox1 (Name) cboProducto
(Name) btnAñadir
CommandBu on1 Cap on AÑADIR
Default True
(Name) btnEliminar
CommandBu on2
Cap on ELIMINAR
(Name) BtnBorrar
CommandBu on3
Cap on BORRAR TODO
(Name) BtnExcel
CommandBu on4
Cap on ENVIAR A EXCEL

3. Implemente los siguientes códigos dentro del UserForm:

'Declaración de variables globales


Dim subtotal As Currency, descuento As Currency
Dim neto As Currency

Private Sub UserForm_Activate()


Call llenaProductos
End Sub

Private Sub btnExcel_Click()


If validaCliente = "" Then
Dim uFila As Integer
uFila = determinaUltimaFila

Sheets(1).Cells(uFila, 2).Value = (uFila - 8) + 1


Sheets(1).Cells(uFila, 3).Value = txtCliente.Text

Dim i As Integer
For i = 0 To lstProductos.ListCount - 1
Sheets(1).Cells(uFila,4).Value=Sheets(1).Cells(uFila, 4).Value & _
(lstProductos.List(i) & Chr(10))
Sheets(1).Cells(uFila,5).Value=Sheets(1).Cells(uFila, 5).Value & _

127
Macros - Aplicaciones VBA con Excel

(lstCantidad.List(i) & Chr(10))


Sheets(1).Cells(uFila,6).Value=Sheets(1).Cells(uFila, 6).Value & _
("$" & Format(lstPrecio.List(i),"0.00") & Chr(10))
Sheets(1).Cells(uFila,7).Value=Sheets(1).Cells(uFila, 7).Value & _
("$" & Format(lstImporte.List(i),"0.00") & Chr(10))
Next

Sheets(1).Cells(uFila, 8).Value = subtotal


Sheets(1).Cells(uFila, 9).Value = descuento
Sheets(1).Cells(uFila, 10).Value = neto
Call limpiaTodo
Else
MsgBox "El error esta en " & validaCliente,vbCritical, "Sistema"
End If
End Sub

Private Sub btnEliminar_Click()


'Verificar 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 producto seleccionado
Dim Pos As Integer
Pos = lstProductos.ListIndex

'Eliminando el producto seleccionado


lstProductos.RemoveItem (Pos)
lstCantidad.RemoveItem (Pos)
lstPrecio.RemoveItem (Pos)
lstImporte.RemoveItem (Pos)
Call mostrarTotales
MsgBox "Producto eliminado Correctamente",
vbInformation, "Sistema"
End If
End Sub

Private Sub btnBorrar_Click()


Call LimpiaListas
End Sub

Private Sub btnAñadir_Click()


If validaProducto() = "" Then
'Capturando los valores ingresados
Dim producto As Integer, cantidad As Integer
producto = cboProducto.ListIndex
cantidad = CInt(txtCantidad.Text)

Dim precio As Currency


precio = determinaPrecio(producto)

Dim importe As Currency


importe = precio * cantidad

Call imprimir(cboProducto.Text, cantidad, precio, importe)


Call mostrarTotales
Else
MsgBox "Ocurrió un error en "
& validaProducto, vbCritical, "Sistema"
End If

128
Se
sió
7
n
Estructuras repe vas

End Sub

'Función que permite validar el ingreso de datos


'del producto
Function validaProducto() As String
If cboProducto.ListIndex = -1 Then
validaProducto = "descripción del producto"
ElseIf Len(Trim(txtCantidad.Text)) = 0 Then
validaProducto = "cantidad ingresada"
End If
End Function

'Procedimiento que imprimir valores en las listas


Sub imprimir(ByVal producto As String, ByVal cantidad As Integer,
ByVal precio As Currency, ByVal importe As Currency)
lstProductos.AddItem producto
lstCantidad.AddItem cantidad
lstPrecio.AddItem precio
lstImporte.AddItem importe
End Sub

'Procedimiento que imprime los totales


Sub mostrarTotales()
For i = 0 To lstImporte.ListCount - 1
subtotal = subtotal + CCur(lstImporte.List(i))
Next
lblSubtotal.Caption = "$" & Format(subtotal, "0.00")
descuento = calculaDescuento(subtotal)
neto = subtotal - descuento

lblDescuento.Caption = "$" & Format(descuento, "0.00")


lblNeto.Caption = "$" & Format(neto, "0.00")
End Sub

'Función que calcula el descuento basado en el subtotal


Function calculaDescuento(ByVal subtotal As Currency) As Currency
Select Case subtotal
Case Is < 500: calculaDescuento = 0.05 * subtotal
Case 500 To 1000: calculaDescuento = 0.1 * subtotal
Case Is > 1000: calculaDescuento = 0.15 * subtotal
End Select
End Function

Private Sub btnSalir_Click()


If MsgBox("Esta seguro de Salir",
vbYesNo + vbInformation, "Sistema") = vbYes Then
Unload Me
End If
End Sub

'Procedimiento que permite llenar


'el cuadro combinado de productos
Sub llenaProductos()
cboProducto.Text = "(Seleccione producto)"
cboProducto.AddItem "PROCESADOR INTEL CORE I5 - 3.00GHZ LGA 1155"
cboProducto.AddItem "MEMORIA DDR3 8GB KINGSTON 1600 HYPERX"
cboProducto.AddItem "PLACA ASROCK H61M-VS S/V/R DDR3 LGA 1155"
cboProducto.AddItem "CASE SLIM MICROATX HALION"
cboProducto.AddItem "MONITOR SAMSUNG LED 18 5' LS19D300NY VGA"
cboProducto.AddItem "TARJETA DE VIDEO ATI XFX ONE HD 5450 1GB DDR3"
cboProducto.AddItem "TECLADO LOGITECH KIT"

129
Macros - Aplicaciones VBA con Excel

cboProducto.AddItem "MOUSE USB MK-120"


End Sub

'Función que permite asignar un precio


'según el producto seleccionado
Function determinaPrecio(ByVal producto As Integer) As Currency
Dim precio As Currency
Select Case producto
Case 0: precio = 180
Case 1: precio = 120
Case 2: precio = 250
Case 3: precio = 90
Case 4: precio = 100
Case 5: precio = 70
Case 6: precio = 20
Case 7: precio = 10
End Select
determinaPrecio = precio
End Function

'Procedimiento que limpia los controles


'de tipo ListBox
Sub LimpiaListas()
lstProductos.Clear
lstCantidad.Clear
lstPrecio.Clear
lstImporte.Clear
Call mostrarTotales
End Sub

'Función que valida los datos del cliente


Function validaCliente() As String
Dim mensaje As String
If txtCliente.Text = Empty Then
mensaje = "Debe registrar los datos del Cliente"
Else
mensaje = ""
End If
validaCliente = mensaje
End Function

'Procedimiento que permite limpiar todos los controles


Sub limpiaTodo()
txtCliente.Text = Empty

cboProducto.Text = "(Seleccione producto)"


txtCantidad.Text = Empty

Call LimpiaListas
End Sub

'Función que determina la posición de la última fila


Function determinaUltimaFila() As Integer
determinaUltimaFila = Sheets(1).Cells(Rows.Count, 2)
.End(xlUp).Offset(1, 0).Row
End Function

130
Se
sió
7
n
Estructuras repe vas

4. Agregue un botón desde la ficha Desarrollador, seleccione Insertar > botón y asigne
el siguiente código:
Sub Botón1_Haga_clic_en()
frmVenta.Show
End Sub

Luego, cambie el tulo del botón por «FORMULARIO DE VENTA».

5. Pruebe la aplicación presionando sobre el botón FORMULARIO DE VENTA.

» Caso desarrollado 2: Registro de alumnos


Implemente una aplicación que permita registrar los alumnos, asimismo debemos
tener en cuenta los siguientes aspectos:

• Implemente el siguiente UserForm:

Fig. 7.3 Userform de control de notas

• El usuario deberá ingresar el nombre del alumno y sus cinco notas de manera
obligatoria; en caso el alumno no rinda algún examen, asignar cero; esto se debe a
que la aplicación cuenta con validación en todos sus controles.
• El promedio del alumno se determina basándose en la siguiente fórmula:
15% de EX1 +20% de EX2 +25% de EX3 +10% de EP1 +30% de EF1

131
Macros - Aplicaciones VBA con Excel

• Implemente el botón «Registrar» para enviar la información del alumno a las listas
correspondientes, además de una condición que indique la caracterís cas del alumno,
tal como se muestra en la siguiente tabla:

Promedio Condición
Menor o igual a 10 Desaprobado
Entre 10.1 y 12 Recuperación
Entre 12.1 y 18 Aprobado
Mayor a 18.1 Excelente

• Implemente el botón «Generar lista», que permita enviar los datos a la hoja de Excel
mostrando el número, nombre del alumno, sus cinco notas, promedio y la condición
según su promedio.
• Implemente el botón «Distribuir listas» que permita enviar información de los
alumnos según su condición en hojas dis ntas.
• Finalmente, las hojas de excel tendrían los siguientes formatos después de registrar
cierta can dad de alumnos:

Hoja de Excel «Listado de alumnos»:

Fig. 7.4 Entorno de la hoja de Excel

132
Se
sió
7
n
Estructuras repe vas

Hoja de Excel «Listado de alumnos aprobados»:

Fig. 7.5 Entorno de la hoja de Excel

Hoja de Excel «Listado de alumnos desaprobados»:

Fig. 7.6 Entorno de la hoja de Excel

Hoja de Excel «Listado de alumnos excelente»:

Fig. 7.7 Entorno de la hoja de Excel


133
Macros - Aplicaciones VBA con Excel

Hoja de Excel «Listado de alumnos recuperación»:

Fig. 7.8 Entorno de la hoja de Excel

Pasos:

1. Diseñe el modelo de la aplicación tanto en la hoja de Excel como en el UserForm.


2. Asigne las respec vas propiedades a los siguientes controles:

(Name)  FrmNotas
UserForm1
Cap on Control de notas
Label1 Cap on CONTROL DE NOTAS
Label2 Cap on Apellidos y nombres
Label3 Cap on (EX1)
Label4 Cap on (EX2)
Label5 Cap on (EX3)
Label6 Cap on (EP1)
Label7 Cap on (EF1)
Label8 Cap on N°
Label9 Cap on ALUMNO
Label10 Cap on EX1
Label11 Cap on EX2
Label12 Cap on EX3
Label13 Cap on EP1
Label14 Cap on EF1
Label15 Cap on Promedio
Label16 Cap on Condición
TextBox1 (Name) txtAlumno
TextBox2 (Name) txtEx1
TextBox3 (Name) txtEx2
TextBox4 (Name) txtEx3
TextBox5 (Name) txtEp1
TextBox6 (Name) txtEf1
Frame1 Cap on Datos del alumno
Frame2 Cap on Notas del alumno
134
Se
sió
7
n
Estructuras repe vas

(Name) btnRegistrar
CommandBu on1 Cap on  REGISTRAR
Default True
(Name) btnLimpiar
CommandBu on2
Cap on  LIMPIAR
(Name) btnSalir
CommandBu on3
Cap on  SALIR
(Name) btnGenerar
CommandBu on4
Cap on  GENERAR LISTA
(Name) btnDistribuir
CommandBu on5
Cap on DISTRIBUIR
ListBox1 (Name) lstNumero
ListBox2 (Name) lstAlumno
ListBox3 (Name) lstEx1
ListBox4 (Name) lstEx2
ListBox5 (Name) lstEx3
ListBox6 (Name) lstEp1
ListBox7 (Name) lstEf1
ListBox8 (Name) lstPromedio
ListBox9 (Name) lstCondicion

3. Implemente los siguientes códigos dentro del UserForm:

'Variables globales
Dim total As Integer, n As Integer

Private Sub btnDistribuir_Click()


'Limpiar todas las hojas
Sheets(2).Range("B14:I100").ClearContents
Sheets(3).Range("B14:I100").ClearContents
Sheets(4).Range("B14:I100").ClearContents
Sheets(5).Range("B14:I100").ClearContents

'Listado de alumnos desaprobados


Dim i As Integer, c As Integer
i = 0
c = 0
Do While i <= lstPromedio.ListCount - 1
If CInt(lstPromedio.List(i)) <= 10 Then
Sheets(4).Cells(14 + c, 2).Value = lstNumero.List(i)
Sheets(4).Cells(14 + c, 3).Value = lstAlumno.List(i)
Sheets(4).Cells(14 + c, 4).Value = lstEx1.List(i)
Sheets(4).Cells(14 + c, 5).Value = lstEx2.List(i)
Sheets(4).Cells(14 + c, 6).Value = lstEx3.List(i)
Sheets(4).Cells(14 + c, 7).Value = lstEp1.List(i)
Sheets(4).Cells(14 + c, 8).Value = lstEf1.List(i)
Sheets(4).Cells(14 + c, 9).Value = lstPromedio.List(i)
c = c + 1
End If
i = i + 1
Loop
'Listado de alumnos en recuperación
i = 0
c = 0
Do While i <= lstPromedio.ListCount - 1
If CInt(lstPromedio.List(i)) > 10

135
Macros - Aplicaciones VBA con Excel

And CInt(lstPromedio.List(i)) <= 12 Then


Sheets(5).Cells(14 + c, 2).Value = lstNumero.List(i)
Sheets(5).Cells(14 + c, 3).Value = lstAlumno.List(i)
Sheets(5).Cells(14 + c, 4).Value = lstEx1.List(i)
Sheets(5).Cells(14 + c, 5).Value = lstEx2.List(i)
Sheets(5).Cells(14 + c, 6).Value = lstEx3.List(i)
Sheets(5).Cells(14 + c, 7).Value = lstEp1.List(i)
Sheets(5).Cells(14 + c, 8).Value = lstEf1.List(i)
Sheets(5).Cells(14 + c, 9).Value = lstPromedio.List(i)
c = c + 1
End If
i = i + 1
Loop
'Listado de alumnos aprobados
i = 0
c = 0
Do While i <= lstPromedio.ListCount - 1
If CInt(lstPromedio.List(i)) > 12
And CInt(lstPromedio.List(i)) <= 18 Then
Sheets(2).Cells(14 + c, 2).Value = lstNumero.List(i)
Sheets(2).Cells(14 + c, 3).Value = lstAlumno.List(i)
Sheets(2).Cells(14 + c, 4).Value = lstEx1.List(i)
Sheets(2).Cells(14 + c, 5).Value = lstEx2.List(i)
Sheets(2).Cells(14 + c, 6).Value = lstEx3.List(i)
Sheets(2).Cells(14 + c, 7).Value = lstEp1.List(i)
Sheets(2).Cells(14 + c, 8).Value = lstEf1.List(i)
Sheets(2).Cells(14 + c, 9).Value = lstPromedio.List(i)
c = c + 1
End If
i = i + 1
Loop
'Listado de alumnos aprobados
i = 0
c = 0
Do While i <= lstPromedio.ListCount - 1
If CInt(lstPromedio.List(i)) > 18 Then
Sheets(3).Cells(14 + c, 2).Value = lstNumero.List(i)
Sheets(3).Cells(14 + c, 3).Value = lstAlumno.List(i)
Sheets(3).Cells(14 + c, 4).Value = lstEx1.List(i)
Sheets(3).Cells(14 + c, 5).Value = lstEx2.List(i)
Sheets(3).Cells(14 + c, 6).Value = lstEx3.List(i)
Sheets(3).Cells(14 + c, 7).Value = lstEp1.List(i)
Sheets(3).Cells(14 + c, 8).Value = lstEf1.List(i)
Sheets(3).Cells(14 + c, 9).Value = lstPromedio.List(i)
c = c + 1
End If
i = i + 1
Loop
End Sub

Private Sub btnGenerar_Click()


Dim uFila As Integer
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 = lstEx1.List(i)
Sheets(1).Cells(uFila + i, 5).Value = lstEx2.List(i)
Sheets(1).Cells(uFila + i, 6).Value = lstEx3.List(i)
Sheets(1).Cells(uFila + i, 7).Value = lstEp1.List(i)
Sheets(1).Cells(uFila + i, 8).Value = lstEf1.List(i)
Sheets(1).Cells(uFila + i, 9).Value = lstPromedio.List(i)

136
Se
sió
7
n
Estructuras repe vas

Sheets(1).Cells(uFila + i, 10).Value = lstCondicion.List(i)


Next
End Sub

Private Sub btnRegistrar_Click()


If valida = "" Then
Dim alumno As String, ex1 As Integer, ex2 As Integer
Dim ex3 As Integer
Dim ep1 As Integer, ef1 As Integer, promedio As Double

'Capturando los datos


alumno = txtAlumno.Text
ex1 = CInt(txtEx1.Text)
ex2 = CInt(txtEx2.Text)
ex3 = CInt(txtEx3.Text)
ep1 = CInt(txtEp1.Text)
ef1 = CInt(txtEf1.Text)

'Calculando el promedio
promedio = 0.15*ex1 + 0.2*ex2 + 0.25*ex3 + 0.1*ep1 + 0.3*ef1

'Determinar la condición
Dim condicion As String
condicion = determinaCondicion(promedio)

'Enviando a las listas


Call imprimir(promedio, condicion)
Call limpiaControles
Else
MsgBox "El error se encuentra en " & valida
End If
End Sub

'Función que determina la condición según el promedio del alumno


Function determinaCondicion(ByVal promedio As Double) As String
If promedio <= 10 Then
determinaCondicion = "Desaprobado"
ElseIf promedio > 10 And promedio <= 12 Then
determinaCondicion = "Recuperación"
ElseIf promedio > 12 And promedio <= 18 Then
determinaCondicion = "Aprobado"
ElseIf promedio > 18 Then
determinaCondicion = "Excelente"
End If
End Function

'Procedimiento de permita imprimir en las listas


Sub imprimir(ByVal promedio As Double, condicion As String)
lstNumero.AddItem n
lstAlumno.AddItem UCase(txtAlumno.Text)
lstEx1.AddItem txtEx1.Text
lstEx2.AddItem txtEx2.Text
lstEx3.AddItem txtEx3.Text
lstEp1.AddItem txtEp1.Text
lstEf1.AddItem txtEf1.Text
lstPromedio.AddItem Format(promedio, "0.00")
lstCondicion.AddItem condicion
n = n + 1
End Sub

'Función que valida el ingreso de valores


Function valida() As String
Dim mensaje$

137
Macros - Aplicaciones VBA con Excel

If Len(Trim(txtAlumno.Text)) = 0 Then
mensaje = "Nombre del alumno"
txtAlumno.SetFocus
ElseIf Not IsNumeric(txtEx1.Text)
Or CInt(txtEx1.Text) > 20 Or CInt(txtEx1.Text) < 0 Then
mensaje = "Examen 1"
txtEx1.SetFocus
ElseIf Not IsNumeric(txtEx2.Text)
Or CInt(txtEx2.Text) > 20 Or CInt(txtEx2.Text) < 0 Then
mensaje = "Examen 2"
txtEx2.SetFocus
ElseIf Not IsNumeric(txtEx3.Text)
Or CInt(txtEx3.Text) > 20 Or CInt(txtEx3.Text) < 0 Then
mensaje = "Examen 3"
txtEx3.SetFocus
ElseIf Not IsNumeric(txtEp1.Text)
Or CInt(txtEp1.Text) > 20 Or CInt(txtEp1.Text) < 0 Then
mensaje = "Examen parcial"
txtEp1.SetFocus
ElseIf Not IsNumeric(txtEf1.Text)
Or CInt(txtEf1.Text) > 20 Or CInt(txtEf1.Text) < 0 Then
mensaje = "Examen final"
txtEf1.SetFocus
Else
mensaje = ""
End If
valida = mensaje
End Function

'Procedimiento que limpia los controles para un nuevo registro


Sub limpiaControles()
txtAlumno.Text = ""
txtEx1.Text = ""
txtEx2.Text = ""
txtEx3.Text = ""
txtEp1.Text = ""
txtEf1.Text = ""
txtAlumno.SetFocus
End Sub

'Función que determina la última fila


Function determinaUltimaFila() As Integer
uFila = Sheets(1).Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Row
determinaUltimaFila = uFila
End Function

Private Sub UserForm_Activate()


n = determinaUltimaFila - 13
End Sub

4. Agregue un botón desde la ficha Desarrollador, seleccione Insertar > botón y asigne
el siguiente código:
Sub Botón1_Haga_clic_en()
frmNotas.Show
End Sub

Luego, cambie el tulo del botón por «FORMULARIO DE REGISTRO DE NOTAS».

5. Pruebe la aplicación presionando sobre el botón FORMULARIO DE REGISTRO DE NOTAS.


138
Se
sió
7
n
Estructuras repe vas

» Caso desarrollado 3: Conteos de números aleatorios


Implemente una aplicación que permita mostrar 100 números aleatorios de tres cifras,
asimismo debemos tener en cuenta los siguientes aspectos:

• Implemente el siguiente UserForm:

Fig. 7.9 Userform de conteos de números aleatorios

• Implemente el botón «Mostrar 100 números aleatorios» para enviar dichos números
a la lista correspondiente.
• Implemente el botón «Mostrar conteos» para enviar un informe de los números
mostrados de tal forma que cumpla con las siguientes especificaciones:

 Can dad total de números pares


 Can dad total de números impares
 Can dad total de números entre 100 y 249
 Can dad total de números entre 250 y 499
 Can dad total de números entre 500 y 799
 Can dad total de números entre 800 y 999

• Implemente el botón «Enviar a Excel» el cual permi rá enviar los números aleatorios
en grupo de 20 tal como se muestra en la siguiente imagen:

139
Macros - Aplicaciones VBA con Excel

Fig. 7.10 Entorno de la hoja de Excel

Pasos:

1. Diseñe el modelo de la aplicación tanto en la hoja de Excel como en el UserForm.


2. Asigne las respec vas propiedades a los siguientes controles:

(Name)  frmAleatorios
UserForm1
Cap on Conteos con VBA
Label1 Cap on NUMEROS ALEATORIOS
(Name) btnMostrar
CommandBu on1 Cap on  MOSTRAR 100 NUMEROS ALEATORIOS
Default True
(Name) btnConteos
CommandBu on2
Cap on  MOSTRAR CONTEOS
(Name) btnExcel
CommandBu on3
Cap on Enviar a Excel
ListBox1 (Name) lstA
ListBox2 (Name) lstR

3. Implemente los siguientes códigos dentro del UserForm:

Private Sub btnConteos_Click()


Dim cPar As Integer, cImpar As Integer
Dim c100 As Integer, c250 As Integer, c500 As Integer, c800 As Integer

'Recorriendo por todos los números


For i = 0 To lstA.ListCount - 1
'Verificando los números pares e impares
If lstA.List(i) Mod 2 = 0 Then
cPar = cPar + 1
Else
cImpar = cImpar + 1
End If

140
Se
sió
7
n
Estructuras repe vas

'Verificando los conteos según el rango solicitado


If lstA.List(i) >= 100 And lstA.List(i) < 250 Then c100 = c100 + 1
If lstA.List(i) >= 250 And lstA.List(i) < 500 Then c250 = c250 + 1
If lstA.List(i) >= 500 And lstA.List(i) < 750 Then c500 = c500 + 1
If lstA.List(i) >= 750 Then c800 = c800 + 1
Next

'Imprimiendo las respuestas


lstR.Clear
lstR.AddItem " ** RESUMEN DE CONTEOS ** "
lstR.AddItem "-----------------------------------------------------"
lstR.AddItem "La cantidad de numeros pares: " & cPar
lstR.AddItem "La cantidad de numeros impares: " & cImpar
lstR.AddItem "La cantidad de numeros entre 100 y 249: " & c100
lstR.AddItem "La cantidad de numeros entre 250 y 499: " & c250
lstR.AddItem "La cantidad de numeros entre 500 y 799: " & c500
lstR.AddItem "La cantidad de numeros entre 800 y 999: " & c800
End Sub

Private Sub btnExcel_Click()


'Verificar que existen elementos en la lista
If lstA.ListCount < 1 Or lstR.ListCount < 1 Then
MsgBox "Una de las listas se encuentra vacia..!"
Exit Sub
End If

Dim i As Integer, c As Integer


'Recorriendo por todos los números mostrados en la lista
For i = 0 To 99
'Inicializando en cero por cada bloque de impresión
If i = 20 Then c = 0
If i = 40 Then c = 0
If i = 60 Then c = 0
If i = 80 Then c = 0

'Verificando de 20 en 20 los números


If i < 20 Then
Cells(5 + c, 2).Value = lstA.List(i)
ElseIf i >= 20 And i < 40 Then
Cells(5 + c, 3).Value = lstA.List(i)
ElseIf i >= 40 And i < 60 Then
Cells(5 + c, 4).Value = lstA.List(i)
ElseIf i >= 60 And i < 80 Then
Cells(5 + c, 5).Value = lstA.List(i)
ElseIf i >= 80 Then
Cells(5 + c, 6).Value = lstA.List(i)
End If
c = c + 1
Next
End Sub

Private Sub btnMostrar_Click()


lstA.Clear
lstR.Clear
Dim numeroAleatorio As Integer

'Imprimiendo 100 números aleatorios en la lista


For i = 1 To 100
numeroAleatorio = Int((999 - 100 + 1) * Rnd() + 100)
lstA.AddItem numeroAleatorio
Next
End Sub

141
Macros - Aplicaciones VBA con Excel

4. Agregue un botón desde la ficha Desarrollador, seleccione Insertar > botón y asigne
el siguiente código:

Sub Botón1_Haga_clic_en()
frmAleatorios.Show
End Sub

Luego, cambie el tulo de botón por «FORMULARIO».

5. Pruebe la aplicación haciendo clic sobre el botón FORMULARIO.

» Caso desarrollado 4: Control de libros


Implemente una aplicación que permita registrar los datos del nuevo libro, asimismo
debemos tener en cuenta los siguientes aspectos:

• Implemente el siguiente UserForm.

Fig. 7.11 Userform de control de libros

• Implemente el botón «Registrar» para enviar el nombre del libro, po de editorial,


especialidad, año de edición, número de páginas y costo a las listas correspondientes;
además de mostrar los datos estadís cos como el total de libros registrados, total de
libro de registro zonal, nacional y extranjero.

142
Se
sió
7
n
Estructuras repe vas

• Implemente el botón «Enviar a Excel» el cual permi rá enviar los datos de las listas,
tal como se muestra en la siguiente imagen:

Fig. 7.12 Entorno de la hoja de Excel

Pasos:

1. Diseñe el modelo de la aplicación tanto en la hoja de Excel como en el UserForm.


2. Asigne las respec vas propiedades a los siguientes controles:

(Name) FrmLibro
UserForm1
Cap on Control de libros
Label1 Cap on CONTROL DE LIBROS
Label2 Cap on Nombre del libro
Label3 Cap on Tipo de editorial
Label4 Cap on Especialidad
Label5 Cap on Año de edición
Label6 Cap on Nº páginas
Label7 Cap on Costo $
Label8 Cap on Nombre del libro
Label9 Cap on Tipo
Label10 Cap on Especialidad
Label11 Cap on Año Edic.
Label12 Cap on Páginas
Label13 Cap on Costo $
(Name)  btnRegistrar
CommandBu on1 Cap on REGISTRAR
Default True
(Name) BtnLimpiar
CommandBu on2
Cap on Limpiar
(Name) btnMostrar
CommandBu on3
Cap on Mostrar estadís cas
(Name)   btnSalir
CommandBu on4
Cap on Salir
(Name) btnExcel
CommandBu on5
Cap on Enviar a Excel
ListBox1 (Name) lstA
ListBox2 (Name) lstR

143
Macros - Aplicaciones VBA con Excel

3. Implemente los siguientes códigos dentro del UserForm:

Private Sub btnConteos_Click()


Dim cPar As Integer, cImpar As Integer
Dim c100 As Integer, c250 As Integer, c500 As Integer, c800 As Integer

'Recorriendo por todos los números


For i = 0 To lstA.ListCount - 1
'Verificando los números pares e impares
If lstA.List(i) Mod 2 = 0 Then
cPar = cPar + 1
Else
cImpar = cImpar + 1
End If

'Verificando los conteos según el rango solicitado


If lstA.List(i) >= 100 And lstA.List(i) < 250 Then c100 = c100 + 1
If lstA.List(i) >= 250 And lstA.List(i) < 500 Then c250 = c250 + 1
If lstA.List(i) >= 500 And lstA.List(i) < 750 Then c500 = c500 + 1
If lstA.List(i) >= 750 Then c800 = c800 + 1
Next

'Imprimiendo las respuestas


lstR.Clear
lstR.AddItem " ** RESUMEN DE CONTEOS ** "
lstR.AddItem "-----------------------------------------------------"
lstR.AddItem "La cantidad de numeros pares: " & cPar
lstR.AddItem "La cantidad de numeros impares: " & cImpar
lstR.AddItem "La cantidad de numeros entre 100 y 249: " & c100
lstR.AddItem "La cantidad de numeros entre 250 y 499: " & c250
lstR.AddItem "La cantidad de numeros entre 500 y 799: " & c500
lstR.AddItem "La cantidad de numeros entre 800 y 999: " & c800
End Sub

Private Sub btnExcel_Click()


'Verificar que existen elementos en la lista
If lstA.ListCount < 1 Or lstR.ListCount < 1 Then
MsgBox "Una de las listas se encuentra vacia..!"
Exit Sub
End If

Dim i As Integer, c As Integer


'Recorriendo por todos los números mostrados en la lista
For i = 0 To 99
'Inicializando en cero por cada bloque de impresión
If i = 20 Then c = 0
If i = 40 Then c = 0
If i = 60 Then c = 0
If i = 80 Then c = 0

'Verificando de 20 en 20 los números


If i < 20 Then
Cells(5 + c, 2).Value = lstA.List(i)
ElseIf i >= 20 And i < 40 Then
Cells(5 + c, 3).Value = lstA.List(i)
ElseIf i >= 40 And i < 60 Then
Cells(5 + c, 4).Value = lstA.List(i)
ElseIf i >= 60 And i < 80 Then

144
Se
sió
7
n
Estructuras repe vas

Cells(5 + c, 5).Value = lstA.List(i)


ElseIf i >= 80 Then
Cells(5 + c, 6).Value = lstA.List(i)
End If
c = c + 1
Next
End Sub

Private Sub btnMostrar_Click()


lstA.Clear
lstR.Clear
Dim numeroAleatorio As Integer

'Imprimiendo 100 números aleatorios en la lista


For i = 1 To 100
numeroAleatorio = Int((999 - 100 + 1) * Rnd() + 100)
lstA.AddItem numeroAleatorio
Next
End Sub

4. Agregar un botón desde la ficha Desarrollador, seleccione Insertar > botón y asigne
el siguiente código:

Sub Botón1_Haga_clic_en()
frmAleatorios.Show
End Sub

Luego, cambie el tulo de botón por «FORMULARIO».

5. Pruebe la aplicación haciendo clic sobre el botón FORMULARIO.

145
Base de datos I Sesión

8
8.1 Introducción
Siempre va exis r la necesidad de manipular de la mejor manera los datos de Excel, es
así, que en este capítulo nos concentraremos en la forma de administrar la información
desde Excel; haciendo consultas en las hojas de Excel mediante un UserForm.

Esto facilitará la tarea del programador en Excel ya que la información lo podrá manipular
directamente desde UserForm quitando la dependencia que existe sobre las hojas de
Excel.

Veremos varios casos desarrollados demostrando cómo administrar los datos registrados
en una hoja de Excel.

» Caso Desarrollado 1: Consulta de datos simple


Implemente una aplicación que permita consultar los datos de los proveedores
registrados en una hoja de Excel, para lo cual deberá implementar un formulario que
solicite el código del proveedor y muestre todos sus datos, como notará en la imagen
hay algunos proveedores que no registran dirección, distrito o teléfono; en este caso
el formulario mostrará el mensaje «No registra» en los cuadros que corresponda,
asimismo debemos tener en cuenta los siguientes aspectos:

• Implemente el siguiente entorno para la hoja de Excel:

Fig. 8.1 Entorno de la hoja de Excel

147
Macros - Aplicaciones VBA con Excel

Fig. 8.2 Userform de consulta de datos de proveedores

• El ingreso del código del proveedor se puede dar en mayúsculas o minúsculas.


• Implemente el botón «Buscar» que permita buscar los datos de un determinado
proveedor según su código.

Pasos:

1. Diseñe el modelo de la aplicación tanto en la hoja de Excel como en el UserForm.


2. Asigne las respec vas propiedades a los siguientes controles:

(Name) frmProveedores
UserForm1
Cap on Formulario de búsqueda de datos
Label1 Cap on CONSULTA DE DATOS – PROVEEDORES
Label2 Cap on Código
Label3 Cap on Razón social
Label4 Cap on Dirección
Label5 Cap on Distrito
Label6 Cap on Teléfono
Label7 (Name) lblCodigo
TextBox1 (Name) txtCodigo
TextBox2 (Name) txtRazon
TextBox3 (Name) txtDireccion
TextBox4 (Name) txtDistrito
TextBox5 (Name) txtTelefono
(Name)  btnBuscar
CommandBu on1 Cap on   BUSCAR
Default True
(Name)  btnLimpiar
CommandBu on2
Cap on LIMPIAR
(Name)  btnSalir
CommandBu on3
Cap on SALIR
Frame1 Cap on Datos de la persona
148
Se
sió
8
n
Base de datos I

3. Implemente los siguientes códigos dentro del UserForm:

Private Sub btnBuscar_Click()


'Capturando el código a buscar
Dim codigo As String
codigo = Trim(txtCodigo.Text)

'Ubicando en el inicio de los códigos


Sheets("proveedores").Range("B5").Select

'Recorriendo por todos los codigos


Do
If ActiveCell.Value = UCase(codigo) Then
lblCodigo.Caption = ActiveCell.Value

If ActiveCell.Offset(0, 1).Value = "" Then


txtDireccion.Text = "No registra"
Else
txtDireccion.Text = ActiveCell.Offset(0, 1).Value
End If

If ActiveCell.Offset(0, 2).Value = "" Then


txtRazon.Text = "No registra"
Else
txtRazon.Text = ActiveCell.Offset(0, 2).Value
End If

If ActiveCell.Offset(0, 3).Value = "" Then


txtDistrito.Text = "No registra"
Else
txtDistrito.Text = ActiveCell.Offset(0, 3).Value
End If

If ActiveCell.Offset(0, 4).Value = "" Then


txtTelefono.Text = "No registra"
Else
txtTelefono.Text = ActiveCell.Offset(0, 4).Value
End If
Exit Sub
Else
Call limpiarControles
End If

'Mover el cursor una fila debajo


ActiveCell.Offset(1, 0).Select
'El ciclo termina cuando ya no encuentra códigos
Loop While ActiveCell.Value <> ""
End Sub

'Procedimiento que limpia los controles


Sub limpiarControles()
lblCodigo.Caption = ""
txtDireccion.Text = ""
txtRazon.Text = ""
txtDistrito.Text = ""
txtTelefono.Text = ""
txtCodigo.SetFocus
End Sub

149
Macros - Aplicaciones VBA con Excel

Private Sub btnLimpiar_Click()


Call limpiarControles
End Sub

Private Sub btnSalir_Click()


Unload Me
End Sub

4. Agregue un botón desde la ficha Desarrollador, seleccione Insertar > botón y asigne
el siguiente código:

Sub Botón1_Haga_clic_en()
frmProveedor.Show
End Sub

Luego, cambie el tulo del botón por «FORMULARIO DE BÚSQUEDA».

5. Pruebe la aplicación presionando sobre el botón FORMULARIO DE BÚSQUEDA.

» Caso Desarrollado 2: Consulta de datos usando un criterio


Implemente una aplicación que permita consultar los datos de los proveedores
registrados en una hoja de Excel, para lo cual deberá implementar un formulario donde
se pueda seleccionar el nombre del proveedor en un control de po ComboBox y
muestre todos sus datos mediante un botón de búsqueda, como notará en la imagen
hay algunos proveedores que no registran dirección, distrito o teléfono; en este caso,
el formulario mostrará el mensaje «No registra» en los cuadros que corresponda,
asimismo debemos tener en cuenta los siguientes aspectos:

• Implemente el siguiente entorno para la hoja de Excel:

Fig. 8.3 Entorno de la hoja de Excel

150
Se
sió
8
n
Base de datos I

• Implemente el siguiente UserForm:

Fig. 8.4 Userform de consulta de datos de proveedores

• Implemente el botón «Buscar» que permita buscar los datos de un determinado


proveedor a par r de su razón social.

Pasos:

1. Diseñe el modelo de la aplicación tanto en la hoja de Excel como en el UserForm.


2. Asigne las respec vas propiedades a los siguientes controles:

(Name) frmProveedor
UserForm1
Cap on Formulario de búsqueda de datos
Label1 Cap on CONSULTA DE DATOS – PROVEEDORES
Label2 Cap on Seleccione proveedor
Label3 Cap on Código
Label4 Cap on Razón social
Label5 Cap on Dirección
Label6 Cap on Distrito
Label7 Cap on Teléfono
Label8 (Name) lblCodigo
TextBox1 (Name) txtRazon
TextBox2 (Name) txtDireccion
TextBox3 (Name) txtDistrito
TextBox4 (Name) txtTelefono
(Name) btnBuscar
CommandBu on1 Cap on  BUSCAR
Default True
(Name) btnLimpiar
CommandBu on2
Cap on LIMPIAR
(Name) btnSalir
CommandBu on3
Cap on SALIR
Frame1 Cap on Datos del proveedor

151
Macros - Aplicaciones VBA con Excel

3. Implemente los siguientes códigos dentro del UserForm:

Private Sub btnBuscar_Click()


'Capturando el nombre del proveedor a buscar
Dim proveedor As String
proveedor = cboProveedor.Text

'Ubicando en el inicio de los proveedores


Sheets("proveedores").Range("C5").Select

'Recorriendo por todos los proveedores


Do
If ActiveCell.Value = proveedor Then
lblCodigo.Caption = ActiveCell.Offset(0, -1).Value

txtRazon.Text = ActiveCell.Value

If ActiveCell.Offset(0, 1).Value = "" Then


txtDireccion.Text = "No registra"
Else
txtDireccion.Text = ActiveCell.Offset(0, 1).Value
End If

If ActiveCell.Offset(0, 2).Value = "" Then


txtDistrito.Text = "No registra"
Else
txtDistrito.Text = ActiveCell.Offset(0, 2).Value
End If

If ActiveCell.Offset(0, 3).Value = "" Then


txtTelefono.Text = "No registra"
Else
txtTelefono.Text = ActiveCell.Offset(0, 3).Value
End If
End If

'Mover el cursor una fila debajo


ActiveCell.Offset(1, 0).Select

'El ciclo termina cuando ya no encuentra proveedores


Loop While ActiveCell.Value <> ""

Sheets("proveedores").Range("C5").Select
End Sub

'Procedimiento que limpia los controles


Sub limpiarControles()
lblCodigo.Caption = ""
txtDireccion.Text = ""
txtRazon.Text = ""
txtDistrito.Text = ""
txtTelefono.Text = ""
txtCodigo.SetFocus
End Sub

Private Sub btnLimpiar_Click()


Call limpiarControles
End Sub
Private Sub btnSalir_Click()
Unload Me
End Sub

152
Se
sió
8
n
Base de datos I

Private Sub UserForm_Activate()


Call llenaProveedores
End Sub

'Procedimiento que lista los proveedores


'dentro del control ComboBox
Sub llenaProveedores()
Worksheets("proveedores").Activate
Range("C5").Select

Do
cboProveedor.AddItem ActiveCell.Value
ActiveCell.Offset(1, 0).Select
Loop While ActiveCell.Value <> ""
Range("C5").Select
End Sub

4. Agregue un botón desde la ficha Desarrollador, seleccione Insertar > botón y asigne
el siguiente código:

Sub Botón1_Haga_clic_en()
frmProveedor.Show
End Sub

Luego, cambie el tulo del botón por «FORMULARIO DE BÚSQUEDA».

5. Pruebe la aplicación presionando sobre el botón FORMULARIO DE BÚSQUEDA.

» Caso Desarrollado 3: Consulta de datos usando dos criterios


Implemente una aplicación que permita consultar los datos de las ins tuciones
educa vas registrados en una hoja de Excel, para lo cual deberá implementar un
formulario donde se pueda seleccionar el nombre de la ins tución y basado en esta,
llenar el cuadro de modalidad. Una vez seleccionado ambos criterios se deberá mostrar
los datos de la ins tución mediante un botón de búsqueda, asimismo debemos tener
en cuenta los siguientes aspectos:

• Implemente el siguiente entorno para la hoja de Excel:

Fig. 8.5 Entorno de la hoja de Excel


153
Macros - Aplicaciones VBA con Excel

• Implemente el siguiente UserForm:

Fig. 8.6 Userform de consulta de datos según el nombre y


la modalidad de la ins tución

• Al seleccionar una ins tución educa va el cuadro combinado (Combobox) de la


modalidad solo mostrar las modalidad correspondientes a dicha ins tución.
• Implemente una función que valide la selección del nombre de la ins tución educa va
así como la modalidad emi endo un mensaje correspondiente.
• Implemente el botón «Búsqueda» que permita buscar los datos de una determinada
ins tución educa va a par r de su nombre y modalidad.

Pasos:

1. Diseñe el modelo de la aplicación tanto en la hoja de Excel como en el UserForm.


2. Asigne las siguientes propiedades a los siguientes controles:

(Name)  frmAlumnos
UserForm1
Cap on Listado de ins tuciones educa vas

Label1 Cap on LISTADO DE INSTITUCIONES EDUCATIVAS


Label2 Cap on Nombre de la IE
Label3 Cap on Modalidad
Label4 Cap on GESTIÓN/DEPENDENCIA
Label5 Cap on DIRECTOR
Label6 Cap on TELÉFONO

154
Se
sió
8
n
Base de datos I

Label7 Cap on CORREO


Label8 (Name) lblGes on
Label9 (Name) lblDirector
Label10 (Name) lblTelefono
Label11 (Name) lblCorreo
ComboBox1 (Name) cboNombre
ComboBox2 (Name) cboModalidad

(Name) btnBuscar
CommandBu on1 Cap on  BÚSQUEDA
Default True

(Name)  btnLimpiar
CommandBu on2
Cap on LIMPIAR

(Name)  btnSalir
CommandBu on3
Cap on SALIR

Frame1 Cap on Datos de la ins tución

3. Implemente los siguientes códigos dentro del UserForm:

Private Sub btnBuscar_Click()


If valida = "" Then
Dim institucion As String, modalidad As String
institución = cboNombre.Text
modalidad = cboModalidad.Text

'Ubicando en el inicio de los colegios


Sheets("Instituciones").Range("B5").Select

'Recorriendo por todos los proveedores


Do
If ActiveCell.Value = institucion
And ActiveCell.Offset(0, 1).Value = modalidad Then
lblGestion.Caption = ActiveCell.Offset(0, 2).Value
lblDirector.Caption = ActiveCell.Offset(0, 3).Value
lblTelefono.Caption = ActiveCell.Offset(0, 4).Value
lblCorreo.Caption = ActiveCell.Offset(0, 5).Value
End If

ActiveCell.Offset(1, 0).Select
Loop While ActiveCell.Value <> ""
Range("B5").Activate
Else
MsgBox "El error se encuentra en " & valida
End If
End Sub

Private Sub cboNombre_Change()

155
Macros - Aplicaciones VBA con Excel

Call buscaModalidad(cboNombre.Text)
End Sub

'Procedimiento que busca la modalidad según


'la institución buscada
Sub buscaModalidad(ByVal institución As String)
cboModalidad.Clear

'Ubicando en el inicio de los colegios


Sheets("Instituciones").Range("B5").Select

'Recorriendo por todos los proveedores


Do
If ActiveCell.Value = institucion Then
cboModalidad.AddItem ActiveCell.Offset(0, 1).Value
End If

ActiveCell.Offset(1, 0).Select
Loop While ActiveCell.Value <> ""
Range("B5").Activate
cboModalidad.Text = "(Seleccione la modalidad)"
End Sub

Private Sub UserForm_Activate()


'Eliminar el parpadeo habitual de búsqueda
Application.ScreenUpdating = False
Call ordenaxNombre
Call llenaColegios
End Sub

Sub llenaColegios()
'Ubicando en el inicio de los colegios
Sheets("Instituciones").Range("B5").Select

'Recorriendo por todos los proveedores


E = ""
Do
If ActiveCell.Value <> E Then
cboNombre.AddItem ActiveCell.Value
End If

E = ActiveCell.Value
ActiveCell.Offset(1, 0).Select

Loop While ActiveCell.Value <> ""


Range("B5").Activate
cboNombre.Text = "(Seleccione nombre de la institución)"
End Sub

'Ordena en forma ascendente los registros de instituciones


Sub ordenaxNombre()
Range("B5").Select
ActiveWorkbook.Worksheets("Instituciones").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Instituciones")
.Sort.SortFields.Add Key:=Range( _
"B5"),SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _xlSortNormal

With ActiveWorkbook.Worksheets("Instituciones").Sort
.SetRange Range("B5:G10278")

156
Se
sió
8
n
Base de datos I

.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub

Function valida() As String


If cboNombre.ListIndex = -1 Then
valida = "nombre de la institución"
ElseIf cboModalidad.ListIndex = -1 Then
valida = "modalidad de la institución"
Else
valida = ""
End If
End Function

4. Agregue un botón desde la ficha Desarrollador, seleccione Insertar > botón y asigne
el siguiente código:
Sub Botón1_Haga_clic_en()
frmAlumnos.Show
End Sub

Luego, cambie el tulo del botón por «FORMULARIO DE BÚSQUEDA».

5. Pruebe la aplicación presionando sobre el botón FORMULARIO DE BÚSQUEDA.

» Caso Desarrollado 4: Consulta de datos por la inicial de una palabra


Implemente una aplicación que permita consultar los datos de las ins tuciones
educa vas registradas en una hoja de Excel, para lo cual deberá implementar un
formulario donde se pueda seleccionar la inicial del nombre de la ins tución y basado
en esta, llene los cuadros de lista con todos los datos de la ins tución educa va;
asimismo debemos tener en cuenta los siguientes aspectos:

• Implemente el siguiente entorno para la hoja de Excel:

Fig. 8.7 Entorno de la hoja de Excel

157
Macros - Aplicaciones VBA con Excel

• Implemente el siguiente UserForm:

Fig. 8.8 Userform de consulta de datos según la letra inicial del nombre de la ins tución.

• Al seleccionar una letra desde el control se deberán mostrar todos los datos en las
listas correspondientes; por cada búsqueda que se realice las listas deben encontrarse
limpias para no sobrecargar de información.
• Implemente una función que valide la selección de la letra inicial del nombre de la
ins tución educa va emi endo un mensaje correspondiente.

Pasos:

1. Diseñe el modelo de la aplicación tanto en la hoja de Excel como en el UserForm.


2. Asigne las siguientes propiedades a los siguientes controles:

(Name)  frmAlumnos
UserForm1
Cap on Listado de ins tuciones educa vas
Label1 Cap on LISTADO DE INSTITUCIONES EDUCATIVAS
Label2 Cap on SELECCIONE LETRA O NÚMERO INICIAL
ListBox1 (Name) lstIns tucion
ListBox2 (Name) lstNivel
ListBox3 (Name) lstGes on
ListBox4 (Name) lstDirector
ListBox5 (Name) lstTelefono
ListBox6 (Name) lstCorreo
ComboBox1 (Name) cboLetra
(Name) btnLimpiar
CommandBu on1
Cap on LIMPIAR
(Name) btnSalir
CommandBu on2
Cap on SALIR
Frame1 Cap on Datos de la ins tución
158
Se
sió
8
n
Base de datos I

3. Implemente los siguientes códigos dentro del UserForm:

Private Sub cboLetra_Change()


Call limpiaListas
If valida = "" Then
Dim letra As String
letra = cboLetra.Text

'Ubicando en el inicio de los colegios


Sheets("Instituciones").Range("B5").Select

'Recorriendo por todos los colegios


Do
If Left(ActiveCell.Value, 1) = letra Then
lstInstitucion.AddItem ActiveCell.Value
lstNivel.AddItem ActiveCell.Offset(0, 1).Value
lstGestion.AddItem ActiveCell.Offset(0, 2).Value
lstDirector.AddItem ActiveCell.Offset(0, 3).Value
lstTelefono.AddItem ActiveCell.Offset(0, 4).Value
lstCorreo.AddItem ActiveCell.Offset(0, 5).Value
End If

ActiveCell.Offset(1, 0).Select
Loop While ActiveCell.Value <> ""
Range("B5").Activate
Else
MsgBox "El error se encuentra en " & valida
End If
End Sub

Private Sub UserForm_Activate()


Call llenaLetras
End Sub

'Procedimiento que llena las letras en el control


'de tipo ComboBox
Sub llenaLetras()
For i = 49 To 57
cboLetra.AddItem Chr(i)
Next
For i = 65 To 90
cboLetra.AddItem Chr(i)
Next
End Sub

'Función que valida la selección de una letra


Function valida() As String
If cboLetra.ListIndex = -1 Then
valida = "letra seleccionada"
Else
valida = ""
End If
End Function

'Procedimiento que limpia todos los controles


Sub limpiaListas()
lstInstitucion.Clear
lstCorreo.Clear

159
Macros - Aplicaciones VBA con Excel

lstNivel.Clear
lstDirector.Clear
lstTelefono.Clear
lstGestion.Clear
End Sub

4. Agregue un botón desde la ficha Desarrollador, seleccione Insertar > botón y asigne
el siguiente código:

Sub Botón1_Haga_clic_en()
frmAlumnos.Show
End Sub

Luego, cambie el tulo del botón por «FORMULARIO DE BÚSQUEDA».

5. Pruebe la aplicación presionando sobre el botón FORMULARIO DE BÚSQUEDA.

160
Base de datos II Sesión

9
9.1 Introducción
En este capítulo veremos el manejo de información cuya fuente de datos sea Microso
Access el cual será usado como sistema de ges ón de base de datos. Para lograr obtener
información desde Access debemos integrarlo con Excel mediante una cadena de
conexión.

Desarrollaremos casos prác cos que permitan ampliar los conocimientos que tenemos
de la obtención de información, ya que hasta el capítulo anterior estudiamos cómo
obtener información de la misma hoja de Excel; el cual presentaba algunas limitaciones
con respecto a los empos de búsqueda de información.

A diferencia de Excel, Access administra de mejor manera la información por medio de


tablas asociadas entre sí. Para todos los casos expuestos en este capítulo usaremos la
base de datos PESCA2016 el cual cuenta con las siguientes tablas:

Fig. 9.1 Relaciones de las tablas en Access de la base de datos Faena

161
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

Los casos desarrollados usarán las siguientes tablas:

Tabla: TB_BARCO

Tabla: TB_EMPLEADO

162
Se
sió
9
n
Base de datos II

Tabla: TB_FAENA

9.2 Sentencia SELECT


La sentencia Select permite filtrar datos desde un conjunto de datos. Presenta el siguiente
formato:

SELECT ListaCampos
[ FROM Tabla ]
[ WHERE Condición ]
[ ORDER BY [ASC|DESC]]

Donde:

• Select: Indica el inicio de la sentencia.


• ListaCampos: Se especifican los campos o columnas de la tabla.
• From Tabla: Se especifica el nombre de la tabla de donde obtendremos los datos.
• Where condición: Se especifica la condición de filtrado desde los registros.
• Order By ASC|DESC: Se especifica el orden de los registros ASC define la ascendencia y
DESC la descendencia.

Veamos algunos casos del uso de la sentencia SELECT.

9.2.1 Listado simple


• Liste todos los campos de la tabla TB_BARCO.
Select * From TB_BARCO

163
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

• Listar las campos código, nombre y fecha de compra del barco:

SELECT COD_BAR, NOM_BAR, FEC_COM FROM TB_BARCO

• Listar los años de compra de los barcos:

SELECT YEAR(FEC_COM) FROM TB_BARCO

9.2.2 Listado ordenado


• Liste todos los campos de la tabla TB_EMPLEADO ordenados de forma ascendente
por el campo apellido paterno.

SELECT * FROM TB_EMPLEADO ORDER BY APE_PAT ASC

• Liste todos los campos de la tabla TB_EMPLEADO ordenados de forma descendente


por el campo fecha de ingreso.

SELECT * FROM TB_EMPLEADO ORDER BY FEC_NAC DESC

• Liste todos los campos de la tabla TB_EMPLEADO ordenados de forma ascendente


por el año obtenido desde la fecha de nacimiento.

SELECT YEAR(FEC_NAC) FROM TB_EMPLEADO ORDER BY 1 ASC

• Liste todos los campos de la tabla TB_EMPLEADO ordenados de forma descendente


por el campo haber básico y ante la igualdad por el código de forma ascendente.

SELECT * FROM TB_EMPLEADO ORDER BY HAB_BAS DESC, COD_EMP ASC

9.2.3 Listado sin repetir valores


• Liste los códigos de los barcos que par cipan en la faena sin repe rse.

SELECT DISTINCT COD_BAR FROM TB_FAENA

• Liste los años obtenidos desde la fecha de inicio de la faena, ordenados de formar
descendente y sin repe rse.

SELECT DISTINCT YEAR(FEC_INI) FROM TB_FAENA ORDER BY 1 DESC

9.2.4 Listado de registros topes


• Liste los tres primeros barcos registrados.
SELECT TOP 3 * FROM TB_BARCO

164
Se
sió
9
n
Base de datos II

• Liste los cinco primeros barcos que enen la menor capacidad de pasajeros.

SELECT TOP 5 * FROM TB_BARCO ORDER BY CAP_BAR ASC

9.2.5 Listado por condición


• Liste toda la información referente a la faena F02.

SELECT * FROM TB_FAENA WHERE NUM_FAE='F02'

• Liste todas las faenas cuya zona marí ma sea sur(S) o norte(N).

SELECT * FROM TB_FAENA WHERE ZON_MAR='S' OR ZON_MAR='N'

• Liste todas las faenas cuyo año obtenido desde la fecha de inicio sea 1997.

SELECT * FROM TB_FAENA WHERE YEAR(FEC_INI)=1997

• Liste todas las faenas cuyo código de barco sea B03 de la zona marí ma sur.

SELECT * FROM TB_FAENA WHERE COD_BAR='B03' AND ZON_MAR='S'

9.3 Agregar una referencia de acceso a Access


Para conectarse a una base de datos de Access necesitamos agregar la siguiente referencia:

• Ingrese al entorno VBA <ALT+F11>


• Desde el menú Herramientas > Referencias…
• Y ac ve el check MicrosoŌ AcƟveX Data Objects 2.7 Library, tal como se muestra en
la siguiente imagen:

Fig. 9.2 Referencias del entorno VBA


165
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

» Caso desarrollado 1: Listado de barcos


Implemente una aplicación que permita listar los registros de la tabla BARCOS obtenidos
de la base de datos PESCA2016; 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 llamada
Pesca2016.accdb y el propio archivo de Excel, de tal forma que tenga el siguiente
aspecto:

Fig. 9.3 Contenido de la carpeta Capítulo 9

• 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. 9.4 Listado de barcos

166
Se
sió
9
n
Base de datos II

• 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 & "\" & "Pesca2016.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 barcos


Sub listaBarcos()
Call LimpiaCeldas
cn = getConecta()
cn.Open

Dim rs As New ADODB.Recordset


rs.Open "SELECT * FROM TB_BARCO", cn
Worksheets(1).Cells(7, 2).CopyFromRecordset rs
rs.Close
cn.Close
End Sub

• Finalmente, asocie el botón «LISTADO DE BARCOS» al procedimiento listaBarcos y el


botón «LIMPIAR CELDAS» al procedimiento LimpiaCeldas.

» Caso desarrollado 2: Listado de empleados ordenados


Implemente una aplicación que permita listar los registros de la tabla EMPLEADOS
obtenidos de la base de datos PESCA2016; 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 llamada Pesca2016.accdb
y el propio archivo de Excel, de
tal forma que tenga el siguiente
aspecto:

Fig. 9.5 Contenido de la carpeta Capítulo 9

167
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

• 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. 9.6 Listado de empleados

• 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 & "\" & "PESCA2016.accdb"
getConecta = cn
End Function

'Procedimiento que limpia el contenido de las celdas


Sub LimpiaCeldas()
Sheets(1).Range("B7:I1000").ClearContents
End Sub

'Procedimiento que lista los empleados


Sub listaEmpleados()
Call LimpiaCeldas
cn = getConecta()
cn.Open

Dim rs As New ADODB.Recordset


rs.Open "SELECT COD_EMP,
NOM_EMP+SPACE(1)+APE_PAT+SPACE(1)+APE_MAT,

168
Se
sió
9
n
Base de datos II

FEC_NAC,FEC_ING,LIB_ELE,EST_CIVIL,HAB_BAS,COD_BAR
FROM TB_EMPLEADO", cn
Worksheets(1).Cells(7, 2).CopyFromRecordset rs
rs.Close
cn.Close
End Sub

'Procedimiento que lista los empleados ordenado por sus nombres


'de forma ascendente
Sub listaEmpleadoAscendente()
Call LimpiaCeldas
cn = getConecta()
cn.Open

Dim rs As New ADODB.Recordset


rs.Open "SELECT COD_EMP,
NOM_EMP+SPACE(1)+APE_PAT+SPACE(1)+APE_MAT,
FEC_NAC,FEC_ING,LIB_ELE,EST_CIVIL,HAB_BAS,COD_BAR
FROM TB_EMPLEADO Order By NOM_EMP Asc", cn
Worksheets(1).Cells(7, 2).CopyFromRecordset rs
rs.Close
cn.Close
End Sub

'Procedimiento que lista los empleados ordenado por sus nombres


'de forma descendente
Sub listaEmpleadoDescendente()
Call LimpiaCeldas
cn = getConecta()
cn.Open

Dim rs As New ADODB.Recordset


rs.Open "SELECT COD_EMP,
NOM_EMP+SPACE(1)+APE_PAT+SPACE(1)+APE_MAT,
FEC_NAC,FEC_ING,LIB_ELE,EST_CIVIL,HAB_BAS,COD_BAR
FROM TB_EMPLEADO Order By NOM_EMP Desc", cn
Worksheets(1).Cells(7, 2).CopyFromRecordset rs
rs.Close
cn.Close
End Sub

• Finalmente, asocie todos los botones mostrados en la hoja de Excel a los


procedimientos implementados en el módulo del proyecto VBA.

169
Retoque
Macros
fotográfico
- Aplicaciones
con Photoshop
VBA con Excel

» Caso desarrollado 3: Listado de barcos filtrado por el año de compra


Implemente una aplicación que permita listar los registros de la tabla BARCO a par r
del año de compra; en un control ComboBox deberá seleccionar el año y en la hoja de
Excel deberá mostrar los barcos cuyo año de compra sea el seleccionado.

Debe tener en cuenta los siguientes aspectos:

• Debemos contar con una carpeta que


contenga la base de datos de Access
llamada Pesca2016.accdb y el propio
archivo de Excel, de tal forma que
tenga el siguiente aspecto:

Fig. 9.7 Contenido de la carpeta Capítulo 9

• Agregue la referencia MicrosoŌ AcƟveX Data Objects 2.7 Library al proyecto, desde
el entorno VBA.
• Implemente el siguiente UserForm:

Fig. 9.8 UserForm que selecciona los años de compra

• Implemente el siguiente modelo de hoja de Excel:

170
Se
sió
9
n
Base de datos II

• Implemente el siguiente código en un módulo agregado al proyecto desde el entorno VBA:

'Variables globales
Dim cn As New ADODB.Connection

Private Sub btnTodos_Click()


cn = getConecta()
cn.Open

Dim rs As New ADODB.Recordset

'Llenando el control ComboBox


rs.Open "Select * from TB_BARCO", cn
Worksheets(1).Cells(7, 2).CopyFromRecordset rs
rs.Close
cn.Close
End Sub

Private Sub cboAños_Change()


Call LimpiaCeldas
cn = getConecta()
cn.Open

Dim rs As New ADODB.Recordset


rs.Open "SELECT * FROM TB_BARCO WHERE YEAR(FEC_COM)="
& cboAños.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 YEAR(FEC_COM) As Año
from TB_BARCO", 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 & "\" & "PESCA2016.accdb"
getConecta = cn
End Function

'Procedimiento que limpia el contenido de las celdas


Sub LimpiaCeldas()
Sheets(1).Range("B7:F1000").ClearContents
End Sub

• Finalmente, asocie el botón «FORMULARIO DE CONSULTA» mostrado en la hoja de


Excel al UserForm frmAños.
171
BIBLIOGRAFÍA
Shepherd, Richard. (2010). Excel 2007 VBA Macro Programming. EE.UU.: McGraw-Hill.

Perry, Gail. (2009). Macros Made EASY. EE.UU.: McGraw-Hill.

Katz, Abbo . (2011). Excel 2010 Made Simple. EE.UU.: Apress.


Impreso en los talleres gráficos de

EDITORIAL

También podría gustarte