Aplicaciones VBA con Excel

345 Pages • 51,250 Words • PDF • 8.6 MB
Uploaded at 2021-09-24 17:06

This document was submitted by our user and they confirm that they have the consent to share it. Assuming that you are writer or own the copyright of this document, report to us by using this DMCA report button.


Aplicaciones

VBA Excel con

Fundamentos de programación en VBA Funciones VBA Gestión de errores Estructuras condicionales y repetitivas Manejo de base de datos

EDITORIAL

Descargado en: ey books.co m

Aplicaciones

VBA con

Excel

EDITORIAL

España - México - Colombia - Chile - Ecuador - Perú - Bolivia - Uruguay - Guatemala - Costa Rica

Aplicaciones VBA con Excel Autor: Manuel Torres Remon © Derechos de autor registrados: Empresa Editora Macro EIRL © Derechos de edición, arte gráco y diagramación reservados: Empresa Editora Macro EIRL Jefe de edición: Cynthia Arestegui Baca Coordinación de edición: Magaly Ramon Quiroz Diseño de portada: Darío Alegría Vargas Corrección de eslo: José Vásquez Espíritu Diagramación: Lizbeth R. Eufracio Quispe Edición a cargo de: © Empresa Editora Macro EIRL 

 Teléfono: (511) 748 0560 *

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

Primera edición: marzo de 2016

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

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

Manuel Ángel Torres Remon   Lima, Perú.  cialmente en las materias de Programación, Base de Datos y Análisis de Sistemas. Ha publicado libros sobre programación como Fundamentos de programación con Visual Basic 2012, Programación orientada a objetos con Visual Basic 2012, Programación Transact con SQL Server 2012. También es autor de los libros Diseño web con HTML5 y CSS3, Desarrollo de aplicaciones web con PHP y Desarrollo de aplicaciones web con PHP y MySQL. Para cualquier duda o consulta sobre este material, puede escribir al siguiente correo: [email protected].

Agradecimientos Escuché alguna vez la frase: “La lectura de un libro enriquece de conocimientos y empo personas que cargan un libro en la mano, debido a que este ha sido reemplazado por los    na para el desarrollo del libro Aplicaciones VBA con Excel.   

Dedicatoria Este libro está dedicado con mucho cariño y aprecio  que son y seguirán siendo mi fuente de inspiración; también deseo agradecer a mi eterna compañera, Luz, por comprenderme en todo lo que me propongo

ÍNDICE Introducción ................................................................................................................ 15 CAPÍTULO 1 Introducción al VBA 1.1 Introducción ................................................... ..................................................... 17 1.2 Denición de VBA ............................................................................................... 18 1.3 Comparando VB con VBA ................................................................................... 18 1.4 Macros y su relación con VBA............................................................................. 19 1.5 La cha Desarrollador de Excel ........................................................................... 20  ...................................................................... 20 1.5.2 Principales botones...................................................................................... 21 1.6 Modos de Acceso al VBA .................................................................................... 22 1.7 Personalizar la seguridad de la macro ............................................................... 22 1.8. Grabar una aplicación VBA ................................................................................ 23 1.9 Descripción del editor VBA ................................................................................ 24 1.9.1 Barra de herramientas estándar ................................................................. 24 1.9.2 Operaciones desde la barra de herramienta estándar............................... 25 1.10 El explorador de proyectos ............................................................................... 25 1.11 La ventana Propiedades .................................................................................... 26 1.12 La ventana de código ........................................................................................ 27 1.13 Modelo de objetos de Excel ............................................................................. 28 1.14 Objeto Applicaon ........................................................................................... 29 .................................................................................................... 29  ................................................................................................ 30  ............................................................................................ 31 ......................................................................................... 32  ....................................................................................................... 32

 ..................................................................................................... 32 ............................................................................................. 33 1.14.8 Visible ......................................................................................................... 34  ....................................................................................... 34 1.14.10 DisplayFormulaBar ................................................................................... 35 1.14.11 DisplayFullScreen ..................................................................................... 35 1.14.12 Quit ........................................................................................................... 36 1.14.13 OnTime ..................................................................................................... 36 1.15 El objeto WorkBook .......................................................................................... 38 1.15.1 Count .......................................................................................................... 38 1.15.2 Name .......................................................................................................... 38 1.15.3 Path ............................................................................................................ 38 1.15.4 Open ........................................................................................................... 39 1.15.5 Add ............................................................................................................. 39  ...................................................................................................... 39 1.15.7 Close ...........................................................................................................40 1.15.8 Save ............................................................................................................ 40 1.15.9 Save As ....................................................................................................... 41 1.15.10 SaveCopyAs .............................................................................................. 42 1.16 El objeto WorkSheets ........................................................................................ 43 1.16.1 Count .......................................................................................................... 43 1.16.2 Name .......................................................................................................... 43 1.16.3 Next ............................................................................................................44 1.16.4 Previous ...................................................................................................... 44 1.16.5 Index ........................................................................................................... 45  ....................................................................................................... 45 1.16.7 Add .............................................................................................................. 46 1.16.8 Delete .........................................................................................................48 1.17 El objeto Range ................................................................................................. 49 1.17.1 Address ....................................................................................................... 49 1.17.2 Cells ............................................................................................................. 49 1.17.3 End .............................................................................................................. 49 1.17.4 Formula ....................................................................................................... 51 1.17.5 FormulaLocal .............................................................................................. 52 1.17.6 FormulaR1C1............................................................................................... 53 1.17.7 Value ........................................................................................................... 55

 ...................................................................................................... 56 1.17.9 Clear ........................................................................................................... 57 1.17.10 ClearContents .......................................................................................... 57 1.17.11 Delete ........................................................................................................ 57 1.17.12 Calculate .................................................................................................. 58 1.18 El objeto Cells .................................................................................................... 58 1.19 Listado de funciones VBA ................................................................................. 59 1.20 Casos desarrollados ......................................................................................... 70 Caso desarrollado 1: Macro para formato de dólares ......................................... 70 Caso desarrollado 2: Macro para formato de texto ............................................. 72 Caso desarrollado 3: Macro para determinar las horas de recorrido de un conductor ............................................................................................................... 76 Caso desarrollado 4: Cerrar un libro guardando los cambios .............................. 78 Caso desarrollado 5: Cerrar un libro sin guardar los cambios.............................. 80 Caso desarrollado 6: Abrir un libro de solo lectura .............................................. 81 .............................................. 82 Caso desarrollado 8: Crear una copia de un libro ................................................ 84  ....................... 85  ........................... 88  ............................................................................. 91 ............................................................ 94 Caso desarrollado 13: Next-Previous .................................................................. 96 Caso desarrollado 14: Open................................................................................... 99

CAPÍTULO 2 Fundamentos de programación 2.1 Fases para la solución de un programa.............................................................101 2.1.1 Fase 1: Análisis del problema..................................................................... 102 2.1.2 Fase 2: Diseño del algoritmo...................................................................... 104  ........................................... 106 2.1.4 Fase 4: Ejecución del programa en VBA .................................................... 108  ............................................................. 108 2.2 Elementos de un programa VBA .......................................................................109 ........................................................................................... 109 2.2.2 Palabras reservadas ................................................................................... 110 2.2.3 Comentarios .............................................................................................. 110

2.3 Tipos de datos .................................................................................................. 111 2.3.1 Enteros........................................................................................................ 111 2.3.2 Reales ......................................................................................................... 112 2.3.3 Caracteres y cadenas ................................................................................ 112 2.3.4 Lógicos........................................................................................................ 113 2.3.5 Fechas......................................................................................................... 113 2.3.6 Variante ...................................................................................................... 113 2.4 Constantes ........................................................................................................113 2.5 Variables .......................................................................................................... 114 2.6 Operadores ......................................................................................................118 2.6.1 Asignación ................................................................................................. 118  ................................................................................................. 119 2.6.3 Relacionales ............................................................................................... 120 2.6.4 Lógicos ....................................................................................................... 121 2.6.5 Incremento y decremento ......................................................................... 122 2.6.6 Orden de prioridad .................................................................................... 122 2.6.7 Expresiones ................................................................................................ 123 2.7 Conversiones de po ........................................................................................ 123 2.7.1 Implícita .....................................................................................................123 2.7.2 Reglas .......................................................................................................... 124 2.7.3 Explícita ......................................................................................................125 2.8 Mensajes en VBA .............................................................................................. 126 2.9 Ingreso de valor con la función InputBox .........................................................129 2.10 Ingreso de valor con el método InputBox .......................................................130 2.11 Ámbito o alcance de las variables .................................................................. 131 2.12 Funciones denidas por el usuario ................................................................ 132 2.12.1 Formato para la implementación de una función sin parámetros......... 133 2.12.2 Formato para la implementación de una función con parámetros........ 135 2.12.3 Formato para invocar una función con parámetros o sin ellos .............. 136 2.13 Procedimientos ............................................................................................... 136 2.13.1 Formato para la implementación de un procedimiento sin parámetros.. 137 2.13.2 Formato para la implementación de un procedimiento con parámetros..138 2.13.3 Formato para invocar un procedimiento con parámetros o sin ellos.... 139 2.14 Casos desarrollados ........................................................................................ 139 Caso desarrollado 1: Guardería ........................................................................... 139 Caso desarrollado 2: Estudios universitarios ...................................................... 141

 ................... 144  ................................ 146              empleado.............................................................................................................. 148  ........................ 151  ............................. 153 ........................... 155 ................. 158 2.15 Casos propuestos ............................................................................................ 161 Caso propuesto 1: Fase de análisis del problema: Ferrocarril............................ 161 Caso propuesto 2: Fase de análisis del problema: Turistas................................. 161 Caso propuesto 3: Fase de análisis del problema: Inversión de negocio........... 162  ........................................................ 163 ......... 163 Caso propuesto 6: Financiamiento ...................................................................... 163 Caso propuesto 7: Tienda comercial ................................................................... 164

CAPÍTULO 3 UserForm y objetos visuales 3.1 UserForm .......................................................................................................... 165 3.2 Administración de UserForm en VBA ............................................................... 166 ................................................................................. 166  ........................................................... 167  ............................................................................... 167  ................................................................................ 168 3.2.5 Asociar el formulario a la hoja de Excel .................................................... 168 3.3 Tiempos en la programación ........................................................................... 170 3.3.1 Tiempo de diseño....................................................................................... 170 3.3.2 Tiempo de ejecución ................................................................................. 171 ................................................... 171 3.4 Nomenclatura de nombres a objetos .............................................................. 171 3.5 Principales controles visuales y sus propiedades ............................................. 172 ....................................................................................... 172 3.5.2 Control Label ............................................................................................ 175 3.5.3 Control TextBox ........................................................................................ 177  ......................................................................... 180

3.5.5 Control ListBox ........................................................................................... 181 3.5.6 Control ComboBox ..................................................................................... 183 3.5.7 Control Frame ............................................................................................184  ................................................................................184  ....................................................................................... 185 3.5.10 Control de imagen .................................................................................... 186 3.6 Agregar los controles visuales al UserForm ...................................................... 187 3.7 Ventana de Código ............................................................................................ 187 3.8 Casos desarrollados .........................................................................................188 Caso desarrollado 1: Control de registro de usuarios......................................... 188 Caso desarrollado 2: Registro de pago a vendedores......................................... 195

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

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

CAPÍTULO 6 Estructuras condicionales 6.1 Introducción .....................................................................................................223 6.2 Implementación de una condición .................................................................. 224 6.3 Estructura If simple ........................................................................................... 225 6.4 Estructura If doble ............................................................................................ 226 6.5 Estructura If doblemente encadenada ............................................................. 227

6.6 Estructura de selección múlple Select-Case...................................................228 6.7 Casos desarrollados .........................................................................................230 Caso desarrollado 1: If simple - Registro de personal.........................................230 Caso desarrollado 2: If simple - Registro de venta de productos...................... 234 Caso desarrollado 3: If doble - Boleta de Venta.................................................238 Caso desarrollado 4: If doblemente encadenado - Boleta de pago.................. 242 Caso desarrollado 5: Select Case - Control de viajes ......................................... 246 Caso desarrollado 6: Validación - Venta de productos......................................250

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

CAPÍTULO 8 Base de datos 8.1 Introducción ................................................... ...................................................293 Caso desarrollado 1: Consulta de datos desde la hoja de Excel (Agenda de clientes) ................................................................................................................293 Caso desarrollado 2: Listado de clientes por distrito (Agenda de clientes) ....... 297 Caso desarrollado 3: Listado de clientes por letra inicial de su apellido paterno (Agenda de clientes).............................................................................................301 8.2 Recuperación de datos mediante la sentencia SELECT de SQL ........................309 8.2.1 Agregar una referencia.............................................................................. 311

8.3 Listado de registros simple ............................................................................... 312 Caso desarrollado 1: Listado de clientes ............................................................. 312 Caso desarrollado 2: Listado de productos......................................................... 313 8.4 Listado de registros usando alias...................................................................... 315 Caso desarrollado: Listado de facturas ............................................................... 315 8.5 Listado de registros especicando campos ...................................................... 317 ........................... 317 8.6 Listado de registros ordenados ........................................................................ 319 Caso desarrollado 1: Listado de clientes ordenados .......................................... 319  ............................ 321 8.7 Listado de los primeros registros ..................................................................... 324  ........................ 324 8.8 Listado de registros sin reper valores ............................................................ 327  ........................... 328 8.9 Listado de registros condicionados ..................................................................330  ......... 331 .......... 333 Caso desarrollado 3: Mantenimiento de productos ........................................... 338 Bibliograa ............................................................................................................... 343

Introducción El libro Aplicaciones VBA con Excel le ayudará a crear aplicaciones comunes usando el lenguaje VBA de Excel. tribuidos de la siguiente manera: En el capítulo uno hacemos una introducción a los objetos VBA de Excel, empleando  Asimismo, en el capítulo dos mencionamos y desarrollamos todos los elementos necesarios para implementar una aplicación en VBA. Para esto exponemos casos desarrollados y  que le ayudará a comprender los demás capítulos.   propiedades. En el capítulo cinco, hacemos una breve explicación de cómo debe tratarse los errores en  En el capítulo seis, explicaremos cómo se implementan las estructuras condicionales usando la sentencia If y Select, mostrando casos desarrollados.           hoja de Excel. Finalmente, en el capítulo ocho, hacemos uso de las bases de datos de Access y del propio Excel para implementar aplicaciones complejas con datos masivos.

Cap. Introducción al VBA

1

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

1.1 Introducción bajos de manipulación, análisis y presentación de datos. Ha pasado de ser una aplicación  así que hoy en día no solo lo usan personas de una determinada profesión; lo usa cualquiera que necesite administrar de manera correcta su información. do todas las fórmulas, funciones y demás acciones que realice bajo Excel en realidad son ejecutadas mediante código que no es visible por el usuario. A veces, a pesar de las amplias capacidades que ofrece Excel, el usuario siente que en  sonal del cual dependen cuarenta sueldos de los trabajadores de un pequeña empresa, y que solo usted conoce el manejo de dicha planilla; hasta aquí todo parece estar bien; ahora suponga el caso de que usted viajara a otro país y no puede manipular la información fuera de la empresa; por lo tanto, deja encargado a su secretaria la manipulación de la planilla; le pregunto: ¿usted viajaría tranquilo? Si cambiamos el escenario a una aplicación VBA de control de planilla, en la cual solo permita ingresar valores correctos y emita mensajes cuando lo necesite, cambiaría la situación, pues se sabe que cualquier personal autorizado podría usar dicha aplicación. De eso trata VBA, de brindar la posibilidad de ampliar dichas aplicaciones realizadas en Excel y pasarlas algo así como a un sistema; por supuesto, bajo el entorno Excel. Muchos conceptos nuevos que veremos en este material serán explicados conforme va           básica entendible.

18

Aplicaciones VBA con Excel

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

1.2 Definición de VBA Las iniciales VBA proviene del inglés Visual Basic for Applicaons, el cual podemos entenderlo como «aplicaciones para Visual Basic», es un entorno de desarrollo que se encuen Asimismo, VBA funciona mediante la ejecución de macros, estos permiten realizar en un objeto de Excel un conjunto de instrucciones llamado código, es decir, podrían estar sobre una hoja, libro, celda, etc.  de VBA. Imagine usted una hoja de Excel con diez mil registros en la cual quiera generar  o función de Excel usaría? Seguro está pensando en usar las funciones de base de datos                 

1.3 Comparando VB con VBA guaje es considerado un dialecto de BASIC. Basic es un lenguaje de programación de alto nivel, es decir, puede ser desarrollado de manera sencilla y entendible, además cuenta con un entorno de desarrollo integrado el cual permite crear un ambiente de programa aplicaciones independientes de su entorno; quiere decir, una aplicación desarrollada en Visual Basic puede ser ejecutada como un archivo independiente o como un archivo ejecutable. En cambio, Visual Basic Aplicaciones (VBA) es considerado como un lenguaje de progra              abarcaremos la acogida en Excel por ser uno de las aplicaciones más usadas por los profesionales.

Cap.1: Introducción al VBA

19

 realizarlo dentro de Excel», y que el resultado de la aplicación puede mostrarse directamente en la aplicación o en una hoja de Excel, pero no fuera de su entorno.  copiar los códigos en ambos y no notar la diferencia. Veamos un formulario en común de ambas aplicaciones:

Fig. 1.1 Formulario desarrollado en VBA

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

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

20

Aplicaciones VBA con Excel

Fig. 1.2 Macros y su relación con VBA

Observamos que, desde la hoja de Excel, se invoca a un formulario de registro de planilla  en Excel por medio del botón Grabar Información.

1.5 La ficha Desarrollador de Excel  en una hoja de Excel y principalmente el control de las macros, es por ello importante conocer los elementos que lo componen: 1.5.1 Activar la ficha Desarrollador Desarrollador vemos en la siguiente imagen:

Fig. 1.3 Cinta de opciones de Excel inicial

Cap.1: Introducción al VBA

21

Desarrollador: 1. Haga clic en el botón Archivo de la cinta de opciones de Excel. 2. De

la lista de opciones mostrada en el lado izquierdo de la ventana, seleccione Opciones. 3. Le aparecerá la ventana de Opciones de Excel, aquí deberá seleccionar Personalizar cinta de opciones En resumen: Archivo > Opciones > Personalizar cinta de opciones > Desarrollador

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

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

Fig. 1.5 Botones de la cha Desarrollador

Botón

Descripción o funcionalidad

Tecla de acceso rápido

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



Apertura de la ventana de diálogo de selección de macros, desde aquí podemos seleccionar una macro  eliminarlo y/o crear uno nuevo.

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



22

Aplicaciones VBA con Excel

          un documento de Excel. Aquí debemos tener especial cuidado; pues al iniciar la grabación, todo lo que realice en la hoja quedará registrado en la macro.

-

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

-

Muestra controles para el diseño de formularios en la hoja de Excel. En nuestro caso, usaremos el control Botón para crear un puente entre la hoja de Excel y el código VBA.

-

1.6 Modos de Acceso al VBA Veamos las diferentes formas de acceder al editor VBA: Primera forma: Ficha Desarrollador > Visual Basic Segunda forma: Tercera forma: Ficha Desarrollador > Ver Código

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

Fig. 1.7 Seguridad de macros

           Desarrollador > Seguridad de macros; desde aquí seleccione Deshabilitar todas las macros sin nocación Conar en el acceso al modelo de objeto de proyectos VBA.

Cap.1: Introducción al VBA

23

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

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

1.8 Grabar una aplicación VBA Antes de entrar completamente al desarrollo de aplicaciones con VBA debemos tener              nuestro caso seleccionaremos solo dos opciones: Opción 1: Desde Excel  Presione Asigne un nombre al archivo



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



Fig. 1.9 Ventana de grabación de Excel

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



24

Aplicaciones VBA con Excel

Opción 2: Desde el entorno VBA Ficha Desarrollador



Seleccione Visual Basic



Seleccione Archivo > Guardar libro…



Los pasos siguientes son los mismos aplicados en la Opción 1.



1.9 Descripción del editor VBA

Fig. 1.10 Editor VBA

 nuevas versiones de Excel. 1.9.1 Barra de herramientas estándar  Botón

Descripción o funcionalidad

Tecla de acceso directo

Intercambia las interfaces de VBA y Excel, es decir, podrá volver a la hoja de Excel.



Permite insertar Formulario, Módulo, Modelo de clase o Procedimiento al proyecto VBA.

-

Permite grabar cualquier cambio realizado en el entorno VBA. Tenga en cuenta que, grabar en el entorno VBA, es equivalente a grabar en Excel.



Cap.1: Introducción al VBA



Permite ejecutar, pausar y parar un procedimiento o un formulario del proyecto VBA. Permite mostrar la ventana Exploradora de Proyectos.



Permite mostrar la ventana de Propiedades.

1.9.2 Operaciones desde la barra de herramienta estándar Cuesones

Ruta de acceso

¿Cómo grabar el proyecto?

Archivo > Guardar Libro

¿Cómo exportar código VBA? La exportación permite guardar un código (.cls) u objeto (.frm) en un archivo independiente.

Archivo > Exportar > Asignar nombre > botón Guardar.

¿Cómo importar código VBA? La importación permite abrir un código u objeto en un proyecto VBA nuevo.

Archivo > Importar > Seleccionar el archivo.

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

Ver > Explorador de Proyectos Ver > Ventana Propiedades

Herramientas > Opciones > Formato        del Editor > Texto Normal > editor de código de VBA?  ¿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…  Bloquear proyecto para visualización y asignar una contraseña para visualizar sus propiedades.

1.10 El explorador de proyectos Permite visualizar la estructura general que puede llegar a tener un proyecto, de tal manera que puede organizar todos los objetos implementados; es así que los procedimientos y funciones se alojan en Módulos, los UserForm en formularios y las hojas de Excel en la carpeta Microso Excel Objetos.

Fig. 1.11 Ventana exploradora de proyectos

25

26

Aplicaciones VBA con Excel

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

Ruta de acceso

¿Cómo cambiar el nombre del proyecto?

Clic derecho sobre el nombre del proyecto > Seleccione Propiedades del VBAProject > Asigne un nombre.

Seleccione una hoja de Excel desde      hojas de Excel? des > Name > Asigne un nombre. ¿Cómo agregar un Módulo al proyecto?

Clic derecho sobre el Proyecto > Insertar > Módulo.

¿Cómo agregar un UserForm al proyecto?

Clic derecho sobre el Proyecto > 

¿Cómo eliminar un Módulo del proyecto?

Clic derecho sobre el Módulo > Quitar Módulo.

¿Cómo eliminar un Formulario del proyecto?

Clic derecho sobre el Formulario > 

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

A

B

C

Cap.1: Introducción al VBA

27

A. Muestra una lista de objetos de las cuales se examinan sus propiedades. Para visuali-

 mostrará el nombre del objeto. Nombre de la clase

Nombre del objeto

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

 C. Presenta opciones iniciales por cada propiedad, debemos considerar que toda pro-

 mencionar que para cambiar el valor de una opción se puede realizar aplicando doble clic sobre la opción.

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

Donde: Aquí se presenta una lista de objetos en la cual puede asignar código. Aquí se presenta una lista de eventos según el objeto seleccionado.

28

Aplicaciones VBA con Excel

1.13 Modelo de objetos de Excel  su vez forman piezas individuales en el entorno de Excel. Podríamos decir que un objeto   de programación, aprovechando así el uso de los elementos las veces que sea necesario. En Excel los objetos presentan la siguiente jerarquía:

 14 y negrita a un texto asignado en la celda A5, entonces podemos usar la siguiente línea de código: "A5").Font.Name="Tahoma" "A5").Font.Size=14 "A5").Font.Bold=True Donde: Applicaon: Hace referencia al propio Excel.



AcveWorkbook: Hace referencia al libro actual.



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



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



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

Cap.1: Introducción al VBA

29

  Primero:propiedades, es decir, un objeto puede presentar caracterís Código VBA

Descripción del caso

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

Hoja1 y azul a la Hoja2.

Application. ThisWorkbook. Sheets(1). Name = "Reporte” Application. ThisWorkbook. Sheets(2). Name = “Listado”

      Hoja1 y «Listado» a la Hoja2.

Segundo:métodos, estos se caracterizan por realizar una ac Código VBA

Descripción del caso

Range("A2:C4").Select

Seleccionar las celdas A2 hasta C4









1.14 Objeto Application Representa la propia aplicación Excel y mayormente funciona como contenedor de otros terminada. Propiedades del objeto Applicaon 1.14.1 ActiveCell   Address de AcveCell.

30

Aplicaciones VBA con Excel

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

Analizando el código: Dim celda As String

 celda = Application.ActiveCell.Address

La variable celda $A$1 el cual indica que el cursor se encuentra en la celda A1. MsgBox "La dirección de la celda activa es: " & celda

La función MsgBox permite mostrar un mensaje de salida al usuario, para nuestro caso el texto que se encuentra entre comillas es el mensaje mostrado al usuario, el símbolo & permite unir dicho texto al contenido de la variable celda.

1.14.2 ActiveSheet    Sub celdaActiva() Dim celda As String celda = Application.InputBox(prompt:="Ingrese una celda para activar: ", Type:=2) Application.ActiveSheet.Range(celda).Select End Sub

Analizando el código: Dim celda As String

Declaramos la variable celda en la cual almacenaremos la celda que será considerada  la forma A13.

Cap.1: Introducción al VBA

31

celda = Application.InputBox(prompt:="Ingrese una celda de la forma Columna Final; para activar: ", Type:=2)

Asignamos el valor ingresado por el usuario a la variable celda, como lo mencionamos anteriormente será de la forma A13. InputBox permite mostrar una ventana al usuaType:=2.

Fig. 1.13 Ventana de po InputBox Application.ActiveSheet.Range(celda).Select

      AcveSheet, Range se encargará de ubicar el cursor en la celda y select de  1.14.3 ActiveWindow  permita mostrar el nombre completo del libro actual. Sub muestraTitulo() Dim libro As String libro = Application.ActiveWindow.Caption MsgBox "El nombre del libro es: " & libro End Sub

Analizando el código: Dim libro As String

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

Asignamos a la variable libroAcveWindow.Capon. MsgBox "El nombre del libro es: " & libro

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

32

Aplicaciones VBA con Excel

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

1.14.5 Caption   de Excel. Sub muestraTitulo() Dim titulo As String titulo = Application.Caption MsgBox "Título de la ventana: " & titulo End Sub

Analizando el código: Dim titulo As String

Se declara la variable tulo   titulo = Application.Caption

Asignamos a la variable tulo propiedad Capon del objeto Applicaon. MsgBox "Título de la ventana: " & titulo

Finalmente, mostramos el contenido de la variable tulo mediante la función MsgBox. 1.14.6 Selection              procedimiento que permita mostrar la dirección de las celdas seleccionadas en la hoja actual de Excel. Sub muestraRango() Dim rango As String rango = Application.Selection.Address MsgBox "El rango seleccionado es: " & rango End Sub

Cap.1: Introducción al VBA

33

Analizando el código: Dim rango As String

Declaramos la variable rango   seleccionadas. rango = Application.Selection.Address

Asignamos a la variable rango la dirección exacta de las celdas seleccionadas de una das desde la hoja de Excel. MsgBox "El rango seleccionado es: " & rango

nado en la variable rango. 1.14.7 ThisWorkbook  Veamos un procedimiento que permita mostrar el nombre del libro actual de Excel. Sub muestraNombre() Dim nombre As String nombre = Application.ThisWorkbook.Name MsgBox "El nombre del libro es: " & nombre End Sub

Analizando el código: Dim nombre As String

Declaramos la variable nombre de Excel. nombre = Application.ThisWorkbook.Name

Name del ThisWorkbook. MsgBox "El nombre del libro es: " & nombre

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

34

Aplicaciones VBA con Excel

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

Analizando el código: Application.Visible = False

La opción False permite ocultar la aplicación Excel; con la opción True lo volvemos  clave de acceso de usuario o realice algún tema de seguridad. 1.14.9 MoveAfterReturn Permite habilitar e inhabilitar el movimiento del cursor al presionar la tecla después del ingreso de valor en una celda. Veamos un procedimiento que inhabilita y hablita el movimiento del cursor en una hoja de Excel. Sub inhabilita() Application.MoveAfterReturn = False End Sub Sub habilita() Application.MoveAfterReturn = True End Sub

Analizando el código: Application.MoveAfterReturn = False

Permite inhabilitar el movimiento del cursor al presionar la tecla , es decir, podremos ingresar valores y permanecer en la misma celda, la única forma de mover el cursor será por medio de las teclas direccionales. Application.MoveAfterReturn = true

Es el valor por defecto, igualmente permite habilitar el movimiento del cursor al presionar la tecla .

Cap.1: Introducción al VBA

1.14.10 DisplayFormulaBar Permite habilitar e inhabilitar la visualización de la barra de fórmulas en el libro de Excel. Veamos un procedimiento que inhabilita y habilita la barra de fórmulas. Sub inhabilita() Application.DisplayFormulaBar = False End Sub Sub habilita() Application.DisplayFormulaBar = True End Sub

Analizando el código: Application.DisplayFormulaBar = False

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

Es el valor por defecto, igualmente permite mostrar la barra de fórmula en el libro  1.14.11 DisplayFullScreen Permite habilitar e inhabilitar la maximización de la hoja de cálculo de un documento de Excel. Veamos un procedimiento que inhabilita y habilita la maximización de la hoja de cálculo. Sub restaura() Application.DisplayFullScreen = False End Sub Sub maximiza() Application.DisplayFullScreen = True End Sub

Analizando el código: Application.DisplayFullScreen = False

Permite restaurar a su estado normal la hoja de cálculo. Application.DisplayFullScreen = True

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

35

36

Aplicaciones VBA con Excel

Métodos del objeto Applicaon 1.14.12 Quit Método que permite salir de la aplicación de Excel, cerrando todos los libros y preguntando si se guardará los cambios en el caso de que los hubiera. Veamos un procedimiento que permite cerrar la aplicación Excel. Sub salir() Dim r As Integer r = MsgBox("Esta seguro de salir", vbYesNo + vbCritical) If r = 6 Then Application.Quit End If End Sub

Analizando el código: Dim r As Integer

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

La función MsgBox presentará una ventana condicional, en la cual el usuario seleccionará la opción «Sí» o «No» dependiendo de la opción que el determine, vbYesNo permite mostrar los botones mientras que vbCrical muestra el símbolo, tal como se muestra en la siguiente imagen: If r = 6 Then

Al seleccionar la opción «Sí» se asigna el número seis a la variable r, mientras que al seleccionar «No» se le asignará el número siete. Application.Quit

 1.14.13 OnTime Método que permite ejecutar un proceso en un  que permita mostrar la fecha y hora actual des

Fig. 1.14 Mensaje mostrado a parr de los 10 segundos

Cap.1: Introducción al VBA

37

Sub tiempo() Dim segundos As Date segundos = Now + TimeValue("0:0:10”) Application.OnTime segundos, "mostrarMensaje" End Sub Sub mostrarMensaje() MsgBox "Fecha Actual: " & Date & " Hora actual: " & Time End Sub

Debemos tener en cuenta los siguientes aspectos, el procedimiento emposión de contabilizar los diez segundos e invocar al procedimiento «mostrarMensaje». Ambos procedimientos deben implementarse en un módulo. Adicionalmente considere que usando Now+TimeValue mientras que TimeValue se programa en un hora determinada. Analizando el código: Dim segundos As Date

Declaramos la variable segundos Date que hace referencia a una hora. segundos = Now + TimeValue("0:0:10")

Now+TimeValue Application.OnTime segundos, "mostrarMensaje"

Finalmente, invocamos al método OnTime   segundos ya es   debe encerrarse entre comillas dobles para ser invocado. MsgBox "Fecha Actual: " & Date & " Hora actual: " & Time

En el procedimiento "mostrarMensaje" se invoca a la función MsgBox para mostrar la fecha actual por medio de la función Date y la hora actual por medio de la función Time.

38

Aplicaciones VBA con Excel

1.15 El objeto WorkBook Representa a un libro de Excel; a la colección de libros abiertos se les llama Workbooks. Propiedades del objeto WorkBook 1.15.1 Count  abierto» es la representación de la apertura de los archivos de Excel. Sub numeroLibros() MsgBox "La cantidad de libros abiertos es: " & Workbooks.Count End Sub

Analizando el código: MsgBox "La cantidad de libros abiertos es: " & Workbooks.Count

La función MsgBox permite mostrar un mensaje de salida al usuario. Para nuestro caso el texto que se encuentra entre comillas es el mensaje mostrado al usuario, el símbolo & permite unir dicho texto a la propiedad Count el cual se encarga de contar el número de libros abiertos. Para la prueba se deberá abrir por lo menos dos veces la aplicación Excel y en uno de ellos colocar el código presentado. Este código puede ser implementado en el ThisWorkbook de cualquier libro. 1.15.2 Name Representa el nombre del libro actual de Excel. Veamos un procedimiento que muestre el nombre del libro. Sub nombreLibro() MsgBox "El nombre del libro es: " & ThisWorkbook.Name End Sub

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

ThisWorkbook.Name el archivo, el nombre mostrado será Libro1. Por otra parte, no se olvide que el símbolo & permite concatenar dos o más elementos dentro de una misma sentencia. 1.15.3 Path to. Veamos un procedimiento que muestre la ruta registrada para el libro actual. Sub rutaArchivo() MsgBox "La ruta del archivo es: " & ThisWorkbook.Path End Sub

Cap.1: Introducción al VBA

39

Analizando el código: MsgBox "La ruta del archivo es: " & ThisWorkbook.Path

Pathta una ruta, primero debemos grabar el libro, de otra manera el mensaje solo mostrará el texto «La ruta del archivo es:». Métodos del objeto WorkBook 1.15.4 Open Permite abrir un archivo de Excel, debemos considerar que para mostrar el contenido de un libro primero debemos conocer la ruta exacta de donde proviene el libro. Sub abrirArchivo() Workbooks.Open "D:\Capitulo 1\path-workbook.xlsm" End Sub

Analizando el código: Workbooks.Open "D:\Capitulo 1\path-workbook.xlsm"

Open     donde fue grabado el documento. Debemos tener en cuenta que al abrir un archivo  1.15.5 Add  Sub agregaLibros() Workbooks.Add End Sub

Analizando el código: Workbooks.Add

El método Add 1.15.6 Activate  apertura de los libros, y la segunda es por el nombre del mismo libro. Sub activaListado() Workbooks("listado.xlsx").Activate End Sub

40

Aplicaciones VBA con Excel

Analizando el código: Workbooks("listado.xlsx").Activate

El método Acvate ubica el cursor en el libro invocado; en este caso, estamos invocando al archivo "listado.xlsx" Debemos considerar que el archivo solicitado no .xlsm sino más bien debe ser solo un archivo existente en una misma carpeta. Si el libro invocado es el segundo abierto de una lista de libros, entonces el código podríamos haberlo escrito de la siguiente manera WoorkBooks(2).Acvate. 1.15.7 Close Permite cerrar un determinado libro. Debemos tener en cuenta que desde un documento podemos cerrar cualquier libro abierto inclusive el mismo. Veamos como cerrar el libro actual. Sub cerrarLibro() ThisWorkbook.Close End Sub

Analizando el código: ThisWorkbook.Close

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

Analizando el código: Workbooks("listado.xlsx").Close SaveChanges:=False

El método Close cierra el libro "listado.xlsx"; la opción SaveChanges permite grabar  False no graba los cambios del libro, en cambio True graba los cambios realizados, sin necesidad de preguntarle al usuario. 1.15.8 Save Permite guardar los cambios en un determinado libro. Debemos tener en cuenta que guardará los cambios realizados al documento, para esto el libro deberá encontrarse previamente grabado. Su función es parecida al accionar del botón Grabar de la barra de herramientas.

Cap.1: Introducción al VBA

41

Sub guardaLibro() ThisWorkbook.Save End Sub

Analizando el código: ThisWorkbook.Save

El método Save permite guardar los cambios en un documento previamente guardado, sin necesidad de mostrar la ventana de diálogo de grabación. También podemos usar los siguientes códigos para la misma acción:  Sub guardaLibro() ActiveWorkbook.Save End Sub

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

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

1.15.9 Save As P el archivo original. Debemos tener en cuenta que el archivo original debe encontrarse previamente guardado. Su función es parecida al accionar del botón Guardar como… de la barra de herramientas. Sub guardaLibro() ActiveWorkbook.SaveAs "C:\Capitulo 1\Copia de Seguridad.xlsm" Workbooks.Open "C:\Capitulo 1\Save As - WorkBook.xlsm" Workbooks("Save As - WorkBook.xlsm").Activate End Sub

Analizando el código: ThisWorkbook.SaveAs "C:\Capitulo 1\Copia de Seguridad.xlsm"

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

42

Aplicaciones VBA con Excel

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

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

            Open. Otras opciones que presenta el manejo del método Save As es: Sub guardaLibro() ThisWorkbook.SaveAs "C:\Capitulo 1\Copia de Seguridad.xlsm" Workbooks.Open "C:\Capitulo 1\Save As - WorkBook.xlsm" Workbooks("Save As - WorkBook.xlsm").Activate End Sub Sub guardaLibro() Workbooks.("C:\Capitulo 1\Save As - WorkBook.xlsm").SaveAs "C:\Capitulo 1\Copia de Seguridad.xlsm" Workbooks.Open "C:\Capitulo 1\Save As - WorkBook.xlsm" Workbooks("Save As - WorkBook.xlsm").Activate End Sub Sub guardaLibro() Workbooks(1).SaveAs "C:\Capitulo 1\Copia de Seguridad.xlsm" Workbooks.Open "C:\Capitulo 1\Save As - WorkBook.xlsm" Workbooks("Save As - WorkBook.xlsm").Activate End Sub

1.15.10 SaveCopyAs Permite crear una copia del libro actual. Debemos tener en cuenta que el libro a duplicar debe encontrarse previamente grabado. Sub crearCopia() ActiveWorkbook.SaveCopyAs "C:\Capitulo 1\Copia de Seguridad.xlsm" End Sub

Analizando el código: ActiveWorkbook.SaveCopyAs "C:\Capitulo 1\Copia de Seguridad.xlsm"

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

Cap.1: Introducción al VBA

43

1.16 El objeto WorkSheets El objeto WorkSheet representa a una hoja de cálculo de Excel, a la colección de hojas se le llama WorkSheets métodos: Propiedades del objeto WorkSheets 1.16.1 Count Representa el número total de hojas por libro, es decir devolverá el número de hojas    hojas predeterminado es uno, en otras versiones de Excel el número total de hojas era tres. Sub numeroHojas() MsgBox "La cantidad de hojas es: " & WorkSheets.Count End Sub

Analizando el código: MsgBox "La cantidad de hojas es: " & WorkSheets.Count

Count siempre devuelve un valor numérico entero. 1.16.2 Name Representa el nombre de la hoja actual. Debemos considerar que el nombre predeterminado es Hoja1 sobre la hoja, y seleccionando Cambiar nombrecando la propiedad Name desde la ventana de propiedades. Veamos cómo mostrar el nombre de la hoja actual por medio de un procedimiento. Sub hojaActual() MsgBox "El nombre de la hoja es: " & Worksheets(1).Name End Sub

Analizando el código: MsgBox "El nombre de la hoja es: " & Worksheets(1).Name

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

44

Aplicaciones VBA con Excel

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



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

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



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

Count del WorkSheets, desde aquí podemos obtener el nom



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

Haciendo referencia a otro libro:



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

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

Analizando el código: ActiveSheet.Next.Activate

Debemos tener en cuenta que la propiedad Next permite ubicar datos de la próxima hoja, mientras que Acvate 1.16.4 Previous miento que permita mostrar la hoja anterior desde una hoja actual en un determinado libro. Sub hojaAnterior() ActiveSheet.Previous.Activate End Sub

Cap.1: Introducción al VBA

45

Analizando el código: ActiveSheet.Previous.Activate

Debemos tener en cuenta que usamos el objeto AcveSheet para movernos a las si sin ningún problema por todas las hojas de un determinado libro. 1.16.5 Index Propiedad que permite devolver el número de hoja de un conjunto de hojas de un mismo libro. Veamos el procedimiento índice que devuelve el número de hoja en la que se encuentra el usuario: Sub indice() MsgBox "El número de hoja es: " & ActiveSheet.Index End Sub

Analizando el código: MsgBox "El número de hoja es: " & ActiveSheet.Index

Indexminado libro. En el siguiente código se muestra un mensaje única y exclusivamente cuando el usua Sub indice() Dim numero As Integer numero = ActiveSheet.Index If numero = Sheets.Count Then MsgBox "Usted se encuentra en la última hoja" End If End Sub

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

46

Aplicaciones VBA con Excel

Analizando el código: WorkSheets(2).Activate

Acvate es un método que no necesita parámetros lo único que debemos considerar  número dos representa a la segunda hoja de todo el libro. 1.16.7 Add Permite agregar un determinado número de hojas a un libro. Debemos tener en cuenta que el nombre por defecto de las hojas es HojaN donde «N» representa al número de hoja según un determinado libro. Veamos el procedimiento que permite agregar un  Sub agregaHoja() Dim nombre As String nombre = InputBox("Ingrese el nombre de la hoja nueva: ") Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name=nombre Worksheets(1).Activate End Sub

Analizando el código: Dim nombre As String

nombre = InputBox("Ingrese el nombre de la hoja nueva: ") Solicitamos el nombre de la hoja por medio de la función InputBox, dicho nombre se almacenará en la variable nombre que próximamente asignaremos a la nueva hoja. Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name=nombre

El método Add la posición usamos la opción Aer cuerde que Worksheets.Count determina el número total de hojas contenidas en el  La forma predeterminada de agregar un hoja nueva sería Worksheets.Add; en caso de agregar una nueva hoja después de la Hoja2 podría ser de la siguiente manera: Worksheets.Add(Aer:=Worksheets("Hoja2")); si quisiéramos agregar tres hojas al Worksheets.Add Aer:=Worksheets(Worksheets.Count), Count:=3. Worksheets(1).Activate

 

Cap.1: Introducción al VBA

47

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

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

Para este ejercicio hay que tener cuidado con las ubicaciones de los elementos como INFORME 0001 que se encuentra en la celda B5 hojas en un mismo libro es: Sub generaHojas() For i = 1 To 20 nombre = Worksheets(1).Cells(4 + i, 2).Value If nombre "" Then Worksheets.Add(after:=Worksheets(Worksheets.Count)).Name=nombre Else Exit Sub End If Next End Sub

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

48

Aplicaciones VBA con Excel

            For  cías; por eso, condicionamos que el nombre de la hoja sea diferente al vacío (If nombre""). De esta manera, se podrá crear las hojas con nombres. En el caso de que For mediante la sentencia Exit Sub Finalmente, la parte más importante del procedimiento es cómo capturar el nombre de las hojas que se encuentran en las celdas de Excel; primero, debemos considerar la posición del primer nombre el cual se encuentra en B5, considerado como la 5, columna 2; es así que podemos capturar los nombres mediante la propiedad Cells, así pues, 4+i representa a 5 cuando el valor de i vale 1; este valor aumentará conforme i aumente, observe que el número 2 no cambiará ya que todos los nombres se encuentran en la columna B considerada como 2 para la propiedad Cells. 1.16.8 Delete Permite eliminar una hoja de un conjunto de hojas en un determinado libro. Sub eliminaHoja() Dim numero As Integer numero = InputBox("Ingrese número de hoja a eliminar: ") Application.DisplayAlerts = False Worksheets(numero).Delete End Sub

Analizando el código: Dim numero As Integer

numero = InputBox("Ingrese número de hoja a eliminar: ") Solicitamos el número de hoja que se desea eliminar, este se guardará en la variable número; recuerde que la función InputBox permite mostrar un cuadro de entrada en la cual el usuario podrá ingresar valores. Application.DisplayAlerts = False

Esta sentencia bloquea los mensajes enviados desde Excel cuando intentamos eliminar las hojas. Worksheets(numero).Delete

Finalmente, llegamos a eliminar la hoja seleccionada por el usuario, recuerde que debe ingresar el número de hoja y no el nombre, ya que la variable ha sido declarada como valor numérico.

Cap.1: Introducción al VBA

49

1.17 El objeto Range El objeto Range              mencionar que el objeto Range puede hacer referencia a celdas de otro libro. Propiedades del objeto Range 1.17.1 Address Representa la ubicación de la celda actual en una determinada hoja. Veamos un proce Sub ubicacionCelda() MsgBox "La ubicación de la celda activa es: "& ActiveCell.Address End Sub

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

La dirección de una celda está dada de la forma $columna$la, de tal manera que la propiedad Address 1.17.2 Cells Permite hacer referencia a un conjunto de celdas en una determinada hoja. Veamos un procedimiento que permite seleccionar un conjunto de celdas: Sub seleccionaCeldas() Range(Cells(6, 2), Cells(15, 4)).Select End Sub

Analizando el código: Range(Cells(6, 2), Cells(15, 4)).Select

El objeto RangeCells, es así que (6,2) representa a la celda B6 mientras que (15,4) representa a la celda D15. 1.17.3 End  

50

Aplicaciones VBA con Excel

Fig. 1.16 Listado de clientes

Sub primeraFila() Range("B5").End(xlUp).Offset(1, 0).Select End Sub Sub ultimaFila() Range("B5").End(xlDown).Select End Sub Sub primeraColumna() Range("B5").End(xlToLeft).Offset(0, 1).Select End Sub Sub ultimaColumna() Range("B5").End(xlToRight).Select End Sub

Analizando el código: Range("B5").End(xlUp).Offset(1, 0).Select

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

xlDown la celda B5. Range("B5").End(xlToLeft).Offset(0, 1).Select

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

Cap.1: Introducción al VBA

51

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

xlToRight a la celda B5. Finalmente, podemos implementar un procedimiento que permita seleccionar toda la  Sub ultimaFilaCompleta() Range("B20", Range("B20").End(xlToRight)).Select End Sub

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

Fig. 1.17 Listado de productos Sub generaCalculos() Range("D23").Formula = "=sum(D9:D22)" Range("E23").Formula = "=sum(E9:E22)" End Sub

Analizando el código: Range("D23").Formula = "=sum(D9:D22)"

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

52

Aplicaciones VBA con Excel

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

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

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

Fig. 1.18 Listado de pagos

Cap.1: Introducción al VBA

53

Antes de implementar el procedimiento se debe tener en claro las posiciones en celdas de los valores a calcular, ya que la implementación de la función FormulaLocal es como usar una fórmula directamente en una hoja de Excel. Sub calculaPago() Range("M12").FormulaLocal = "=SUMA(D12:L12)" Range("M12").Select Selection.AutoFill Destination:=Range("M12:M42") Range("M43").FormulaLocal = "=SUMA(M12:M42)" End Sub

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

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

La idea es copiar la formula a las demás celdas como lo haríamos en una hoja de Excel, así que empezamos por ubicarnos en la celda donde se encuentra la fórmula implementada con la sentencia anterior. Selection.AutoFill Destination:=Range("M12:M42")

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

Finalmente, aplicamos la fórmula usando la función FormulaLocal función Suma como si estuviéramos en la hoja de Excel; tenga en cuenta que M43 es la celda donde se mostrará el resultado. 1.17.6 FormulaR1C1 Establece una fórmula mediante la notación R1C1 donde Rtras C  su código, y la sección lo determina el sexto carácter del lado izquierdo. Finalmente,  se componga por la primera letra de su nombre más su apellido paterno, tal como se muestra en la siguiente imagen:

54

Aplicaciones VBA con Excel

Fig. 1.19 Listado de parcipantes Sub determinaValores() Range("D10").FormulaR1C1 = "=RIGHT(RC[-2])" Range("D10").Select Selection.AutoFill Destination:=Range("D10:D20") Range("E10").FormulaR1C1 = "=MID(RC[-3],6,1)" Range("E10").Select Selection.AutoFill Destination:=Range("E10:E20") Range("F10").FormulaR1C1 = "=LOWER(MID(RC[-3], SEARCH("" "", RC[-3], SEARCH("" "", RC[-3]) + 1), 1 + 1) & MID(RC[-3], RIGHT(1), RIGHT(SEARCH("" "", RC[-3]) - 1))) & ""@editorialmacro.com""" Range(“F10”).Select Selection.AutoFill Destination:=Range("F10:F20") End Sub Sub limpiarCeldas() Range("D10:F20").ClearContents End Sub

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

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

Cap.1: Introducción al VBA

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

En la celda E10 función MID que representa al Extraer de Excel retrocediendo para este caso tres co AutoFill. Range("F10").FormulaR1C1 = "=LOWER(MID(RC[-3], SEARCH("" "", RC[-3], SEARCH("" "", RC[-3]) + 1), 1 + 1) & MID(RC[-3], RIGHT(1), RIGHT(SEARCH("" "", RC[-3]) - 1))) & ""@editorialmacro.com""" Range("F10").Select Selection.AutoFill Destination:=Range("F10:F20")

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

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

Fig. 1.20 Listado de productos

55

56

Aplicaciones VBA con Excel

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

Analizando el código: Range("D23").Value = "" Range("E23").Value = ""

La forma para limpiar la celda D23 es enviando un valor vacío a dicha celda por medio de la propiedad Value; de la misma manera, se limpia el contenido de la celda E23. Range("D9").End(xlDown).Offset(1, 0).Select ActiveCell.Value = "=sum(D9:D22)"

Nos ubicamos al inicio de las unidades (D9 (xlDown) y saltar una posición (Oset(1, 0)des usando la fórmula "=sum(D9:D22)". Range("E9").End(xlDown).Offset(1, 0).Select ActiveCell.Value = "=sum(E9:E22)"

Nos ubicamos al inicio de los costos (E9   (xlDown) y saltar una posición (Oset(1, 0)) para generar la suma de dichos costos usando la fórmula "=sum(E9:E22)". Métodos 1.17.8 Activate Rangeva. Veamos algunos casos: Procedimiento que permite capturar el contenido de una determinada celda. Sub capturaContenido() Range("D7").Activate Dim valor As String valor = ActiveCell.Value MsgBox "El valor de la celda D7 es: " & valor End Sub

Cap.1: Introducción al VBA

Procedimiento que permite mostrar la hora actual en la celda D7. Sub enviaValor() Range("D7").Activate Range("D7").FormulaLocal = "=Hoy()" End Sub

1.17.9 Clear Método que permite eliminar el contenido y el formato asignado a un determinado número de celdas. Veamos un procedimiento que permita limpiar el contenido de un determinado rango de celdas así como su formato: Sub eliminaContenido() Range("D10:D20").clear End Sub

1.17.10 ClearContents cados en el objeto Range. Veamos el procedimiento: Sub limpiaCeldas() Range("D10:D50").ClearContents End Sub

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

57

58

Aplicaciones VBA con Excel

 Sub eliminaFila() Range("D10").Activate Selection.EntireRow.Delete End Sub

Si necesitamos eliminar una columna completa podríamos usar el siguiente procedimiento: Sub eliminaFila() Range("D10").Activate Selection.EntireColumn.Delete End Sub

1.17.12 Calculate Método que permite recalcular las fórmulas en un determinado rango. Sub recalculaFormulas() Range("D10").Calculate End Sub

1.18 El objeto Cells Cells cuenta con las mismas funcionalidades que el objeto Range la diferencia es la esRangeCells lo  Al respecto, podemos decir que Cells ofrece la ventaja de recorrer por varias celdas ha algunos ejemplos del objeto Cells: Procedimiento que permita seleccionar todas las celdas de una determinada hoja: Sub seleccionarTodo() Cells.Select End Sub

Procedimiento que permita seleccionar la celda D2: Sub seleccionarCeldaDos() Cells(2, 4).Select End Sub

Cap.1: Introducción al VBA

59

Procedimiento que permita limpiar el contenido solo para la celda D2: Sub seleccionarRango() Cells(2,4).ClearContents End Sub

D2: Sub modicaFuente() Cells.Font.Name = "Arial" Cells.Font.Size = 10 End Sub

Procedimiento que permita asignar un valor número a la celda D2: Sub asignaValor() Cells(2,4).Value = 200 End Sub

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

Función Excel

















































60

Aplicaciones VBA con Excel

Función VBA

Función Excel





































































































































Cap.1: Introducción al VBA

Función VBA

Función Excel





































































































































61

62

Aplicaciones VBA con Excel

Función VBA

Función Excel





































































































































Cap.1: Introducción al VBA

Función VBA

Función Excel









































































































































63

64

Aplicaciones VBA con Excel

Función VBA

Función Excel









































































































































Cap.1: Introducción al VBA

Función VBA

Función Excel









































































































































65

66

Aplicaciones VBA con Excel

Función VBA

Función Excel







































M.C.D



M.C.M





























































































Cap.1: Introducción al VBA

Función VBA

Función Excel





N

N











































O





















































































67

68

Aplicaciones VBA con Excel

Función VBA

Función Excel









































































































































Cap.1: Introducción al VBA

Función VBA

Función Excel





































































T

T

































































69

70

Aplicaciones VBA con Excel

Función VBA

Función Excel





































































1.20 Casos desarrollados ͫCaso desarrollado 1: Macro para formato de dólares Implemente una macro llamada MonedaDolares que permita dar el formato de mo Pasos: 1. En un documento nuevo de Excel elabore el siguiente cuadro

Fig. 1.21 Hoja de Excel 2. C2 3. Ficha Desarrollador > Grabar macro y asigne los valores tal como se muestra en la

siguiente ventana:

Cap.1: Introducción al VBA

71

Fig. 1.22 Ventana «Grabar macro» 4. Tenga en cuenta que al hacer clic en el botón Aceptar

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

Fig. 1.23 Conguración de la moneda 5.             

muestra en la siguiente imagen:

Fig. 1.24 Formato de número 6. Desarrollador

>

Detener grabación. 7. Por otra parte, ahora visualizaremos el código VBA generado con base en la macro, para lo cual debemos presionar la combinación de teclas .

Fig. 1.25 Ventana exploradora de proyectos

72

Aplicaciones VBA con Excel

8. Para

visualizar el código debemos hacer doble clic sobre el objeto Módulo1, la 

Fig. 1.26 Código fuente de la macro

ͫCaso desarrollado 2: Macro para formato de texto Implemente una macro llamada FormatoTitulo que permita combinar las celdas y  Pasos: 1. En un documento nuevo de Excel coloque el texto «Reporte de ventas» en la celda

B2, tal como se muestra en la siguiente imagen:

Fig. 1.27 Hoja de Excel 2. Ficha

Desarrollador > Grabar macro y asignar los valores como se muestra en la siguiente ventana:

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

Cap.1: Introducción al VBA

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

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

Asignar el tamaño de letra 18.



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

Fig. 1.29 Aspecto nal del tulo en la hoja de Excel 6. Desarrollador > Visual

Basic. Código fuente de la macro «FormatoTitulo» Sub FormatoTitulo() Range("B2:G2").Select With Selection .HorizontalAlignment = xlCenter .VerticalAlignment = xlBottom .WrapText = False .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = False .ReadingOrder = xlContext .MergeCells = False End With Selection.Merge With Selection.Font .Name = "Tahoma" .Size = 22 .Strikethrough = False .Superscript = False .Subscript = False .OutlineFont = False .Shadow = False .Underline = xlUnderlineStyleNone .ThemeColor = xlThemeColorLight1 .TintAndShade = 0 .ThemeFont = xlThemeFontNone End With With Selection.Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic .ThemeColor = xlThemeColorAccent5 .TintAndShade = 0.799981688894314 .PatternTintAndShade = 0 End With End Sub

73

74

Aplicaciones VBA con Excel

Como verá el código generado usa funciones propias de VBA que a simple vista parece complejo, pero conforme vamos avanzando en el tema, observará usted que su interpretación es sencilla; por mientras, eliminaremos las instrucciones neutras del código  de la macro), teniendo así el siguiente código: Código de la macro depurada Sub FormatoTitulo() '1. Seleccionar las celdas a combinar Range("B2:G2").Select '2. Combinar las celdas With Selection .HorizontalAlignment = xlCenter .VerticalAlignment = xlBottom End With Selection.Merge '3. Aplicar formato de fuente al texto With Selection.Font .Name = "Tahoma" .Size = 22 End With '4. Aplicando color de fondo a las celdas With Selection.Interior .Pattern = xlSolid .ThemeColor = xlThemeColorAccent5 .TintAndShade = 0.799981688894314 End With End Sub

Explicaremos el código generado por la macro: Código VBA

Descripción

Range("B2:G2").Select

Permite seleccionar las celdas desde B2 hasta G2.

Selection .HorizontalAlignment=xlCenter

Permite centrar el texto de forma horizontal.

Selection .VerticalAlignment = xlBottom

Permite centrar el texto de forma 

Selection.Merge

Permite combinar las celdas seleccionada con Range("B2.G2").select.

Selection.Font .Name = "Tahoma"

   celdas seleccionadas.

Selection.Font .Size = 22

Permite aplicar el tamaño de la fuente a las celdas seleccionadas.

Selection.Interior .Pattern = xlSolid

Permite asignar un color de fondo a las celdas seleccionadas.

Selection.Interior .ThemeColor=xlThemeColorAccent5

Permite asignar un tema de color a las celdas seleccionadas (opcional).

Cap.1: Introducción al VBA

Código VBA

Descripción

Selection.Interior .TintAndShade = 0.799981688894314

Permite asignar un degradado del color seleccionado aplicado a las celdas seleccionadas.

With

Permite resumir una sentencia común en VBA. Por ejemplo, veamos el siguiente código:

End With

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

Si analizamos el código, notamos que la instrucción Selecon.Font se repite; por lo tanto, usando la función With podría ser de la siguiente: With Selection.Font .Name = "Tahoma" .Size = 22 End With

7. Para

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

Fig. 1.30 Ventana de diálogo de la macro

75

76

Aplicaciones VBA con Excel

ͫCaso desarrollado 3: Macro para determinar las horas de recorrido de un conductor   dos decimales. Pasos: 1. En un documento nuevo de Excel elabore el siguiente cuadro:

Fig. 1.31 Hoja de Excel mostrando el entorno del problema 2.       Desarrollador

asigne los siguientes valores:

Fig. 1.32 Valores de la macro «Conductor»

> Grabar macro y

Cap.1: Introducción al VBA

3. D13 y colo-

que la siguiente instrucción en la barra: = C13*C12 / D12 4. El código generado en la macro es:

Fig. 1.33 Código generado en la macro

Analicemos el código generado: Código VBA

Descripción

Range("D13").Select

Permite seleccionar la celda D13.

ActiveCell.FormulaR1C1

       FormulaR1C1.

"=RC[-1]*R[-1]C[-1]/R[-1]C"

Si nos encontramos en D13, entonces: - RC[-1]: hace referencia a la celda C13. - R[-1]C[-1]: hace referencia a la celda C12. - R[-1]C: hace referencia a la celda D12. Hay que tener en cuenta que R repre      C, a la columna; por tanto, RC[-1] hace que la  una posición, basándose en la celda D13.

Selection.NumberFormat="0.00"

La propiedad NumberFormat permite  en una determinada celda. Cuando se ta a todos los números enteros, mientras que .00 representa a dos decimales.

5. Pruebe la macro, pero primero asegúrese que la celda D13 se encuentre vacía, lue-

Desarrollador > Macros > seleccione Conductor > Ejecutar. El resultado es 2.4 horas.

77

78

Aplicaciones VBA con Excel

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

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

ͫCaso desarrollado 4: Cerrar un libro guardando los cambios Implemente un procedimiento dentro del proyecto VBA que permita cerrar un libro de Excel, registrando los cambios realizados. Hay que tener en cuenta que, si el libro  es nuevo, antes de cerrar este, debe mostrar el cuadro de diálogo de la grabación. Pasos: 1. Desde el Explorador de Proyectos haga doble clic sobre ThisWorkbook, asegúrese

que la ventana mostrada se parezca a la siguiente:

Fig. 1.35 Contenido del ThisWorkbook

Tenga en cuenta que el objeto debe encontrarse en General mientras que en propiedades debe estar seleccionado Declaraciones. 2. Ahora

agregaremos un procedimiento llamado CerrarLibroG, para lo cual debemos seleccionar Procedimiento del menú Insertar, tal como se muestra en la siguiente imagen:

Fig. 1.36 Agregando un procedimiento al proyecto VBA

Cap.1: Introducción al VBA

79

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

Fig. 1.37 Implementación de un procedimiento 4. Agregaremos el siguiente código:

Fig. 1.38 Código del procedimiento CerrarLibroG 5. En

Excel invocaremos al procedimiento mediante un botón, para esto debemos Desarrollador > Insertar > Botón de Controles de formulario > arrastre un marco en la hoja de Excel formando un rectángulo, al soltarlo se mostrará la siguiente ventana:

Fig. 1.39 Asignación de Macro al procedimiento en VBA 6. De la ventana anterior seleccione ThisWorkbook.CerrarLibroG y haga clic en el bo-

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

80

Aplicaciones VBA con Excel

Fig. 1.40 Modicando el texto del botón 8. 

los cambios» y haga clic fuera del botón. 9. Antes de probar la aplicación debemos grabar la hoja de Excel, para esto presione Libro de Excel habilitado para macros. 10. Finalmente, pruebe la acción haciendo clic sobre el botón Cerrar libro guardando los cambios. ͫCaso desarrollado 5: Cerrar un libro sin guardar los cambios Implemente un procedimiento dentro del proyecto VBA que permita cerrar un libro de Excel sin registrar los cambios realizados. Hay que tener en cuenta que, si el libro  Pasos: 1. ThisWorkbook,

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

Fig. 1.41 Código del procedimiento CerrarLibro

Cap.1: Introducción al VBA

81

4. En

Excel invocaremos al procedimiento mediante un botón, para esto debemos Desarrollador > Insertar > Botón de Controles de formulario > arrastre un marco en la hoja de Excel formando un rectángulo, al soltarlo, seleccione el procedimiento CerrarLibro y haga clic en el botón Aceptar. 5. Seguidamente, haga clic derecho sobre el botón y seleccione la opción Modicar texto > asígnele el texto «Cerrar libro sin guardar los cambios». 6. Antes de probar la aplicación debemos grabar la hoja de Excel, para esto presione Libro de Excel habilitado para macros. 7. Finalmente, pruebe la acción haciendo clic sobre el botón Cerrar libro sin grabar los cambios. ͫCaso desarrollado 6: Abrir un libro de solo lectura .xlsx) desde un solo archivo con código VBA. Hay que tener en cuenta lo siguiente: 1. Debemos contar con una carpeta en la cual se encuentren los tres archivos involu-

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

Fig. 1.42 Procedimientos de apertura de archivos .xlsx 4. En el archivo Control de listados, agregar tres botones desde Controles de formu-

lario y a cada botón asígnele el procedimiento correspondiente.

82

Aplicaciones VBA con Excel

ͫCaso desarrollado 7: Acvar un determinado libro  usuario. Pasos: 1. Asumamos

que contamos con una carpeta llamada Reporte de Ventas con los siguientes archivos:

Fig. 1.43 Contenido de la carpeta Reporte de Ventas 2. En

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

Fig. 1.44 Código del procedimiento acvaLibro

Explicaremos brevemente el código presentado en el procedimiento; empecemos por el término libro el cual es una variable que almacena el nombre del libro que el usuario desea abrir; la función InputBox, muestra un cuadro de diálogo el cual le permite al usuario ingresar un valor; el símbolo & ".xlsx" concatena el nombre del archivo que el usuario ingrese con el texto .xlsxAcvate Workbooks. No se olvide que el archivo Control de reportes debe ser guardado en la misma Libro de Excel habilitado para macros. 3. En la hoja de Excel del libro Control de reportes agregar un botón llamado Acvar

libros y direccionarlo al procedimiento acvaLibro.

Cap.1: Introducción al VBA

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

seleccionar dicho botón la aplicación mostrará la siguiente imagen:

Fig. 1.46 Cuadro de diálogo para el ingreso del nombre del archivo

Aquí el usuario deberá ingresar el nombre del        cuenta que los archivos de reportes deben estar abiertos para poder invocarlos. Fig. 1.47 Cuadro de diálogo para el ingreso del nombre del archivo 5. Finalmente,

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

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

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

83

84

Aplicaciones VBA con Excel

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

Nombre del archivo original Informe01.xlsm

Informe01_25-04-2016.xlsm

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

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

Fig. 1.49 Código del procedimiento copiaLibro 4. En Excel invocaremos al procedimiento mediante un botón, para esto debemos ubi-

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

Cap.1: Introducción al VBA

85

ͫCaso desarrollado 9: Uso de propiedades del objeto Applicaon Implemente una aplicación VBA que permita controlar el acceso a un documento de Excel, el cual muestra la siguiente imagen a un usuario logueado correctamente:

Fig. 1.50 Pantalla inicial mostrada al usuario logueado correctamente

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



Fig. 1.51 Ventana de solicitud de usuario

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

Fig. 1.52 Ventana de solicitud de clave de acceso

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

Fig. 1.53 Mensaje de bienvenida al usuario

86

Aplicaciones VBA con Excel

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



Fig. 1.54 Mensaje para el usuario no válido

Además de mostrar el mensaje, deberá cerrar la aplicación, es decir, cerrará Excel  En todos los casos, la ventana de Excel debe permanecer oculta, es decir, solo se mostrará cuando el usuario sea logueado correctamente.



Pasos: 1. En

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

Fig. 1.55 Pantalla inicial mostrada al usuario logueado correctamente 2. Ficha Desarrollador > Visual Basic > ThisWorkbook 3. Cambie el objeto a Workbook con el evento Open de la siguiente manera:

La línea de código debe tener el siguiente aspecto: Private Sub Workbook_Open() End Sub

Cap.1: Introducción al VBA

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

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

Explicaremos el código implementado: Application.Visible=False

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

Se declara la variable usuarioString para almacenar el nombre del usuario que desea acceder al sistema, de la misma forma declare la variable clave el cual almacena el password según el usuario. usuario=Application.InputBox(Prompt:="Ingrese nombre de usuario", Type:=2)

Applicaon.InputBox permite mostrar un cuadro de entrada de valor con el men  clave=Application.InputBox(Prompt:= "Ingrese clave:", Type:=2)

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

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

87

88

Aplicaciones VBA con Excel

MsgBox "Bienvenido usuario Administrador"

La función MsgBox permite enviar un mensaje al usuario, de tal forma que la aplicación se pueda comunicar con el usuario. Application.Visible=True

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

Permite salir de la aplicación Excel, en nuestro caso solo saldrá de Excel cuando el usuario o la clave sean incorrectas. 5. Li-

bro de Excel habilitado para macros. Salir de Excel y volver abrir el libro; ingrese el nombre del usuario «Administrador» y la clave «123» para probar el acceso. ͫCaso desarrollado 10: Uso de métodos del objeto Applicaon  la siguiente imagen:

Fig. 1.57 Pantalla inicial de la aplicación

Se debe tener en cuenta: ción como B11, C11 y D11.



Los botones de Iniciar empo y Detener empolizar los procedimientos en el entorno VBA.



Para probar la aplicación, primero debemos hacer clic en el botón Iniciar empo  botón Detener empo         cronómetro.



Cap.1: Introducción al VBA

Pasos: 1. En

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

Fig. 1.58 Pantalla inicial mostrada al usuario logueado correctamente 2. Ficha Desarrollador > Visual Basic 3. Agregue un módulo al proyecto desde el menú Insertar > Módulo 4. Coloque los siguientes procedimientos dentro del módulo: Dim segundos As Date, contador As Date Sub detenerCronometro() Application.OnTime segundos, "actualizaTiempo", , False End Sub Sub actualizaTiempo() Application.Range("D11").Value = FormatDateTime(Now-CDate(Application.Range("B11").Value),vbLongTime) segundos = Now + (1 / 86400) Application.OnTime segundos, "actualizaTiempo" End Sub Sub IniciaTiempo() Call actualizaTiempo contador = Now Application.Range("B11").Value = FormatDateTime(contador, vbLongTime) Application.Range("C11").ClearContents End Sub Sub detenerTiempo() Call detenerCronometro Application.Range("C11").Value = FormatDateTime(Now(), vbLongTime) Application.Range("D11").Value = FormatDateTime(CDate(Application.Range("C11"))CDate(Application.Range("B11")), vbLongTime) End Sub

89

90

Aplicaciones VBA con Excel

Explicaremos el código implementado: Dim segundos As Date, contador As Date

Las variables segundos y contador están declaradas en la sección global de la aplicación, es decir, podrán ser usadas en cualquier función o procedimiento. Asimismo, la variable segundos cronómetro; mientras que la variable contador almacena la hora actual. Sub detenerCronometro() Application.OnTime segundos, "actualizaTiempo", , False End Sub

El procedimiento detenerCronometrodos; dentro del procedimiento se hace referencia al método OnTime del objeto Applicaon segundos al procedimiento actualizaTiempo para iniciar nuevamente el cronómetro; debemos considerar que la opción False Sub actualizaTiempo() Application.Range("D11").Value = FormatDateTime(Now-CDate(Application.Range("B11").Value), vbLongTime) segundos = Now + (1 / 86400) Application.OnTime segundos, "actualizaTiempo" End Sub

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

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

Cap.1: Introducción al VBA

91

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

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

Excel invocaremos a los procedimientos mediante botones, para esto debemos Desarrollador > Insertar > Botón de Controles de formulario > arrastre un marco en la hoja de Excel formando un rectángulo, al soltarlo seleccione el procedimiento IniciaTiempo y haga clic en el botón Aceptar.

6. Seguidamente,

haga clic derecho sobre el botón y seleccione la opción Modicar texto

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

de probar la aplicación debemos grabar la hoja de Excel, para esto presione Libro de Excel habilitado para macros. 9. Finalmente, pruebe las acciones presionando primero el botón Iniciar empo, lue Detener empo. ͫCaso desarrollado 11: Acvate Implemente una aplicación VBA que permita mostrar la información obtenida por la empresa «Inversiones Mygsala SAC», en la cual se encuentran los datos de los clien      como se muestra en la siguiente imagen:

Fig. 1.59 Pantalla principal

92

Aplicaciones VBA con Excel

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



Hoja2: Data

Fig. 1.60 Data

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

Fig. 1.61 Gráco

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



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

Cap.1: Introducción al VBA

3. Implemente los siguientes procedimientos: Sub activaData() Worksheets(2).Activate End Sub Sub activaGraco() Worksheets(3).Activate End Sub Sub salir() r = MsgBox("Esta seguro de salir?", vbYesNo + vbInformation, "Salir") If r = 6 Then Me.Close End If End Sub Sub retornarPrincipal() Worksheets(1).Activate End Sub

Analizando el código: Worksheets(2).Activate

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

 r=MsgBox("Esta seguro de salir?",vbYesNo+vbInformation,"Salir") If r = 6 Then Me.Close End If

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

Finamente, el método retornarPrincipal permite ubicar en la primera hoja desde cualquier hoja, la idea principal es regresar al menú de opciones que presenta la 

93

94

Aplicaciones VBA con Excel

4. En

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

Fig. 1.62 Listado de procedimientos implementados en VBA

No se olvide, que el procedimiento retornarPrincipal debe ser invocado por medio de botones en las hojas Listado de clientes 5. Antes

de probar la aplicación debemos grabar la hoja de Excel, para esto presione Libro de Excel habilitado para macros. 6. dos en cada hoja del libro. ͫCaso desarrollado 12: Name WorkSheets Implemente una aplicación VBA que permita mostrar los nombres de las hojas contenidas en un determinado libro, tal como se muestra en la siguiente imagen:

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

Cap.1: Introducción al VBA

Se debe tener en cuenta: En el libro de Excel se debe contar con una hoja inicial que presente la relación de nóminas de matrícula tal como se muestra en la imagen anterior.



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



Pasos: 1. Establezca las hojas necesarias para la aplicación. 2. Acceda

al entorno VBA presionando y haga doble clic sobre el objeto ThisWorkbook, es aquí donde implementaremos los procedimientos necesarios en la aplicación. 3. Implemente los siguientes procedimientos: Sub muestraHojas() Dim hojas As Worksheet i = 1 For Each hojas In Sheets Sheets(1).Cells(6 + i, 2).Value = hojas.Name i = i + 1 Next End Sub Sub limpiaCeldas() Sheets(1).Range("B7:B100").ClearContents End Sub Sub salir() r = MsgBox("Esta seguro de salir?", vbYesNo + vbInformation, "Salir") If r = 6 Then Me.Close End Sub

Analizando el código: Dim hojas As Worksheet i = 1 For Each hojas In Sheets Sheets(1).Cells(6 + i, 2).Value = hojas.Name i = i + 1 Next

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

95

96

Aplicaciones VBA con Excel

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

El método ClearContents permite eliminar las celdas de un determinado rango, para Range. r = MsgBox("Esta seguro de salir?", vbYesNo + vbInformation, "Salir") If r = 6 Then Me.Close

       variable r acumula la respuesta que el usuario seleccionará y que la sentencia If comprobará justamente qué botón seleccionó, si el usuario selecciona Sí entonces cerrará la hoja con la sentencia Me.Close. 4. En

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

Fig. 1.64 Listado de procedimientos implementados en VBA 5. Antes

de probar la aplicación debemos grabar la hoja de Excel, para esto presione Libro de Excel habilitado para macros. 6. dos en cada hoja del libro. ͫCaso desarrollado 13: Next-Previous Implemente una aplicación VBA que permita mostrar toda la información de las orga de botones, podamos avanzar o retroceder por las hojas de información, tal como se muestra en la siguiente imagen:

Cap.1: Introducción al VBA

Fig. 1.65 Listado de registros con botones anterior y siguiente

Se debe tener en cuenta: En el libro de Excel se debe contar con las siguientes hojas:



Hoja1: Listado01

Fig. 1.66 Listado 01

Hoja2: Datos02

Fig. 1.67 Datos 02

97

98

Aplicaciones VBA con Excel

Hoja3: Datos03

Fig. 1.68 Datos 03

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



Pasos: 1. -

 2. Acceda al entorno VBA presionando y haga doble clic sobre el objeto ThisWorkbook, es aquí donde implementaremos los procedimientos necesarios en la aplicación. 3. Implemente los siguientes procedimientos: Sub hojaSiguiente() ActiveSheet.Next.Activate End Sub Sub hojaAnterior() ActiveSheet.Previous.Activate End Sub

4. En

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

Fig. 1.69 Listado de procedimientos implementados en VBA

Cap.1: Introducción al VBA

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

de probar la aplicación debemos grabar la hoja de Excel, para esto presione Libro de Excel habilitado para macros. 6. dos en cada hoja del libro. ͫCaso desarrollado 14: Open Implemente una aplicación VBA que permita abrir los archivos de Excel desde un mismo documento, tal como se muestra en la siguiente imagen:

Fig. 1.70 Pantalla del libro «Control de reportes»

Se debe tener en cuenta: Todos los archivos correspondientes a los reportes y el mismo archivo Control de reportes deben encontrarse en una misma carpeta.



xlsm, pueden ser .xls o .xlsx.



Pasos: 1. En

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

Fig. 1.71 Pantalla inicial del control de reportes

99

100

Aplicaciones VBA con Excel

2. Ficha Desarrollador > Visual Basic. 3. Hacer doble clic sobre ThisWorkbook desde la ventana Explorador de Proyectos. 4. Coloque los siguientes procedimientos: Sub muestraReporte01() Workbooks.Open Filename:="C:\Reportes Excel 2016\reporte01.xlsx" End Sub Sub muestraReporte02() Workbooks.Open Filename:="C:\Reportes Excel 2016\reporte02.xlsx" End Sub Sub muestraReporte03() Workbooks.Open Filename:="C:\Reportes Excel 2016\reporte03.xlsx" End Sub

Explicaremos el código implementado: Workbooks.Open Filename:="C:\Reportes Excel 2016\reporte01.xlsx"

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

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

Fig. 1.72 Listado de procedimientos implementados en VBA 6. Antes

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

Cap. Fundamentos de programación

2

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

2.1 Fases para la solución de un programa La solución a un determinado problema se puede dar de diferentes formas y en diferentes escenarios. Cuando el problema es conocido, se puede solucionar directamente en el lenguaje de programación, pero siempre se recomienda realizar un análisis del mismo, pues las soluciones pasadas no necesariamente solucionan las actuales.    mente el lenguaje BASIC también debemos conocer cuáles son las funciones que enlazan los resultados con Excel, ya que no nos servirá de mucho mostrar los resultados en VBA cuando se requiere, por ejemplo, un informe o reporte de datos. Entonces, podemos resumir que para solucionar un determinado problema debemos seguir las siguientes fases: Acvidades

Fases

Analizar el problema de tal forma que 

Análisis del problema

Diseñar el algoritmo de solución al  la necesidad del problema.

Diseño del algoritmo

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



Ejecutar el programa de tal manera 

Ejecución del programa

 



102

Aplicaciones VBA con Excel

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

Valores de solución

¿Qué datos necesito para la solución del problema?

Aquí debemos listar los datos que se necesita para la solución del problema, por lo menos debe haber uno y para esta etapa debe ser un valor atómico, es decir, no debe contener más de un valor. Es comúnmente llamado «ENTRADA».

¿Cómo uso esos datos o cual será la fórmula que emplearé en la solución?

Aquí podemos emplear nuestros conocimientos previos sobre los cálculos matemá como parte de la solución al problema. Aquí podemos establecer una analogía con las funciones que ofrece Excel, pues las funciones trabajan dependiendo de cómo usted lo use. Es comúnmente llamada «PROCESO».

¿Cuál es el resultado?

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

Veamos algunos casos para entender mejor cómo debemos analizar un problema antes  Problema 1:    Analizando el problema, encontramos los siguientes datos: Peso del paquete (kg)

Distancia de la población (km)

Costo de transporte ($)

5

60

9.00

15

200

¿?

Cap.2: Fundamentos de programación

103

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

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

Proceso costo = 9 × 15 × 200  El costo del transporte es directamente proporcional al peso del   el costo aumenta en proporción al peso del paquete. De la misma manera, debemos comparar el costo de acuerdo            proporcional, ya que a mayor distancia, mayor será el costo de transporte. Finalmente, podemos concluir con la siguiente fórmula de solución al problema: costo = 9 × peso × distancia  Si se observa la fórmula, nos damos cuenta que para poder hallar el costo, necesitamos saber cuál es el peso y la distancia. Por lo tanto, es válido decir que «peso» y «distancia» son datos de entrada, mientras que «costo» representa el valor de salida. Salida

Costo de transporte (costo)

Problema 2: Doce obreros, trabajando 8 horas diarias, terminan un trabajo en 25 días. ¿Cuánto tardarán en hacer ese mismo trabajo 5 obreros trabajando 10 horas diarias? Analizando el problema, encontramos los siguientes datos: Candad de obreros

Horas de trabajo

Días trabajados

12

8

25

5

10

¿?

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

104

Aplicaciones VBA con Excel

Entrada

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

Proceso Días = 25 × 12 × 8   de obreros, es decir, si por 25 días se necesitan 12 obreros,  disminuye. De la misma manera, debemos comparar las horas diarias de trabajo basado en los días trabajados, es decir, si trabajando 8 horas diarias nos demoramos 25 días; entonces podemos decir que, por 10 horas diarias, nos demoraremos menos días; por lo tanto, las horas de trabajo son inversamente proporcionales a los días trabajados. Finalmente, podemos concluir con la siguiente fórmula de solución al problema: días = 25 ×

12 × 8 obreros horas

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

Salida

Días trabajados (días)

 y salida, así pues, le recomiendo que resuelva los ejercicios propuestos. 2.1.2 Fase 2: Diseño del algoritmo El diseño del algoritmo es representado mediante dos herramientas que pueden ser dia ya que son los más parecidos al código fuente que necesitamos implementar en VBA. Se dice que un pseudocódigo representa el problema en cortos pasos de forma descen problema con los datos obtenidos en la fase 1. Ahora, seleccionaremos los dos casos expuestos en la fase 1 para representarlos en la fase del diseño del algoritmo.

Cap.2: Fundamentos de programación

105

Problema 1:   Patrón de entrada, proceso y salida del problema: Entrada

peso, distancia

Proceso

costo = 9 × peso × distancia 5 60

Salida

costo

Pseudocódigo de solución: Descripción

Líneas de pseudocódigo

Punto de inicio del pseudocódigo.

INICIO Leer peso, distancia

Solicita el valor de peso y distancia.

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

Calcula el costo según lo analizado.

Imprimir costo

Muestra el resultado del cálculo. 

FIN

Problema 2: Doce obreros, trabajando 8 horas diarias, terminan un trabajo en 25 días. ¿Cuánto tardarán en hacer ese mismo trabajo 5 obreros trabajando 10 horas diarias? Patrón de entrada, proceso y salida del problema: Entrada

obreros, horas

Proceso

días = 25 ×

Salida

12 8 × obreros horas

dias

Pseudocódigo de solución: Líneas de pseudocódigo INICIO

Descripcion Punto de inicio del pseudocódigo.

Leer obreros, horas

Solicita el valor de obreros y horas.

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

 según la fórmula.

Imprimir días

Muestra el resultado del cálculo.

FIN



106

Aplicaciones VBA con Excel

2.1.3 Fase 3: Codificación de un programa en VBA  el pseudocódigo y reemplazarlos por las sentencias propias de VBA. Esto lo vamos a ir aprendiendo conforme pasemos los capítulos del libro. Tomaremos como referencia el Problema 1: Problema 1:    Pseudocódigo de solución: Líneas de pseudocódigo INICIO Leer peso, distancia Costo = 9 x (peso/5) x (distancia /60) Imprimir costo FIN

Paso 1: Diseñe el siguiente formato en Excel

Paso 2: Ingrese al entorno VBA (), luego inserte un módulo al proyecto (Insertar>Módulo) y coloque el siguiente código:

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

Cap.2: Fundamentos de programación

107

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

Descripción

Function calculaCosto

         el nombre que representará al código VBA, se debe tomar en cuenta que un nombre de función no debe tener espacios en blanco.

ByVal peso

 es decir, peso representa el primer valor que el usuario envíe a la función.

ByVal distancia

 Debe considerar que para asignar dos o más parámetros hay que separarlos por comas y deben estar precedidos siempre por la palabra ByVal  «por el valor».

calculaCosto=costo

Para que la función devuelva una respuesta se debe asignar el valor resultante al nombre de la función. Vale decir, qué costo es el resultado esperado por la función que será devuelta, cuando hagamos referencia a la función calculaCosto.

End Function



Problema 2: Doce obreros, trabajando 8 horas diarias, terminan un trabajo en 25 días. ¿Cuánto tardarán en hacer ese mismo trabajo 5 obreros trabajando 10 horas diarias? Pseudocódigo de solución: Líneas de pseudocódigo INICIO Leer obreros, horas días = 25x(12/obreros)x(8/horas) Imprimir días FIN

Paso 1: Diseñe el siguiente formato en Excel

108

Aplicaciones VBA con Excel

Paso 2: Ingrese al entorno VBA (), luego inserte un módulo al proyecto (Insertar>Módulo) y coloque el siguiente código:

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

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

Descripción

Function calculaDias

Nombre de la función.

ByVal obreros, Byval horas

Parámetros de la función.

Días=25*(12/obreros)*(8/horas)

Formula que calcula los días en  y las horas que trabajan.

calculaDias=días

Devolviendo el resultado a la función.

End Function

Fin de la función calculaDias.

2.1.4 Fase 4: Ejecución del programa en VBA En esta fase pasaremos a probar el valor resultante de la función en Excel, por tanto, ubíquese en la hoja del Paso 1. Según el diseño, debemos ubicarnos en la celda D6 e invocar a la función calculaCosto de la siguiente manera: =calculaCosto(B5;C5) Tenga en cuenta que B5 representa al valor del peso, por lo tanto asegúrese que la celda B5 contenga dicho valor, mientras C5 representa a la distancia. Finalmente, se debe tener en cuenta que cada objeto de VBA se ejecuta de diferente forma, en este caso estamos viendo la ejecución de una función. 2.1.5 Fase 5: Verificación y depuración Ahora debemos comprobar que los valores expuestos como resultado sean los esperados por el usuario de tal forma que, si el resultado no es el esperado, entonces usted podrá 

Cap.2: Fundamentos de programación

109

2.2 Elementos de un programa VBA Cuando se desarrolla una aplicación VBA se necesita tener en cuenta que todo código está compuesto por elementos que en conjunto trabajan para generar un resultado esperado por el usuario. Ahora veremos cuáles son los elementos más importantes. 2.2.1 Identificadores Es un conjunto de caracteres los cuales pueden ser letras, números o caracteres subrayados. Estos representan un valor dentro del código VBA y es muy importante tener en cuenta los siguientes aspectos, puesto que en toda la línea de programación se hace   nombre_cliente es igual a NOMBRE_CLIENTE y viceversa.



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



Observación

Alternava

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

_ (Guion bajo)

_nombres _descripcion _precio

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





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



Válido

No Válido

nota1 nota_1

1nota 1_nota

descuento10 descuento_10

10descuento 10_descuento

110

Aplicaciones VBA con Excel

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



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

Boolean

ByRef

Byte

ByVal

Case

CBool

CByte

CChar

Cdate

CDec

CDbl

Char

CInt

Class

CLng

CObj

Const



Date

Decimal

Dim

Do

Double

Else

ElseIf

End

EndIf

Error

Exit

False

For



Get

GetType

GoTo

If

Integer

Is

Long

Loop

Mod

Module

Next

Not

Nothing

Object

Or

Private

Protected

Public

REM

Short

Single

Step

String

Sub

Then

To

True

Variant



2.2.3 Comentarios  la idea es asignar comentarios para explicar algún efecto en el código o simplemente  Debemos recordar que una aplicación es interpretada y compilada por el lenguaje VBA y que un comentario es interpretado como tal, pero no ingresa a la compilación. Existen dos sentencias para asignar comentarios: Sentencia

Ejemplo

Rem

Rem Comentarios

' (comilla simple)

'Comentarios

Cap.2: Fundamentos de programación

111

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

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

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

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

2.3 Tipos de datos  Aquí debemos comentar que VBA no obliga a la declaración de variables y toma como Variant. Asimismo, cuando no se declara una variable tenga en cuenta que se declarará interna Variant. Finalmente, podemos decir que una variable declarada como Variant  2.3.1 Enteros  

112

Aplicaciones VBA con Excel

Tipo de datos

Capacidad

Ejemplo

Byte

0.255

Edad de una persona, nota de un alumno, número de hijos de un trabajador, etc.

Integer

-32768 a +32767

 puntaje de evaluación, etc.

Long

-2.147.483.648 a +2.147.483.647

Número de asistentes a un evento, 

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

Capacidad  -3.4028523E38 a -1,401298E-45

Single  +1,401298E-45 a +3.402823E38  -1.79769313486232E308 a -4,94065645841247E-324 Double  +4,94065645841247E-324 a +1.79769313486232E308 Decimal

-7,9228162514264337593543950335 a 7,9228162514264337593543950335

Ejemplo

Promedio de notas, talla y peso de una persona, etc.

 valor de la exponencial, tasa de interés anual de un banco, etc.

Subtotal, descuento de una compra, etc.

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

-922.337.000.000.000 a +922.337.000.000.000

Precio de un producto, sueldo de un empleado, etc.

2.3.3 Caracteres y cadenas  String. Tipo de datos String

Capacidad Tiene un máximo de 2 millones de caracteres.

Ejemplo Nombre del empleado, descripción de un producto, categoría de un empleado, estado civil de una persona, etc.

Cap.2: Fundamentos de programación

113

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

Capacidad True/False

Ejemplo Sexo, estado civil de un empleado (soltero, casado), condición de un alumno (aprobado, desaprobado), etc.

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

Capacidad 1 de enero de 100 a 31 de diciembre de 9999

Date

Ejemplo Fecha de nacimiento de un empleado, fecha de vencimiento de un producto, fecha de contrato, etc.

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

Capacidad

Variant



Ejemplo Número entero, nombre de estudiante, año de nacimiento, etc.

2.4 Constantes  como un valor predeterminado. Su formato es: CONST Nombre As TipoDatos = "Valor" Donde: CONST:  Nombre: Es el nombre que se le asigna a la constante. 

As TipoDatos:  puede ser Integer, Double, Date, etc.



Valor: Es el valor que tendrá la constante.



114

Aplicaciones VBA con Excel

 



CONST pi As Double = 3.14159265359 



CONST interés As Double = 0.08 6



CONST fecha As Date = "01/01/2016" 



CONST estado As String = "Emida"

2.5 Variables Toda aplicación en VBA usa variables para almacenar información referente a su entorno,          Al respecto, debemos mencionar que una variable es una posición con nombre en la me números, etc. A diferencia de las constantes, una variable cambia de valor las veces que sea necesaria,  ¿Cómo idencar una variable en una aplicación? Veamos el siguiente código VBA: Sub calculaPromedio() Alumno = InputBox("Ingrese nombre del alumno: ") nota1 = CInt(InputBox("Ingrese Nota 1: ")) nota2 = CInt(InputBox("Ingrese Nota 2: ")) nota3 = CInt(InputBox("Ingrese Nota 3: ")) promedio = (nota1 + nota2 + nota3) / 4 MsgBox "El promedio es: " & promedio End Sub

Cap.2: Fundamentos de programación

115

Las variables son alumno, nota1, nota2, nota3 y promedio ya que almacenarán diferen  por lo tanto, el nombre del alumno y sus notas serán diferentes. Igualmente, podríamos decir que alumno, nota1, nota2, nota3 son variables de entrada mientras que promedio es una variable de salida. ¿Qué nombre le puedo asignar a una variable? Colocar los nombres de las variables es una decisión del programador, pero se debe seguir un patrón para asignar un nombre. Por ejemplo, si almacenamos una descripción de un producto, podríamos llamar a su variable descripcion o producto; pero si el valor resulta algo compuesto como el precio unitario de un producto, podríamos llamarlo precioUnitario o pUnitario. Como notará asignamos mayúscula al inicio de la segunda pala decisión la toma usted. Veamos algunos casos: Caso

Nombres posibles de variables

Fecha de nacimiento de un empleado

fechaNacimiento fecha_nacimiento fechaNac _fecha_nacimiento

Promedio ponderado de un alumno

promedioPonderado promedio_ponderado promPonderado

Sueldo básico de un empleado

sueldoBasico sueldo_basico sueldoBas

¿Cómo declarar una variable? Dim nombre_variable As poDatos Donde: Dim: Es la palabra reservada que indica el inicio de la declaración de una o más variables. Al respecto debemos mencionar que solo puede haber un Dim por línea de código.



Variable: Es el nombre que el programador asignará a la variable. Lea el tema de 



As poDatos: Integer, Double, Currency, etc.



116

Aplicaciones VBA con Excel

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

Especicación Declaración de la edad de una persona  personas asistentes a un evento

Dim edad As Byte Dim edad As Integer Dim cantidad As Integer Dim cantidad As Long

Declaración de la distancia recorrida por un automóvil.

Dim distancia As Single Dim distancia As Double

 mos de un camión.

Dim peso As Double

Declaración del pago de pensiones de un estudiante.

Dim pension As Decimal Dim pension As Currency

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

Declaración de variable

Especicación



Declaración de la edad de una persona.

Dim edad%

& (Single)

      personas asistentes a un evento.

Dim cantidad&

! (Long)

Declaración de la distancia recorrida por un automóvil.

Dim distancia!



Declaración de un peso en toneladas de un determinado camión.

Dim peso#

@ (Currency)

Declaración del sueldo de un empleado.

Dim sueldo@



Declaración de la dirección domiciliaria de un empleado.

Dim direccion$

Algunas opciones al declarar variables Especicación

Declaración de variable

Declaración de una sola variable.

Dim edad As Integer Dim edad%

Declaración de dos variables o más 

Dim nota1 As Integer, Nota2 As Integer Dim nota1%,Nota2%,nota3%

Declaración de dos variables o más 

Dim edad As Integer, sueldo As Currency Dim edad%, sueldo@

Cap.2: Fundamentos de programación

117

Finalmente, podemos reestructurar el código presentado al inicio (con referencia a este tema), el cual quedará de la siguiente manera: Sub calculaPromedio() Dim alumno As String Alumno = InputBox("Ingrese nombre del alumno: ") Dim nota1 As Integer, nota2 As nota1 = CInt(InputBox("Ingrese nota2 = CInt(InputBox("Ingrese nota3 = CInt(InputBox("Ingrese

Integer, nota3 As Integer Nota 1: ")) Nota 2: ")) Nota 3: "))

Dim promedio As Double promedio = (nota1 + nota2 + nota3) / 3 MsgBox "El promedio es: " & promedio End Sub

O también, podríamos tener el siguiente código usando símbolos en la declaración de variables: Sub calculaPromedio() Dim alumno$, nota1%, nota2%, nota3%, promedio# Alumno = InputBox("Ingrese nombre del alumno: ") nota1 = CInt(InputBox("Ingrese Nota 1: ")) nota2 = CInt(InputBox("Ingrese Nota 2: ")) nota3 = CInt(InputBox("Ingrese Nota 3: ")) promedio = (nota1 + nota2 + nota3) / 3 MsgBox "El promedio es: " & promedio End Sub

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

118

Aplicaciones VBA con Excel

Especicación

Inicialización de variables por defecto.

Inicialización de variables con 

Inicialización de variables con  en una misma línea.

Dim Dim Dim Dim Dim Dim

Declaración de variable

Valor Inicial

n As Integer distancia As Single peso As Double nombre As String fecha As Date estado As Boolean

0 0.0 0.0 «» 12:00:00am False

Dim n As Integer n=10

10

Dim categoria As String categoria = "Administrador"

Administrador

Dim n As Integer: n=10 Dim categoria As String: categoria="Administrador"

10 Administrador

2.6 Operadores   cerlos y saber el uso adecuado de algunos de ellos. 2.6.1 Asignación   declaración de la variable. Además, debemos considerar que una variable también puede registrar un valor resultante de una expresión. Su formato es: Variable = valor Veamos algunas referencias: Especicación Asignar la categoría de Operario a un empleado. minado monto y asignarlo a una variable.

Determinar la edad de una persona basado en su fecha de nacimiento y asignarlo a una variable.

Asignación de valor Dim categoria As String categoria = "Operario" Dim monto As Currency monto = 5200.75 Dim descuento As Currency descuento = monto * 0.2 Dim fechaNac As Date fechaNac = "05/05/1976" Dim edad As Integer edad = Year(Date) - Year(fechaNac)

Cap.2: Fundamentos de programación

119

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

Descripción

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

+

Dim precioLista As Currency precioLista = 5400

Suma o adición

Dim precioVenta As Currency precioVenta = precio + 50

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

Resta o sustracción

Dim pago As Currency pago = 10000 Dim descuento as Currency descuento = pago – 2.17/100

Determinar a cuánto asciende un monto el cual es  *

 producto



Dim monto As Currency monto = 10000 Dim nuevoMonto As Currency nuevoMonto = monto * 1.2

Determinar el promedio en decimales de un alumno, el cual cuenta con tres notas decimales.

/

División real

Dim nota1#, nota2#, nota3# nota1 = 10.5 nota2 = 15.7 nota3 = 20 Dim promedio# promedio = (nota1 + nota2 + nota3) / 3

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

División entera

Dim meses As Integer meses = 121 Dim años As Integer años = meses \ 12

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

Exponenciación o potencia

Dim n As Integer n=2 Dim raiz As Double raiz = n ^ (1/2)

120

Aplicaciones VBA con Excel

      dígito de un número entero cualquiera. MOD

Resto de la división

Dim n As Integer n = 12453 Dim ultimoDigito As Integer ultimoDigito = n Mod 10

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

Descripción

Formas de uso Comparar las edades de dos personas:

=

Igualdad

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

Determinar si una persona es mayor de edad, de acuerdo a su fecha de nacimiento: Dim fechaNac As Date fechaNac = "04/05/1981"

>

Mayor que

Dim edad As Integer edad = Year(Date) - Year(fechaNac) Dim mensaje$ mensaje = IIf(edad > 17, "Mayor de edad", "Menor de edad")

Determinar si un alumno ha aprobado o no un curso el cual 

<

Menor que

Dim nota1%, nota2%, nota3% nota1 = 10 nota2 = 15 nota3 = 20 Dim promedio As Double promedio = (nota1 + nota2 + nota3) / 3 Dim mensaje$ mensaje = IIf(promedio < 10.5, "Desaprobado", "Aprobado")

Cap.2: Fundamentos de programación

121

Determinar si una persona es mayor de edad, de acuerdo a su fecha de nacimiento: Dim fechaNac As Date fechaNac = "04/05/1981"

>=

Mayor o igual que

Dim edad As Integer edad = Year(Date) - Year(fechaNac) Dim mensaje$ mensaje = IIf(edad >= 18, "Mayor de edad", "Menor de edad")

Determinar si un alumno ha aprobado o no un curso el cual 

Insertar > Controles de formulario > Botón. Luego seleccione el procedimiento calculosGuarderia desde la lista de macros.

Fig. 2.15 Selección de macro

Pruebe los resultados ingresando el total de alumnos (E10), cuota mensual (C12), otros gastos (C13E12). 5. Libro de Excel habilitado para macros. 4.

ͫCaso desarrollado 2: Estudios universitarios caria para sus estudios superiores. ¿Cuánto recibirá dentro de 18 años, suponiendo  fórmula:

C = Cinicial (1 + rn ) nt Donde: Cnal: n años Cinicial: Monto inicial del depósito r: Porcentaje de interés



t: Años de depósito



n: Composición del interés por año (trimestral (12÷3=4))



142

Aplicaciones VBA con Excel



C = Cinicial * ( 1 + ( r / n ) ) ^ ( n * t ) Si reemplazamos en la fórmula, por los valores dados en el problema, tenemos:

C  = 5000 * ( 1 + 0.04 / 4 ) ^ ( 4 * 18 )

Fig. 2.16 Cálculo del monto trimestral por depósito de herencia

Pasos: 1. Diseñe el siguiente modelo en la segunda hoja de Excel:

Fig. 2.17 Diseño inicial para el cálculo de monto trimestral

Cap.2: Fundamentos de programación

143

2. Ingrese al entorno VBA, haga doble clic sobre el objeto ThisWorkbook e implemen-

te el procedimiento calculaHerencia:

Fig. 2.18 Procedimiento que permite realizar los cálculos 3. Seguidamente,

debemos agregar un botón en la hoja de Excel para obtener los   Desarrollador > Insertar > Controles de formulario > Botón. Luego seleccione el procedimiento calculaHerencia desde la lista de macros.

Fig. 2.19 Selección de macro 4. Pruebe los resultados ingresando el monto depositado (C10), tasa de interés (C11)

y años (C14); haga clic en el botón Calcular. 5. Libro de Excel habilitado para macros.

144

Aplicaciones VBA con Excel

ͫCaso desarrollado 3: Uso de Operadores - Municipalidad de Lima       ciales, comedores populares y el programa vaso de leche.     pulares y el resto para el programa vaso de leche. Debe considerar los siguientes aspectos: Implemente en Excel el siguiente entorno:



Fig. 2.20 Entorno benecios sociales

Implemente procedimientos para realizar los cálculos mostrados y para limpiar las celdas.



Todas las variables usadas en la aplicación deben ser declaradas según la naturaleza de sus valores.



Pasos: 1. Diseñe el modelo de la aplicación 2. Implemente los siguientes procedimientos dentro del entorno ThisWorkbook:

Cap.2: Fundamentos de programación

Sub calculaDonacion() Dim monto As Currency monto = Range("C16").Value Dim cAsistenciales As Double, cPopulares As Double Dim pVaso As Double cAsistenciales = monto * 0.25 cPopulares = monto * 0.35 pVaso = monto - (cAsistenciales + cPopulares) Range("C18").Value = cAsistenciales Range("C19").Value = cPopulares Range("C20").Value = pVaso End Sub Sub limpiar() Range("C16").ClearContents Range("C18:C20").ClearContents Range("C16").Select End Sub

Explicación del código - Procedimiento calculaDonacion: Dim monto As Currency monto = Range("C16").Value

Declaramos la variable monto que será la encargada de almacenar el valor desde la celda C16, almacenada por el usuario el cual representa el valor total de la donación. Dim cAsistenciales As Currency, cPopulares As Currency Dim pVaso As Currency cAsistenciales = monto * 0.25 cPopulares = monto * 0.35 pVaso = monto - (cAsistenciales + cPopulares)

monto, este será usado en otras expresiones, el cual podrá calcular el monto asignado al programa de Centros Asistenciales (cAsistenciales), comedores populares (cPopulares) y el programa vaso de leche (pVaso). Todas estas variables deben ser declaradas como Currency por tratarse de valores monetarios. Range("C18").Value = cAsistenciales Range("C19").Value = cPopulares Range("C20").Value = pVaso

Finalmente, debemos enviar los valores resultantes a las celdas correspondientes.

145

146

Aplicaciones VBA con Excel

Explicación del código - Procedimiento limpiar: Range("C16").ClearContents Range("C18:C20").ClearContents Range("C16").Select

 poder hacer un rango de celdas y, así, ahorrar líneas de código como sucedió con Range("C18:C20")C16 mediante el método Select. 3. Desarrollador

y que se encuentre asociado al procedimiento calculaDonacion. 4. Desarrollador que se encuentre asociado al procedimiento limpiar. 5. Probar la aplicación, ingresando un monto en la celda C16 y mostrar los resultados con el botón Procesar. Para un segundo ingreso podrá presionar el botón Limpiar. ͫCaso desarrollado 4: Uso de constantes - Casa de cambio  monto en soles. Debe considerar los siguientes aspectos: Implemente en Excel el siguiente entorno:



Fig. 2.21 Entorno de casa de cambio

Cap.2: Fundamentos de programación

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



1 dólar = 3.51 soles 1 dólar = 1.09 euros 1 dólar = 2.12 marcos Pasos: 1. Diseñe el modelo de la aplicación 2. Implemente el siguiente procedimiento dentro del entorno ThisWorkbook: Sub determinaMontos() Const DOLAR = 3.51 Const EURO = 1.09 Const MARCOS = 2.12 Dim soles As Currency soles = Range("D14") Dim montoE As Currency, montoD As Currency Dim montoM As Currency montoD = soles / DOLAR montoE = montoD * EURO montoM = montoD * MARCOS Range("D17").Value = montoE Range("D18").Value = montoM Range("D19").Value = montoD End Sub

Explicación del código - Procedimiento calculaDonacion: Const DOLAR = 3.51 Const EURO = 1.09 Const MARCOS = 2.12

Empezamos por implementar las constantes antes de comenzar la captura de los  problema. Dim soles As Currency soles = Range("D14")

Luego, debemos capturar el monto ingresado por el usuario; este se registrará en la celda D14, el cual es capturado con la función Range y enviado a la variable monto, Currency. Dim montoE As Currency, montoD As Currency Dim montoM As Currency

 Descargado en: ey books.co m

147

148

Aplicaciones VBA con Excel

montoD = soles / DOLAR montoE = montoD * EURO montoM = montoD * MARCOS

  constante las expresiones que la usen no sufrirán cambios. Range("D17").Value = montoE Range("D18").Value = montoM Range("D19").Value = montoD

Finalmente, debemos enviar los valores resultantes a las celdas correspondientes, aquí se debe considerar el modelo presentado inicialmente para la aplicación. 3.  Desarrollador-

SAR» y que se encuentre asociado al procedimiento determinaMontos. 4. Pruebe la aplicación ingresando un monto en soles en la celda D14, luego haga clic en el botón PROCESAR. ͫCaso desarrollado 5: Símbolos que representan los pos de datos - Salario de empleado La empresa Trome S.A. necesita tener un mejor control sobre los montos que se paga a sus empleados, para lo cual cuenta con horas trabajadas, tarifa por hora, descuento de  necesita implementar una aplicación que permita calcular el monto bruto, descuento de Oncosalud, descuento de ley y sueldo neto de un determinado empleado. Debe considerar los siguientes aspectos: • Implemente en Excel el siguiente entorno:

Fig. 2.22 Montos del empleado

Cap.2: Fundamentos de programación

149

Implemente un procedimiento que permita realizar los cálculos y otro para limpiar las celdas.



Todas las variables usadas en la aplicación deben ser declaradas con símbolos que 



Pasos: 1. Diseñe el modelo de la aplicación 2. Implemente los siguientes procedimientos dentro del entorno ThisWorkbook: Sub calcularMontos() Dim Empleado$, hTrabajadas%, tHora@ Empleado = Range("C11").Value hTrabajadas = Range("C12").Value tHora = Range("F12").Value Dim mBruto@, tDescuentos@, sNeto@ Dim dOncosalud@, dLey@ mBruto = hTrabajadas * tHora dOncosalud = 8.5 / 100 * mBruto dLey = 12 / 100 * mBruto tDescuentos = dOncosalud + dLey sNeto = mBruto - tDescuentos Range("C14").Value Range("F14").Value Range("F15").Value Range("C16").Value Range("C17").Value End Sub

= = = = =

mBruto dOncosalud dLey tDescuentos sNeto

Sub limpiaCeldas() Range("C11").Value = "" Range("C12").ClearContents Range("F12").ClearContents Range("C14").ClearContents Range("F14:F15").ClearContents Range("C16:C17").ClearContents Range("C11").Select End Sub

Explicación del código - Procedimiento calcularMontos: Dim Empleado$, hTrabajadas%, tHora@ Empleado = Range("C11").Value hTrabajadas = Range("C12").Value tHora = Range("F12").Value

 $ representa al As String, % representa al As Integer y @ representa al As Currency. Luego capturamos los valores ingresados en la hoja de Excel. Asegúrese que las celdas son las correspondientes a los datos como C11 al nombre del empleado, C12 a las horas trabajadas y F12 a la tarifa horaria.

150

Aplicaciones VBA con Excel

Dim mBruto@, tDescuentos@, sNeto@ Dim dOncosalud@, dLey@ mBruto = hTrabajadas * tHora dOncosalud = 8.5 / 100 * mBruto dLey = 12 / 100 * mBruto tDescuentos = dOncosalud + dLey" sNeto = mBruto – tDescuentos

Realizamos los cálculos de los montos según lo solicitado en el problema. Range("C14").Value Range("F14").Value Range("F15").Value Range("C16").Value Range("C17").Value

= = = = =

mBruto dOncosalud dLey tDescuentos sNeto

Finalmente, enviamos los valores calculados a las celdas correspondientes, asegúrese que las posiciones de las celdas resultados sean las correctas. Explicación del código - Procedimiento limpiaCeldas: Range("C11").Value = "" Range("C12").ClearContents Range("F12").ClearContents Range("C14").ClearContents Range("F14:F15").ClearContents Range("C16:C17").ClearContents Range("C11").Select

La celda C11 es una celda combinada por lo tanto no se puede usar el método ClearContents como en las demás celdas, así es que usamos el método Value y C11 para ingresar nuevamente valores.

3. Desarrollador

que se encuentre asociado al procedimiento calcularMontos. 4. DesarrolladorDAS» y que se encuentre asociado al procedimiento limpiaCeldas. 5. Pruebe la aplicación ingresando el nombre del empleado, las horas trabajadas y la tarifa por hora, luego haga clic en el botón CALCULAR.

Cap.2: Fundamentos de programación

151

ͫCaso desarrollado 6: Uso de mensajes - Conversión de grados  (°C) y la convierta a sus equivalentes en grados Fahrenheit (°F), grados Kelvin (K) y  Implemente en Excel el siguiente entorno:



Fig. 2.23 Entorno de conversión de grados

Antes de mostrar las respuestas en la hoja de Excel, muestre el siguiente mensaje con las fórmulas siguientes:



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



Pasos: 1. Diseñe el modelo de la aplicación 2. Implemente los siguientes procedimientos dentro del entorno ThisWorkbook:

152

Aplicaciones VBA con Excel

Sub calculaGrados() Dim C# C = Range("C8").Value Dim F = R = K =

F#, K#, R# (9 * C) / 5 + 32 C + 460 R - 187

MsgBox "Las fórmulas a usar son: " & vbNewLine & _ vbNewLine & _ "Farhenheit: 9C/5+32" & vbNewLine & _ "Rankine: C+460" & vbNewLine & _ "Kelvin: R-187" Range("C12").Value = F Range("C13").Value = R Range("C14").Value = K End Sub

Explicación del código: Dim C# C = Range("C8").Value

Empezamos declarando la variable Cdouble(#) en la cual almacenaremos el valor ingresado en la celda C8. Dim F = R = K =

F#, K#, R# (9 * C) / 5 + 32 C + 460 R - 187

Realizamos los cálculos de los montos según lo solicitado en el problema, recuerde double(#). MsgBox "Las fórmulas a usar son: " & vbNewLine & _ vbNewLine & _ "Farhenheit: 9C/5+32" & vbNewLine & _ "Rankine: C+460" & vbNewLine & _ "Kelvin: R-187"

Antes de mostrar los resultados en las celdas, enviamos un mensaje al usuario con las fórmulas usadas. Aquí debemos mencionar que vbNewLine permite el cambio de línea dentro del texto del mensaje, la"& _" sentencia en la línea siguiente. Range("C12").Value = F Range("C13").Value = R Range("C14").Value = K

Finalmente, enviamos los valores calculados a las celdas correspondientes, asegúrese que las posiciones de las celdas resultados sean las correctas.

Cap.2: Fundamentos de programación

153

3. Desarrollador 

y que se encuentre asociado al procedimiento calculaGrados. 4. Pruebe la aplicación ingresando un valor en grados Celsius en la celda C8, luego haga clic en el botón PROCESAR. ͫCaso desarrollado 7: Uso de InputBox - Venta de repuestos La empresa de venta de repuestos para automóviles Chery necesita una aplicación que permita determinar el precio al que debe vender una pieza considerando en  precio de compra de la pieza y el porcentaje de ganancia será ingresado mediante la función InputBox. Debe considerar los siguientes aspectos: Implemente en Excel el siguiente entorno:



Fig. 2.24 Entorno venta de repuestos

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



Pasos: 1. Diseñe el modelo de la aplicación 2. Implemente los siguientes procedimientos dentro del entorno ThisWorkbook: Sub calculaMontos() Dim precio@ precio = Range("C9").Value Dim porcentaje# porcentaje = InputBox("Ingrese porcentaje de ganancia: ") Dim montoGanancia@ montoGanancia = precio * porcentaje / 100 Dim precioVenta@ precioVenta = precio + montoGanancia

154

Aplicaciones VBA con Excel

Range("C10").Value = porcentaje / 100 Range("C11").Value = montoGanancia Range("C13").Value = precioVenta End Sub Sub limpiarCeldas() Range("C9:C11").ClearContents Range("C13").ClearContents Range("C9").Select End Sub

Explicación del código: Dim precio@ precio = Range("C9").Value

Empezamos declarando la variable precio, luego se almacena el valor registrado en la celda C9. Dim porcentaje# porcentaje = InputBox("Ingrese porcentaje de ganancia: ")

La variable porcentaje recibe el valor ingresado desde la función InputBox. Dim montoGanancia@ montoGanancia = precio * porcentaje / 100

El monto de ganancia se calcula en base al porcentaje ingresado por el usuario y el precio de compra del repuesto. Dim precioVenta@ precioVenta = precio + montoGanancia

El precio de venta se calcula en base al precio ingresado y el monto de ganancia. Range("C10").Value = porcentaje / 100 Range("C11").Value = montoGanancia Range("C13").Value = precioVenta

Finalmente, enviamos los valores resultantes a las celdas correspondientes. 3. Desarrollador

que se encuentre asociado al procedimiento calculaMontos. 4. Pruebe la aplicación ingresando un valor para el precio de compra en la celda C9, luego haga clic en el botón PROCESAR.

Cap.2: Fundamentos de programación

155

ͫCaso desarrollado 8: Uso de funciones - Pago de vendedores   grama que calcule la comisión, el salario bruto, el descuento y el salario neto de un vendedor de la empresa. Debe considerar los siguientes aspectos: Implemente en Excel el siguiente entorno:



Fig. 2.25 Entorno de pago de vendedores

Implemente funciones necesarias para la aplicación.



 Declare la constante «básico» con el valor 700. 

Pasos: 1. Diseñe el modelo de la aplicación 2. Implemente las siguientes funciones dentro del entorno ThisWorkbook: Const basico = 700 Function getMonto() getMonto = Range("C11").Value End Function Function calculaComision(ByVal monto As Currency) As Currency Dim comision@ comision = getMonto * 0.09 calculaComision = comision End Function Function calculaBruto(ByVal comision As Currency) As Currency calculaBruto = basico + comision End Function

156

Aplicaciones VBA con Excel

Function calculaDescuento(ByVal bruto As Currency) As Currency calculaDescuento = bruto * 0.11 End Function Function calculaNeto(ByVal bruto As Currency, ByVal descuento As Currency) As Currency calculaNeto = bruto - descuento End Function

Explicación del código: Function getMonto() getMonto = Range("C11").Value End Function

Función que permita obtener el monto de venta desde la celda C11. Function calculaComision(ByVal monto As Currency) As Currency Dim comision@ comision = getMonto() * 0.09 calculaComision = comision End Function

Función que permite calcular el monto de comisión basado en el monto vendido, el cual será enviado por medio del parámetro monto. Function calculaBruto(ByVal comision As Currency) As Currency calculaBruto = basico + comision End Function

 constante y del monto de comisión, el cual será enviado por medio del parámetro comisión. Function calculaDescuento(ByVal bruto As Currency) As Currency calculaDescuento = bruto * 0.11 End Function

Función que permite determinar el monto de descuento basado en el monto bruto. Function calculaNeto(ByVal bruto As Currency, ByVal descuento As Currency) As Currency calculaNeto = bruto - descuento End Function

Finalmente, la función calculaNeto 

Cap.2: Fundamentos de programación

157

3. Implemente el siguiente procedimiento dentro del entorno ThisWorkbook: Sub calculos() Dim monto@ monto = getMonto() Dim comision@, bruto@, descuento@, neto@ comision = calculaComision(monto) bruto = calculaBruto(comision) descuento = calculaDescuento(bruto) neto = calculaNeto(bruto, descuento) Range("C13").Value Range("C14").Value Range("C15").Value Range("C16").Value End Sub

= = = =

comision bruto descuento neto

Explicación del código: Dim monto@ monto = getMonto()

getMonto. Dim comision@, bruto@, descuento@, neto@ comision = calculaComision(monto) bruto = calculaBruto(comision) descuento = calculaDescuento(bruto) neto = calculaNeto(bruto, descuento)

Realizamos los cálculos sobre las variables comision, bruto, descuento y neto a par Range("C13").Value Range("C14").Value Range("C15").Value Range("C16").Value

= = = =

comision bruto descuento neto

Finalmente, se envían los resultados en las celdas correspondientes. 4. Desarrollador 

que se encuentre asociado al procedimiento calculos. 5. Pruebe la aplicación ingresando un valor para el monto vendido en la celda C11, luego haga clic en el botón PROCESAR.

158

Aplicaciones VBA con Excel

ͫCaso desarrollado 9: Uso de procedimientos - Pago de vendedores   grama que calcule la comisión, el salario bruto, el descuento y el salario neto de un vendedor de la empresa. Debe considerar los siguientes aspectos: Implemente en Excel el siguiente entorno:



Fig. 2.26 Entorno de pago de vendedores

Implemente procedimientos necesarios para la aplicación.



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



Pasos: 1. Diseñe el modelo de la aplicación 2. Implemente los siguientes procedimientos dentro del entorno ThisWorkbook:

Const basico = 700 Dim monto@, comision@, bruto@, descuento@, neto@ Sub getMonto() monto = Range("C11").Value End Sub Sub calculaComision() comision = monto * 0.09 End Sub Sub calculaBruto() bruto = basico + comision End Sub

Cap.2: Fundamentos de programación

Sub calculaDescuento() descuento = bruto * 0.11 End Sub Sub calculaNeto() neto = bruto - descuento End Sub Sub calculos() Call getMonto Call calculaComision Call calculaBruto Call calculaDescuento Call calculaNeto Range("C13").Value Range("C14").Value Range("C15").Value Range("C16").Value End Sub

= = = =

comision bruto descuento neto

Explicación del código: Const basico = 700 Dim monto@, comision@, bruto@, descuento@, neto@

ción de las variables monto, comision, bruto, descuento y neto. Recuerde que la declaración de variables globales debe realizarse fuera de los procedimientos; es así que cada uno de los procedimientos podrá acceder a los valores almacenados de dichas variables en cualquier momento. Sub getMonto() monto = Range("C11").Value End Sub

Procedimiento que se encarga de llenar de valor la variable global monto, debe considerar que la celda C11 Sub calculaComision() comision = monto * 0.09 End Sub

Procedimiento que se encarga de calcular el monto de la comisión basándose en  procedimiento calculaComision debe invocarse al procedimiento getMonto.

159

160

Aplicaciones VBA con Excel

Sub calculaBruto() bruto = basico + comision End Sub

Procedimiento que permite calcular el monto bruto en base a las variables globales básico y comision, recuerde que la variable comision fue llenada por el procedimiento calculaComision y que la variable basico es un valor constante. Sub calculaDescuento() descuento = bruto * 0.11 End Sub

Procedimiento que permite calcular el monto de descuento basado en el monto bruto. Sub calculaNeto() neto = bruto - descuento End Sub

Procedimiento que permite determinar el monto neto basado en las variables globales bruto y descuento. Sub calculos() Call getMonto Call calculaComision Call calculaBruto Call calculaDescuento Call calculaNeto Range("C13").Value Range("C14").Value Range("C15").Value Range("C16").Value End Sub

= = = =

comision bruto descuento neto

Finalmente, debemos invocar a todos los procedimientos desde otro procedimiento, este será el que se asocie al botón PROCESAR que se encuentra en la hoja de Excel. Tenga en cuenta que, como las variables están dependiendo de los procedimientos, estos deben ser llamados en estricto orden, ya que de otra manera algunas variables quedarán vacías.

3. Desarrollador

y que se encuentre asociado al procedimiento calculos. 4. Pruebe la aplicación ingresando un valor para el monto vendido en la celda C11, luego haga clic el botón PROCESAR.

Cap.2: Fundamentos de programación

161

2.15 Casos propuestos ͫCaso propuesto 1: Fase de análisis del problema: Ferrocarril Si tenemos 500 obreros trabajando en la implementación de un ferrocarril, en el que laboran 10 horas diarias, y donde logran colocar 2300 metros de vía en 28 días; con 425 obreros trabajando a 8 horas diarias, ¿cuántos metros de vía colocarán en 42 días? Analizando el problema, encontramos los siguientes datos: Candad de obreros

Candad de horas diarias (h)

Candad de metros (m)

Candad de días

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

Salida

ͫCaso propuesto 2: Fase de análisis del problema: Turistas chan 12 turistas? Analizando el problema, encontramos los siguientes datos: Candad de turistas

Candad de días de duración de la comida

162

Aplicaciones VBA con Excel

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

Salida

ͫCaso propuesto 3: Fase de análisis del problema: Inversión de negocio   cada uno? Analizando el problema, encontramos los siguientes datos: Aporte de amigo 1 ($)

Aporte de amigo 2 ($)

Aporte de amigo 3 ($)

Ganancia ($)

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

Salida

Cap.2: Fundamentos de programación

163

ͫCaso propuesto 4: Expresiones aritmécas  función de cada operador y el orden de prioridad según VBA. Expresión

Resultado

A1 = 10 / 15

A1=

A2 = 10 \ 15

A2=

A3 = 10 MOD 15

A3=

A4 = 3 + 4 * 8 * 4 – (9 + 3) / 6

A4=

A5 = 3 + 4 * (8 * 4) – 9 + 3 / 6

A5=

A6 = 10 / 100

A6=

A7 = 1 ^ (1/2)

A7=

ͫCaso propuesto 5: Expresiones aritmécas vs. expresiones algorítmicas  Expresión

Resultado

E1 = r + 1 d e E2 = (x + y)  E3 =

x+y x-y

E4 = (x + y)2 (a + b) E5 =

√x x+ y 2

ͫCaso propuesto 6: Financiamiento Implemente una aplicación en VBA que permita controlar la herencia que puede recibir un niño de parte de sus padres. Para esto, desean establecer un fondo de ahorro   por año compuesto, asumiendo que el interés sea semestral o trimestral?

C  = C inicial (1rn )nt 

164

Aplicaciones VBA con Excel

ͫCaso propuesto 7: Tienda comercial      determine el importe de la compra, el importe del descuento y el importe a pagar. Debe considerar los siguientes aspectos: 

Implemente en Excel el siguiente entorno:

Fig. 2.27 Entorno enda comercial

Implemente procedimientos para realizar los cálculos mostrados y para limpiar las celdas.



Todas las variables usadas en la aplicación deben ser declaradas según la naturaleza de sus valores.



Cap. UserForm y objetos visuales

3

Capacidad Reconoce los elementos que conforman las aplicaciones visuales de VBA como los 

3.1 UserForm   punto podremos crear aplicaciones basadas en formularios e integrarlas a las hojas de Excel de la forma que crea conveniente. Por otra parte, podemos mencionar que los UserForm permiten una interacción integraUserForm en VBA: Insertar un UserForm al libro de trabajo. Agregar los controles visuales al UserForm. Mediante las propiedades, modelar los controles y el mismo formulario de tal manera que pueda ser legible para el usuario. Agregar funciones o procedimientos a los controles. Enlazar el formulario en la hoja de Excel mediante un botón. 

Veamos un ejemplo del uso del UserForm, aquí observamos un formulario el cual solicita datos, los cuales pueden ser enviados a una hoja de Excel o simplemente ser manejados directamente desde el formulario.

Fig. 3.1 Entorno básico del UserForm 

166

Aplicaciones VBA con Excel

En la siguiente imagen observamos los datos que se visualizarán en el formulario, la idea principal de VBA es el uso de los datos que se encuentran en las hojas de cálculo como si cia los datos, los cuales veremos en este capítulo.

Fig. 3.2 Entorno de Excel registrando datos desde VBA 

3.2 Administración de UserForm en VBA Veremos algunas funcionalidades que presentan los UserForm. 3.2.1 Agregar un UserForm UserForm que se puede agregar sobre un proyecto. Veamos algunas formas de agregar un UserForm desde el entorno VBA: Desde el menú Insertar seleccionar la opción UserForm.



Desde el panel Explorador de Proyectos, haga clic derecho, seleccionar Insertar > UserForm.



Fig. 3.3 Agregando un UserForm

Cap.3: UserForm y objetos visuales

167

Al agregar un Userform el Explorador de Proyectos muestra el siguiente aspecto:

Fig. 3.4 Ventana del Explorador de Proyectos

Se muestra una carpeta llamada Formularios en la cual se almacenarán todos los UserForm que agregue al proyecto. 3.2.2 Modificar el nombre del UserForm En vista que se pueden agregar muchos UserForm al proyecto se debe considerar el asignar un nombre adecuado a cada UserForm debemos seguir los siguientes pasos: Seleccione un UserForm desde la ventana Exploradora de Proyectos.



 Name       nombre, se recomienda que dicho nombre inicie con el texto «frm», tal como se muestra en la siguiente imagen: frmPago o frmVenta.



Fig. 3.5 Propiedades del UserForm

3.2.3 Eliminar un UserForm Debemos seguir los siguientes pasos: Seleccione un UserForm desde la ventana Explorador de Proyectos Haga clic derecho sobre dicho UserForm y seleccione la opción Quitar, normalmente está acompañado del nombre que se le asignó al UserForm. 

A la pregunta: «¿Desea exportar frm antes de quitarlo?», seleccione No para elimi



Fig. 3.6 Exportar un UserForm antes de eliminarlo

168

Aplicaciones VBA con Excel

3.2.4 Ejecutar un UserForm  UserForm frente al usuario. Para ejecutar podemos realizar los siguientes pasos: Haga doble clic sobre un UserForm desde la ventana Explorador de Proyectos; esto hará que dicho UserForm



Presione 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ándar del entorno VBA.



Por otra parte, para salir del modo de Ejecución podemos realizar las siguientes opciones: 



También podríamos seleccionar el botón tándar del entorno VBA.



desde la barra de herramientas es-

3.2.5 Asociar el formulario a la hoja de Excel En la mayoría de ocasiones un UserForm se asociará a una hoja de Excel con la idea de enviar información o mostrar algún resultado esperado. Veamos cómo invocar un formulario desde la hoja de Excel. Por medio de un botón



Desarrollador, seleccione la opción botón de los Controles de formulario que se encuentra dentro de Insertar y arrastre formando un cuadro en la hoja de Excel.

Fig. 3.7 Opciones de Insertar desde la cha Desarrollador

Cap.3: UserForm y objetos visuales

169

Luego, se mostrará la siguiente ventana, desde la cual se debe seleccionar el botón Nuevo:

Fig. 3.8 Ventana de asignación de Macro

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

Fig. 3.9 Código implementado al botón

.ShowUserForm, lo contrario a la muestra se llama ocultar al UserForm, es decir, cuando hay varios UserForm           código frmVenta.Hide para administrarlo de la mejor manera.  y seleccione Modicar texto, quedando de la siguiente manera:

Fig. 3.10 Botón que invoca al UserForm frmVenta

170

Aplicaciones VBA con Excel

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

Fig. 3.11 Imagen que muestra el UserForm frmVenta

Fig. 3.12 Forma que muestra el Userform frmVenta

3.3 Tiempos en la programación                3.3.1 Tiempo de diseño Se le llama así cuando el programador coloca los controles sobre el UserForm, cambia las propiedades de dichos controles y asigna código VBA en algunos controles. Veamos un UserFormpulados, es decir, se podrá mover, copiar o eliminar.

Fig. 3.13 Tiempo de diseño

Cap.3: UserForm y objetos visuales

171

3.3.2 Tiempo de ejecución Se le llama así cuando el UserForm está preparado para la exposición frente al usuario 

Fig. 3.14 Tiempo de ejecución

3.3.3 Pasar del tiempo de diseño a ejecución cionar Ejecutar > Ejecutar o seleccionar el botón desde la barra de herramientas estándar del VBA.   UserForm o hacer clic en el botón reestablecer desde el cuadro de herramientas estándar del VBA

3.4 Nomenclatura de nombres a objetos Antes de pasar a explicar todos los controles que posee VBA, tenemos que considerar  UserForm. Asimismo, debemos mencionar que para asignar nombres de los controles existe una        

172

Aplicaciones VBA con Excel

Clase

Prejo



Ejemplo

frm

frmVenta



lbl

lblTotal

Cuadro de Texto (TextBox)

txt

txtFecha

btn cmd



btnCalcular cmCalcular

Cuadro de Lista (ListBox)

lst

lstPaises

Cuadro combinado (ComboBox)

cbo

cboProductos









opt

optCasado

Imagen (Image)

img

imgFoto

Marco (Frame)

fra



3.5 Principales controles visuales y sus propiedades Haremos una lista de los controles y sus principales propiedades: Label

TextBox

Select Objects

ComboBox ListBox



Frame  Image

  TabStrip



RefEdit 

ScrollBar

Fig. 3.15 Descripción de los controles desde el cuadro de herramientas Fuente:

3.5.1 Control UserForm Este control es el principal elemento contenedor de otros controles desde aquí podremos diseñar entornos de usuario de acuerdo a la necesidad de la aplicación. Al insertar un nuevo UserForm al proyecto debe tener en cuenta los siguientes aspectos: Tiene un nombre inicial predeterminado llamado UserForm1. Tiene un alto y ancho asignado de forma estándar. po de diseño del UserForm y su misión es ayudar a modelar los controles contenidos dentro de él. 

Cap.3: UserForm y objetos visuales

173

Fig. 3.16 Aspecto inicial del UserForm

ͫOpciones de conguración del UserForm Modicar ancho y alto del UserForm en empo de diseño: Debemos tener en cuenta que, al crear un nuevo UserForm, este presenta un tamaño inicial el cual   Modicar el alto y ancho de la cuadricula del UserForm en empo de diseño: Desde el menú seleccione Herramientas > Opciones > Ficha General las unidades de la cuadrícula según su conveniencia. 

Fig. 3.17 Ventana de opciones del UserForm

 (Name):Form, según la nomenclatura de nombres deberá empezar con frm por ejemplo frmVenta, frmPago, etc. Es muy importante asignar un nombre al UserForm, ya que la hoja de Excel necesitara asociarse a él y lo hará por su nombre.

174

Aplicaciones VBA con Excel

Para comprobar el nombre asignado al UserForm podría seguir los siguientes pasos:

Fig. 3.18 Ventana de propiedades del UserForm

 nombre del control UserForm que el programador ha asignado, mientras que UserForm BackColor: UserForm, tenga en cuenta que si coloca una imagen de fondo el color queda rezagado, ya que se estarían superponiendo.

Fig. 3.19 Ventana de paleta de colores

 Paletatras que Sistema muestra los colores propios del sistema. BorderStyle:  UserForm UserForm. Capon: UserForm Height: UserForm. Picture: UserForm.

Fig. 3.20 UserForm asignado con imagen de fondo

Cap.3: UserForm y objetos visuales

175

Si desea eliminar la imagen de fondo, tendrá que presionar la tecla sobre el texto (mapa de bits) de la propiedad Picture. PictureSizeMode: Propiedad que determina la forma en que la imagen se adaptará al UserForm. Presenta las siguientes opciones: fmPictureSizeModeClip: Imagen en modo normal



fmPictureSizeModeStretch: Imagen controlada por el tamaño del UserForm.



fmPictureSizeModeZoom: Imagen expandida en alto y ancho sobre el UserForm.



StartUpPosion: UserForm frente a la pantalla al  Width:UserForm. 3.5.2 Control Label  de UserForm En el siguiente UserForm

Label

Fig. 3.21 UserForm de venta de productos

Label a Venta de productos, Descripción, 

176

Aplicaciones VBA con Excel

 (Name):Label. Según la nomenclatura de nombres deberá empezar con lbl, por ejemplo, lblTitulo, lblPension, etc. Se Label   nombre, por ejemplo, lblSubtotal. AutoSize:tenido del mismo. BackColor: Permite asignar un color de fondo al marco que controla el alto y ancho del control Label. BackStyle:Label, tenemos: fmBackStyleOpaque:lor. Este es el valor estándar.



fmBackStyleTransparent: Permite hacer transparente el contenido del marco que controla al Label, nos sirve principalmente cuando se quiere eliminar el color de fondo del Label.



BorderColor: y cuando la propiedad BorderStyle se encuentre en fmBorderStyleSingle. BorderStyle:  Label, en caso de seleccionar fmBorderStyleNone no podrá visualizar el color del borde. Capon: Representa el contenido textual que se muestra en el control Label, esto per ControlTipText: Label, este mos es que aparece un texto en un marco de relleno amarillo. Enabled: Permite bloquear la selección del control Label, pero si, por estructura, dicho  diferencia es que Enabled=True muestra de color gris al control Label. Font: Label

Cap.3: UserForm y objetos visuales

177

Fig. 3.22 Cambio de fuente con la propiedad Font

ForeColor: Permite asignar de color al texto mostrado en el control Label. TextAlign: Determina la alineación del texto con respecto al marco del control Label. Visible: Determina si el control Label bien que puede hacerlo visible mediante una determinada condición. WordWrap: Permite visualizar el texto en más de 2 líneas del objeto Label. 3.5.3 Control TextBox También llamado «Caja de texto» o «Cuadro de texto», en la cual podemos ingresar o registrar un valor que será usado en el código VBA; esta es la única forma de solicitar  En el siguiente UserForm TextBox:

TextBox

Fig. 3.23 UserForm de venta de productos

178

Aplicaciones VBA con Excel

 (Name):TextBox, según la nomenclatura de nombres debe empezar con txt, por ejemplo, txtCandad. BackColor:TextBox siempre y cuando la propiedad BackStyle sea fmBackColorOpaque. BackStyle: TextBox el cual puede ser transparente u opaco. BorderColor:TextBox siempre y cuando la propiedad BorderStyle sea fmBorderStyleSingle. BorderStyle: TextBox. ControlTipText: se por encima del control TextBox. Enabled: Permite habilitar o inhabilitar el acceso al control TextBox, normalmente se  una condición de registro. El valor estándar es Enabled=True. Font:  control TextBox. ForeColor:TextBox. Height:   Locked: Permite bloquear y desbloquear el acceso al texto del control TextBox. Es parecido al trabajo que realiza la propiedad Enabled con la diferencia que se permite establecer el cursor dentro del control TextBox bloqueado. MaxLength:          TextBox. Veamos estos casos:  el acceso desde 0 a 99 años.



            MaxLenght=8.



Cap.3: UserForm y objetos visuales

179

Debe tener en cuenta que la propiedad MaxLenght no realiza validaciones sobre los      validaciones las realizaremos más adelante con la estructura condicional If. MulLine: Permite habilitar el ingreso de valores en varias líneas del control TextBox;  en ocasiones se usa para imprimir muchos resultados como parte de la solución de un problema. PasswordChar: sado en el control TextBoxcarar, el más común es el asterisco (*) pero eso dependerá del criterio del programador. ScrollBars: Permite asignar barras de desplazamiento sobre la caja de texto; normal MulLine se encuentre en True. La propiedad presenta las siguientes opciones: 0 fmScrollBarsNone (sin barras)



1 fmScrollBarsHorizontal (solo barra horizontal)







3 fmScrollBarsBoth (ambas barras)



Text: Permite asignar un valor al control TextBox, normalmente esta propiedad debe   TextAlign: Permite alinear el texto contenido en el control TextBox. Tenemos las siguientes opciones: 



2 fmTextAlignCenter



3 fmTextAlignRight



Width:       TextBox; inicialmente, este presenta un valor estándar para todos los controles TextBox incorporados al UserForm. WordWrap: propiedad MulLineTextBox.

180

Aplicaciones VBA con Excel

3.5.4 Control CommandButton Es también llamado botón de comando por su traducción en español o simplemente UserForm, normalmente está asociado a un código que lo implementará de acuerdo con la necesidad de la aplicación. En el siguiente UserForm





Fig. 3.24 UserForm de venta de productos

  CommandBuon a Procesar, Limpiar, Salir.  (Name):CommandBuon, según la nomenclatura de nombres debe empezar con btn, por ejemplo, btnProcesar, btnLimpiar o btnSalir. BackColor: Permite asignar un color de fondo al botón, esto se podría dar en botones  Cancel: Permite accionar un botón con la tecla , el valor predeterminado es False; además, dentro de un UserForm solo puede haber un botón con la propiedad Cancel=True. Capon:  que se mostrará en el botón. ControlTipText: Permite mostrar un mensaje de apoyo al usuario al posicionar el puntero del mouse encima del botón.

Cap.3: UserForm y objetos visuales

181

Default: Permite accionar un botón con la tecla , el valor predeterminado es False; además debemos tener en cuenta que dentro de un UserForm solo puede haber un botón con la propiedad Default=True. Font:  botón de comando. ForeColor: Permite asignar un color de texto al texto mostrado dentro del control botón de comando. Picture: imagen asignada puede tener diferentes posiciones dentro del botón, la cual puede ser PicturePosion. PicturePosion: Permite asignar una posición dentro del marco que presenta el control botón de comando. WordWrap: Permite la escritura de dos a más líneas dentro del control botón de comando. 3.5.5 Control ListBox tos una debajo de otra como un listado. Se debe tener en cuenta que cada elemento registrado en el control ListBox         otra, esta se llama índice. En el siguiente UserFormListBox:

ListBox

Fig. 3.25 UserForm de venta de productos

182

Aplicaciones VBA con Excel

 (Name): Es el nombre que se le asignará al control ListBox; de acuerdo con la nomenclatura debemos usar la palabra lst, por ejemplo, lstVendedores. BackColor: ListBox. ColumnCount: ListBox, el valor predeterminado es uno. ControlTipText: na el puntero del mouse encima del control ListBox. Enabled: Permite bloquear los valores dentro del control ListBox haciendo que el usuario no pueda seleccionar ningún elemento de la lista, el valor predeterminado es True. Font:  ListBox. ForeColor:ListBox. ListStyle:ListBox, tenemos fmListStylePlain como valor predeterminado:

Fig. 3.26 fmListStylePlain

El valor fmListStyleOpon presenta la siguiente forma:

Fig. 3.27 fmListStyleOpon

MulSelect:   ListBox, presenta las siguientes opciones: 0: fmMulSelectSingle: Es el valor predeterminado el cual permite seleccionar los elementos del control ListBox de uno en uno.



1: fmMulSelectMul: Permite seleccionar varios elementos del control ListBox.



Cap.3: UserForm y objetos visuales

183

2: fmMulSelectExtended: Permite seleccionar varios elementos del control ListBox



TextAlign:ListBox. 3.5.6 Control ComboBox Es también llamado cuadro combinado el cual presenta una lista de opciones desplega ListBox. En el siguiente UserFormComboBox:

ComboBox

Fig. 3.28 UserForm de venta de productos

 (Name): Es el nombre que se le asignará al control ComboBox de acuerdo con la nomenclatura debemos usar la palabra cbo, por ejemplo, cboDescripcion. DropBuonStyle:             control ComboBox, presenta las siguientes opciones: 0: fmDropbuonStylePlain 1: fmDropBuonStyleArrow 2: fmDropBuonStyleEllipsis 3: fmDropBuonStyleReduce

184

Aplicaciones VBA con Excel

3.5.7 Control Frame Es también llamado marco, el cual permite seccionar un área dentro del control UserForm. En el siguiente UserFormFrame:

Frame

Fig. 3.29 UserForm de venta de productos

 (Name): Es el nombre que se le asignará al control Frame en muchas ocasiones, no será necesario asignarle un nombre a menos que necesite bloquear todo el Frame. Capon: Frame. Enabled: Permite bloquear todo el contenido del control Frame, el valor predeterminado es True. Font:             Frame. 3.5.8 Control OptionButton Es también llamado botón de opción, el cual permite asignar opciones predetermina de las opciones como, por ejemplo, el estado civil de un empleado. En el siguiente UserFormOponBuon:

Cap.3: UserForm y objetos visuales

185



Fig. 3.30 UserForm de venta de productos

 (Name): Es el nombre que se le asignará al control OponBuon; según la nomenclatura debe iniciar con la palabra «opt» como, por ejemplo, optCredito u optContado. Capon: OponBuon. 3.5.9 Control CheckBox  opciones predeterminadas en una aplicación, pero la diferencia con el control OponBuon es que se pueden seleccionar más de dos opciones, como, por ejemplo, seleccionar las preferencias de un usuario. En el siguiente UserForm



Fig. 3.31 UserForm de venta de productos

186

Aplicaciones VBA con Excel

 (Name): Es el nombre que se le asignará al control CheckBox según la nomenclatura chkDescuento. Capon:CheckBox. 3.5.10 Control de imagen Este control permite incorporar una imagen como un control común dentro del UserForm. En el siguiente UserFormImage:

Image

Fig. 3.32 UserForm de venta de productos

 (Name): Es el nombre que se le asignará al control Image; según la nomenclatura debe  será necesaria asignar un nombre. Picture:   el marco del control ImagePictureSizeMode. PictureAlignment: Permite alinear la imagen que se encuentra dentro del marco del control Image. PictureSizeMode: Permite adaptar el tamaño de la imagen frente al marco del control Image.

Cap.3: UserForm y objetos visuales

187

3.6 Agregar los controles visuales al UserForm Añadir un control visual al UserForm permite dar solución a una determinada aplicación,  los controles del UserForm UserForm: Arrastrar desde el cuadro de herramientas hacia el UserForm, permite agregar un solo control. Si presiona doble sobre un control desde el cuadro de herramientas podrá agregar UserForm, de tal forma que cuando termine de añadir los controles necesarios, debe seleccionar el control Seleccionar objetos que se encuentra al inicio del cuadro de herramientas; esto hará  UserForm, podrá duplicarlos presionando la tecla y sin soltar arrastrar por el UserForm. 

3.7 Ventana de Código  que podemos hacer uso de toda la funcionalidad VBA, esta ventana es única para todo 

Fig. 3.33 Ventana de código

Presenta algunas partes que debemos considerar ya que será nuestra plataforma de código de VBA. Listado de controles quier control agregado al UserForm.



, desde aquí podemos seleccionar cual-

Listado de eventos , desde aquí podemos seleccionar algún evento del control seleccionado desde la lista de controles.



Cuando se selecciona un determinado control y un evento; el bloque de código se presenta de la siguiente manera: Private Sub UserForm_Click() 'Código del procedimiento End Sub

188

Aplicaciones VBA con Excel

Donde: Private: Es la visibilidad del procedimiento, de forma predeterminada siempre aparecera private en cada uno de los controles.



Sub: Indica el inicio del procedimiento.



UserForm: Es el nombre del control en la cual se programará el código VBA.



Click: Es el evento seleccionado para un determinado control; este evento se apli Código del procedimiento: Es el código VBA que presenta un determinado control. 

End Sub:



Cuando se presente demasiado código dentro del contenedor podemos resumirlo, mostrando un solo procedimiento o mostrando todos mediante el botón .

3.8 Casos desarrollados ͫCaso desarrollado 1: Control de registro de usuarios Implemente una aplicación que permita registrar los datos de los usuarios para lo cual se deberá ingresar los apellidos, nombres, DNI y contraseña, asimismo debemos tener en cuenta los siguientes aspectos: Implemente en Excel el siguiente entorno:



Fig. 3.34 Registro de usuarios en Excel

Cap.3: UserForm y objetos visuales

189

Implemente el siguiente UserForm:



Fig. 3.35 Userform de registro de usuarios

 cinco caracteres numéricos y llenando con ceros el lado izquierdo.



Implemente un procedimiento para limpiar los controles colocados dentro del UserForm.



Implemente un procedimiento para asignar un borde a las celdas una vez registrado los datos en Excel.  esto hará que se pueda agregar usuarios uno debajo de otro como un listado. 

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



Pasos: 1. Diseñe el modelo de la aplicación tanto en la hoja de Excel como en el UserForm. 2. Asigne las propiedades a los siguientes controles: 

(Name) frmRegistro  

Label1

 

Label2

 

Label3

(Name)

Label4

 

Label5

 

Label6

 

Label7

 



lblNumero

(Name) btnRegistrar  Default True Picture Grabar.gif

190

Aplicaciones VBA con Excel



(Name) btnNuevo  Picture Nuevo.gif



(Name) btnAnular  Picture Anular.gif



(Name) btnSalir  Cancel True Picture Salir.gif

TextBox1

(Name)

txtApellidos

TextBox2

(Name)

txtNombres

TextBox3

(Name) txtDNI MaxLenght 8

TextBox4

(Name) txtContraseña MaxLenght 4 PasswordChar *

3. Implemente los siguientes códigos dentro del UserForm: Dim uFila% Private Sub btnAnular_Click() Call limpiaControles End Sub Private Sub btnNuevo_Click() uFila = determinaUltimaFila() lblNumero.Caption = Format(uFila - 9, "00000") Call limpiaControles End Sub Private Sub btnRegistrar_Click() Dim numero$, dni$, apellido$, nombres$, clave$ numero = lblNumero.Caption dni = txtDni.Text apellidos = txtApellidos.Text nombres = txtNombres.Text clave = txtClave.Text Cells(uFila, 2).Value = numero Cells(uFila, 3).Value = dni Cells(uFila, 4).Value = UCase(apellidos) & Space(1) & UCase(nombres) Cells(uFila, 5).Value = clave Call borde End Sub Private Sub btnSalir_Click() Unload Me End Sub Private Sub UserForm_Activate() uFila = determinaUltimaFila() lblNumero.Caption = Format(uFila - 9, "00000") End Sub

Cap.3: UserForm y objetos visuales

Function determinaUltimaFila() As Integer uFila=Sheets(1).Cells(Rows.Count,2).End(xlUp).Offset(1,0).Row determinaUltimaFila = uFila End Function Sub limpiaControles() txtApellidos.Text = "" txtNombres.Text = "" txtDni.Text = "" txtClave.Text = "" txtApellidos.SetFocus End Sub Sub borde() Range(Cells(uFila, 2), Cells(uFila, 5)).Select With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .ThemeColor = 1 .TintAndShade = -0.249946592608417 End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .ThemeColor = 1 .TintAndShade = -0.249946592608417 End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ThemeColor = 1 .TintAndShade = -0.249946592608417 End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .ThemeColor = 1 .TintAndShade = -0.249946592608417 End With With Selection.Borders(xlInsideVertical) .LineStyle = xlContinuous .ThemeColor = 1 .TintAndShade = -0.249946592608417 End With Cells(uFila, 2).Select End Sub

Explicación del código: Dim uFila% Private Sub UserForm_Activate() uFila = determinaUltimaFila() lblNumero.Caption = Format(uFila - 9, "00000") End Sub

Empezamos por declarar de forma global la variable uFila; esto se debe a que cuando claración global implica que todos los procedimientos o funciones podrán acceder al valor de dicha variable.

191

192

Aplicaciones VBA con Excel

Seguidamente, implementamos código en el evento Acvate del control UserForm, esto se realizó para que, al iniciar el UserForm, nos muestre el código autogenerado. La variable global invoca a la función determinaUlmaFilaro exacto en la que debe registrarse el nuevo usuario. La función Format permite                rellenando con ceros. La expresión uFila - 9 se debe a que en la hoja de Excel los uFila restarle 9 nos quedará el número de usuario; de la misma manera, ocurrirá si ya se  Function determinaUltimaFila() As Integer uFila=Sheets(1).Cells(Rows.Count,2).End(xlUp).Offset(1,0).Row determinaUltimaFila = uFila End Function

         cambiar el valor 2 que se encuentra en Cells(Rows.Count,2), ya que dicho valor de Sub limpiaControles() txtApellidos.Text = "" txtNombres.Text = "" txtDni.Text = "" txtClave.Text = "" txtApellidos.SetFocus End Sub

Procedimiento que permite limpiar todos los controles del UserForm, las comillas dobles sin ningún valor determinan la limpieza del control TextBox, mientras que SetFocus Sub borde() Range(Cells(uFila, 2), Cells(uFila, 5)).Select With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .ThemeColor = 1 .TintAndShade = -0.249946592608417 End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .ThemeColor = 1 .TintAndShade = -0.249946592608417 End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ThemeColor = 1 .TintAndShade = -0.249946592608417 End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .ThemeColor = 1

Cap.3: UserForm y objetos visuales

.TintAndShade = -0.249946592608417 End With With Selection.Borders(xlInsideVertical) .LineStyle = xlContinuous .ThemeColor = 1 .TintAndShade = -0.249946592608417 End With Cells(uFila, 2).Select End Sub

Procedimiento que se encarga de agregar bordes a las celdas con los datos del nuevo  lo capturamos con el siguiente código Range(Cells(uFila, 2), Cells(uFila, 5)).Select, todo el código siguiente es para designar a qué borde se agregará una línea. Private Sub btnRegistrar_Click() Dim numero$, dni$, apellido$, nombres$, clave$ numero = lblNumero.Caption dni = txtDni.Text apellidos = txtApellidos.Text nombres = txtNombres.Text clave = txtClave.Text Cells(uFila, 2).Value = numero Cells(uFila, 3).Value = dni Cells(uFila, 4).Value = UCase(apellidos) & Space(1) & UCase(nombres) Cells(uFila, 5).Value = clave Call borde End Sub

Para llegar a este procedimiento debemos hacer doble clic sobre el botón Registrar que se encuentra en el UserForm; con esto indicamos que la cabecera de este proce Empezamos por capturar los datos desde los controles, recuerde que siempre debemos declarar todas las variables usadas en el código VBA; la forma de capturar un valor desde el control TextBox es variable = TextBox.Text, la propiedad Text captura  tencia Cells(uFila,2).Value=numero   Space(1) permite dejar un espacio entre los apellidos y los nombres del nuevo usuario. Finalmente, se invoca al procedimiento borde que se encargará de colocar un borde de color gris sobre los nuevos datos agregados a la hoja de Excel.

193

194

Aplicaciones VBA con Excel

Private Sub btnAnular_Click() Call limpiaControles End Sub

Para llegar a este procedimiento se presionó doble clic sobre el botón Anular el cual         miento limpiaControles. Private Sub btnNuevo_Click() uFila = determinaUltimaFila() lblNumero.Caption = Format(uFila - 9, "00000") Call limpiaControles End Sub

Para llegar a este procedimiento debemos hacer doble clic sobre el botón Nuevo, el  con el mismo formato inicial. Private Sub btnSalir_Click() Unload Me End Sub

Para llegar a este procedimiento debemos hacer doble clic sobre el botón Salir el UserForm Unload Me. 4. Desarrollador

seleccione el botón Nuevo, asigne el

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

 5. Pruebe la aplicación haciendo clic sobre el botón Formulario de registro.

Cap.3: UserForm y objetos visuales

195

ͫCaso desarrollado 2: Registro de pago a vendedores    bruto. Diseñe un programa que calcule la comisión, el monto bruto, monto de descuento y el monto neto de un vendedor de la empresa. Debe considerar los siguientes aspectos: Implemente en Excel el siguiente entorno:



Fig. 3.36 Registro de pago a vendedores en Excel

Implemente el siguiente UserForm.



Fig. 3.37 Entorno de pago de vendedores

Implemente un botón de proceso que permita determinar el resumen de pago mostrando así el nombre del vendedor, el monto de comisión, monto bruto, monto de descuento y el monto neto a recibir.



Implemente un botón que envíe toda la información resultante a la hoja de Excel,  de registro.



196

Aplicaciones VBA con Excel





Implemente un procedimiento que permita limpiar los controles contenidos en el 



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



Pasos: 1. Diseñe el modelo de la aplicación tanto en la hoja de Excel como en el UserForm. 2. Asigne las propiedades a los siguientes controles: 

(name) frmPago  

Label1

 

Label2

 

Label3

(Name) MONTO TOTAL VENDIDO



(Name) btnProcesar   



  



  



(Name) btnSalir  Cancel True

TextBox1

(Name)

txtVendedor

TextBox2

(Name)

txtMonto

ListBox

(Name)

lstR

3. Implemente los siguientes códigos dentro del UserForm: Const basico = 700 Dim vendedor$, monto@, comision@, bruto@, descuento@, neto@ Function determinaUltimaFila() As Integer Dim uFila% uFila=Sheets(1).Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Row determinaUltimaFila = uFila End Function Sub limpiarControles() txtVendedor.Text = "" txtMonto.Text = "" lstR.Clear txtVendedor.SetFocus End Sub Private Sub btnProcesar_Click()

Cap.3: UserForm y objetos visuales

vendedor = txtVendedor.Text monto = CCur(txtMonto.Text) comision = monto * 0.09 bruto = basico + comision descuento = bruto * 0.11 neto = bruto - descuento lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem End Sub

"** RESUMEN DE PAGO **" "VENDEDOR: " & vendedor "COMISION: $ " & Format(comision, "0.00") "------------------------------------------------" "MONTO BRUTO: $ " & Format(bruto, "0.00") "MONTO DESCUENTO: $ " & Format(descuento, "0.00") "MONTO NETO: $ " & Format(neto, "0.00")

Private Sub btnLimpiar_Click() Call limpiarControles End Sub Private Sub btnExcel_Click() Dim uFila% uFila = determinaUltimaFila Sheets(1).Cells(uFila, Sheets(1).Cells(uFila, Sheets(1).Cells(uFila, Sheets(1).Cells(uFila, Sheets(1).Cells(uFila, Sheets(1).Cells(uFila, Sheets(1).Cells(uFila, Sheets(1).Cells(uFila, Call limpiarControles End Sub

2).Value 3).Value 4).Value 5).Value 6).Value 7).Value 8).Value 9).Value

= = = = = = = =

uFila - 11 Date UCase(vendedor) monto comision bruto descuento neto

Private Sub btnSalir_Click() Unload Me End Sub

Explicación del código: Const basico = 700 Dim vendedor$, monto@, comision@, bruto@, descuento@, neto@

 el nombre del vendedor, monto vendido, monto de comisión, monto bruto, monto               «Enviar a Excel». Function determinaUltimaFila() As Integer Dim uFila% uFila=Sheets(1).Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Row determinaUltimaFila = uFila End Function

 

197

198

Aplicaciones VBA con Excel

Sub limpiarControles() txtVendedor.Text = "" txtMonto.Text = "" lstR.Clear txtVendedor.SetFocus End Sub

Procedimiento que permite limpiar todos los controles usados en el UserForm. Private Sub btnProcesar_Click() vendedor = txtVendedor.Text monto = CCur(txtMonto.Text) comision = monto * 0.09 bruto = basico + comision descuento = bruto * 0.11 neto = bruto - descuento lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem End Sub

"** RESUMEN DE PAGO **" "VENDEDOR: " & vendedor "COMISION: $ " & Format(comision, "0.00") "------------------------------------------------" "MONTO BRUTO: $ " & Format(bruto, "0.00") "MONTO DESCUENTO: $ " & Format(descuento, "0.00") "MONTO NETO: $ " & Format(neto, "0.00")

Llegamos a este procedimiento haciendo doble clic sobre el botón Procesar desde el UserForm. Empezamos el código capturando el nombre del vendedor así como el monto vendido, hay que tener en cuenta que el monto es un valor monetario que CCur cuando se envía dicho valor a la variable. Luego, calculamos los montos según el criterio del problema y terminamos el proceso enviando toda la información al control ListBox, debemos tener en cuenta, que AddItem permite agregar un elemento a la lista; el símbolo & permite concatenar dos elementos ya sean numéricos o textuales y la función Format de moneda a los montos. Private Sub btnLimpiar_Click() Call limpiarControles End Sub

Llegamos a este procedimiento haciendo doble clic sobre el botón Limpiar desde el UserForm. El cual invoca al procedimiento limpiarControles que es el encargado de dejar limpios los controles para un nuevo registro de valores en el UserForm.

Cap.3: UserForm y objetos visuales

Private Sub btnExcel_Click() Dim uFila% uFila = determinaUltimaFila Sheets(1).Cells(uFila, Sheets(1).Cells(uFila, Sheets(1).Cells(uFila, Sheets(1).Cells(uFila, Sheets(1).Cells(uFila, Sheets(1).Cells(uFila, Sheets(1).Cells(uFila, Sheets(1).Cells(uFila, Call limpiarControles End Sub

2).Value 3).Value 4).Value 5).Value 6).Value 7).Value 8).Value 9).Value

= = = = = = = =

uFila - 11 Date UCase(vendedor) monto comision bruto descuento neto

Llegamos a este procedimiento haciendo doble clic sobre el botón Enviar a Excel desde el UserForm. El cual permite enviar toda la información obtenida en el UserForm  donde enviaremos todos los valores. La función DATE devuelve la fecha actual obteUCase nombre del vendedor; cada vez que se envíe los datos a Excel se deberá limpiar los controles para un nuevo registro, es por eso que se invoca al procedimiento limpiarControles. Private Sub btnSalir_Click() Unload Me End Sub

Finalmente, llegamos a este procedimiento haciendo doble clic sobre el botón Salir desde el UserForm, el cual permite salir de la aplicación.

199

Cap. Funciones VBA

4

Capacidad Implementa aplicaciones VBA haciendo uso de las principales funciones VBA como las cadenas, numéricas, fechas y comprobaciones de valor.

4.1 Introducción a las funciones   De la misma manera, VBA ofrece un conjunto de funciones que podrán ser usadas en cualquier aplicación que use el código VBA, estos se dividen en categorías como funciones de texto, fecha, numéricos, etc. 4.1.1 Funciones para cadena de caracteres String, veremos a  ASC: Devuelve el código ASCII de un determinado carácter. ASCII es el acrónimo en inglés de American Standard Code for Informaon Interchange, es decir, Código Estándar Estadounidense para el Intercambio de Información, es un código de caracteres 



Veamos una aplicación que permita mostrar las letras del abecedario y su código ListBox. Formulario propuesto:

Fig. 4.1 Listado de códigos ASCII

202

Aplicaciones VBA con Excel

Código VBA: Private Sub btnListar_Click() Dim letrasMayusculas As Variant letrasMayusculas=Array("A","B","C","D","E","F","G","H","I","J", _ "K","L","M","N","O","P","Q","R","S","T", _ "U","V","W","X","Y","Z") lstCodigos.ColumnCount = 2 For i = 0 To 25 lstCodigos.AddItem letrasMayusculas(i) lstCodigos.List(i, 1) = Asc(letrasMayusculas(i)) Next End Sub

Explicando el código implementado: Dim letrasMayusculas As Variant letrasMayusculas = Array("A","B","C","D","E","F","G","H","I","J", _ "K","L","M","N","O","P","Q","R","S","T", _ "U","V","W","X","Y","Z")

Declaramos la variable letrasMayusculasVariant ya que soporta valores del Arreglo (un arreglo es un conjunto de elementos del mismo, almacenados en un sola variable). Luego almacenamos las letras del abecedario usando la función Array que se encargará de llenar el arreglo con dichos elementos, recuerde que deben ser enviados en forma de cadena, es por eso que cada letra debe ir encerrada entre comillas dobles y separadas por comas.  en la línea posterior, si quiere evitar algún error de interpretación, entonces escríbalo en una sola línea eliminando para este caso las líneas inferiores agregadas. lstCodigos.ColumnCount = 2

Sentencia que permite dividir el control ListBox en dos columnas, la primera mostrar la letra y la segunda su código ASCII. For i = 0 To 25 lstCodigos.AddItem letrasMayusculas(i) lstCodigos.List(i, 1) = Asc(letrasMayusculas(i)) Next

La estructura For se encargará de recorrer por cada una de las letras almacenadas en el arreglo con la intención de mostrar su código ASCII en pocas líneas de código. Hay que tener en cuenta que el control ListBox enviarán por medio de la propiedad AddItem; para mandar información a la segunda columna usaremos lstCodigos.List(i, 1) donde i a la segunda columna.  enviamos todos los elementos del arreglo letrasMayusculas.

Cap.4: Funciones VBA

203

Chr: La función Chr actúa a la inversa de la función Asc, esto quiere decir, que ingresando un número nos devolverá el carácter asociado desde la tabla ASCII.



Veamos una aplicación que permita mostrar los códigos ASCII del 0 al 255 y su carácter asociado en un control ListBox. Formulario propuesto:

Fig. 4.2 Listado de códigos ASCII

Código VBA: Private Sub btnListar_Click() lstCodigos.ColumnCount = 2 For i = 0 To 255 lstCodigos.AddItem i lstCodigos.List(i, 1) = Chr(i) Next End Sub

Explicando el código implementado: lstCodigos.ColumnCount = 2

ListBox, la primera columna mostrará los números del 0 al 255, mientras que la segunda columna presentará el carácter asociado. For i = 0 To 255 lstCodigos.AddItem i lstCodigos.List(i, 1) = Chr(i) Next

Recorremos por los 256 números y estos serán impresos en la primera columna, mientras que en la segunda enviamos el carácter mediante la función Chr y el valor de la variable i lstCodigos.List(i, 1).

204

Aplicaciones VBA con Excel

Format:  monetario, decimal, fecha o porcentaje.



mato Format(valor, "Currency").



     guiente formato Format(monto, "Standard").



 Format(IVA, "Percent"). ta como Format(d, "Long Date"). 

 presenta como MsgBox Format(d, "Medium Date").



senta como Format(d, "Short Date").



Veamos una aplicación que permita ingresar un valor numérico que sea expresado en el formato Currency, Estándar y Percent, además de ingresar una fecha para que sea expresado en fecha larga, mediana y corta en un control ListBox. Formulario propuesto:

Fig. 4.3 Manejo de la función Format

Código VBA: Private Sub btnFormatos_Click() Dim n%, fecha As Date n = CInt(txtNumero.Text) fecha = CDate(txtFecha.Text) lstR.AddItem "**RESUMEN DE FORMATOS**" lstR.AddItem "MONEDA: " & Format(n, "Currency") lstR.AddItem "ESTANDAR: " & Format(n, "Standard")

Cap.4: Funciones VBA

lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem End Sub

205

"ESTANDAR: " & Format(n, "0.00") "------------------------------------------" "PORCENTAJE: " & Format(n, "Percent") "------------------------------------------" "FECHA LARGA: " & Format(fecha, "Long Date") "FECHA MEDIANA: " & Format(fecha, "Medium Date") "FECHA CORTA: " & Format(fecha, "Short Date")

Explicando el código implementado: Dim n%, fecha As Date n = CInt(txtNumero.Text) fecha = CDate(txtFecha.Text)

Empezamos por obtener los valores desde el control txtNumero y txtFecha, recuerde  la función CInt convierte de cadena a número y CDate convierte una cadena en el formato de fecha. lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem

"**RESUMEN DE FORMATOS**" "MONEDA: " & Format(n, "Currency") "ESTANDAR: " & Format(n, "Standard") "ESTANDAR: " & Format(n, "0.00”) "------------------------------------------" "PORCENTAJE: " & Format(n, "Percent") "------------------------------------------" "FECHA LARGA: " & Format(fecha, "Long Date") "FECHA MEDIANA: " & Format(fecha, "Medium Date") "FECHA CORTA: " & Format(fecha, "Short Date")

ListBox, tenga  formato Estándar es exactamente igual que "0.00".

LCase:   formato es LCase(Cadena).



Ucase:  formato es UCase(Cadena).



Len: Función que permite determinar el número de caracteres contenido en una ca formato es Len(Cadena).



Le: Función que permite capturar un número determinado de letras del lado izquierdo de una cadena de caracteres. Su formato es Le(Cadena).



Right: Función que permite capturar las letras contenidas desde el lado derecho de una cadena de caracteres. Su formato es Right(Cadena). Ltrim: Función que permite eliminar los espacios en blanco que se encuentren en el lado izquierdo de una cadena de caracteres. Su formato es Ltrim(Cadena). 

206

Aplicaciones VBA con Excel

Rtrim: Función que permite eliminar los espacios en blanco del lado derecho de una determinada cadena de caracteres. Su formato es Rtrim(Cadena).



Trim: Función que permite eliminar los espacios en blanco de ambos lados de la cadena de caracteres. Su formato es Trim(Cadena).



Space: dentro de una cadena de caracteres. Su formato es Space(Candad de espacios).



Veamos una aplicación que permita ingresar los apellidos, nombres y fecha de naci  electrónico se compone de la primera letra de su nombre y las cuatro primeras letras de los apellidos. Debe tener en cuenta que el correo debe ser expresado en minúsculas y eliminar los espacios en blanco que pudiera tener los apellidos y nombres. En el caso del código se inicia con el año actual, las cuatro primeras letras de sus apelli Formulario propuesto:

Fig. 4.4 Manejo de las funciones de cadena

Código VBA: Private Sub btnGenerar_Click() Dim apellidos$, nombres$, fecha As Date apellidos = Trim(txtApellidos.Text) nombres = Trim(txtNombres.Text) fecha = CDate(txtFechaNac.Text) Dim email$, codigo$ email = LCase(Left(nombres, 1) & Left(apellidos, 4)) & "_" & Right(fecha, 2) & "@miempresa.com" codigo = Year(Date) & "_" & UCase(Left(apellidos, 4)) & "_" & Right(fecha, 2) lblEmail.Caption = email lblCodigo.Caption = codigo End Sub

Cap.4: Funciones VBA

207

Explicando el código implementado: Dim apellidos$, nombres$, fecha As Date apellidos = Trim(txtApellidos.Text) nombres = Trim(txtNombres.Text) fecha = CDate(txtFechaNac.Text)

Capturamos los apellidos, nombres y la fecha de nacimiento, recuerde que debe con    CDate. A la vez quitamos los espacios en blanco que pudiera ingresar el usuario en los apellidos y nombres. Dim email$, codigo$ email = LCase(Left(nombres, 1) & Left(apellidos, 4)) & "_" & Right(fecha, 2) & "@miempresa.com" codigo = Year(Date) & "_" & UCase(Left(apellidos, 4)) & "_" & Right(fecha, 2)

cación. Recuerde que el símbolo & permite unir dos o más elementos y la función Year(Date) captura el año actual. lblEmail.Caption = email lblCodigo.Caption = codigo

Finalmente, imprimiremos el correo electrónico y el codigo generado. 4.1.2 Funciones numéricas Integer, Double, Single o Currency    aplicación: Abs: vo. Su formato es Abs(Numero). Sin: Función que permite devolver el seno de un número entero o real. Su formato es Sin(Numero). Cos: Función que permite devolver el coseno de un número entero o real. Su formato es Cos(Numero). 

Tan: Función que permite devolver la tangente de un número entero o real. Su formato es Tan(Numero).



Sqr: Función que permite devolver la raíz cuadrada de un número entero. Su formato es Sqr(Numero). Fix: Función que permite devolver el valor entero redondeando al exceso a un número real. Su formato es Fix(Numero). 

Hex: Función que permite devolver un valor entero en un valor hexadecimal. Su formato es Hex(Numero).



208

Aplicaciones VBA con Excel

Int: Función que permite devolver solo la parte entera de una operación, expresión o número. Tenga en cuenta que esta función no redondea el valor, solo captura la parte entera.



Log: Función que permite devolver el logaritmo natural de un número entero en base e.



Rnd: Función que permite devolver un número aleatorio entre 0 y 1, pero nosotros            adelantaremos un poco este tema:



Por ejemplo, se necesita imprimir por medio de mensajes al usuario 10 números aleatorios entre 20 y 40. Sub Aleatorio() Dim inicio% inicio = 20 Dim tope% tope = 40 For i = 1 To 10 MsgBox Int((tope - inicio + 1) * Rnd + inicio) Next End Sub

Veamos una aplicación que permita calcular el módulo de un vector para lo cual de  fórmula es como sigue:

 Formulario propuesto:

Fig. 4.5 Manejo de las funciones numéricas

Cap.4: Funciones VBA

209

Código VBA: Private Dim i = j = k =

Sub btnProcesar_Click() i#, j#, k# CDbl(txtI.Text) CDbl(txtJ.Text) CDbl(txtK.Text)

Dim modulo# modulo = (Abs(i) ^ 2 + Abs(j) ^ 2 + Abs(k) ^ 2) ^ (0.5) lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem End Sub

"MODULO DEL VECTOR" "Primer valor: " & Abs(i) ^ 2 "Segundo valor:" & Abs(j) ^ 2 "Tercer valor: " & Abs(k) ^ 2 "----------------------------------" "Modulo del vector es: " & modulo

Explicando el código implementado: Dim i = j = k =

i#, j#, k# CDbl(txtI.Text) CDbl(txtJ.Text) CDbl(txtK.Text)

Obtenemos los valores desde los controles Textbox. Debe tener en cuenta que los  eso son declarados como Double Dim modulo# modulo = (Abs(i) ^ 2 + Abs(j) ^ 2 + Abs(k) ^ 2) ^ (0.5)

  con la función Abs y el símbolo ^ para elevar a la N potencia un valor numérico. Hay que tener en cuenta que para obtener la raíz cuadrada del valor debemos elevar la suma a la 0.5 o ½. lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem

"MODULO DEL VECTOR" "Primer valor: " & Abs(i) ^ 2 "Segundo valor:" & Abs(j) ^ 2 "Tercer valor: " & Abs(k) ^ 2 "----------------------------------" "Modulo del vector es: " & modulo

Finalmente, se imprimen los valores en el control ListBox. Si queremos obtener la raíz cuadrada con la función SQR el código podría ser de la siguiente manera: modulo = Sqr(Abs(i) ^ 2 + Abs(j) ^ 2 + Abs(k) ^ 2).  siguiente código para su impresión: lstR.AddItem «Modulo del vector es: « & Round(modulo, 3) en la respuesta.

210

Aplicaciones VBA con Excel

4.1.3 Funciones de fecha Date, veremos a  Date: Función que permite devolver la fecha actual del sistema. Su formato es Date.



DateAdd:   función DateAdd.



Intervalo de Fecha

Formato

"d"

Día

"y"

Año

"h"

Hora

"n"

Minuto

"m"

Mes

"q"

Trimestre

"s"

Segundo

"w"

Semana

"ww"

Semana del calendario

"yyyy"

Año

        DateDi: Función que permite devolver la diferencia entre 2 fechas esta se puede dar en días, meses o años.



DatePart: Función que permite devolver parte de una determinada fecha como el mes, año, etc. Si necesitamos el mes actual, el código sería DatePart("m", Date).



Year: Función que permite devolver el año de una determinada fecha. Si necesitamos obtener el año actual, el código sería Year(Date) fecha, el código podría ser Year(Fecha). Month: Función que permite devolver el mes de una determinada fecha. Si necesitamos el número de mes actual, el código sería Month(Date). 

Day: Función que permite devolver el día de una determinada fecha. Si necesitamos el número del día actual, el código sería Day(Date).



Hour:mos capturar la hora actual, el código sería Hour(Time).



Minute:         necesitamos obtener los minutos de la hora actual, el código sería Minute(Time).



Cap.4: Funciones VBA

211

Second:  Second(Time).



Now: Función que permite devolver la fecha actual del sistema. Su formato es Now.



Time: Función que permite devolver la hora actual del sistema. Su formato es Time.



WeekDay: Función que permite devolver el número correspondiente al día de la semana de una determinada fecha. Si necesitamos obtener el número de día en la semana actual, el código sería WeekDay(Date).



Debemos tener en cuenta que el número de día para VBA es considerado de la siguiente manera: 0 Domingo



4 Jueves

1 Lunes



2 Martes





5 Viernes



6 Sábado



3 Miércoles



Veamos una aplicación que permita mostrar el monto mensual y las fechas de pago para un préstamo, para lo cual, se deberá ingresar el nombre del cliente y el monto prestado, y por medio de opciones se debe seleccionar las letras de pago para 3, 6 o 9 cuotas. Debemos tener en cuenta que al seleccionar directamente la opción se mostrarán los datos solicitados tal como se muestra en la siguiente imagen: Formulario propuesto:

Fig. 4.6 UserForm de generación de fechas con DateAdd

212

Aplicaciones VBA con Excel

Código VBA: Private Sub opt3_Click() Dim monto@ monto = getMonto lstR.Clear lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem End Sub

"**RESUMEN DE PAGO Y FECHAS**" "MONTO MENSUAL $ " & Format(monto / 3, "0.00") "-----------------------------------------------" DateAdd("m", 1, Date) DateAdd("m", 2, Date) DateAdd("m", 3, Date)

Private Sub opt6_Click() Dim monto@ monto = getMonto lstR.Clear lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem End Sub

"**RESUMEN DE PAGO Y FECHAS**" "MONTO MENSUAL $ " & Format(monto / 6, "0.00") "-----------------------------------------------" DateAdd("m", 1, Date) DateAdd("m", 2, Date) DateAdd("m", 3, Date) DateAdd("m", 4, Date) DateAdd("m", 5, Date) DateAdd("m", 6, Date)

Private Sub opt9_Click() Dim monto@ monto = getMonto lstR.Clear lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem End Sub

"**RESUMEN DE PAGO Y FECHAS**"" "MONTO MENSUAL $ " & Format(monto / 9, "0.00") "-----------------------------------------------" DateAdd("m", 1, Date) DateAdd("m", 2, Date) DateAdd("m", 3, Date) DateAdd("m", 4, Date) DateAdd("m", 5, Date) DateAdd("m", 6, Date) DateAdd("m", 7, Date) DateAdd("m", 8, Date) DateAdd("m", 9, Date)

Private Sub UserForm_Activate() lblFecha.Caption = Date End Sub Function getMonto() As Currency getMonto = CCur(txtMonto.Text) End Function

Cap.4: Funciones VBA

Explicando el código implementado: Para crear los procedimientos se debe hacer doble clic sobre los controles. Por ejemplo, para Private Sub opt3_Click() se hace doble clic sobre , en caso de Private Sub UserForm_Acvate se hace doble clic sobre el fondo del UserForm y se cambia  Se implementó la función getMonto para obtener el monto registrado por el usuario en el control txtMonto. Finalmente, tenga en cuenta que para obtener las posible fechas de pago se usa como base la fecha actual obtenida desde la función Date.

Veamos una aplicación que permita mostrar los días de mora y el total a pagar por la entrega de un libro en una biblioteca, es así que debemos ingresar el nombre del cliente y la fecha de entrega que se indica en su recibo; de tal manera que, según la fecha actual, deberá calcular los días de mora si se sabe que por cada día se le cobra  6   rres Lázaro» debió entregar el libro el 08/02/2016, la aplicación determinará los días de mora y el total a pagar, tal como se muestra en la siguiente imagen: Formulario propuesto:

Fig. 4.7 UserForm de cálculo de mora con DateDi

213

214

Aplicaciones VBA con Excel

Código VBA: Private Sub btnProcesar_Click() Dim cliente$, fechaEnt As Date cliente = txtCliente.Text fechaEnt = CDate(txtFechaEnt.Text) Dim mora% mora = DateDiff("d", fechaEnt, Date) lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem End Sub

"RESUMEN DE MORA" "CLIENTE: " & cliente "FECHA ACTUAL: " & Date "FECHA DE ENTREGA" & fechaEnt "---------------------------" "DIAS DE MORA:" & mora "TOTAL A PAGAR:" & mora * 5

Private Sub UserForm_Activate() lblFecha.Caption = Date End Sub

Explicando el código implementado: Dim mora% mora = DateDiff("d", fechaEnt, Date)

 fecha actual y la fecha que el usuario debió pagar la cuota. En la función DateDi se hace referencia a d para el conteo de días, fechaEnt es la fecha de entrega y Date la fecha actual.

4.1.4 Funciones de comprobación de valor La comprobación de valor se basa en la evaluación del valor ingresado por el usuario,  usan comúnmente para validar dichos valores que pueden ser numéricos, de texto o de fechas. IsNumeric: Función que permite determinar si un valor es numérico o no. Debemos  Su formato es IsNumeric(cadena).



Por ejemplo, si necesitamos validar el registro de la edad en un control txtEdad, el código sería IsNumeric(txtEdad.Text); y si queremos validar el registro de un monto en dólares, el código sería IsNumeric(txtMonto.Text).

Cap.4: Funciones VBA

215

IsEmpty:mente para saber si se ingresó o no valor en una cadena, número o fecha.



Por ejemplo, si queremos validar el ingreso del nombre de un cliente en el control txtCliente, el código sería Not IsEmpty(txtCliente.Text) o también podría ser Not Trim(txtCliente.Text) = Empty la cadena Len(txtCliente.Text)=0. IsDate:Date.



Por ejemplo, si necesitamos validar la fecha de nacimiento de un alumno, el código podría ser de la siguiente manera IsDate(txtFechaNac.Text).

Cap. Gestión de errores

5

Capacidad  usuario.

5.1 Gestión de errores  controlar los valores ingresados por el usuario o por los valores generados por la misma aplicación, de tal manera que la aplicación se proteja de dichos errores y los administre   Cuando no se declara una variable.  

Cuando se deja vacío un valor numérico.



Cuando un número se divide entre cero.







Muchos de los errores que se puedan ocasionar en una aplicación, se deben al ingreso de datos errados por parte del usuario, así es que en este capítulo veremos cómo controlar 

5.2 Tipos de errores VBA  aplicación en VBA: ͫErrores de compilación lador convierte el código fuente en código legible por la computadora, los errores de compilación son errores que impiden que una aplicación se ejecute correctamente.

218

Aplicaciones VBA con Excel

Estos errores se podrían ocasionar por: 















ͫErrores en empo de ejecución   a que también son considerados como errores lógicos, los cuales solo pueden ser solucionados por el desarrollador de la aplicación haciendo una depuración de los valores que está evaluando.   ͫErrores lógicos   de detectar y corregir, ya que toda aplicación realizada en VBA debe pasar por un control de calidad que solo lo puede hacer el desarrollador de la aplicación.

5.3 Control básico de errores con On Error Goto La instrucción On Error Gotoviando mensajes o dando una salida adecuada al error; hay que tener en cuenta que el error se podría ocasionar en cualquier línea del código del procedimiento o función. Veamos el formato de la instrucción On Error Goto: On Error { GoTo [ line | 0 | -1 ] | Resume Next } Donde: GoTo line:  un mensaje al usuario indicándole que ocasionó un error.



GoTo 0:  la aplicación.



Cap.5: Gestión de errores

219

Resume Next:             



5.4 La Clase Err El objeto Errministra el error con las siguientes propiedades: Descripon: Devuelve la descripción del error encontrado en la aplicación VBA. Su formato es Err.Descripon. Number:guaje VBA, en el futuro este número puede ser parte de una condicional. Su formato es Err.Number. mismos: Número de Error

Descripción del Error

5

La llamada al procedimiento Sub no es válido.

6

Error de desbordamiento de datos, esto ocurre cuando la variable es declarada de 

9

El subíndice está fuera del intervalo, solo sucede cuando se usa objetos que contengan elementos matriciales.

11

Error de división por cero, solo ocurre en el caso que se divida un número entre cero.

13

  asignado a dicha variable es de otro.

ͫCaso desarrollado: Capitalización           fórmula: tasa ) años × periodo Monto = Capital ( 1 + periodo

220

Aplicaciones VBA con Excel

Formulario propuesto:

Fig. 5.1 UserForm de control de errores

Código VBA: Private Sub btnProcesar_Click() On Error GoTo Imprevisto Dim monto@, años%, tasa# monto = CCur(txtMonto.Text) años = CInt(txtAños.Text) tasa = CDbl(txtTasa.Text) Dim periodo% If optBimestral.Value = True Then periodo = 6 If optTrimestral.Value = True Then periodo = 4 If optSemestral.Value = True Then periodo = 2 Dim capital@ capital = monto / (1 + (tasa / 100) / periodo) ^ (años * periodo) lstR.Clear lstR.AddItem "** RESUMEN **" lstR.AddItem "MONTO: $ " & Format(monto, "0.00")" lstR.AddItem "AÑOS: " & años lstR.AddItem "TASA: " & Format(tasa / 100, "Percent") lstR.AddItem "--------------------------------------" lstR.AddItem "CAPITAL: $ " & Format(capital, "0.00") Exit Sub Imprevisto: MsgBox "Error en la aplicacion...!!! - " & Err.Description End Sub

Cap.5: Gestión de errores

Explicando el código: On Error GoTo Imprevisto Dim monto@, años%, tasa# monto = CCur(txtMonto.Text) años = CInt(txtAños.Text) tasa = CDbl(txtTasa.Text)

Se inicializa el control de errores con On Error, el nombre «Imprevisto» será la clave para el acceso al bloque de mensajes si en la aplicación hubiera algún error. Luego, declaramos las variables y obtenemos los valores desde los controles TextBox. Dim periodo% If optBimestral.Value = True Then periodo = 6 If optTrimestral.Value = True Then periodo = 4 If optSemestral.Value = True Then periodo = 2

 4 trimestres, o 2 semestres. Dim capital@ capital = monto / (1 + (tasa / 100) / periodo) ^ (años * periodo)

Determinar el monto capital según la fórmula de la aplicación. lstR.Clear lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem lstR.AddItem Exit Sub

"** RESUMEN **" "MONTO: $ " & Format(monto, "0.00") "AÑOS: " & años "TASA: " & Format(tasa / 100, "Percent") "--------------------------------------" "CAPITAL: $ " & Format(capital, "0.00")

Los resultados se imprimen al control ListBox. Solo debemos tener en cuenta que Exit Sub para que no acceda al mensaje implementado en el bloque Imprevisto. Imprevisto: MsgBox "Error en la aplicacion...!!! - " & Err.Description

Implementación del bloque de mensajes, esta sección solo será accesible si dentro de la aplicación ocurriera algún error. Debemos tener en cuenta que la sentencia Err. Descripon emite un mensaje desde el compilador VBA.

221

Cap. Estructuras condicionales

6

Capacidad  desarrollar casos que involucren un nivel de lógica intermedia.

6.1 Introducción Hasta ahora hemos implementado aplicaciones VBA de forma secuencial, es decir, una sentencia sigue a la otra en descendencia y de la misma forma se ejecutan las sentencias. En nuestra vida diaria se nos puede presentan situaciones donde debemos decidir por ejemplo: ¿Qué carrera profesional elijo? ¿Qué ropa me pondré? ¿Aprobaré mi examen? Si estamos en una carretera bifurcada, ¿cuál camino tomaré?  



Algo así nos sucederá en nuestra aplicaciones VBA para lo cual combinaremos las sen veremos en este capítulo.

224

Aplicaciones VBA con Excel

6.2 Implementación de una condición  condición de manera correcta, ya que es un requisito obligatorio en las estructuras condicionales. Debemos tener en cuenta los siguientes aspectos: True o False. Por cada juego variable-valor debemos usar operadores relacionales como >, >=, = 18 Condicionar la categoría de un empleado sabiendo que se busca solo aquellos empleados de categoría «B»:



Categoría = "B"

Cap.6: Estructuras condicionales

225

Condicionar la nota de un alumno el cual se puede encontrar entre 0 y 20:



Nota >= 0 And Nota –1 And Nota < 21 Condicionar el sueldo de un empleado el cual puede encontrarse entre 1500 y 3000:



Sueldo >=1500 And SueldoValor

Case 1 Case 1,2 Case 1 To 5 Case Is>100 Case Is
Aplicaciones VBA con Excel

Related documents

345 Pages • 51,250 Words • PDF • 8.6 MB

6 Pages • 511 Words • PDF • 546.4 KB

378 Pages • 55,491 Words • PDF • 14.6 MB

33 Pages • 3,813 Words • PDF • 18.9 MB

86 Pages • 19,848 Words • PDF • 4.9 MB

14 Pages • 1,198 Words • PDF • 22 MB

3 Pages • 316 Words • PDF • 560 KB

16 Pages • 2,125 Words • PDF • 1 MB

9 Pages • 1,792 Words • PDF • 321 KB

3 Pages • 845 Words • PDF • 602.4 KB

321 Pages • 384,998 Words • PDF • 4.2 MB