Aplicaciones VBA Con Excel - Compressed PDF
Aplicaciones VBA Con Excel - Compressed PDF
VBA
Excel
con
EDITORIAL
Descargado en: ey books.co m
Aplicaciones
VBAcon
Excel
EDITORIAL
España - México - Colombia - Chile - Ecuador - Perú - Bolivia - Uruguay - Guatemala - Costa Rica
Aplicaciones VBA con Excel
Autor: Manuel Torres Remon
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 eslo:
José Vásquez Espíritu
Diagramación:
Lizbeth R. Eufracio Quispe
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.
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 Denició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 Applicaon ........................................................................................... 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 denidas 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úlple 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 especicando 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 reper valores ............................................................ 327
........................... 328
8.9 Listado de registros condicionados ..................................................................330
......... 331
.......... 333
Caso desarrollado 3: Mantenimiento de productos ........................................... 338
Bibliograa ............................................................................................................... 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
propiedades.
En el capítulo cinco, hacemos una breve explicación de cómo debe tratarse los errores en
hoja de Excel.
Finalmente, en el capítulo ocho, hacemos uso de las bases de datos de Access y del
propio Excel para implementar aplicaciones complejas con datos masivos.
1
Cap.
Introducción al VBA
Capacidad
Reconoce los conceptos básicos del lenguaje VBA; así como el modelo de objetos de
1.1 Introducción
-
bajos de manipulación, análisis y presentación de datos. Ha pasado de ser una aplicación
así que hoy en día no solo lo usan personas de una determinada profesión; lo usa cual-
quiera que necesite administrar de manera correcta su información.
-
do todas las fórmulas, funciones y demás acciones que realice bajo Excel en realidad son
ejecutadas mediante código que no es visible por el usuario.
A veces, a pesar de las amplias capacidades que ofrece Excel, el usuario siente que en
-
sonal del cual dependen cuarenta sueldos de los trabajadores de un pequeña empresa,
y que solo usted conoce el manejo de dicha planilla; hasta aquí todo parece estar bien;
ahora suponga el caso de que usted viajara a otro país y no puede manipular la informa-
ción fuera de la empresa; por lo tanto, deja encargado a su secretaria la manipulación de
la planilla; le pregunto: ¿usted viajaría tranquilo? Si cambiamos el escenario a una aplica-
ción VBA de control de planilla, en la cual solo permita ingresar valores correctos y emita
mensajes cuando lo necesite, cambiaría la situación, pues se sabe que cualquier personal
autorizado podría usar dicha aplicación. De eso trata VBA, de brindar la posibilidad de
ampliar dichas aplicaciones realizadas en Excel y pasarlas algo así como a un sistema; por
supuesto, bajo el entorno Excel.
Muchos conceptos nuevos que veremos en este material serán explicados conforme va-
básica entendible.
Aplicaciones VBA con Excel
18
Debemos considerar que, para crear aplicaciones, no necesariamente usted debe ser un
experto en programación o algo así; ya que si fuera así, estamos seguros que no estaría
usando VBA. Más bien, este material se considera como una iniciación en la programación;
por lo tanto, no es requisito indispensable saber sobre programación, pues en este ma-
terial le explicaremos los comandos necesarios para iniciarse como programador junior.
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
-
realizarlo dentro de Excel», y que el resultado de la aplicación puede mostrarse directa-
mente en la aplicación o en una hoja de Excel, pero no fuera de su entorno.
copiar los códigos en ambos y no notar la diferencia. Veamos un formulario en común de
ambas aplicaciones:
El formulario mostrado puede desarrollarse bajo el entorno de Visual Basic, el cual emi-
resultados en una o más hojas de Excel.
Desarrollador:
En resumen: Archivo > Opciones > Personalizar cinta de opciones > Desarrollador
la macro. Más adelante explicaremos este punto, por
ahora solo podemos mencionar que al iniciar una aplica- -
.xlsm (macro de
Excel) sin necesidad de mostrar el mensaje de «Advertencia de seguridad».
Presione <F12>
Guardar.
Aplicaciones VBA con Excel
24
Ficha Desarrollador
Seleccione Visual Basic
Seleccione Archivo > Guardar libro…
Los pasos siguientes son los mismos aplicados en la Opción 1.
nuevas versiones de Excel.
<Ctrl+R>
Permite mostrar la ventana Exploradora de Proyectos.
<F4>
Permite mostrar la ventana de Propiedades.
B C
Cap.1: Introducción al VBA
27
A. Muestra una lista de objetos de las cuales se examinan sus propiedades. Para visuali-
mostrará el nombre del objeto.
Nombre de la clase
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.
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.
Donde:
Aquí se presenta una lista de objetos en la cual puede
asignar código.
de programación, aprovechando así el uso de los elementos las veces que sea necesario.
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:
AcveSheet:
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
1.14.1 ActiveCell
Address de AcveCell.
Aplicaciones VBA con Excel
30
Sub celdaActiva()
Dim celda As String
celda = Application.ActiveCell.Address
MsgBox "La dirección de la celda activa es: " & celda
End Sub
Analizando el código:
celda = Application.ActiveCell.Address
La variable celda
$A$1 el cual indica que el cursor se encuentra en la celda A1.
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:
Application.ActiveSheet.Range(celda).Select
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:
Declaramos la variable libro que tendrá la misión de almacenar el nombre del libro
actual.
libro = Application.ActiveWindow.Caption
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:
titulo = Application.Caption
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:
rango = Application.Selection.Address
-
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:
nombre = Application.ThisWorkbook.Name
Name
del ThisWorkbook.
nombre.
Aplicaciones VBA con Excel
34
1.14.8 Visible
Permite mostrar u ocultar la aplicación Excel, esto puede ser usado al ejecutar un formu-
Excel nuevamente con la propiedad Visible=True. Veamos un procedimiento que permita
ocultar el libro actual.
Sub ocultaVentana()
Application.Visible = False
End Sub
Analizando el código:
Application.Visible = False
La opción False permite ocultar la aplicación Excel; con la opción True lo volvemos
clave de acceso de usuario o realice algún tema de seguridad.
1.14.9 MoveAfterReturn
Permite habilitar e inhabilitar el movimiento del cursor al presionar la tecla <Enter>
después del ingreso de valor en una celda. Veamos un procedimiento que inhabilita y
hablita el movimiento del cursor en una hoja de Excel.
Sub inhabilita()
Application.MoveAfterReturn = False
End Sub
Sub habilita()
Application.MoveAfterReturn = True
End Sub
Analizando el código:
Application.MoveAfterReturn = False
Application.MoveAfterReturn = true
Es el valor por defecto, igualmente permite habilitar el movimiento del cursor al pre-
sionar la tecla <Enter>.
Cap.1: Introducción al VBA
35
1.14.10 DisplayFormulaBar
Permite habilitar e inhabilitar la visualización de la barra de fórmulas en el libro de Ex-
cel. Veamos un procedimiento que inhabilita y habilita la barra de fórmulas.
Sub inhabilita()
Application.DisplayFormulaBar = False
End Sub
Sub habilita()
Application.DisplayFormulaBar = True
End Sub
Analizando el código:
Application.DisplayFormulaBar = False
Application.DisplayFormulaBar = True
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
Application.DisplayFullScreen = True
1.14.12 Quit
Método que permite salir de la aplicación de Excel, cerrando todos los libros y pregun-
tando si se guardará los cambios en el caso de que los hubiera. Veamos un procedi-
miento que permite cerrar la aplicación Excel.
Sub salir()
Dim r As Integer
r = MsgBox("Esta seguro de salir", vbYesNo + vbCritical)
If r = 6 Then
Application.Quit
End If
End Sub
Analizando el código:
Dim r As Integer
If r = 6 Then
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 parr 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
Analizando el código:
Now+Ti-
meValue
MsgBox "Fecha Actual: " & Date & " Hora actual: " & Time
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:
1.15.2 Name
Representa el nombre del libro actual de Excel. Veamos un procedimiento que muestre
el nombre del libro.
Sub nombreLibro()
MsgBox "El nombre del libro es: " & ThisWorkbook.Name
End Sub
Analizando el código:
MsgBox "El nombre del libro es: " & ThisWorkbook.Name
ThisWorkbook.Name
el archivo, el nombre mostrado será Libro1. Por otra parte, no se olvide que el símbo-
lo & permite concatenar dos o más elementos dentro de una misma sentencia.
1.15.3 Path
-
to. Veamos un procedimiento que muestre la ruta registrada para el libro actual.
Sub rutaArchivo()
MsgBox "La ruta del archivo es: " & ThisWorkbook.Path
End Sub
Cap.1: Introducción al VBA
39
Analizando el código:
Path-
ta una ruta, primero debemos grabar el libro, de otra manera el mensaje solo mostrará
el texto «La ruta del archivo es:».
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:
1.15.5 Add
Sub agregaLibros()
Workbooks.Add
End Sub
Analizando el código:
Workbooks.Add
El método Add
1.15.6 Activate
-
apertura de los libros, y la segunda es por el nombre del mismo libro.
Sub activaListado()
Workbooks("listado.xlsx").Activate
End Sub
Aplicaciones VBA con Excel
40
Analizando el código:
Workbooks("listado.xlsx").Activate
El método Acvate ubica el cursor en el libro invocado; en este caso, estamos in-
vocando al archivo "listado.xlsx" Debemos considerar que el archivo solicitado no
.xlsm sino más bien debe ser solo un archivo exis-
tente en una misma carpeta. Si el libro invocado es el segundo abierto de una lista de
libros, entonces el código podríamos haberlo escrito de la siguiente manera Woork-
Books(2).Acvate.
1.15.7 Close
Permite cerrar un determinado libro. Debemos tener en cuenta que desde un docu-
mento podemos cerrar cualquier libro abierto inclusive el mismo. Veamos como cerrar
el libro actual.
Sub cerrarLibro()
ThisWorkbook.Close
End Sub
Analizando el código:
ThisWorkbook.Close
El método Close cierra el libro preguntando si desea grabar los cambios realizados; se
debe tener en cuenta que si no realiza ningún cambio al libro, este se cerrará automá-
en el siguiente código:
Sub cerrarLibro()
Workbooks("listado.xlsx").Close SaveChanges:=False
End Sub
Analizando el código:
Workbooks("listado.xlsx").Close SaveChanges:=False
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
Sub guardaLibro()
ActiveWorkbook.Save
End Sub
Sub guardaLibro()
Workbooks("Save - WorkBook.xlsm").Save
End Sub
Guardando el libro haciendo referencia al número de libro abierto, aquí debemos te-
ner en cuenta que el número es asignado en el orden de apertura de los libros:
Sub guardaLibro()
Workbooks(1).Save
End Sub
1.15.9 Save As
P
el archivo original. Debemos tener en cuenta que el archivo original debe encontrarse
previamente guardado. Su función es parecida al accionar del botón Guardar como…
de la barra de herramientas.
Sub guardaLibro()
ActiveWorkbook.SaveAs "C:\Capitulo 1\Copia de Seguridad.xlsm"
Workbooks.Open "C:\Capitulo 1\Save As - WorkBook.xlsm"
Workbooks("Save As - WorkBook.xlsm").Activate
End Sub
Analizando el código:
El método SaveAs permite guardar todo el archivo en uno nuevo para lo cual debe-
Aplicaciones VBA con Excel
42
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.
Sub guardaLibro()
ThisWorkbook.SaveAs "C:\Capitulo 1\Copia de Seguridad.xlsm"
Workbooks.Open "C:\Capitulo 1\Save As - WorkBook.xlsm"
Workbooks("Save As - WorkBook.xlsm").Activate
End Sub
Sub guardaLibro()
Workbooks.("C:\Capitulo 1\Save As - WorkBook.xlsm").SaveAs
"C:\Capitulo 1\Copia de Seguridad.xlsm"
Workbooks.Open "C:\Capitulo 1\Save As - WorkBook.xlsm"
Workbooks("Save As - WorkBook.xlsm").Activate
End Sub
Sub guardaLibro()
Workbooks(1).SaveAs "C:\Capitulo 1\Copia de Seguridad.xlsm"
Workbooks.Open "C:\Capitulo 1\Save As - WorkBook.xlsm"
Workbooks("Save As - WorkBook.xlsm").Activate
End Sub
1.15.10 SaveCopyAs
Permite crear una copia del libro actual. Debemos tener en cuenta que el libro a dupli-
car debe encontrarse previamente grabado.
Sub crearCopia()
ActiveWorkbook.SaveCopyAs "C:\Capitulo 1\Copia de Seguridad.xlsm"
End Sub
Analizando el código:
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.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:
Count
siempre devuelve un valor numérico entero.
1.16.2 Name
Representa el nombre de la hoja actual. Debemos considerar que el nombre predeter-
minado es Hoja1
sobre la hoja, y seleccionando Cambiar nombre-
cando la propiedad Name desde la ventana de propiedades. Veamos cómo mostrar el
nombre de la hoja actual por medio de un procedimiento.
Sub hojaActual()
MsgBox "El nombre de la hoja es: " & Worksheets(1).Name
End Sub
Analizando el código:
Debemos tener en cuenta que el nombre de la hoja es una propiedad del objeto Wor-
ksheets
será Hoja1 o simplemente 1 si queremos tratarlo por su índice. Es por esa razón que al
invocar la propiedad Name hacemos referencia al número de hoja del cual queremos
su nombre. Otras opciones para la invocación del nombre de la hoja pueden ser:
Aplicaciones VBA con Excel
44
Sub hojaActual()
MsgBox "El nombre de la hoja es: " & ActiveSheet.Name
End Sub
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 Acvate
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 AcveSheet para movernos a las si-
sin ningún problema por todas las hojas de un determinado libro.
1.16.5 Index
Propiedad que permite devolver el número de hoja de un conjunto de hojas de un mis-
mo libro. Veamos el procedimiento índice que devuelve el número de hoja en la que se
encuentra el usuario:
Sub indice()
MsgBox "El número de hoja es: " & ActiveSheet.Index
End Sub
Analizando el código:
Index-
minado libro.
Métodos
1.16.6 Activate
cómo mostrar el contenido de la Hoja2, sabiendo que la hoja actual es la Hoja1.
Sub activaHoja()
WorkSheets(2).Activate
End Sub
Aplicaciones VBA con Excel
46
Analizando el código:
WorkSheets(2).Activate
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:
Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name=nombre
El método Add
la posición usamos la opción Aer -
cuerde que Worksheets.Count determina el número total de hojas contenidas en el
Worksheets(1).Activate
Cap.1: Introducción al VBA
47
Para este ejercicio hay que tener cuidado con las ubicaciones de los elementos como
INFORME
0001 que se encuentra en la celda B5
hojas en un mismo libro es:
Sub generaHojas()
For i = 1 To 20
nombre = Worksheets(1).Cells(4 + i, 2).Value
If nombre <> "" Then
Worksheets.Add(after:=Worksheets(Worksheets.Count)).Name=nombre
Else
Exit Sub
End If
Next
End Sub
Analizando el código:
For i = 1 To 20
nombre = Worksheets(1).Cells(4 + i, 2).Value
If nombre <> "" Then
Worksheets.Add(after:=Worksheets(Worksheets.Count)).Name=nombre
Else
Exit Sub
End If
Next
Aplicaciones VBA con Excel
48
For
-
cías; por eso, condicionamos que el nombre de la hoja sea diferente al vacío (If nom-
bre<>""). De esta manera, se podrá crear las hojas con nombres. En el caso de que
For mediante la sentencia Exit
Sub
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:
Application.DisplayAlerts = False
Esta sentencia bloquea los mensajes enviados desde Excel cuando intentamos elimi-
nar las hojas.
Worksheets(numero).Delete
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:
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:
El objeto Range-
Cells, es así que (6,2) representa a la celda B6 mientras que (15,4)
representa a la celda D15.
1.17.3 End
-
Aplicaciones VBA con Excel
50
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-
B5xlUp ubicaría en la celda B4, es por
Oset
Range("B5").End(xlDown).Select
xlDown
la celda B5.
Range("B5").End(xlToLeft).Offset(0, 1).Select
xlToLe
B5, usamos Oset(0,1) para saltar una columna adelante.
Cap.1: Introducción al VBA
51
Range("B5").End(xlToRight).Select
xlToRight
a la celda B5.
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:
Sub generaCalculos()
Range("D23").Formula = "=sum(D9:D22)"
Range("E23").Formula = "=sum(E9:E22)"
End Sub
Analizando el código:
Range("D23").Formula = "=sum(D9:D22)"
La propiedad Formula
función interpretada por Excel, es por esto que, para sumar todas las unidades, se
emplea la función sum que es análoga a la función «suma» de Excel.
Aplicaciones VBA con Excel
52
Range("E23").Formula = "=sum(E9:E22)"
comentar que VBA envía a la celda de Excel la fórmula =sum(E9:E22) mientras que
Excel lo recepciona como =Suma(E9:E22).
Finalmente, si aplicamos todas las funciones vistas hasta el momento podríamos lle-
Sub generaCalculos()
Range("D9").End(xlDown).Offset(1, 0).Select
ActiveCell.Formula = "=sum(D9:D22)"
Range("E9").End(xlDown).Offset(1, 0).Select
ActiveCell.Formula = "=sum(E9:E22)"
End Sub
1.17.5 FormulaLocal
Debemos considerar que en VBA para hacer referencia a la funciones de Excel se debe
-
logas en VBA y Excel. Veamos cómo implementar un procedimiento que permita calcu-
tal como se muestra en la siguiente imagen:
Range("M43").FormulaLocal = "=SUMA(M12:M42)"
End Sub
Analizando el código:
Range("M12").FormulaLocal = "=SUMA(D12:L12)"
La celda M12 representa la primera posición del cálculo que debemos realizar, recuer-
de que la función FormulaLocal es como encontrarse en una hoja de Excel; por tanto,
para sumar todos los montos del primer registro sería =SUMA(D12:L12).
Range("M12").Select
La idea es copiar la formula a las demás celdas como lo haríamos en una hoja de Excel,
así que empezamos por ubicarnos en la celda donde se encuentra la fórmula imple-
mentada con la sentencia anterior.
Selection.AutoFill Destination:=Range("M12:M42")
Para copiar la fórmula a las demás celdas debe considerar la posición de todos los
elementos a sumar y, además, deberán ser adyacentes. AutoFill permite copiar la fór-
aplicación de la copia, en nuestro caso desde M12 hasta M42. Tenga en cuenta que,
M12.
Range("M43").FormulaLocal = "=SUMA(M12:M42)"
1.17.6 FormulaR1C1
Establece una fórmula mediante la notación R1C1 donde R-
tras C
-
su código, y la sección lo determina el sexto carácter del lado izquierdo. Finalmente,
se componga por la primera letra de su nombre más su apellido paterno, tal como se
muestra en la siguiente imagen:
Aplicaciones VBA con Excel
54
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")
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.
Range("E10").FormulaR1C1 = "=MID(RC[-3],6,1)"
Range("E10").Select
Selection.AutoFill Destination:=Range("E10:E20")
En la celda E10
función MID que representa al Extraer de Excel retrocediendo para este caso tres co-
-
AutoFill.
Range("F10").FormulaR1C1 = "=LOWER(MID(RC[-3],
SEARCH("" "", RC[-3],
SEARCH("" "", RC[-3]) + 1), 1 + 1) &
MID(RC[-3], RIGHT(1),
RIGHT(SEARCH("" "", RC[-3]) - 1))) &
""@editorialmacro.com"""
Range("F10").Select
Selection.AutoFill Destination:=Range("F10:F20")
Para la generación del correo electrónico debemos hacer uso de varias funciones
como Lower para que el correo se genere en minúsculas, Search para hallar los espa-
Mid para extraer parte
del texto. Recuerde que el símbolo & permite unir o concatenar dos o más expresio-
doblemente, tal es así que representar "" sería "" "".
1.17.7 Value
Tiene un trabajo de asignación y recuperación de valor sobre una celda, es decir, pode-
Formu-
la; así también podemos obtener un valor desde las celdas de la hoja de Excel hacia VBA.
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)"
Range("E9").End(xlDown).Offset(1, 0).Select
ActiveCell.Value = "=sum(E9:E22)"
Métodos
1.17.8 Activate
Range-
va. Veamos algunos casos:
Sub capturaContenido()
Range("D7").Activate
1.17.9 Clear
Método que permite eliminar el contenido y el formato asignado a un determinado
número de celdas. Veamos un procedimiento que permita limpiar el contenido de un
determinado rango de celdas así como su formato:
Sub eliminaContenido()
Range("D10:D20").clear
End Sub
1.17.10 ClearContents
-
cados en el objeto Range. Veamos el procedimiento:
Sub limpiaCeldas()
Range("D10:D50").ClearContents
End Sub
1.17.11 Delete
Método que elimina un determinado número de celdas. Veamos un procedimiento que
permita eliminar un conjunto determinado de celdas:
Sub eliminaCelda()
Range("D10:D20").Delete
End Sub
Aplicaciones VBA con Excel
58
Sub eliminaFila()
Range("D10").Activate
Selection.EntireRow.Delete
End Sub
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
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
Sub seleccionarCeldaDos()
Cells(2, 4).Select
End Sub
Cap.1: Introducción al VBA
59
Sub seleccionarRango()
Cells(2,4).ClearContents
End Sub
D2:
Sub modicaFuente()
Cells.Font.Name = "Arial"
Cells.Font.Size = 10
End Sub
Sub asignaValor()
Cells(2,4).Value = 200
End Sub
Pasos:
1. En un documento nuevo de Excel elabore el siguiente cuadro
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
Pasos:
Sub FormatoTitulo()
Range("B2:G2").Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Selection.Merge
With Selection.Font
.Name = "Tahoma"
.Size = 22
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ThemeColor = xlThemeColorLight1
.TintAndShade = 0
.ThemeFont = xlThemeFontNone
End With
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorAccent5
.TintAndShade = 0.799981688894314
.PatternTintAndShade = 0
End With
End Sub
Aplicaciones VBA con Excel
74
Como verá el código generado usa funciones propias de VBA que a simple vista parece
complejo, pero conforme vamos avanzando en el tema, observará usted que su inter-
pretación es sencilla; por mientras, eliminaremos las instrucciones neutras del código
de la macro), teniendo así el siguiente código:
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
Selection.Font.Name="Taho-
ma"
Selection.Font.Size=22
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 B2Desarrollador >
Macros > seleccione FormatoTitulo > Ejecutar, tal como se muestra en la siguiente
imagen:
Pasos:
3. D13 y colo-
que la siguiente instrucción en la barra:
= C13*C12 / D12
5. Pruebe la macro, pero primero asegúrese que la celda D13 se encuentre vacía, lue-
Desarrollador > Macros > seleccione Conductor > Ejecutar. El resultado
es 2.4 horas.
Aplicaciones VBA con Excel
78
-
tencias. Ambos códigos son equivalentes:
Pasos:
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.
Pasos:
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 listadosLibro de Excel habilitado para
macros.
3. Seguidamente, crear los procedimientos de la siguiente manera:
Pasos:
1. Asumamos que contamos con una carpeta llamada Reporte de Ventas con los si-
guientes archivos:
2. Enel editor de código VBA del archivo Control de reportes colocar el siguiente
procedimiento:
3. En la hoja de Excel del libro Control de reportes agregar un botón llamado Acvar
libros y direccionarlo al procedimiento acvaLibro.
Cap.1: Introducción al VBA
83
Si en caso desea controlar el error por ingreso del libro incorrecto, el código inicial
podría cambiar por:
Hay que tener en cuenta que el archivo original puede encontrarse en cualquier ubi-
ubicación del archivo original.
Pasos:
Al abrir el documento nos debe solicitar el nombre del usuario, tal como se muestra
en la siguiente imagen:
muestra en la siguiente imagen:
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:
4. Coloque el siguiente código dentro del método tal como lo muestra la siguiente imagen:
Application.Visible=False
Excel para mostrar un cuadro de entrada de datos.
al usuario por medio de un cuadro de entrada y lo almacenará en la variable clave.
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.
-
ción como B11, C11 y D11.
Los botones de Iniciar empo y Detener empo-
lizar los procedimientos en el entorno VBA.
Para probar la aplicación, primero debemos hacer clic en el botón Iniciar empo
botón Detener empo
cronómetro.
Cap.1: Introducción al VBA
89
Pasos:
1. En
un documento nuevo de Excel implemente la siguiente interfaz, tal como se
muestra en la siguiente imagen:
Sub detenerCronometro()
Application.OnTime segundos, "actualizaTiempo", , False
End Sub
Sub actualizaTiempo()
Application.Range("D11").Value =
FormatDateTime(Now-CDate(Application.Range("B11").Value),vbLongTime)
segundos = Now + (1 / 86400)
Application.OnTime segundos, "actualizaTiempo"
End Sub
Sub IniciaTiempo()
Call actualizaTiempo
contador = Now
Application.Range("B11").Value = FormatDateTime(contador, vbLongTime)
Application.Range("C11").ClearContents
End Sub
Sub detenerTiempo()
Call detenerCronometro
Application.Range("C11").Value = FormatDateTime(Now(), vbLongTime)
Application.Range("D11").Value =
FormatDateTime(CDate(Application.Range("C11"))-
CDate(Application.Range("B11")), vbLongTime)
End Sub
Aplicaciones VBA con Excel
90
Sub detenerCronometro()
Application.OnTime segundos, "actualizaTiempo", , False
End Sub
El procedimiento detenerCronometro-
dos; dentro del procedimiento se hace referencia al método OnTime del objeto Appli-
caon
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 Applicaon.Range("D11").Value, asimismo, la función Now determina la
fecha y hora actual, la función CDate
válida. La función FormatDateTime
ejemplo, vbLongTime.
Sub IniciaTiempo()
Call actualizaTiempo
contador = Now
Application.Range("B11").Value =
FormatDateTime(contador, vbLongTime)
Application.Range("C11").ClearContents
End Sub
El procedimiento IniciaTiempo-
metro mostrado en la celda D11; así como mostrar el contador en la celda B11 y lim-
piar el contenido de la celda C11. La claúsula Call permite invocar a un procedimiento
desde cualquier parte de la aplicación, también es válido llamarlo directamente sin
Call. El método ClearContents permite eliminar el contenido
Range.
Cap.1: Introducción al VBA
91
Sub detenerTiempo()
Call detenerCronometro
Application.Range("C11").Value =
FormatDateTime(Now(), vbLongTime)
Application.Range("D11").Value =
FormatDateTime(CDate(Application.Range("C11"))-
CDate(Application.Range("B11")), vbLongTime)
End Sub
Now() muestra la fecha actual.
En el proyecto existe una hoja principal en la cual se encuentra los botones de para el
Hoja2: Data
Pasos:
1.
2. Acceda al entorno VBA presionando <Alt+F11> y haga doble clic sobre el objeto
ThisWorkbook, es aquí donde implementaremos los procedimientos necesarios en
la aplicación.
Cap.1: Introducción al VBA
93
Sub activaData()
Worksheets(2).Activate
End Sub
Sub activaGraco()
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
La variable r
debemos considerar que el número seis representa al botón Sí, mientras que el
número siete representa al botón No; es así que, usamos la estructura If para com-
parar cuál fue la respuesta del usuario, de acuerdo con esto podrá salir o quedarse
en el libro.
Worksheets(1).Activate
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.
En el libro de Excel se debe contar con una hoja inicial que presente la relación de
Pasos:
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:
La variable hojas representará a todos las hojas del libro. La variable i
puede imprimir en las celdas de la hoja de Excel. La estructura For Each permite
recorrer todas las hojas encontradas en el libro; es ahí, justamente, donde usamos
la variable hojas. La opción In Sheets hace referencia a la colección de hojas que
mediante la sentencia Cells.
Aplicaciones VBA con Excel
96
Sheets(1).Range("B7:B100").ClearContents
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.
Hoja1: Listado01
Hoja2: Datos02
Hoja3: Datos03
Pasos:
1. -
2. Acceda al entorno VBA presionando <Alt+F11> y haga doble clic sobre el objeto
ThisWorkbook, es aquí donde implementaremos los procedimientos necesarios en
la aplicación.
3. Implemente los siguientes procedimientos:
Sub hojaSiguiente()
ActiveSheet.Next.Activate
End Sub
Sub hojaAnterior()
ActiveSheet.Previous.Activate
End Sub
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.
Pasos:
1. En
un documento nuevo de Excel implemente la siguiente interfaz, tal como se
muestra en la siguiente imagen:
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
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.
6. Antes de probar la aplicación debemos grabar la hoja de Excel, para esto presione
Libro de Excel
habilitado para macros.
7. Finalmente, pruebe las acciones presionando cualquiera de los botones, considere
2
Cap.
Fundamentos de programación
Capacidad
una aplicación VBA, además de implementar funciones y procedimientos que permitan
el desarrollo de aplicaciones ordenadas.
Acvidades Fases
-
minado lenguaje en nuestro VBA.
Aplicaciones VBA con Excel
102
Veamos algunos casos para entender mejor cómo debemos analizar un problema antes
Problema 1:
valores Entrada-Proceso-Salida.
Proceso
costo = 9 × 15 × 200
Problema 2:
Doce obreros, trabajando 8 horas diarias, terminan un trabajo en 25 días. ¿Cuánto tar-
darán en hacer ese mismo trabajo 5 obreros trabajando 10 horas diarias?
valores Entrada-Proceso-Salida.
Aplicaciones VBA con Excel
104
Entrada
Proceso
Días = 25 × 12 × 8
de obreros, es decir, si por 25 días se necesitan 12 obreros,
-
disminuye.
días = 25 × 12 × 8
obreros horas
y salida, así pues, le recomiendo que resuelva los ejercicios propuestos.
Problema 1:
Pseudocódigo de solución:
Pseudocódigo de solución:
Problema 1:
Pseudocódigo de solución:
Líneas de pseudocódigo
INICIO
FIN
Paso 2: Ingrese al entorno VBA (<ALT+F11>), luego inserte un módulo al proyecto (In-
sertar>Módulo) y coloque el siguiente código:
-
brando a VBA.
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
=calculaCosto(B5;C5)
Tenga en cuenta que B5 representa al valor del peso, por lo tanto asegúrese que la cel-
da B5 contenga dicho valor, mientras C5 representa a la distancia.
Finalmente, se debe tener en cuenta que cada objeto de VBA se ejecuta de diferente
forma, en este caso estamos viendo la ejecución de una función.
2.2.1 Identificadores
Es un conjunto de caracteres los cuales pueden ser letras, números o caracteres subra-
yados. Estos representan un valor dentro del código VBA y es muy importante tener en
cuenta los siguientes aspectos, puesto que en toda la línea de programación se hace
nombre_cliente es igual a NOMBRE_CLIENTE y viceversa.
Alternava Observación
Con el guion bajo podremos unir dos o más
palabras que componen a un solo iden-
nombre_cliente
_ (Guion bajo) fecha_de_nacimiento
dias_trabajados
_nombres
_descripcion
_precio
-
guir entre las palabras que compone un
segunda palabra
nombreCliente
fechaDeNacimiento
diasTrabajados
números, por ejemplo:
Válido No Válido
nota1 1nota
nota_1 1_nota
descuento10 10descuento
descuento_10 10_descuento
Aplicaciones VBA con Excel
110
dim, integer, string,
double, funcon, sub, private, etc.
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
Ahora veremos la misma implementación pero esta vez usaremos la función REM:
Asimismo, cuando no se declara una variable tenga en cuenta que se declarará interna-
Variant. Finalmente, podemos decir que una variable declara-
da como Variant
2.3.1 Enteros
Aplicaciones VBA con Excel
112
2.3.2 Reales
Los números reales abarcan la capacidad expuesta por los números enteros pero ade-
-1.79769313486232E308 a
-4,94065645841247E-324
Double valor de la exponencial, tasa de
interés anual de un banco, etc.
+4,94065645841247E-324 a
+1.79769313486232E308
2.3.4 Lógicos
-
2.3.5 Fechas
-
registro de las horas.
2.3.6 Variante
Variant
2.4 Constantes
como un valor predeterminado. Su formato es:
Donde:
CONST:
Nombre: Es el nombre que se le asigna a la constante.
As TipoDatos:
6
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,
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: "))
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.
promedioPonderado
Promedio ponderado de un alumno promedio_ponderado
promPonderado
sueldoBasico
Sueldo básico de un empleado sueldo_basico
sueldoBas
Donde:
Sub calculaPromedio()
Dim alumno As String
Alumno = InputBox("Ingrese nombre del alumno: ")
Sub calculaPromedio()
Dim alumno$, nota1%, nota2%, nota3%, promedio#
Alumno = InputBox("Ingrese nombre del alumno: ")
2.6 Operadores
-
cerlos y saber el uso adecuado de algunos de ellos.
2.6.1 Asignación
declaración de la variable.
Además, debemos considerar que una variable también puede registrar un valor resul-
tante de una expresión. Su formato es:
Variable = valor
2.6.2 Aritméticos
Dim promedio#
promedio = (nota1 + nota2 + nota3) / 3
-
minado de meses.
Dim n As Integer
Exponenciación o
^ n=2
potencia
Dim raiz As Double
raiz = n ^ (1/2)
Aplicaciones VBA con Excel
120
Dim n As Integer
MOD Resto de la división
n = 12453
2.6.3 Relacionales
obtener un resultado verdadero o falso según la condición. Mayormente, estos ope-
If For o
While
Dim mensaje$
mensaje = IIf(edad1 = edad2, "Iguales",
"No son iguales")
Dim mensaje$
mensaje = IIf(edad > 17, "Mayor de edad",
"Menor de edad")
Dim mensaje$
mensaje = IIf(promedio < 10.5, "Desaprobado",
"Aprobado")
Cap.2: Fundamentos de programación
121
Dim mensaje$
mensaje = IIf(edad >= 18, "Mayor de edad",
"Menor de edad")
Dim mensaje$
mensaje = IIf(promedio <= 10.4, "Desaprobado",
"Aprobado")
Dim n As Integer
Diferente o n = 4
<>
desigual
Dim mensaje$
mensaje = IIf(n Mod 2 <> 0, "Número impar",
"Número par")
2.6.4 Lógicos
-
guir los siguientes operadores:
L
usamos el operador OR
Debemos tener en cuenta que el operador con más alto grado de prioridad es el
juego de paréntesis ().
Cap.2: Fundamentos de programación
123
2.6.7 Expresiones
dentro de un código VBA, desde aquí se puede obtener algún resultado relevante en
A1 = 1200(32x-1 )+ 80
A2 = 10x +x-2
2
Algorítmicas: Son expresiones que son entendidas por el compilador del VBA. Por
ejemplo:
A1 = 1200 * (3 ^ (2*X-1))+80
A2 = 10 ^ (X+2)*(X-1)
2.7.1 Implícita
En VBA se considera una conversión implícita cuando un valor se convierte automá-
permite calcular el promedio de cuatro notas de un determinado alumno.
Sub calculaPromedio()
promedio = (nota1+ nota2+ nota3+ nota4)/4
Msgbox "El promedio es: " & promedio
End Sub
Aplicaciones VBA con Excel
124
Cuando trabajemos con elementos visuales como el cuadro de texto será más claro la
conversión implícita, veamos la siguiente línea:
2.7.2 Reglas
que las conversiones más comunes se realizan de cadena a número para cuando ne-
necesite concatenar valores. Ya usted comprenderá su uso mediante los casos desarro-
llados expuestos en este material.
CByte Byte Byte, usado para valores numéricos
cortos.
CCur Currency
Currency, usado para valores monetarios.
CDate Date Date
hora.
Cap.2: Fundamentos de programación
125
Double,
CDbl Double -
rio largo.
Decimal,
CDec Decimal
Currency o Double.
Single,
CSng Single usado para valores numéricos fraccionarios
cortos.
String,
CStr String
de cualquier longitud.
Variant,
CVar Variant
valor recepcionado.
2.7.3 Explícita
También se le conoce como declaración forzada, es así que un valor de una variable
pasa a otra por conveniencia del programador. Su formato es:
Variable = ReglaConversion(Valor)
Dim cadena As String
cadena = "0.255"
Dim cadena As String
cadena = "2850.00"
Dim numero As Integer
numero = 10
Título
Ícono Mensaje
Botón
Formato:
Donde:
Mensaje:
corto, pero si necesita señalar información masiva, podríamos optar por usar los cam-
bios de línea en el mensaje. Veamos algunos casos:
Cap.2: Fundamentos de programación
127
Título:
respuesta del usuario, es así que debemos conocer la siguiente tabla de valores:
Dim r As Integer
r = MsgBox("Está seguro de salir?",VbYesNo, "Salida")
If r=6 Then End
Donde:
Dim cantidad As Integer
cantidad = InputBox("Ingrese cantidad comprada: ")
Defecto:-
gresar un valor, esta es opcional. Veamos el siguiente caso:
Donde:
Prompt:
Ingresar la descripción de un determinado producto:
Type:
Tipo Descripción
0 Permite el acceso de una fórmula
1 Permite el acceso de un número
2 Permite el acceso de una cadena de caracteres.
4 Permite el acceso de un elemento booleano (True or False).
8 Permite el acceso de un rango de celdas.
Dim edad As Integer
edad=Application.InputBox(Prompt:="Ingrese edad:",Type:=1)
Dim nombre As String
nombre=Application.InputBox(Prompt:="Ingrese nombre:",Type:=2)
Dim rango As Range
Set rango=Application.InputBox(Prompt:="Elija un rango", Type:=8)
rango.Interior.Color = "255"
Finalmente, se agregó la sentencia Opon Explicit al inicio de todo el código para forzar
a la declaración de todas las variables usadas en la implementación de las funciones.
Finalmente, podemos decir que las funciones permiten organizar de la mejor manera
grandes códigos que se pueden presentar en una aplicación. VBA no limita la implemen-
tación de una función, ya que esta se puede desarrollar en cualquier contenedor de có-
digo del VBA, lo que se recomienda es almacenar las funciones en módulos. Veamos la
Cap.2: Fundamentos de programación
133
Donde:
NOMBRE:
los nombres de variables. Recomendamos que todo nombre de función inicie con
capturaEdad o
devuelvePI.
SENTENCIAS: Son las sentencias o expresiones que puede contener una función; aquí
podemos hacer uso de todas las estructuras que posee VBA.
Ejemplos:
Sub muestraFecha()
MsgBox "La fecha actual es: " & devuelveFecha
End Sub
Función que permita devolver el valor ingresado en un cuadro de texto que represen-
ta a la edad de una persona
Sub capturaDatos()
Dim Edad As Integer
Edad = getEdad()
End Sub
Donde:
PARAMETROS: -
ByVal nombre As Tipo, donde
ByVal es la palabra reservada que indica el paso de un valor, nombre-
dor del parámetro y As Tipo
Ejemplos:
Sub calcula()
Dim base As Integer, exponente As Integer
Dim potencia As Integer
potencia = calculaExponencial(base,exponente)
MsgBox "La potencia es: " & potencia
End Sub
Aplicaciones VBA con Excel
136
Función que permita validar un valor numérico, dicho valor tendrá un rango de 0 a
Sub calculaPromedio()
Dim nota As Integer
nota = InputBox("Ingrese nota: ")
If validaNumero(nota) = "" Then
MsgBox "Su nota es: " & nota
Else
MsgBox validaNumero(nota)
End If
End Sub
2.12.3 Formato para invocar una función con parámetros o sin ellos
-
-
ción; por lo tanto, la invocación puede tener los siguientes formatos:
Variable = nombreFuncion(Parámetros)
Expresión = nombreFuncion(Parámetros)+Valor
2.13 Procedimientos
Los procedimientos son bloques de código que pueden recibir datos por medio de pará-
metros o a través de variable globales, pero que no devuelven ningún resultado a quien
los invoque. Son también llamados funciones sin valor de retorno. Pueden ser usados
controles visuales o imprimir algún valor directamente.
Cap.2: Fundamentos de programación
137
SUB NOMBRE()
SENTENCIAS
END SUB
Donde:
Ejemplos:
Sub muestraFecha()
Dim fecha As Date
fecha = Now
MsgBox "La fecha actual es: " & fecha
End Sub
Aplicaciones VBA con Excel
138
Sub muestraPI()
Dim PI As Double
PI = 3.1416
MsgBox "El valor de PI es: " & PI
End Sub
SUB NOMBRE(PARAMETROS)
SENTENCIAS
END SUB
Donde:
PARAMETROS:
-
ByVal nom-
bre As Tipo, donde ByVal es la palabra reservada que indica el paso de un valor, nom-
breAs Tipo
Ejemplos:
Pasos:
2. Ingrese al entorno VBA, haga doble clic sobre el objeto ThisWorkbook e implemen-
te el procedimiento calculosGuarderia:
4. Pruebe los resultados ingresando el total de alumnos (E10), cuota mensual (C12),
otros gastos (C13E12).
5. Libro de Excel habilitado para macros.
C = Cinicial (1 + rn ) nt
Donde:
Cnal: n años
r: Porcentaje de interés
t: Años de depósito
C = Cinicial * ( 1 + ( r / n ) ) ^ ( n * t )
Pasos:
2. Ingrese al entorno VBA, haga doble clic sobre el objeto ThisWorkbook e implemen-
te el procedimiento calculaHerencia:
4. Pruebe los resultados ingresando el monto depositado (C10), tasa de interés (C11)
y años (C14); haga clic en el botón Calcular.
5. Libro de Excel habilitado para macros.
Aplicaciones VBA con Excel
144
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:
Sub calculaDonacion()
Dim monto As Currency
monto = Range("C16").Value
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
monto, este
será usado en otras expresiones, el cual podrá calcular el monto asignado al pro-
grama de Centros Asistenciales (cAsistenciales), comedores populares (cPopulares)
y el programa vaso de leche (pVaso). Todas estas variables deben ser declaradas
como Currency por tratarse de valores monetarios.
Range("C18").Value = cAsistenciales
Range("C19").Value = cPopulares
Range("C20").Value = pVaso
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.
1 dólar = 3.51 soles
1 dólar = 1.09 euros
1 dólar = 2.12 marcos
Pasos:
Sub determinaMontos()
Const DOLAR = 3.51
Const EURO = 1.09
Const MARCOS = 2.12
Range("D17").Value = montoE
Range("D18").Value = montoM
Range("D19").Value = montoD
End Sub
-
Descargado en: ey books.co m
Aplicaciones VBA con Excel
148
constante las expresiones que la usen no sufrirán cambios.
Range("D17").Value = montoE
Range("D18").Value = montoM
Range("D19").Value = montoD
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.
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:
Sub calcularMontos()
Dim Empleado$, hTrabajadas%, tHora@
Empleado = Range("C11").Value
hTrabajadas = Range("C12").Value
tHora = Range("F12").Value
Range("C14").Value = mBruto
Range("F14").Value = dOncosalud
Range("F15").Value = dLey
Range("C16").Value = tDescuentos
Range("C17").Value = sNeto
End Sub
Sub limpiaCeldas()
Range("C11").Value = ""
Range("C12").ClearContents
Range("F12").ClearContents
Range("C14").ClearContents
Range("F14:F15").ClearContents
Range("C16:C17").ClearContents
Range("C11").Select
End Sub
$ representa al As
String, % representa al As Integer y @ representa al As Currency. Luego captura-
mos los valores ingresados en la hoja de Excel. Asegúrese que las celdas son las
correspondientes a los datos como C11 al nombre del empleado, C12 a las horas
trabajadas y F12 a la tarifa horaria.
Aplicaciones VBA con Excel
150
Range("C14").Value = mBruto
Range("F14").Value = dOncosalud
Range("F15").Value = dLey
Range("C16").Value = tDescuentos
Range("C17").Value = sNeto
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
Pasos:
Sub calculaGrados()
Dim C#
C = Range("C8").Value
Range("C12").Value = F
Range("C13").Value = R
Range("C14").Value = K
End Sub
Dim C#
C = Range("C8").Value
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
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.
Pasos:
Sub calculaMontos()
Dim precio@
precio = Range("C9").Value
Dim porcentaje#
porcentaje = InputBox("Ingrese porcentaje de ganancia: ")
Dim montoGanancia@
montoGanancia = precio * porcentaje / 100
Dim precioVenta@
precioVenta = precio + montoGanancia
Aplicaciones VBA con Excel
154
Sub limpiarCeldas()
Range("C9:C11").ClearContents
Range("C13").ClearContents
Range("C9").Select
End Sub
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
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
Pasos:
Function getMonto()
getMonto = Range("C11").Value
End Function
constante y del monto de comisión, el cual será enviado por medio del parámetro
comisión.
Sub calculos()
Dim monto@
monto = getMonto()
Range("C13").Value = comision
Range("C14").Value = bruto
Range("C15").Value = descuento
Range("C16").Value = neto
End Sub
Dim monto@
monto = getMonto()
getMonto.
Realizamos los cálculos sobre las variables comision, bruto, descuento y neto a par-
Range("C13").Value = comision
Range("C14").Value = bruto
Range("C15").Value = descuento
Range("C16").Value = neto
4. Desarrollador
que se encuentre asociado al procedimiento calculos.
5. Pruebe la aplicación ingresando un valor para el monto vendido en la celda C11, lue-
go haga clic en el botón PROCESAR.
Aplicaciones VBA con Excel
158
Pasos:
Sub getMonto()
monto = Range("C11").Value
End Sub
Sub calculaComision()
comision = monto * 0.09
End Sub
Sub calculaBruto()
bruto = basico + comision
End Sub
Cap.2: Fundamentos de programación
159
Sub calculaDescuento()
descuento = bruto * 0.11
End Sub
Sub calculaNeto()
neto = bruto - descuento
End Sub
Sub calculos()
Call getMonto
Call calculaComision
Call calculaBruto
Call calculaDescuento
Call calculaNeto
Range("C13").Value = comision
Range("C14").Value = bruto
Range("C15").Value = descuento
Range("C16").Value = neto
End Sub
-
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
Sub calculaComision()
comision = monto * 0.09
End Sub
Sub calculaBruto()
bruto = basico + comision
End Sub
Procedimiento que permite calcular el monto bruto en base a las variables globales
básico y comision, recuerde que la variable comision fue llenada por el procedi-
miento calculaComision y que la variable basico es un valor constante.
Sub calculaDescuento()
descuento = bruto * 0.11
End Sub
Sub calculaNeto()
neto = bruto - descuento
End Sub
Procedimiento que permite determinar el monto neto basado en las variables glo-
bales bruto y descuento.
Sub calculos()
Call getMonto
Call calculaComision
Call calculaBruto
Call calculaDescuento
Call calculaNeto
Range("C13").Value = comision
Range("C14").Value = bruto
Range("C15").Value = descuento
Range("C16").Value = neto
End Sub
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
valores Entrada-Proceso-Salida.
Entrada
Proceso
Salida
valores Entrada-Proceso-Salida.
Entrada
Proceso
Salida
valores Entrada-Proceso-Salida.
Entrada
Proceso
Salida
Cap.2: Fundamentos de programación
163
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=
Expresión Resultado
E1 = r + 1
d
e
E2 = (x + y)
x+y
E3 =
x-y
E4 = (x + y)2 (a + b)
√x
E5 =
x+ y
2
Implemente procedimientos para realizar los cálculos mostrados y para limpiar las
celdas.
Todas las variables usadas en la aplicación deben ser declaradas según la naturaleza
de sus valores.
3
Cap.
UserForm y objetos visuales
Capacidad
Reconoce los elementos que conforman las aplicaciones visuales de VBA como los
3.1 UserForm
punto podremos crear aplicaciones basadas en formularios e integrarlas a las hojas de
Excel de la forma que crea conveniente.
Por otra parte, podemos mencionar que los UserForm permiten una interacción integra-
UserForm en VBA:
Mediante las propiedades, modelar los controles y el mismo formulario de tal manera
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.
Desde el panel Explorador de Proyectos, haga clic derecho, seleccionar Insertar >
UserForm.
Se muestra una carpeta llamada Formularios en la cual se almacenarán todos los User-
Form que agregue al proyecto.
Por otra parte, para salir del modo de Ejecución podemos realizar las siguientes opciones:
También podríamos seleccionar el botón desde la barra de herramientas es-
tándar del entorno VBA.
Finalmente, debemos hacer la invocación del UserForm por medio de código VBA, el
cual se muestra en la siguiente imagen:
.ShowUserForm, lo con-
trario a la muestra se llama ocultar al UserForm, es decir, cuando hay varios UserForm
código frmVenta.Hide para administrarlo de la mejor manera.
-
y seleccione Modicar texto, quedando de la siguiente manera:
UserForm o hacer clic en el botón
reestablecer desde el cuadro de herramientas estándar del VBA
Asimismo, debemos mencionar que para asignar nombres de los controles existe una
Aplicaciones VBA con Excel
172
Label TextBox
Select Objects ComboBox
ListBox
Frame
Image
TabStrip
RefEdit ScrollBar
-
Para comprobar el nombre asignado al UserForm podría seguir los siguientes pasos:
nombre del control UserForm que el programador ha asignado, mientras que User-
Form
Paleta-
tras que Sistema muestra los colores propios del sistema.
Capon: UserForm-
Height: UserForm.
Picture: UserForm.
Si desea eliminar la imagen de fondo, tendrá que presionar la tecla <Supr> sobre el
texto (mapa de bits) de la propiedad Picture.
Width:UserForm.
En el siguiente UserForm
Label
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.
Capon: Representa el contenido textual que se muestra en el control Label, esto per-
Enabled: Permite bloquear la selección del control Label, pero si, por estructura, dicho
diferencia es que Enabled=True muestra de color gris al control Label.
Font: La-
bel
Cap.3: UserForm y objetos visuales
177
TextAlign: Determina la alineación del texto con respecto al marco del control Label.
TextBox
BorderStyle: TextBox.
ControlTipText: -
se por encima del control TextBox.
Font:
control TextBox.
ForeColor:TextBox.
Height: -
Locked: Permite bloquear y desbloquear el acceso al texto del control TextBox. Es pa-
recido al trabajo que realiza la propiedad Enabled con la diferencia que se permite
establecer el cursor dentro del control TextBox bloqueado.
MaxLength: TextBox.
Veamos estos casos:
el acceso desde 0 a 99 años.
MaxLen-
ght=8.
Cap.3: UserForm y objetos visuales
179
Debe tener en cuenta que la propiedad MaxLenght no realiza validaciones sobre los
validaciones las realizaremos más adelante con la estructura condicional If.
MulLine: 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.
Text: Permite asignar un valor al control TextBox, normalmente esta propiedad debe
TextAlign: Permite alinear el texto contenido en el control TextBox. Tenemos las si-
guientes opciones:
2 fmTextAlignCenter
3 fmTextAlignRight
Width: TextBox; inicialmente, este presenta un
valor estándar para todos los controles TextBox incorporados al UserForm.
WordWrap:
propiedad MulLineTextBox.
Aplicaciones VBA con Excel
180
En el siguiente UserForm
(Name):CommandBuon, según la
nomenclatura de nombres debe empezar con btn, por ejemplo, btnProcesar, btnLim-
piar o btnSalir.
BackColor: Permite asignar un color de fondo al botón, esto se podría dar en botones
Cancel: Permite accionar un botón con la tecla <Esc>, el valor predeterminado es False;
además, dentro de un UserForm solo puede haber un botón con la propiedad Cancel=-
True.
Capon:
que se mostrará en el botón.
Font:
botón de comando.
ForeColor: Permite asignar un color de texto al texto mostrado dentro del control bo-
tón de comando.
Picture:
imagen asignada puede tener diferentes posiciones dentro del botón, la cual puede ser
PicturePosion.
PicturePosion: Permite asignar una posición dentro del marco que presenta el control
botón de comando.
WordWrap: Permite la escritura de dos a más líneas dentro del control botón de co-
mando.
En el siguiente UserFormListBox:
ListBox
BackColor: ListBox.
ColumnCount: ListBox,
el valor predeterminado es uno.
ControlTipText: -
na el puntero del mouse encima del control ListBox.
Enabled: Permite bloquear los valores dentro del control ListBox haciendo que el usua-
rio no pueda seleccionar ningún elemento de la lista, el valor predeterminado es True.
Font:
ListBox.
ForeColor:ListBox.
ListStyle:ListBox, tenemos
fmListStylePlain como valor predeterminado:
TextAlign:ListBox.
En el siguiente UserFormComboBox:
ComboBox
DropBuonStyle:
control ComboBox, presenta las siguientes opciones:
0: fmDropbuonStylePlain
1: fmDropBuonStyleArrow
2: fmDropBuonStyleEllipsis
3: fmDropBuonStyleReduce
Aplicaciones VBA con Excel
184
En el siguiente UserFormFrame:
Frame
Capon: Frame.
Enabled: Permite bloquear todo el contenido del control Frame, el valor predetermi-
nado es True.
Font:
Frame.
En el siguiente UserFormOponBuon:
Cap.3: UserForm y objetos visuales
185
Capon: OponBuon.
En el siguiente UserForm
Capon:CheckBox.
En el siguiente UserFormImage:
Image
Picture:
el marco del control ImagePictureSi-
zeMode.
PictureAlignment: Permite alinear la imagen que se encuentra dentro del marco del
control Image.
UserForm:
Presenta algunas partes que debemos considerar ya que será nuestra plataforma de có-
digo de VBA.
Donde:
End Sub:
cinco caracteres numéricos y llenando con ceros el lado izquierdo.
Implemente un procedimiento para limpiar los controles colocados dentro del
UserForm.
Implemente un procedimiento para asignar un borde a las celdas una vez registra-
do los datos en Excel.
esto hará que se pueda agregar usuarios uno debajo de otro como un listado.
Pasos:
(Name) frmRegistro
Label1
Label2
Label3 (Name) lblNumero
Label4
Label5
Label6
Label7
(Name) btnRegistrar
Default True
Picture Grabar.gif
Aplicaciones VBA con Excel
190
(Name) btnNuevo
Picture Nuevo.gif
(Name) btnAnular
Picture Anular.gif
(Name) btnSalir
Cancel True
Picture Salir.gif
TextBox1 (Name) txtApellidos
TextBox2 (Name) txtNombres
(Name) txtDNI
TextBox3
MaxLenght 8
(Name) txtContraseña
TextBox4 MaxLenght 4
PasswordChar *
Dim uFila%
Private Sub btnAnular_Click()
Call limpiaControles
End Sub
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
Dim uFila%
Private Sub UserForm_Activate()
uFila = determinaUltimaFila()
lblNumero.Caption = Format(uFila - 9, "00000")
End Sub
Empezamos por declarar de forma global la variable uFila; esto se debe a que cuando
-
claración global implica que todos los procedimientos o funciones podrán acceder al
valor de dicha variable.
Aplicaciones VBA con Excel
192
cambiar el valor 2 que se encuentra en Cells(Rows.Count,2), ya que dicho valor de-
Sub limpiaControles()
txtApellidos.Text = ""
txtNombres.Text = ""
txtDni.Text = ""
txtClave.Text = ""
txtApellidos.SetFocus
End Sub
Procedimiento que permite limpiar todos los controles del UserForm, las comillas
dobles sin ningún valor determinan la limpieza del control TextBox, mientras que
SetFocus
Sub borde()
Range(Cells(uFila, 2), Cells(uFila, 5)).Select
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ThemeColor = 1
.TintAndShade = -0.249946592608417
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ThemeColor = 1
.TintAndShade = -0.249946592608417
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.ThemeColor = 1
.TintAndShade = -0.249946592608417
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ThemeColor = 1
Cap.3: UserForm y objetos visuales
193
.TintAndShade = -0.249946592608417
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.ThemeColor = 1
.TintAndShade = -0.249946592608417
End With
Cells(uFila, 2).Select
End Sub
Procedimiento que se encarga de agregar bordes a las celdas con los datos del nuevo
lo capturamos con el siguiente código Range(Cells(uFila, 2), Cells(uFila, 5)).Select,
todo el código siguiente es para designar a qué borde se agregará una línea.
Para llegar a este procedimiento debemos hacer doble clic sobre el botón Registrar
que se encuentra en el UserForm; con esto indicamos que la cabecera de este proce-
Empezamos por capturar los datos desde los controles, recuerde que siempre de-
bemos declarar todas las variables usadas en el código VBA; la forma de capturar un
valor desde el control TextBox es variable = TextBox.Text, la propiedad Text captura
-
tencia Cells(uFila,2).Value=numero
Space(1) permite dejar un espacio entre los
apellidos y los nombres del nuevo usuario.
Para llegar a este procedimiento se presionó doble clic sobre el botón Anular el cual
-
miento limpiaControles.
Para llegar a este procedimiento debemos hacer doble clic sobre el botón Nuevo, el
con el mismo formato inicial.
Para llegar a este procedimiento debemos hacer doble clic sobre el botón Salir el
UserForm
Unload Me.
Implemente un procedimiento que permita limpiar los controles contenidos en el
Pasos:
(name) frmPago
Label1
Label2
Label3 (Name) MONTO TOTAL VENDIDO
(Name) btnProcesar
(Name) btnSalir
Cancel True
TextBox1 (Name) txtVendedor
TextBox2 (Name) txtMonto
ListBox (Name) lstR
Sub limpiarControles()
txtVendedor.Text = ""
txtMonto.Text = ""
lstR.Clear
txtVendedor.SetFocus
End Sub
vendedor = txtVendedor.Text
monto = CCur(txtMonto.Text)
el nombre del vendedor, monto vendido, monto de comisión, monto bruto, monto
«Enviar a Excel».
Aplicaciones VBA con Excel
198
Sub limpiarControles()
txtVendedor.Text = ""
txtMonto.Text = ""
lstR.Clear
txtVendedor.SetFocus
End Sub
Llegamos a este procedimiento haciendo doble clic sobre el botón Procesar desde
el UserForm. Empezamos el código capturando el nombre del vendedor así como
el monto vendido, hay que tener en cuenta que el monto es un valor monetario que
CCur cuando se envía dicho valor a la variable.
Luego, calculamos los montos según el criterio del problema y terminamos el proceso
enviando toda la información al control ListBox, debemos tener en cuenta, que Ad-
dItem permite agregar un elemento a la lista; el símbolo & permite concatenar dos
elementos ya sean numéricos o textuales y la función Format
de moneda a los montos.
Llegamos a este procedimiento haciendo doble clic sobre el botón Limpiar desde el
UserForm. El cual invoca al procedimiento limpiarControles que es el encargado de
dejar limpios los controles para un nuevo registro de valores en el UserForm.
Cap.3: UserForm y objetos visuales
199
Llegamos a este procedimiento haciendo doble clic sobre el botón Enviar a Excel des-
de el UserForm. El cual permite enviar toda la información obtenida en el UserForm
donde enviaremos todos los valores. La función DATE devuelve la fecha actual obte-
UCase
nombre del vendedor; cada vez que se envíe los datos a Excel se deberá limpiar los
controles para un nuevo registro, es por eso que se invoca al procedimiento limpiar-
Controles.
Finalmente, llegamos a este procedimiento haciendo doble clic sobre el botón Salir
desde el UserForm, el cual permite salir de la aplicación.
4
Cap.
Funciones VBA
Capacidad
Implementa aplicaciones VBA haciendo uso de las principales funciones VBA como las
cadenas, numéricas, fechas y comprobaciones de valor.
Formulario propuesto:
Código VBA:
en la línea posterior, si quiere evitar algún error de interpretación, entonces escríbalo
en una sola línea eliminando para este caso las líneas inferiores agregadas.
lstCodigos.ColumnCount = 2
Sentencia que permite dividir el control ListBox en dos columnas, la primera mostrar
la letra y la segunda su código ASCII.
For i = 0 To 25
lstCodigos.AddItem letrasMayusculas(i)
lstCodigos.List(i, 1) = Asc(letrasMayusculas(i))
Next
La estructura For se encargará de recorrer por cada una de las letras almacenadas en
el arreglo con la intención de mostrar su código ASCII en pocas líneas de código. Hay
que tener en cuenta que el control ListBox
enviarán por medio de la propiedad AddItem; para mandar información a la segunda
columna usaremos lstCodigos.List(i, 1) donde i
a la segunda columna.
enviamos todos los elementos del arreglo letrasMayusculas.
Cap.4: Funciones VBA
203
Chr: La función Chr actúa a la inversa de la función Asc, esto quiere decir, que ingre-
Veamos una aplicación que permita mostrar los códigos ASCII del 0 al 255 y su carác-
ter asociado en un control ListBox.
Formulario propuesto:
Código VBA:
lstCodigos.ColumnCount = 2
For i = 0 To 255
lstCodigos.AddItem i
lstCodigos.List(i, 1) = Chr(i)
Next
Recorremos por los 256 números y estos serán impresos en la primera columna,
mientras que en la segunda enviamos el carácter mediante la función Chr y el valor
de la variable i
lstCodigos.List(i, 1).
Aplicaciones VBA con Excel
204
Format:
monetario, decimal, fecha o porcentaje.
-
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:
Código VBA:
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.
ListBox, tenga
formato Estándar es exactamente igual que "0.00".
formato es LCase(Cadena).
Ucase:
formato es UCase(Cadena).
Len: Función que permite determinar el número de caracteres contenido en una ca-
formato es Len(Cadena).
Le: Función que permite capturar un número determinado de letras del lado iz-
Rtrim: Función que permite eliminar los espacios en blanco del lado derecho de una
determinada cadena de caracteres. Su formato es Rtrim(Cadena).
Trim: Función que permite eliminar los espacios en blanco de ambos lados de la ca-
dena de caracteres. Su formato es Trim(Cadena).
Space:
dentro de una cadena de caracteres. Su formato es Space(Candad 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:
Código VBA:
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.
-
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
Abs: -
vo. Su formato es Abs(Numero).
Sin: Función que permite devolver el seno de un número entero o real. Su formato
es Sin(Numero).
Cos: Función que permite devolver el coseno de un número entero o real. Su formato
es Cos(Numero).
Tan: Función que permite devolver la tangente de un número entero o real. Su for-
mato es Tan(Numero).
Sqr: Función que permite devolver la raíz cuadrada de un número entero. Su formato
es Sqr(Numero).
Fix: Función que permite devolver el valor entero redondeando al exceso a un núme-
mato es Hex(Numero).
Aplicaciones VBA con Excel
208
Int: Función que permite devolver solo la parte entera de una operación, expresión o
número. Tenga en cuenta que esta función no redondea el valor, solo captura la parte
entera.
Log: Función que permite devolver el logaritmo natural de un número entero en base e.
Rnd: Función que permite devolver un número aleatorio entre 0 y 1, pero nosotros
-
adelantaremos un poco este tema:
Por ejemplo, se necesita imprimir por medio de mensajes al usuario 10 números alea-
torios entre 20 y 40.
Sub Aleatorio()
Dim inicio%
inicio = 20
Dim tope%
tope = 40
For i = 1 To 10
MsgBox Int((tope - inicio + 1) * Rnd + inicio)
Next
End Sub
Veamos una aplicación que permita calcular el módulo de un vector para lo cual de-
fórmula es como sigue:
Formulario propuesto:
Código VBA:
Dim modulo#
modulo = (Abs(i) ^ 2 + Abs(j) ^ 2 + Abs(k) ^ 2) ^ (0.5)
Obtenemos los valores desde los controles Textbox. Debe tener en cuenta que los
eso son declarados como Double
Dim modulo#
modulo = (Abs(i) ^ 2 + Abs(j) ^ 2 + Abs(k) ^ 2) ^ (0.5)
con la función Abs y el símbolo ^ para elevar a la N potencia un valor numérico. Hay
que tener en cuenta que para obtener la raíz cuadrada del valor debemos elevar la
suma a la 0.5 o ½.
lstR.AddItem "MODULO DEL VECTOR"
lstR.AddItem "Primer valor: " & Abs(i) ^ 2
lstR.AddItem "Segundo valor:" & Abs(j) ^ 2
lstR.AddItem "Tercer valor: " & Abs(k) ^ 2
lstR.AddItem "----------------------------------"
lstR.AddItem "Modulo del vector es: " & modulo
Si queremos obtener la raíz cuadrada con la función SQR el código podría ser de la si-
guiente manera: modulo = Sqr(Abs(i) ^ 2 + Abs(j) ^ 2 + Abs(k) ^ 2).
siguiente código para su impresión: lstR.AddItem «Modulo del vector es: « & Round(-
modulo, 3)
en la respuesta.
Aplicaciones VBA con Excel
210
Date: Función que permite devolver la fecha actual del sistema. Su formato es Date.
DateAdd: -
función DateAdd.
DateDi: Función que permite devolver la diferencia entre 2 fechas esta se puede dar
en días, meses o años.
DatePart: Función que permite devolver parte de una determinada fecha como el
mes, año, etc. Si necesitamos el mes actual, el código sería DatePart("m", Date).
Year: Función que permite devolver el año de una determinada fecha. Si necesitamos
obtener el año actual, el código sería Year(Date)
fecha, el código podría ser Year(Fecha).
Month: Función que permite devolver el mes de una determinada fecha. Si necesita-
Second:
Se-
cond(Time).
Now: Función que permite devolver la fecha actual del sistema. Su formato es Now.
Time: Función que permite devolver la hora actual del sistema. Su formato es Time.
Debemos tener en cuenta que el número de día para VBA es considerado de la siguien-
te manera:
0 Domingo
4 Jueves
1 Lunes
5 Viernes
2 Martes
6 Sábado
3 Miércoles
Veamos una aplicación que permita mostrar el monto mensual y las fechas de pago
para un préstamo, para lo cual, se deberá ingresar el nombre del cliente y el monto
prestado, y por medio de opciones se debe seleccionar las letras de pago para 3, 6 o 9
cuotas. Debemos tener en cuenta que al seleccionar directamente la opción se mostra-
rán los datos solicitados tal como se muestra en la siguiente imagen:
Formulario propuesto:
Código VBA:
lstR.Clear
lstR.AddItem "**RESUMEN DE PAGO Y FECHAS**"
lstR.AddItem "MONTO MENSUAL $ " & Format(monto / 3, "0.00")
lstR.AddItem "-----------------------------------------------"
lstR.AddItem DateAdd("m", 1, Date)
lstR.AddItem DateAdd("m", 2, Date)
lstR.AddItem DateAdd("m", 3, Date)
End Sub
lstR.Clear
lstR.AddItem "**RESUMEN DE PAGO Y FECHAS**"
lstR.AddItem "MONTO MENSUAL $ " & Format(monto / 6, "0.00")
lstR.AddItem "-----------------------------------------------"
lstR.AddItem DateAdd("m", 1, Date)
lstR.AddItem DateAdd("m", 2, Date)
lstR.AddItem DateAdd("m", 3, Date)
lstR.AddItem DateAdd("m", 4, Date)
lstR.AddItem DateAdd("m", 5, Date)
lstR.AddItem DateAdd("m", 6, Date)
End Sub
lstR.Clear
lstR.AddItem "**RESUMEN DE PAGO Y FECHAS**""
lstR.AddItem "MONTO MENSUAL $ " & Format(monto / 9, "0.00")
lstR.AddItem "-----------------------------------------------"
lstR.AddItem DateAdd("m", 1, Date)
lstR.AddItem DateAdd("m", 2, Date)
lstR.AddItem DateAdd("m", 3, Date)
lstR.AddItem DateAdd("m", 4, Date)
lstR.AddItem DateAdd("m", 5, Date)
lstR.AddItem DateAdd("m", 6, Date)
lstR.AddItem DateAdd("m", 7, Date)
lstR.AddItem DateAdd("m", 8, Date)
lstR.AddItem DateAdd("m", 9, Date)
End Sub
Para crear los procedimientos se debe hacer doble clic sobre los controles. Por ejem-
plo, para Private Sub opt3_Click() se hace doble clic sobre , en caso de Private
Sub UserForm_Acvate se hace doble clic sobre el fondo del UserForm y se cambia
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:
Código VBA:
Dim mora%
mora = DateDiff("d", fechaEnt, Date)
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.
IsEmpty:-
IsDate:-
Date.
Capacidad
usuario.
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
ͫErrores de compilación
-
lador convierte el código fuente en código legible por la computadora, los errores de
compilación son errores que impiden que una aplicación se ejecute correctamente.
Aplicaciones VBA con Excel
218
ͫ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.
Donde:
GoTo 0:
la aplicación.
Cap.5: Gestión de errores
219
Resume Next:
Number:-
guaje VBA, en el futuro este número puede ser parte de una condicional. Su formato
es Err.Number.
mismos:
Formulario propuesto:
Código VBA:
Dim periodo%
If optBimestral.Value = True Then periodo = 6
If optTrimestral.Value = True Then periodo = 4
If optSemestral.Value = True Then periodo = 2
Dim capital@
capital = monto / (1 + (tasa / 100) / periodo) ^ (años * periodo)
lstR.Clear
lstR.AddItem "** RESUMEN **"
lstR.AddItem "MONTO: $ " & Format(monto, "0.00")"
lstR.AddItem "AÑOS: " & años
lstR.AddItem "TASA: " & Format(tasa / 100, "Percent")
lstR.AddItem "--------------------------------------"
lstR.AddItem "CAPITAL: $ " & Format(capital, "0.00")
Exit Sub
Imprevisto:
MsgBox "Error en la aplicacion...!!! - " & Err.Description
End Sub
Cap.5: Gestión de errores
221
Explicando el código:
On Error GoTo Imprevisto
Dim monto@, años%, tasa#
monto = CCur(txtMonto.Text)
años = CInt(txtAños.Text)
tasa = CDbl(txtTasa.Text)
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)
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.
Descripon emite un mensaje desde el compilador VBA.
6
Cap.
Estructuras condicionales
Capacidad
desarrollar casos que involucren un nivel de lógica intermedia.
6.1 Introducción
Hasta ahora hemos implementado aplicaciones VBA de forma secuencial, es decir, una
sentencia sigue a la otra en descendencia y de la misma forma se ejecutan las sentencias.
En nuestra vida diaria se nos puede presentan situaciones donde debemos decidir por
ejemplo:
¿Qué carrera profesional elijo?
¿Qué ropa me pondré?
¿Aprobaré mi examen?
<Fuente: http://modaengustosycolores.blogspot.com/2013>
Algo así nos sucederá en nuestra aplicaciones VBA para lo cual combinaremos las sen-
veremos en este capítulo.
Aplicaciones VBA con Excel
224
True o False.
Por cada juego variable-valor debemos usar operadores relacionales como >, >=, <,
Para la Y lógica:
P Q P AND Q
True True True
True False False
False True False
False False False
P Q P OR Q
True True True
True False True
False True True
False False True
Para la O lógica:
Veamos algunas implementaciones de condiciones simples y compuestas:
Condicionar la edad de una persona mayor de edad, esta es considerada así cuando
su edad es mayor a 18 años:
Edad > 17
Edad >= 18
Segunda forma:
If condición Then
Acción o acciones
End If
Donde:
True
Condición Acción
False
Aplicaciones VBA con Excel
226
Segunda forma:
If condición Then
Accion_True
Else
Accion_False
End If
Donde:
es verdadera.
Accion_False: Son las sentencias o expresiones que se efectuarán solo si la condición
es falsa.
End If:
False True
Condición
Acción_false Acción_true
Cap.6: Estructuras condicionales
227
If condición Then
Accion1
ElseIf condicion Then
Accion2
ElseIf condicion Then
Accion3
Else
Accion_False
End If
Donde:
True
Condición
Acción_true
Condición
Acción1
Condición
Acción_false Acción2
forma se podría tratar un rango de fechas.
acción:
Donde:
Variable
palabra «PER» y cinco cifras numéricas, por ejemplo, 00004.
civil.
En todo momento se debe controlar los errores con la sentencia On Error Goto y
mostrar el mensaje:
Código VBA:
Dim uFila%
Private Sub btnAnular_Click()
Call limpiarControles
End Sub
fechaNac = CDate(txtFechaNac.Text)
End If
Imprevisto:
MsgBox "Error al enviar información...
Revise antes de enviar..!!"
End Sub
Sub llenaSexo()
cboSexo.AddItem "(M)asculino"
cboSexo.AddItem "(F)emenino"
End Sub
Sub llenaEstadoCivil()
cboEstadoCivil.AddItem "(S)oltero"
cboEstadoCivil.AddItem "(C)asado"
cboEstadoCivil.AddItem "(V)iudo"
cboEstadoCivil.AddItem "(D)ivorciado"
End Sub
Sub generaCodigo()
lblCodigo.Caption="PER-" & Format(determinaUltimaFila-12, "00000")
End Sub
Sub limpiarControles()
txtNombres.Text = ""
txtPaterno.Text = ""
txtMaterno.Text = ""
cboSexo.ListIndex = 0
cboEstadoCivil.ListIndex = 0
txtFechaNac.Text = ""
txtNombres.SetFocus
End Sub
Aplicaciones VBA con Excel
234
de la compra de acuerdo a lo siguiente:
-
En la hoja de Excel los datos deben mostrarse de la siguiente manera:
Cap.6: Estructuras condicionales
235
Cancel True
TextBox1
ListBox1 (Name) lstR
Código VBA:
'Calculando el descuento
If cantidad<5 Then iDescuento=0.05 * iCompra
If cantidad>5 And cantidad<=15 Then iDescuento=0.1*iCompra
If cantidad > 15 Then iDescuento = 0.2 * iCompra
lstR.AddItem "---------------------------------------"
lstR.AddItem "IMPORTE DE COMPRA $ :" & iCompra
lstR.AddItem "IMPORTE DE DESCUENTO $ :" & iDescuento
lstR.AddItem "IMPORTE NETO $ :" & iNeto
Exit Sub
Imprevisto:
MsgBox "Error en la aplicación..!!", vbCritical, "Error"
End Sub
Implemente una aplicación en VBA que permita determinar el importe bruto, el im-
porte del descuento y el importe a pagar por la compra.
Label1
Label2
Label3
Label4
Label5
Label6
Label5
Combobox1
Default True
Cancel True
Aplicaciones VBA con Excel
240
Código VBA:
uFila = determinaUltimaFila
Sheets(1).Cells(uFila, 3).Value = cantidad
Sheets(1).Cells(uFila, 4).Value = producto
Sheets(1).Cells(uFila, 7).Value = precio
Sheets(1).Cells(uFila, 9).Value = neto
Range("I24").Formula = "=sum(I14:I23)"
End Sub
'Determinando el neto
neto = subtotal - descuento
En todo momento se debe controlar los errores con la sentencia On Error Goto
mostrando un mensaje al usuario.
Implemente un botón Procesar, que mostrará en un control ListBox el resultado
de la aplicación.
Implemente un botón Generar boleta para enviar los datos solicitados en la boleta
de pago del trabajador.
En la hoja de Excel los datos deben mostrarse de la siguiente manera:
Código VBA:
'Variables globales
Dim trabajador$, dni$, cargo$, horas%, hExtras%
Dim salarioBruto@, descuento@, neto@
Dim AFP$
Range("H8").Value = dni
Range("H9").Value = Date
Range("H10").Value = hExtras
Range("H11").Value = determinaCosto * 1.5
Range("K9").Value = AFP
Range("K10").Value = "DÓLARES"
Range("E14").Value = salarioBruto
Range("H14").Value = determinaAFP * salarioBruto
Range("H15").Value = "0"
Range("K14").Value = determinaAporte
Range("E17").Value = salarioBruto
Range("H17").Value = determinaAFP * salarioBruto
Range("K17").Value = determinaAporte
Range("E19").Value = neto
End Sub
Call DeterminaHoras
salarioBruto = (horas * determinaCosto) + (hExtras * (determinaCosto * 1.5))
descuento = determinaAFP * salarioBruto
neto = salarioBruto - descuento - determinaAporte
lstR.Clear
Cap.6: Estructuras condicionales
245
ComboBox.
OponBuon.
Desno Monto
Trujillo
Arequipa
Chiclayo
Tacna
En la hoja de Excel los datos deben mostrarse de la siguiente manera:
Código VBA:
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
End With
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
End With
End Sub
If cboDestino.ListIndex = -1 Then
MsgBox "Debe seleccionar un Destino", vbCritical, "Sistema"
End If
'Imprimir en la lista
lstR.Clear
lstR.AddItem "***RESUMEN DE PAGOS***"
lstR.AddItem "DESTINO:" & Destino
lstR.AddItem "MONTO PASAJE:" & Format(Pasaje, "0.00")
lstR.AddItem "DESCUENTO:" & Format(Descuento, "0.00")
lstR.AddItem "NETO A PAGAR:" & Format(Neto, "0.00")
End Sub
Producto Costo
Lavadora
Televisor
RadioGrabadora
Refrigeradora
Blue Ray
A través de una función se debe validar el ingreso de los valores del UserForm mos-
trando un mensaje adecuado.
En la hoja de Excel los datos deben mostrarse de la siguiente manera:
Label8
AutoSize True
Picture C:\VentaCredito\Carrito.jpg
Picture C:\VentaCredito\Eliminar.jpg
(Name) btnBorrar
(Name) btnSalir
TextBox1 (Name) txtCliente
TextBox2
TextBox3
Value False
Value False
Value False
ComboBox1 (Name) cboProducto
Cap.6: Estructuras condicionales
253
Código VBA:
'Declaración de variables globales
Dim montoSubtotal@, Descuento@, Neto@, PagoMensual@
'Calculando el subtotal
Precio = AsignaPrecio(cboProducto.ListIndex)
Subtotal = Precio * Cantidad
Call formatoImpresion(UFila)
Call limpiaTodo
Else
MsgBox r, vbCritical, "Sistema"
End If
End Sub
Sub LimpiaListas()
lstP'roductos.Clear
lstCantidad.Clear
lstSubTotal.Clear
End Sub
End With
End Sub
Call LimpiaListas
Call BloqueOpciones
chkCredito.Value = False
lstR.Clear
End Sub
7
Cap.
Estructuras repetitivas
Capacidad
desarrollar casos que involucren un nivel de lógica avanzada.
7.1 Introducción
-
locidad en la que ejecuta sus procesos, la precisión que presentan sus resultados y la
7.2 Contadores
Como su nombre lo indica un contador se implementa solo para iniciar un conteo de
valores bajo una determinada condición. Su mayor desempeño se puede dar cuando se
de forma global.
'Variables globales
Dim c%
'Variables globales
Dim c%
7.3 Acumuladores
También llamado totalizador. Es una variable cuya misión es registrar cierto número de
-
rencia radica en que un contador realiza una sentencia de valor constante, mientras que
en el acumulador su valor es variable.
Formato:
For Variable = ValorInicio TO ValorTope [Step +Valor]
'Cuerpo del Bucle
Next
Donde:
For:
Variable:
To: Indica el otro valor del rango.
Aplicaciones VBA con Excel
262
ValorFinal:
Step Valor:-
te o descendente.
Cuerpo del bucle: Son las sentencias que se ejecutarán mientras se encuentre en el
Next:For.
Dim i%
For i = 1 To 10
lstN.AddItem i
Next
ͫFormato 1
While sea
obligatoriamente verdadera por lo menos la primera vez.
Do While condición
'Cuerpo del Bucle
Loop
Veamos cómo imprimir los diez primeros números enteros en forma ascendente
usando el formato 1:
Dim i%
i = 1
Do While i <= 10
Sheets(1).Cells(i, 1).Value = i
i = i + 1
Loop
ͫFormato 2
decir, la condición debe ser falsa para iniciar el ciclo; cuando el resultado de evaluar
Do Until condición
'Cuerpo del Bucle
Loop
Veamos cómo imprimir los diez primeros números enteros en forma ascendente
usando el formato 2:
Dim i%
i = 1
Do Until i > 10
Sheets(1).Cells(i, 2).Value = i
i = i + 1
Loop
Aplicaciones VBA con Excel
264
ͫFormato 3:
Do
'Cuerpo del Bucle
Loop While condición
Veamos cómo imprimir los diez primeros números enteros en forma ascendente
usando el formato 3:
Dim i%
i = 1
Do
Sheets(1).Cells(i, 3).Value = i
i = i + 1
Loop While i <= 10
ͫFormato 4:
Do
'Cuerpo del Bucle
Loop Until Condición
Veamos cómo imprimir los diez primeros números enteros en forma ascendente
usando el formato 4:
Dim i%
i = 1
Do
Sheets(1).Cells(i, 4).Value = i
i = i + 1
Loop Until i > 10
-
cionarse desde el control ComboBox.
Cap.7: Estructuras repetitivas
265
necesario implementar un reloj digital en el UserForm que muestra en forma diná-
mica la hora actual.
Implemente funciones o procedimientos necesarios para la aplicación.
-
vimiento y el monto ingresado por el cliente.
Implemente un botón Procesar el cual permita mostrar el número de movimiento,
ListBox; también debe considerar
Implemente un botón Enviar a Excel para generar un registro de movimientos ban-
carios.
En la hoja de Excel los datos deben mostrarse de la siguiente manera:
Label1
Label2 (Name) lblFecha
Label3 (Name) lblHora
Label4 (Name) lblSaldo
Label5
Label6
Label7
Label8
Label9
Label10
Label11
Label12
Label13
Combobox1 (Name) cboMovimiento
Default True
(Name) btnExcel
(Name) btnSalir
Cancel True
TextBox1 (Name) txtMonto
ListBox1 (Name) LstR
Código VBA:
'Variables globales
Dim cm As Boolean
Dim saldoActual@
Dim numeroMovimiento%, i%, cr%, cd%
Sheets(1).Cells(uFila, 5).Value = cd
Sheets(1).Cells(uFila, 6).Value = saldoActual
End Sub
tipo = cboMovimiento.Text
monto = CCur(txtMonto.Text)
'Acumulador
Select Case tipo
Case "Retiro"
saldoActual = saldoActual - monto
cr = cr + 1
Case "Deposito"
saldoActual = saldoActual + monto
cd = cd + 1
End Select
'Contador
numeroMovimiento = numeroMovimiento + 1
Call muestraFecha_Hora
End Sub
En el UserForm se debe registrar el nombre del alumno, tres notas y un crédito por
cada uno de ellos.
La aplicación debe devolver el promedio simple y ponderado los cuales se mues-
Promedio simple = n1 + n2 + n3
3
Donde: n1, n2 y n3 representan las tres notas del alumno, mientras que c1, c2 y c3
representan los créditos por cada nota.
Cap.7: Estructuras repetitivas
269
Luego de registrar los valores, estos deberán mostrarse en los cuadros de lista en el
siguiente orden: número de orden, nombre completo del alumno, nota1, crédito1,
nota2, crédito2, nota3, crédito3, promedio simple y promedio ponderado.
Implemente funciones o procedimientos necesarios para la aplicación.
Se debe implementar una función que permita validar el ingreso de valores en los
pleto del alumno, promedio simple y promedio ponderado a la hoja de Excel, tal
como se muestra en la siguiente imagen:
(Name) frmPromedio
Frame1
Frame2
Label1
Label2
Label3
Label4
Label5
Label6
Label7
Label8
Label9
Label10
Label11
(Name) lblPromedio
Label12
Cap.7: Estructuras repetitivas
271
(Name) lblAprobados
Label13
(Name) lblDesaprobados
Label14
Default True
(Name) btnLimpiar
(Name) btnProcesar
(Name) btnSalir
Cancel True
TextBox1 (Name) txtAlumno
TextBox2 (Name) txtN1
TextBox3 (Name) txtC1
TextBox4 (Name) txtN2
TextBox5 (Name) txtC2
TextBox6 (Name) txtN3
TextBox7 (Name) txtC3
Código VBA:
For i = 0 To lstNumero.ListCount - 1
Sheets(1).Cells(uFila + i, 2).Value = lstNumero.List(i)
Sheets(1).Cells(uFila + i, 3).Value = lstAlumno.List(i)
Sheets(1).Cells(uFila + i, 4).Value = lstPromedioS.List(i)
Sheets(1).Cells(uFila + i, 5).Value = lstPromedioP.List(i)
Next
End Sub
En el UserForm
La aplicación inicialmente debe mostrar el código autogenerado con el siguiente
formato PER0001 donde PER es un valor constante y 0001
que dependerá de cuántos registros se encuentren en la hoja de Excel. Además de
ComboBox, con respecto a
los cargos se presentan los siguientes montos:
Aplicaciones VBA con Excel
274
(Name) frmRegistro
Label1
Label2
(Name) lblCodigo
Label3
Label4
Label5
Label6
Label7
Label8
Label9
Label10
Label11
Label12
Combobox1 (Name) cboCargo
Aplicaciones VBA con Excel
276
Código VBA:
For i = 0 To lstCodigo.ListCount - 1
Sheets(1).Cells(uFila + i, 2).Value = lstCodigo.List(i)
Sheets(1).Cells(uFila + i, 3).Value = lstPersonal.List(i)
Sheets(1).Cells(uFila + i, 4).Value = lstCargo.List(i)
Sheets(1).Cells(uFila + i, 5).Value = lstSexo.List(i)
Sheets(1).Cells(uFila + i, 6).Value = lstSueldo.List(i)
Next
Range("J4").Value = C1200
Range("J5").Value = C1200_5000
Range("J6").Value = C5000
Range("J7").Value = aSueldos / lstCodigo.ListCount
Range("J8").Value =
Format(cFemenino / (cFemenino + cMasculino), "0.00")
Range("J9").Value =
Format(cMasculino / (cFemenino + cMasculino), "0.00")
End Sub
Call limpiaControles
lblCodigo.Caption = generaCodigo
Call realizaConteos
Else
MsgBox "El error se encuentra en " & valida
End If
End Sub
End Function
'Función de validación
Function valida() As String
Dim mensaje$
If Len(Trim(txtApellidos.Text)) = 0 Then
mensaje = "apellidos del personal"
txtApellidos.SetFocus
Cap.7: Estructuras repetitivas
279
En el UserForm se debe registrar los datos del cliente como el nombre completo o
En el UserForm se debe registrar los datos del producto, como la descripción del
producto desde un control Combobox
Los precios de los productos se dan de acuerdo a la siguiente tabla:
Al seleccionar una opción de cuota (3, 6 o 9) se deberá mostrar las fechas y los
ListBox.
Implemente un botón llamado Otra venta
Implemente un botón llamado Enviar a Excel que enviará los datos referentes de la
venta, tal como se muestra en la siguiente imagen:
(Name) frmTienda
Label1
Label2
Label3
Label4
Label5
Label6
Label7
Label8
Label9
Label10
Label11
Frame1
Frame2
Frame3
Frame4
Frame5
ComboBox1 (Name) cboProducto
(Name) btnComprar
Default True
(Name) btnEliminar
(Name) btnBorrar
(Name) btnExcel
(Name) btnOtro
(Name) btnSalir
TextBox1 (Name) txtCliente
TextBox2
TextBox3
ListBox1 (Name) lstProducto
Aplicaciones VBA con Excel
282
Código VBA:
'Variables GLOBALES
Dim Neto@, letras%
'Determinar el Subtotal
Dim SubTotal@
SubTotal = Precio * cantidad
Call imprimirResumen(SubTotal)
chkCredito.Value = False
Else
MsgBox "El error esta en " & validaProducto
End If
Cap.7: Estructuras repetitivas
283
End Sub
Private Sub btnEliminar_Click()
If lstProductos.ListIndex = -1 Then
MsgBox "Debe seleccionar un producto a eliminar", vbCritical
Else
'Capturamos el índice del producto a eliminar
Dim Indice%
Indice = lstProductos.ListIndex
End If
asignaPrecio = Precio
End Function
'Función que valida el ingreso de datos del cliente
Function validaCliente()
Dim mensaje$
If Trim(txtCliente.Text) = Empty Then
mensaje = "Nombre del Cliente"
ElseIf Trim(txtRUC.Text) = Empty Or
Not IsNumeric(txtRUC.Text) Then
mensaje = "Ruc del Cliente"
End If
validaCliente = mensaje
End Function
'Calcular el Descuento
Dim Descuento@
Descuento = calculaSubTotal * 0.06
'Calcular el Neto
Neto = calculaSubTotal - Descuento
'Imprimir Resumen
lstResumen.AddItem "El SubTotal es: $"
& Format(calculaSubTotal, "0.00")
lstResumen.AddItem "El Descuento es: $"
& Format(Descuento, "0.00")
Aplicaciones VBA con Excel
286
Dim fechaLetras$
For i = 0 To determinaLetras - 1
fechaLetras = fechaLetras & lstFechas.List(i)
& vbNewLine
Next
Sheets(1).Cells(uFila, 6).Value = fechaLetras
Sheets(1).Cells(uFila, 7).Value = Neto / determinaLetras
Call limpiarTodo
Else
MsgBox "El error se encuentra en " & valida
End If
End Sub
Agregar un módulo en el entorno VBA de tal manera que implemente los siguientes
procedimientos:
La hoja de Excel debe agregar botones para determinar el total de autos no cancelados,
total de autos cancelados, monto total de autos que no cancelan y monto total de autos
que cancelan la deuda, tal como se muestra en la siguiente imagen:
Sub eliminaCeldasVacias()
Dim uFila%
Range("B1000").Select
Selection.End(xlUp).Select
uFila = ActiveCell.Row
Range("B12").Select
Dim i%
i = 1
Do
If ActiveCell = "" Then
Selection.EntireRow.Delete
Else
ActiveCell.Offset(1, 0).Select
End If
i = i + 1
Loop While i <= uFila
End Sub
Sub Copiar_Rango()
Dim marca$
marca = InputBox("Ingrese marca de auto: ", "Ingreso")
Sheets("Original").Select
Range("B12").Select
Sheets("Copias").Select
Range("B12").Select
Do While ActiveCell <> ""
ActiveCell.Offset(1, 0).Select
Loop
ActiveSheet.Paste
End If
Sheets("Original").Select
ActiveCell.Offset(1, 0).Select
Loop
Range("B12").Select
Application.CutCopyMode = False
End Sub
Cap.7: Estructuras repetitivas
291
Capacidad
Implementa aplicaciones VBA haciendo uso de todas las sentencias aprendidas, además
dicha información de manera profesional.
8.1 Introducción
Existen muchos conceptos para base de datos, pero el más adecuado es el que se des-
prende inmediatamente de su nombre, quiere decir, el de un conjunto de datos, al mismo
La necesidad de una base de datos surge en los años 60 como respuesta a la anarquía que
información redundante. La propuesta de una base de datos como concepto tecnológico
comenzó con las siguientes ideas:
Registrar los datos que son importantes para una organización y decidir el nivel de
prioridad de los mismos.
Organizarlos de manera correcta.
Colocarlos en un repositorio único, es decir, asignarle un nombre como Base de Datos.
Impedir que las aplicaciones externas accedan a los datos directamente, esto es, solo
podrán ser accesibles por medio de una conexión hacia dicha base, para esto SQL
como gestor de base de datos pondrá las reglas de juego para dicho acceso.
En este capítulo trataremos el manejo de información cuya fuente sea propiamente Ex-
cel, es decir, una hoja de Excel donde se encontrará toda la información que se necesita
consultar, copiar o eliminar.
Debemos contar con dos hojas en un libro de Excel, la primera debe contener los
datos de los clientes (Clientes), y la segunda, otra hoja (Distritos) con el código y des-
cripción del distrito.
Se debe implementar una función que permita validar el ingreso del código de cliente.
Implemente un botón Buscar el cual permita mostrar los datos del cliente en los
TextBox. Hay que tener en cuenta que en la lista de clientes no se
encuentra la descripción de los distritos; por tanto, la aplicación deberá buscar en la
hoja de distritos el código adecuado.
En la hoja de Excel (Clientes) los datos deben mostrarse de la siguiente manera:
La segunda hoja (Distritos) debe tener el siguiente aspecto, hay que tomar en cuenta
que se puede agregar los distritos que crea conveniente:
Código VBA:
Worksheets("Clientes").Activate
Range("A13").Select
Do
If ActiveCell.Value = codigo Then
lblCodigo.Caption = ActiveCell.Value
txtPersona.Text=ActiveCell.Offset(0,3).Value & Space(1) & _
ActiveCell.Offset(0, 1).Value & Space(1) & _
ActiveCell.Offset(0, 2).Value
txtDistrito.Text=muestraDistrito(ActiveCell.Offset(0,4).Value)
txtEdad.Text = ActiveCell.Offset(0, 5).Value
txtEmpleador.Text = ActiveCell.Offset(0, 6).Value
End If
ActiveCell.Offset(1, 0).Select
Loop While ActiveCell.Value <> ""
Range("A13").Select
Else
MsgBox "El error se encuentra en " & valida
End If
End Sub
Do
If ActiveCell.Value = codigo Then
muestraDistrito = ActiveCell.Offset(0, -1).Value
End If
ActiveCell.Offset(1, 0).Select
Loop While ActiveCell.Value <> ""
Worksheets("Clientes").Activate
End Function
Dim mensaje$
If Len(Trim(txtCodigo.Text)) = 0 Then
mensaje = "codigo del cliente"
txtCodigo.SetFocus
End If
valida = mensaje
End Function
Debemos contar con tres hojas en un libro de Excel, la primera debe contener los
datos de los clientes (Clientes), la segunda hoja con los datos de los distritos y sus
códigos, y la tercera hoja (Listado) con la información de los clientes según el dis-
trito seleccionado.
Implemente un botón Buscar, el cual permita mostrar los datos del cliente como
ListBox.
Implemente un botón Enviar a Excel, el cual permita enviar la información obtenida
ListBox y enviarlos a la hoja de Excel (Listado).
En la hoja de Excel (Clientes) los datos deben mostrarse de la siguiente manera:
La segunda hoja (Distritos) debe tener el siguiente aspecto, hay que tomar en cuenta
que se puede agregar los distritos que crea conveniente:
Código VBA:
Private Sub btnBuscar_Click()
Call limpiarListas
If valida = "" Then
Dim distrito$, codigoDistrito$
distrito = cboDistrito.Text
codigoDistrito = devuelveCodigo(distrito)
Worksheets("Clientes").Activate
Range("E13").Select
Do
If ActiveCell.Value = codigoDistrito Then
lstCodigo.AddItem ActiveCell.Offset(0, -4).Value
lstCliente.AddItem ActiveCell.Offset(0, -1).Value & _
Space(1) & ActiveCell.Offset(0, -3).Value & _
Space(1) & ActiveCell.Offset(0, -2).Value
lstDistrito.AddItem ActiveCell.Value
End If
ActiveCell.Offset(1, 0).Select
Loop While ActiveCell.Value <> ""
Range("E13").Select
Else
MsgBox "El error se encuentra en " & valida
End If
End Sub
Do
cboDistrito.AddItem ActiveCell.Value
ActiveCell.Offset(1, 0).Select
Loop While ActiveCell.Value <> ""
Worksheets("Clientes").Activate
End Sub
Do
If ActiveCell.Value = distrito Then
devuelveCodigo = ActiveCell.Offset(0, 1).Value
End If
ActiveCell.Offset(1, 0).Select
Loop While ActiveCell.Value <> ""
Worksheets("Clientes").Activate
End Function
Debemos contar con tres hojas en un libro de Excel, la primera debe contener los
datos de los clientes (Clientes), la segunda hoja con los datos de los distritos y la
tercera hoja (Listado) con la información de los clientes según la letra inicial de su
apellido paterno.
mostrar los datos del cliente como código, nombre completo y el nombre del distri-
ListBox.
Implemente un botón Enviar a Excel el cual permita enviar la información obteni-
ListBox y enviarlos a la hoja de Excel (Listado).
• En la hoja de Excel (Clientes) los datos deben mostrarse de la siguiente manera:
Aplicaciones VBA con Excel
302
La segunda hoja (Distritos) debe tener el siguiente aspecto, hay que tomar en cuenta
que se puede agregar los distritos que crea conveniente:
(Name) btnH
(Name) btnI
(Name) btnJ
(Name) btnK
(Name) btnT
(Name) btnV
(Name) btnY
Cap.8: Base de datos
305
Cancel True
Código VBA:
Dim Letra$
lstDistrito.AddItem muestraDistrito(ActiveCell.Offset(0,3).Value)
End If
ActiveCell.Offset(1, 0).Select
Loop While ActiveCell.Value <> ""
Range("B13").Select
End Sub
End Sub
Call limpiarListas
Letra = "T"
Call muestracliente("T")
End Sub
SELECT ListaCampos
[ FROM Tabla ]
[ WHERE Condición ]
[ GROUP BY ExpresionGrupo ]
[ HAVING CondicionBusqeuda ]
[ ORDER BY [ASC|DESC]]
Donde:
un Group By.
Order By ASC|DESC:
y DESC la descendencia.
Tabla: Clientes
Tabla: Detalle
Tabla: Facturas
Cap.8: Base de datos
311
Tabla: Producto
en la siguiente imagen:
Donde:
Debemos contar con una carpeta que contenga la base de datos de Access llama-
da Ventas.accdb y el propio archivo de Excel, de tal forma que tenga el siguiente
aspecto:
Agregue la referencia Microso AcveX Data Objects 2.7 Library al proyecto, des-
de el entorno VBA.
Implemente el siguiente modelo de hoja de Excel:
Cap.8: Base de datos
313
torno VBA:
'Variables globales
Dim cn As New ADODB.Connection
Agregue la referencia Microso AcveX Data Objects 2.7 Library al proyecto, desde
el entorno VBA.
Implemente el siguiente modelo de hoja de Excel:
'Variables globales
Dim cn As New ADODB.Connection
Donde:
Alias.* (asterisco): Representa a todos los registros de la tabla según su alias asignado.
NombreTabla Alias: Es el nombre de la tabla del cual queremos obtener información
Debemos contar con una carpeta que contenga la base de datos de Access llama-
da Ventas.accdb y el propio archivo de Excel, de tal forma que tenga el siguiente
aspecto:
Agregue la referencia Microso AcveX Data Objects 2.7 Library al proyecto, desde
el entorno VBA.
Implemente el siguiente modelo de hoja de Excel:
'Variables globales
Dim cn As New ADODB.Connection
Donde:
Debemos contar con una carpeta que contenga la base de datos de Access llama-
da Ventas.accdb y el propio archivo de Excel, de tal forma que tenga el siguiente
aspecto:
Agregue la referencia Microso AcveX Data Objects 2.7 Library al proyecto, des-
de el entorno VBA.
Implemente el siguiente modelo de hoja de Excel:
Aplicaciones VBA con Excel
318
'Variables globales
Dim cn As New ADODB.Connection
Donde:
Debemos contar con una carpeta que contenga la base de datos de Access llama-
da Ventas.accdb y el propio archivo de Excel, de tal forma que tenga el siguiente
aspecto:
Agregue la referencia Microso AcveX Data Objects 2.7 Library al proyecto, des-
de el entorno VBA.
Aplicaciones VBA con Excel
320
cn.Open
Debemos contar con una carpeta que contenga la base de datos de Access llama-
da Ventas.accdb y el propio archivo de Excel, de tal forma que tenga el siguiente
aspecto:
Aplicaciones VBA con Excel
322
Agregue la referencia Microso AcveX Data Objects 2.7 Library al proyecto, des-
de el entorno VBA.
Implemente el siguiente modelo de hoja de Excel:
'Variables globales
Dim cn As New ADODB.Connection
Worksheets(1).Cells(7, 2).CopyFromRecordset rs
rs.Close
cn.Close
End Sub
cn.Open
Donde:
TOP: Representa dos opciones, cuando es un valor numérico entero devolverá dicha
según el porcentaje solicitado.
Campo:
NombreTabla: Es el nombre de la tabla del cual queremos obtener información.
Debemos contar con una carpeta que contenga la base de datos de Access llama-
da Ventas.accdb y el propio archivo de Excel, de tal forma que tenga el siguiente
aspecto:
Agregue la referencia Microso AcveX Data Objects 2.7 Library al proyecto, desde
el entorno VBA.
Implemente el siguiente modelo de hoja de Excel:
'Variables globales
Dim cn As New ADODB.Connection
End Function
Donde:
DISTINCT:
Campo:
Debemos contar con una carpeta que contenga la base de datos de Access llama-
da Ventas.accdb y el propio archivo de Excel, de tal forma que tenga el siguiente
aspecto:
Agregue la referencia Microso AcveX Data Objects 2.7 Library al proyecto, des-
de el entorno VBA.
Implemente el siguiente modelo de hoja de Excel:
Cap.8: Base de datos
329
'Variables globales
Dim cn As New ADODB.Connection
código frmDiscnct.Show.
Aplicaciones VBA con Excel
330
Donde:
DISTINCT:
Campo:
Mostrar a todos los clientes que vivan en algún distrito cuyo contenido sea «Juan»,
Select * From clientes Where distrito LIKE ''
Mostrar a todos los clientes de los distritos que inicien con «San».
Select * From clientes Where distrito LIKE ''
Mostrar los productos cuya descripción empiece con «A», «D» o «J».
Select * From Producto Where descrip LIKE ''
Mostrar todos los productos cuya descripción esté en el rango de la «A» hasta la «J».
Select * From Producto Where descrip LIKE ''
Select * From Producto Where
Cap.8: Base de datos
331
Select GETDATE()
Select DAY(getDate())
Select MONTH(getDate())
Select
From Facturas F
INNER JOIN Detalle D
ON F.NumFact = D.NumFact
Debemos contar con una carpeta que contenga la base de datos de Access llamada
Ventas.accdb y el propio archivo de Excel, de tal forma que tenga el siguiente aspecto:
Agregue la referencia Microso AcveX Data Objects 2.7 Library al proyecto, desde
el entorno VBA.
Implemente el siguiente modelo de hoja de Excel:
'Variables globales
Dim cn As New ADODB.Connection
Worksheets(1).Cells(7, 2).CopyFromRecordset rs
rs.Close
cn.Close
End Sub
Debemos contar con una carpeta que contenga la base de datos de Access llamada
Ventas.accdb y el propio archivo de Excel, de tal forma que tenga el siguiente aspecto:
Agregue la referencia Microso AcveX Data Objects 2.7 Library al proyecto, desde
el entorno VBA.
Cap.8: Base de datos
335
'Variables globales
Dim cn As New ADODB.Connection
For i = 0 To lstCliente.ListCount - 1
Sheets(1).Cells(uFila + i, 2).Value = lstCodigo.List(i)
Sheets(1).Cells(uFila + i, 3).Value = lstCliente.List(i)
Sheets(1).Cells(uFila + i, 4).Value = lstDistrito.List(i)
Next
End Sub
Sub limpiarListas()
lstCliente.Clear
lstCodigo.Clear
lstDistrito.Clear
End Sub
Sub ListaClientes()
cn = getConecta()
cn.Open
Call limpiarListas
Dim rs As New ADODB.Recordset
rs.Open "Select codigo,nomcli,distrito from clientes", cn
Do While Not rs.EOF
lstCodigo.AddItem rs!codigo
lstCliente.AddItem rs!nomcli
lstDistrito.AddItem rs!distrito
rs.MoveNext
Loop
rs.Close
cn.Close
End Sub
Call ltra("V")
End Sub
Debemos contar con una carpeta que contenga las imágenes de los productos a
forma que tenga el siguiente aspecto:
Cap.8: Base de datos
339
ducto ya se encontraba registrado, se deberá mostrar sus datos en los demás contro-
Implemente el botón Agregar/Modicar
Excel.
Implemente el siguiente modelo de hoja de Excel:
Option Explicit
'Variables globales
Dim rutaImagen$
Sub limpiaControles()
Call generaCodigo
Call llenaProductos
txtPrecio.Text = ""
txtStock.Text = ""
cboDescripcion.SetFocus
Aplicaciones VBA con Excel
340
End Sub
If posProducto = 0 Then
Do While Not IsEmpty(ActiveCell)
ActiveCell.Offset(1, 0).Activate
Loop
Else
Cells(posProducto, 1).Select
End If
If posProducto = 0 Then
MsgBox "El producto no existe"
cboDescripcion.SetFocus
Exit Sub
End If
Dim r%
r = MsgBox("Está seguro de eliminar el producto?",
vbCritical + vbYesNo)
If r = 6 Then
Cells(posProducto, 1).Select
ActiveCell.EntireRow.Delete
limpiaControles
MsgBox "Producto eliminado correctamente..!"
cboDescripcion.SetFocus
End If
End Sub
imgFoto.Picture = LoadPicture(“”)
imgFoto.Picture = LoadPicture(ActiveCell.Offset(0, 4))
imgFoto.PictureSizeMode = fmPictureSizeModeStretch
rutaImagen = ActiveCell.Offset(0, 4)
Else
Call generaCodigo
txtPrecio.Text = ""
txtStock.Text = ""
rutaImagen = ""
imgFoto.Picture = LoadPicture("")
End If
End Sub
Sub llenaProductos()
cboDescripcion.Clear
Range("C11").Select
Do While Not IsEmpty(ActiveCell)
cboDescripcion.AddItem ActiveCell.Value
ActiveCell.Offset(1, 0).Select
Loop
End Sub
EDITORIAL