Guía de Macros VBA: Creación y Uso
Guía de Macros VBA: Creación y Uso
P á g i n a 1 | 106
7.13. Matrices en Una Dimensión ......…………...……..……………………..…….…....... 74
7.14. Matrices en Dos Dimensión ......…………...……..……………………….…….…..... 77
7.15. Ventana de Mensaje (MsgBox) ………….......…..……….…...……….…..…..…….. 78
7.16. LBound y UBound …………...........……..……..……...……..…………....….….….. 82
7.17. InputBox …………...........……..………..…...……..…………………….....….…….. 84
7.18. Call …………...........……………………….………...……………………...….…….. 85
7.19. End …………...........……………………….………...……………………...….…….. 87
7.20. Format ……...........……………………….………...……………………...………….. 90
7.21. WorksheetFunction ……...........……………………….……………….…...….…….. 92
7.22. Shell …………...........……..………………....……..…..…………………...….….….. 93
8. Temas Complementarios …...........……………………….…………………...….….….. 95
8.1. Sub y Function …………...........……..……..………...……..…….…….…..….…..….. 95
8.2. Control de Errores …………...........……..……..……...……..……..….…..….…..….. 96
8.3. Eventos …………...........……..…………...……………………….……..….….…..….. 98
8.4. Crear un Ícono de acceso directo a una Macros …………..................….….…..….. 102
8.5. Referencias Relativas …………...........................……………….………....…..…….. 103
8.6 Seguridad de Macros ………….............…………………….………………....….….. 104
8.7 Fecha y Hora con Macros ………….............……………….….…….……………….. 104
P á g i n a 2 | 106
1. El menú de Macros: Si no aparece el menú Desarrollador (con el que programamos con
Macros) en nuestro Excel, seguimos la siguiente ruta para activarlo:
P á g i n a 3 | 106
En el menú Desarrollador hay varias opciones, una de ellas es Visual Basic, donde podemos
colocar los códigos del lenguaje de programación:
P á g i n a 4 | 106
Una Macro hace que Excel realice tareas reiteradamente las veces que queramos, automatiza
los cálculos que deseemos que realice Excel, cada Macro tiene su base en el lenguaje de
programación Visual Basic, al entrar en su lenguaje podemos modificar nuestra Macro creada
según nuestra necesidad.
2. Método Básico para crear una Macro: El método más sencillo para crear una Macro es
utilizando el Grabador de Macros, el paso 01 es hacer clic en Grabar Macro:
Se nos pide que coloquemos uno nombre a nuestra Macro, una combinación de teclas para
ejecutarlo automáticamente, también elegir si sólo queremos que esta Macro funcione en este
libro de Excel, y por último un comentario sobre de que trata esta Macro:
Si guardamos una Macros en libro personal, siempre va a estar activa y disponible cuando
abramos cualquier libro de Excel:
P á g i n a 5 | 106
Ahora hacemos una serie de procedimientos con Excel que queremos que quede grabada en la
Macro, por ejemplo colocamos fórmulas en las celdas correspondientes a Volumen y Peso
para que realice los cálculos correspondientes:
Nos aparecerá una ventana con las Macros creadas, seleccionamos la que queremos utilizar, y
hacemos clic en Ejecutar:
P á g i n a 6 | 106
Y automáticamente se llenarán las celdas de Volumen y Peso con las fórmulas que hemos
colocado mientras la Macro se estaba grabando:
DESCRIPCION CANTIDAD LARGO ANCHO ALTO VOLUMEN PESO
ZAPATAS 6 1.00 1.00 0.40 2.40 5,760.00
COLUMNA 6 0.25 0.25 3.00 1.13 2,700.00
VIGA 7 3.50 0.25 0.30 1.84 4,410.00
TECHO 2 3.50 3.50 0.20 4.90 11,760.00
Ahora si hacemos clic en Opciones podemos modificar la Tecla de método abreviado para
dejarla en minúscula:
Ahora vamos a crear una Macro que borre todos los datos de las celdas correspondientes:
P á g i n a 7 | 106
Borramos todos los datos y detenemos la grabación, ahora cada vez que ejecutemos esa
Macros los datos que coloquemos entre las celdas D6 a I9 se van a borrar:
Ahora lo más importante, si queremos grabar un archivo de Excel con una Macro, no debemos
de hacerlo de la manera tradicional, sino con el siguiente Tipo de archivo:
P á g i n a 8 | 106
Todo lo que grabamos con una Macro genera un procedimiento en Visual Basic, la cual
podemos revisar con la siguiente ruta:
Para entender este lenguaje de programación se tiene que saber Visual Basic para
Aplicaciones, poco a poco vamos a ir aprendiendo más sobre este lenguaje.
Cada pestaña de la hoja de Excel puede tener su propia programación en Visual Basic, pero
cuando usamos la Grabadora de Macros se van creando unos Módulos donde se graba la
Macros creada en programación de Visual Basic:
P á g i n a 9 | 106
En el menú Herramientas, en Opciones…, en Formato del editor podemos elegir la Fuente y el
Tamaño del texto:
P á g i n a 10 | 106
Cuando antes de cada procedimiento está la sentencia Option Explicit, ésta nos ayuda a
que VBA nos obligue a declarar las variables para que no se nos olvide alguna. De este modo
se puede saber cuántas variables hay en el Procedimiento y de qué tipo.
Para no estar colocando ese código al comienzo de cada módulo, VBA lo puede colocar de
forma automática habilitando la siguiente opción del Editor:
Esta es una opción de Excel que nos obliga a declarar toda variable a utilizar en un
procedimiento, nos obliga literalmente, puesto que si no declaramos nuestra variable en el
procedimiento aparecerá un mensaje de error y dicho procedimiento no correrá.
Al programar es muy recomendable tener activa esta opción, porque al declarar nuestras
variables nos aseguramos de que VBA entienda con que tipos de variables estamos
trabajando sin necesidad de que VBA por defecto lo averigüe logrando mayor eficiencia en
nuestros procedimientos, haciéndolos más rápidos de correr y ahorrando espacios de
almacenamiento.
Cuando declaramos variables nos aparecerá una lista desplegable para poder elegir la más
adecuada:
P á g i n a 11 | 106
3. Método 01 para crear un Botón: La manera más sencilla de crear un botón es insertando
un cuadro de texto:
Para darle vida a este botón, le hacemos clic derecho y escogemos Asignar Macro…:
Le asignamos la Macro que queramos, en este caso la que calcula el volumen y el peso:
P á g i n a 12 | 106
De la misma manera también podemos crear más botones, uno para borrar los datos (para lo
cual ya hemos creado una Macro) y otro para Grabar Datos (el cual podemos editarlo):
Podemos guardar los datos en otra pestaña que llamaremos GUARDAR DATOS,
simplemente creamos una Macro donde copiamos los resultados de la Hoja 1 a la pestaña
GUARDAR DATOS:
P á g i n a 13 | 106
Grabamos y detenemos la Macro según el procedimiento realizado al inicio, y finalmente
asignamos nuestra nueva Macro al botón GRABAR DATOS:
También podemos crear un botón para que nos lleve a otra pestaña, es este caso a una pestaña
llamada VINCULO, con el menú Insertar y la opción formas podemos crear nuestro botón:
Para darle una mejor presentación podemos agregarle una imagen y agrupamos estos
elementos:
P á g i n a 14 | 106
Hacemos clic derecho al botón y escogemos Hipervínculo…:
Ahora realizaremos otro ejemplo, donde haremos que con un botón podamos almacenar la
información de una pestaña a otra, en la primera pestaña (que llamaremos FORMULARIO)
P á g i n a 15 | 106
armamos nuestro cuadro de datos, y a la celda de CÓDIGO le vamos a dar el siguiente
formato para que se vea mejor:
P á g i n a 16 | 106
También armaremos otra pestaña llamada DATOS:
P á g i n a 17 | 106
Con este tipo de botones podemos crear directamente una Macro (además de cambiarle el
nombre) o asignarle una Macro creada, simplemente hacemos clic en Grabar…, vamos a la
pestaña FORMULARIO y detenemos la grabación, con esto la Macro esta creada y el botón
nos llevará a la pestaña FORMULARIO:
Vamos a la pestaña DATOS, insertamos una fila en la fila número 6 (fila donde se irán
grabando los datos que ingresemos), luego de la pestaña FORMULARIO seleccionamos los
datos de las celdas desde CÓDIGO hasta GUIA (desde D4 a D13), copiamos, regresamos a la
pestaña DATOS, seleccionamos las celdas B6 a K6, con clic derecho escogemos Pegado
especial, valores y Transponer, con esto pegará los datos que estén en vertical en la pestaña
FORMULARIO, en forma horizontal en la pestaña DATOS, volvemos a la pestaña
FORMULARIO y paramos la Macro:
P á g i n a 18 | 106
La Macro ya se encuentra grabada, si hacemos clic en el botón GUARDAR de la pestaña
FORMULARIO la Macro se va a ejecutar, y se va a ir guardando la información
suministrada en la pestaña DATOS:
P á g i n a 19 | 106
Ahora si queremos que cada vez que guardamos un dato nos aparezca una ventana donde nos
diga: “Datos Grabados Correctamente” tenemos que entrar al lenguaje de programación de
nuestra Macro y colocamos casi al final el código que está encuadrado en rojo:
El código MsgBox hará que se habrá una ventana con un mensaje como se ve a continuación:
P á g i n a 20 | 106
Si queremos también que la pantalla no parpadee cuando ejecutemos la Macro (ya sea o no
con el botón), colocamos casi al inicio el código que está encuadrado en rojo:
P á g i n a 21 | 106
Pero si queremos que se muestre la pantalla completa al ejecutar la Macros colocamos en
código que se muestra en un rectángulo rojo (se ocultan los menús):
Si deseamos que los datos que se guarden en nuestra pestaña DATOS tenga un orden
determinado, primero vamos a crear otro botón que llamaremos GUARDAR 02 para este
ejemplo:
P á g i n a 22 | 106
Y segundo al realizar la Macro seguimos todos los pasos efectuados anteriormente con la
única diferencia que al llegar a la pestaña DATOS, como paso final, hacemos una selección de
todas las celdas donde se almacenarán los datos, vamos al menú Datos y escogemos la opción
Ordenar, y de ahí podemos hacer que se ordenen los datos ingresados y los que se van a
ingresar según la columna que nosotros deseemos, en este ejemplo se decidió ordenar los
datos según su código, de menor a mayor, y finalmente vamos a la pestaña FORMULARIO
donde detenemos la Macro:
4.2. Control de Número: Hay varios controles de formulario aparte del botón, como el
Control de número:
P á g i n a 23 | 106
Colocamos los valores mínimo y máximo que queremos que maneje nuestro control, y lo
vinculamos a la celda donde queremos que se muestren los datos (a la celda B23 se le dio el
mismo formato que a la celda del CÓDIGO):
Para probar podemos hacer el mismo formulario celdas abajo, donde lo podemos utilizar como
un buscados de los datos de la pestaña DATOS, solo con variar el código de la celda B23, los
datos de la celdas del Formulario de abajo (desde D29 a D37) van a cambiar (se debe de usar
la fórmula BUSCARV):
=BUSCARV(B23,DATOS!B5:K1000,2,FALSO)
También podemos vincular el Control a una Macro (podemos llamar Buscar) donde
realicemos la fórmula BUSCARV y realice el mismo procedimiento anterior (sería en esencia
lo mismo):
P á g i n a 24 | 106
4.3. Control de Cuadro Combinado: Un cuadro combinado nos muestra una lista
desplegable de datos:
P á g i n a 25 | 106
En Rango de entrada seleccionamos las celdas con los datos que queremos que aparezcan en
la lista desplegable, y en Vincular con la celda, escogemos la celda (en este caso H2) donde
queremos que aparezca el número que tiene relación con el orden de la lista desplegable:
Es decir si escogemos el primer elemento de la lista desplegable (en este caso cemento), en la
celda H2 aparecerá el número 1, si escogemos el segundo elemento (acero) aparecerá el
número 2, y así sucesivamente:
P á g i n a 26 | 106
Podemos enlazar diversas condiciones a esa celda o número para que Excel nos realice los
cálculos que deseemos.
Vamos a insertar un Control numérico (que ya conocemos):
Con ese control podemos hacer que varíe la cantidad de los materiales a requerir según
queramos, hacemos clic derecho, escogemos Formato de control:
P á g i n a 27 | 106
Colocamos un Valor mínimo y Valor máximo para las cantidades de los materiales, y en
incremento indicamos como queremos que varíen los valores que se van a mostrar (en este
caso variarán de uno en uno), y en Vincular con la celda escogemos la celda donde se
mostrarán estos valores:
Como nuestro nuevo control insertado, podemos indicar la cantidad deseada, claro que los
valores van a ir cambiando de uno en uno:
P á g i n a 28 | 106
4.4 Casilla de control: Este control sirve para realizar chequeos, y según ello que se cumplan
ciertas condiciones:
Y al hacer clic derecho al control y seleccionar Formato del objeto, en vincular con la celda
escogemos una donde queremos que se indique verdadero o falso según se haya o no
chequeado el control:
Haciendo un simple ejercicio podemos enlazar todos los controles colocados, con la fórmula
índice podemos hacer que aparezca automáticamente la unidad del material al enlazarla con la
celda H5 que depende del control combinado:
P á g i n a 29 | 106
Podemos hacer que al chequear la casilla de control nos diga SI o NO para aplicar un costo al
transporte a obra con la función Si:
4.5 Cuadro de Lista: Es similar al cuadro combinado, con la diferencia que en vez de
mostrarnos una lista desplegable, nos muestra un cuadro donde se encuentran todos los
elementos a enlistar:
P á g i n a 30 | 106
Una vez que lo insertamos, le hacemos clic derecho y escogemos Formato de control…:
En rango de entrada seleccionamos las celdas que queremos que aparezcan en la lista, en
Vincular con la celda indicamos donde queremos que aparezca el número de orden del
elemento que seleccionemos de la lista:
P á g i n a 31 | 106
Al igual que como hicimos con el cuadro combinado, podemos usar ese número para realizar
diversas operaciones con Excel:
4.6. Barra de Desplazamiento: Es similar al control numérico, sólo que además de contar
con una barra horizontal, para cambiar los valores hacemos clic en las flechas que se
encuentran a la izquierda y derecha de la barra:
P á g i n a 32 | 106
Colocamos un valor mínimo, valor máximo, un incremento y en Vincular con la celda
escogemos donde queremos que se muestre nuestro valor numérico:
4.7. Botón de Opción: Es similar a la casilla de control, sólo que en vez de hacer un check,
hacemos clic en unos círculos para escoger diferentes opciones:
P á g i n a 33 | 106
Tenemos que vincular nuestro botón con una celda, en este caso la A20:
SI vinculamos varias opciones a la celda A20, según el orden en que los enlacemos con la
celda A20, irán adquiriendo un número (en nuestro caso del 1 al 3), y como ejercicio podemos
colocar una función Si, para que en una celda determinada aparezca un texto según el valor
numérico de la celda que está enlazada con las opciones:
P á g i n a 34 | 106
5. Introducción a la Declaración de Variables y Objetos: Las variables en VBA son
utilizadas para guardar valores y su tipo dependerá de la clase de datos que deseamos guardar
dentro de ellas. Para programar con Macros o VBA (Visual Basic), es imprescindible aprender
a declarar las variables, es decir darles “vida”, en los códigos del siguiente lenguaje de
programación, se muestra una serie de variables declaradas que paso a explicar:
Con Public declaramos variables que son reconocidas por todos los módulos del libro de
trabajo activo (rectángulo verde) y se lo coloca siempre en la parte superior del módulo.
AMBITO DE VARIABLES - DECLARACION
AMBITO (Scope) DECLARACIÓN (Palabra Reservada)
A Nivel de Procedimiento Con las palabras reservadas Dim o Static dentro del procedimiento deseado.
A Nivel de Módulo Declara la variable Dim antes del primer procedimiento en el módulo.
En todo el proyecto Utilizando la palabra reservada Public antes del primer procedimiento en un módulo.
P á g i n a 36 | 106
Si queremos el “objeto” (puede ser un valor numérico o lo que sea que esté en esa celda) por
ejemplo de la celda D3 de la pestaña u hoja llamada “Libro1” del archivo de Excel llamado
“Ejemplo” usamos la siguiente expresión:
Application.Workbooks(“Ejemplo.xlsm”).Worksheets(“Libro1”).Range(“D3”).Value
Excel Application
Libros (Archivos) Workbook Workbooks
Hojas Worksheet Worksheets
Rangos Range
Si estamos en la hoja de programación (módulo) del archivo “Ejemplo.xlsm” y de la pestaña u
hoja llamado “Libro1”, solo será necesario escribir: Range(“D3”).
CELLS RANGE
Application.Cells(37,"G") Application.Range("G37")
Cells(37,"G") Range("G37")
Cells(37,7)
P á g i n a 37 | 106
6. Controles ActiveX
6.1. Botón de Comando: Los controles ActiveX se diferencian de los controles de formulario,
en que además trabajan siendo programados en Visual Basic, veamos el primer botón:
Le hacemos clic izquierdo y tenemos que programarlo en Visual Basic, en este caso haremos
que nos dé el resultado de la multiplicación de las celdas C19 * C21 en la celda C23:
P á g i n a 38 | 106
Cuando programamos un botón, empezamos con Private Sub y terminamos con End Sub, con
Dim declaramos los tipos de datos de los elementos que vamos a utilizar, son la base de
nuestra programación, son lo que usaremos para que el programa desarrolle los cálculos o
procedimientos deseados (según lo visto en el punto anterior).
Hemos declarado nuestras variables: Precio, Unidades y Total como Double, o sea como
números reales, luego damos a nuestras variables los valores de las celdas a multiplicar (C19 y
C21), y finalmente indicamos que en la celda C23 se coloque el resultado de la multiplicación.
6.2. Cuadro Combinado: Nos muestra una lista desplegable con una relación de elementos
previamente indicados:
P á g i n a 39 | 106
A diferencia del cuadro combinado de Controles de formulario, en vez de aparecernos un
número nos aparece el nombre del elemento seleccionado de la lista en la celda vinculada:
6.3. Creación de un Formulario: Los formularios sirven para ejecutar operaciones como el
registro, actualización, eliminación o procesamiento de los datos existentes en Excel, o como
una interfaz de usuario desde la que se pueden ejecutar macros previamente existentes en
Visual Basic, podemos crear uno desde la ventana de VBA (Visual Basic for Applications),
mediante el menú Insertar:
Nos aparecerá una ventana, a la cual podremos colocarle los controles que requiramos, ya sean
Etiquetas:
P á g i n a 40 | 106
Cuadros de texto:
En este caso llamados TextBox1, TextBox2, TextBox3, TextBox4, nombres que usaremos más
adelante para el lenguaje de programación:
P á g i n a 41 | 106
Casillas de chequeo (llamadas CheckBox1 y CheckBox2):
Botones de opciones:
P á g i n a 42 | 106
En Propiedades, en Font, podemos editar nuestro estilo de texto de nuestras Etiquetas:
Botones de comando:
P á g i n a 43 | 106
Cuadros combinados (llamado ComboBox1):
P á g i n a 44 | 106
Como ejemplo, haremos que los datos que llenemos en este formulario, sean almacenados en
una hoja de Excel, para ello en Excel damos formato a nuestra base de datos (donde se
almacenará lo que ingresemos en nuestro formulario), e ingresamos un botón para poder
llamar al formulario creado:
P á g i n a 45 | 106
Le hacemos clic izquierdo para hacer la programación en Visual, para que llame a nuestro
formulario creado llamado UserForm1, le colocamos el código Show:
Si lo dejamos así, el botón llamará al Formulario sin ningún problema, pero cuando aparezca
su ventana, no vamos a poder hacer clic o seleccionar ninguna celda de la hoja de Excel, para
que esto no ocurra, y podamos seleccionar las celdas de Excel al mismo tiempo que
trabajamos con el Formulario, colocamos la palabra False al final de nuestro código:
No olvidemos que para que los controles ActiveX puedan ser programados, tiene que estar
activado el Modo Diseño, cuando terminemos de programar lo desactivamos para que se
pueda dar funcionamiento a nuestro botón:
P á g i n a 46 | 106
Ahora vamos a programar los botones del formulario, hacemos clic en el botón BORRAR y
nos aparecerá la ventana de programación, hacemos que todos los Textbox y ComboBox sean
vacíos (solo colocando = ””):
Me es el objeto de control del formulario actual, es decir, para ejecutar una acción con el
formulario, en vez de colocar el nombre del formulario, llamado UserForm1, como se muestra
a continuación:
P á g i n a 47 | 106
Que también funciona, pero si ya estamos en ese formulario, en vez de colocar UserForm1,
colocamos simplemente Me.
Con todo lo indicado, todos los casilleros quedarán vacíos después de darle al botón
BORRAR, pero si queremos que después de presionar este botón, el cursor se ubique en la
primera casilla de texto (TextBox1), le aumentamos el código de programación que se
encuentra en rojo:
Para los datos que irán en nuestro cuadro combinado, en otra pestaña en Excel hacemos la lista
y administramos el nombre de la siguiente manera:
P á g i n a 48 | 106
P á g i n a 49 | 106
Esta lista de datos la colocamos al ComboBox1 colocando el siguiente código que se encuentra
enmarcado en rojo:
P á g i n a 50 | 106
También podemos colocar datos en nuestra lista desplegable de otra manera, sólo como
ejemplo crearemos otro formulario llamado UserForm2, donde pondremos sólo una lista
desplegable, hacemos doble clic en el formulario e ingresamos a su ventana donde ingresamos
el código mostrado, sin antes seleccionar de la casilla de la derecha (que se encuentra en un
rectángulo rojo) la opción Initialize, para que cuando ejecutemos el formulario, nuestro cuadro
combinada ya tenga los datos como se muestra en la siguiente figura:
Lista.AddItem “Tacna”: Lista es el nombre de nuestro cuadro combinado (puede ser cualquier
otro), y AddItem hará que se agreguen todos los datos que requiramos en nuestra lista.
Si queremos que en una determinada celda aparezca el nombre del departamento seleccionado,
podemos colocar por ejemplo el siguiente código:
Range(“A1”).Value = Lista.Value
Para finalizar este pequeño ejemplo, también podemos hacer que al iniciar el formulario
UserForm2 se muestre con un tamaño determinado, que lo hacemos incrementando el código
que se muestra en rectángulo azul:
P á g i n a 51 | 106
Con Width y Height determinamos el ancho y alto de nuestra ventana del formulario cuando
este se ejecute, y todo dentro de Initialize, apareciendo de la siguiente manera:
Ahora si queremos que el tamaño de la ventana de nuestro formulario sea igual al tamaño de la
ventana de Excel, simplemente modificamos nuestro código de la siguiente manera:
P á g i n a 52 | 106
Declaramos la variable que llamaremos xfil, que nos servirá para indicar la fila donde se
almacenarán los datos, la declaramos como As Integer (número entero), indicamos que la
celda activa será la B4, donde está la palabra CÓDIGO, que es la fila donde se encuentran los
títulos de los datos a almacenar.
Al indicar que xfil = ActiveCell.CurrentRegion.Rows.Count, primero se ubicará en la celda
activa (ActiveCell) que es la B4 (inicialmente), Current.Region es el rango rectangular de
celdas no en blanco que rodea la celda activa (celdas con datos), y al complementarlo con
Rows.Count nos sumará la cantidad de filas que tienen datos, entonces xfil será el número de
filas que tienen datos incluyendo la B4 que es la que contiene los títulos.
Con Offset colocamos coordenadas en (filas, columnas) para ubicar los datos a ingresar, al
decir (xfill, 0), estamos dando la coordenada de la fila xfill veces por debajo de la B4 que es la
que tiene los títulos, si es el primer valor a grabar, xfill valdrá uno (porque sólo contará la fila
4 que es donde están los títulos), lo que significaría que los datos se grabarían en la fila 5 (una
fila más debajo de la fila 4), si es el segundo valor a grabar, xfill valdrá dos (porque sólo
contará la fila 4 y 5 que es donde está el primer dato), entonces los datos se grabarían en la fila
6 (dos filas más debajo de la fila 4), y así sucesivamente se irán grabando los datos en las filas
vacías que se encuentren filas abajo, y la columna ”0” sería la primera columna donde
colocaremos nuestros datos, es decir la columna B, porque nuestra celda inicial o activa es la
B4, luego (xfill, 1) sería la columna C, (xfill, 2) la columna D, hasta que (xfill, 6) será la
columna H donde se almacenará el última dato correspondiente al PROVEEDOR.
P á g i n a 53 | 106
Estamos indicando que los datos que coloquemos en los TextBox se almacenen en las celdas
correspondientes tal como se explicó en el párrafo anterior, según como se ve en un rectángulo
rojo.
Al igual que usamos la función SI en Excel, en VBA usamos If, para indicar que si el
CheckBox1 (Perú / Departamento) está seleccionado, en la columna “5” o “G” se coloque
Perú, caso contrario Extranjero (en rectángulo verde).
Lo mismo hacemos con los OptionButtons correspondiente a las Ferreterías (ElseIf veremos
más adelante), para que en la columna “6”o “H” aparezca la Ferretería seleccionada (en
rectángulo azul).
Finalmente llamamos al formulario, llenamos los datos, seleccionamos GRABAR y los datos
se van a ir almacenando filas abajo.
En vez de CurrentRegion podemos usar también UsedRange, pero tienen ciertas diferencias,
las explicaremos con el siguiente ejemplo, tenemos la siguiente base de datos:
P á g i n a 54 | 106
Haremos la primera selección con CurrentRegion:
Vemos que solo selecciona el grupo de celdas con datos que están colindantes con la celda
activa indicada (A1:C4), en este caso la A1, ahora veremos que ocurre al usar UsedRange:
P á g i n a 55 | 106
Vemos que el rango de selección es mayor, A1:H10, selecciona un rango que abarca todas las
celdas con datos, seleccionando también las filas y columnas que se encuentran vacías, cosa
que no se puede hacer con CurrentRegion, que cuando encuentra filas o columnas vacías
termina su selección.
6.4 Imagen (Control ActiveX): Con este control podemos visualizar y manejar imágenes de
diversas maneras:
Nos vamos a ayudar con un cuadro combinado, a nuestra imagen insertada le hacemos clic
derecho, escogemos Propiedades y escogemos la opción que está en un rectángulo rojo:
P á g i n a 56 | 106
6.5. Más controles: Tenemos más controles ActiveX que podemos utilizar en Excel, veremos
como ejemplo un control para reproducir videos, seguimos la siguiente ruta:
Insertamos el control con dos botones más para el ejemplo, le hacemos clic derecho,
escogemos Propiedades y en URL colocamos la ubicación del video con su extensión .mp4
(en rectángulo rojo):
P á g i n a 57 | 106
Configuramos el botón PLAY con los siguientes códigos:
P á g i n a 58 | 106
7. Instrucciones y Códigos
7.1 With…End With: La estructura With en VBA nos permite ejecutar un conjunto de
instrucciones sin tener que volver a hacer referencia al mismo objeto, haciendo de alguna
manera los códigos más reducidos, veamos el siguiente ejemplo, se muestran las celdas
seleccionadas con un tipo y tamaño de letra, entraremos a VBA para modificar su formato:
Indicaremos que el tipo de letra sea Times New Roman, de tamaño 18 (Size), con negrita
(Bold), con cursiva (Italic) y subrayado (Underline), la columna B lo haremos con With (en
rectángulo rojo) y la columna D sin With (en rectángulo azul):
P á g i n a 59 | 106
Como se puede observar, de ambas formas dan los mismos resultados, la única diferencia es
que con With se simplifica un poco más el código o procedimiento.
7.2. ElseIf y Case: Hemos visto cómo funciona el código If, pero ahora veremos dos códigos
que son más prácticos especialmente cuando tenemos varias opciones o condiciones, estas son
ElseIf y Case, veremos su aplicación con un ejemplo de escoger imágenes, al cuadro de
imagen ingresado anteriormente, le colocamos el siguiente código de programación al cuadro
combinado que se muestra:
Primero definimos nuestras variables llamadas Dirección y productos como String (texto), a
Dirección la igualamos a la ubicación de donde se encuentran las imágenes que usaremos,
todas las imágenes tienen nombres que van desde el M1 al M11, por eso como dirección
copiamos: “D:\EJEMPLO MACRO\M”, dejamos sólo “M” sin número, el número lo
colocamos para cada condición de los ElseIf, colocando solo: Dirección & “7.jpg” por
ejemplo (es una manera de no hacer tan largo el lenguaje de programación con los nombres),
la variable productos será igual al valor de la celda D2 que es donde se vincularán los datos
escogidos del cuadro combinado.
Para comenzar colocamos un solo If y luego tantos ElseIf como condiciones tengamos, y cada
condición estará sujeta a un gráfico que será llamado con el código LoadPicture, y finalmente
End If.
A continuación se muestra el lenguaje de programación utilizando Case, al inicio siempre se
coloca Select Case (en esta caso es productos, la variable a comparar) y al final End Select,
cumpliendo la misma función que ElseIf.
P á g i n a 60 | 106
En el siguiente ejemplo usamos Case con una variable tipo Integer (entero), con el fin de
obtener en la celda I18 el material que corresponde a la orden de compra colocada en la celda
I16:
En este otro ejemplo usamos Case con una variable tipo String (texto), con el fin de obtener en
la celda I42 el código de obra que corresponde al material indicado en la celda I40:
P á g i n a 61 | 106
7.3 GoTo: Este código nos permite saltarnos líneas de lo programado cada vez que lo
coloquemos. Buscará en toda nuestra programación la palabra que coloquemos al costado del
GoTo y empezará a leer el código a partir de esa línea.
Haremos un ejemplo que nos dé como resultado los divisores de un número, insertamos un
botón de comando, y le ingresamos los códigos que se muestran a continuación:
P á g i n a 62 | 106
Explicamos los códigos nuevos:
Range(“H55:H80”).ClearContents: borra el contenido que se encuentre en esas celdas.
numero = Range(“J53”).Value: Valor del número del cual vamos a encontrar los divisores.
numero Mod divisor = 0: el resto de dividir el número entre en divisor es cero.
ubicacion = ubicacion + 1: es un contador que va aumentando la ubicación de la fila donde se
mostrará al divisor (partiendo de 55, porque es la celda H55 donde se mostrará al primer
divisor), con el fin de que los divisores aparezcan en una columna.
divisor = divisor + 1: es un contador que irá aumentando el valor de los divisores de uno en
uno partiendo de 1.
GoTo CalculandoDivisor: vuelve a iniciar la secuencia del código desde donde está la palabra
CalculandoDivisor (líneas arriba).
Tenemos dos If, si el primero se cumple, es decir si el divisor es menor al número del cual
queremos saber los divisores, entonces pasa al siguiente If, donde si se cumple que el resto de
la división es cero, entonces el divisor se graba en la celda H55 (si no se cumple solo aumenta
su valor en una unidad el divisor):
Range(“H” & ubicacion).Value = divisor
Luego, aumenta en una unidad nuestra ubicación, en una unidad nuestro divisor, y con GoTo
se vuelve a repetir el proceso (flecha roja), solo hasta que el divisor sea mayor al número, en
ese caso no se cumple el primer If, el programa salta al último End If (flecha verde) y se acaba
el bucle (el proceso).
7.4 For To: Con este código podemos hacer que una variable cambie su valor en un rango de
datos definidos, que al llegar al último valor del rango acaba el bucle, en el siguiente ejemplo
vamos a hacer que se nos muestre los números del uno al veinte en una diagonal formada por
celdas:
Hemos declarado nuestra variable “x”, que decimos que tomará valores del 1 al 20:
P á g i n a 63 | 106
For x = 1 To 20
E indicamos que celdas van a tener su valor correspondiente:
Cells(x, x).Value = x, es igual a decir: celda(1,1) = 1; cuando “x” vale 1, cuando vale 2 será
celda(2,2); el primer valor representa a las filas y el segundo a las columnas, lo que sería igual
a decir: celda(2,B).
Para finalizar colocamos Next.
También podemos realizar el ejemplo anterior de hallar los divisores, de una manera más
práctica y con una menor cantidad de códigos:
7.5. Step: Con Step podemos hacer que ciertos valores aumenten en una cantidad determinada
hasta que alcance un límite deseado, haremos el ejemplo de la diagonal pero haciendo que los
valores aumenten de 2 en 2:
P á g i n a 64 | 106
7.6. Exit For: Usando este código (tiene que estar escrito antes de Next) podemos salir de un
bucle del código For sin necesidad de que llegue al valor de To, veamos su aplicación en el
siguiente ejemplo, que cuando hagamos clic en el botón UBICAR, nos marcará con negrita el
CARGO según el orden de la celda G8 y el área indicado en la celda G10 (el cuadro
combinado está vinculado con la celda G10, no se la ve porque la está tapando):
P á g i n a 65 | 106
Range(“C” & i), Font.Bold = True: colocará en negrita la celda de la columna C que cumpla
la condición, el símbolo & hace que la Columna C se enlace con una fila, en este caso con la
fila “i” cuando obtenga un valor numérico.
For i = 5 To 16: comenzará con el número 5, debido que es la fila 5 donde empiezan los datos.
Si el primer If se cumple para al segundo If, sino pasa a Next y continúa el bucle.
Si el segundo If se cumple marca con negrita la celda indicada y pasa a Exit For, donde
termina el bucle y el programa, sino se cumple pasa al contador b = b + 1 y luego a Next para
seguir con el bucle.
Usando For podemos generar bucles más complejos para que el programa nos muestre
resultados deseados, como el ejemplo a continuación, con los códigos mostrados podemos
hacer que se vayan llenando celdas en columnas de 10 en 10 hasta llegar al número 200.
Como se puede ver se usan dos For To y dos Next, con lo aprendido anteriormente ya
podemos entender el funcionamiento del código mostrado.
7.7. For Each: Esta variación del código For, nos permite movernos a través de determinados
objetos, uno a la vez, ya sea celdas u hojas activas, veamos el siguiente ejemplo:
P á g i n a 66 | 106
Declaramos hoja como worksheet, es decir, un objeto tipo pestaña u hoja de Excel, al decir:
For Each hoja In ActiveWorkbook.Worksheets: Estamos ordenando al programa que vaya
recorriendo hoja por hoja que contiene el libro, para que lo vaya mostrando en una ventana
con el siguiente código:
MsgBox hoja.Name
Next hoja: Indica que regresa al ciclo For Each pero mostrando la siguiente hoja, el ciclo
termina cuando se muestren todas las hojas que contenga el libro.
Veamos ahora un ejemplo usando celdas, donde se colocará en negrita sólo las celdas
previamente seleccionadas que contengan texto:
P á g i n a 67 | 106
Range (“B2:B12”).Select: Con esto determinamos el rango de celdas determinado.
For Each Celda In Selection: Quiere decir que va a ir recorriendo por cada celda seleccionada,
en nuestro caso son las celdas B2:B12.
If Application.IsText(Celda) = False: Si es falso que la celda contiene texto, entonces solo se
cumple si la celda contiene un número, en ese caso:
Celda.Font.Bold = True: Coloca el número en negrita.
Celda.Interior.Color = vbRed = Pinta la celda de color rojo.
7.8. And: Este código efectúa lo mismo que la función “Y” en Excel, que muchas veces va
acompañada de la función “SI”, en VBA sería el código If, veamos un ejemplo, haremos que
de las celdas que seleccionemos en la columna B, según la edad que esté en la columna C, nos
aparezca en la columna D si la persona está o no en edad escolar:
P á g i n a 68 | 106
Declaramos Celda como Range (o rango) porque va a representar a un grupo de Celdas.
For Each Celda In Selection: Como vimos en el punto anterior, indica que el programa irá
recorriendo todas las celdas seleccionadas, una por una, una a la vez.
Celda.Offset (0, 1).Value: Como vimos anteriormente, con Offset nos podemos dirigir a unas
celdas (o espacios) de la seleccionada según la coordenada indicada, por ejemplo, si la celda
seleccionada es la B4, con (0, 1), le indicamos que se desplace “0” filas hacia abajo y “una”
columna a la derecha (fila, columna), lo cual nos llevaría a la celda C4.
Entonces si le indicamos (0, 2) nos llevará a la columna D.
Aquí se muestra la aplicación de And con If, sí el valor de la celda de la columna C es mayor e
igual a 7 y menor e igual que 17 nos efectuará lo siguiente:
Que quiere decir que en las celdas de la columna D aparecerá ese mensaje, pero sino se
cumple la condición aparecerá este otro mensaje:
7.9. While Wend: Este código puede ser más práctico de aplicar que For To, hagamos un
ejemplo como uno anterior, que cuando hagamos clic en el botón RESALTAR, nos marcará
con negrita el CARGO, el AREA y el SALARIO según la opción escogida del cuadro
combinado o lista desplegable, cuya valor se vincula con la celda G10:
P á g i n a 69 | 106
Expliquemos los códigos colocados:
f = 5: será nuestro contador, empieza con el número 5 debido a que es en la fila 5 donde
comienzan nuestros datos.
Range (“C5:E16”).Font.Bold = False: deja sin negrita las celdas desde C5 hasta E16 para
comenzar con el programa.
While Cells (f, 3).Value <> “”, indica una opción para continuar siempre y cuando la celda (f,
3) sea diferente (<>) a vacío, o sea que tenga datos, sino la celda no contiene datos termina el
programa; Cells (f, 3) indica la celda de la columna 3 que viene a ser la columna C y la fila f
(Cells(fila, columna)).
If Cells(f, 4).Value = area Then: Cells(f, 4) es igual a decir celda Df, el 4 representa a la cuarta
columna que vendría a ser la columna D.
Range(“C” & f & “:” & “E” & f).Font.Bold = True: Si la condición If se cumple, entonces
colocará las celdas en negrita desde Cf a Ef, como ya sabemos f es un contador que representa
a las filas.
f = f + 1: es un contador.
Wend hace que regrese el bucle a While mientras se sigan cumpliendo las condiciones.
7.10. Do While … Loop: Estos son otros códigos para generar bucles, con el siguiente
ejemplo explicaremos su funcionamiento, tenemos un cuadro donde se muestran las distancias
entre departamentos del Perú (datos ficticios), lo que queremos hacer es un programa para que
complete los datos faltantes, tal como si fuera un espejo:
P á g i n a 70 | 106
Para realizar ello escribimos los siguientes códigos de programación:
Sub VariableObjeto1()
Worksheets("Hoja1").Range("A1").Value = 200
Worksheets("Hoja1").Range("A1").Font.Bold = True
Worksheets("Hoja1").Range("A1").Font.Italic = True
Worksheets("Hoja1").Range("A1").Font.Size = 10
Worksheets("Hoja1").Range("A1").Font.Name = "Cambria"
End Sub
P á g i n a 71 | 106
Ejemplo de rutina simplificada con el uso de la variable objeto:
Sub VariableObjeto2()
Celda.Value = 200
Celda.Font.Bold = True
Celda.Font.Italic = True
Celda.Font.Size = 10
Celda.Font.Name = "Cambria"
End Sub
En nuestro objeto las variables objeto son tabla y referencia declaradas como Range, por eso
hemos usado Set para asignarles los valores de las celdas que se muestran en rectángulo rojo.
Usamos Set dos veces por que solo la segunda se encuentra dentro del bucle, la primera es
solo para tener valores iniciales.
tabla.Copy: hace una copia de los valores de las celdas de la variable tabla.
referencia.PasteSpecial Transpose:=True: hace la copia a las celdas de la referencia pero con
transponer, es decir, las celdas verticales de tabla las pega horizontalmente en las celdas de
referencia.
Al llegar a Loop nos regresa a Do While hasta que se cumpla la condición de f1 <= f2; todas
las iteraciones verificaremos que la tabla queda de la siguiente manera:
P á g i n a 72 | 106
7.11. Do … Loop While: Con estos códigos tenemos otra manera de realizar el mismo
ejemplo anterior:
Las sintaxis vistas en los puntos 5.9 y 5.10 son las siguientes:
While: Repite ha sta que la condición sea falsa, una vez sea falsa sa le del bucle.
Until: Repite ha sta que la condición sea Verdadera, una vez sea Verdadera sa le del bucle.
Application.CutCopyMode = False: borra los datos o elementos que se tengan grabados en el
portapapeles.
La secuencia lógica es igual al ejemplo anterior.
P á g i n a 73 | 106
7.12. Do Until … Loop: Ya hemos visto la sintaxis de estos códigos, con ellos realizaremos el
ejemplo de resaltar en negrita las filas indicadas:
Muchos de los códigos ya se explicaron anteriormente, así que sólo se expondrán los nuevos.
Appication.ScreenUpdating = False: evita el parpadeo de la pantalla.
Do Until Range (“D” & i).Value = “”: si es verdadero sale del bucle, termina el programa.
i = i + 1: es el contador para ir bajando de fila en fila (comenzando con la fila 5, i = 5).
La secuencia lógica ya la hemos visto anteriormente.
7.13. Matrices en una Dimensión: Este tipo de Matrices también llamadas vectores son
variables en Visual Basic para Aplicaciones que pueden contener más de un valor en distintos
"espacios en Memoria" en una dimensión, veamos el siguiente ejemplo:
Dim ElementosDelVector(6) As Integer
ElementosDelVector
ElementosDelVector(0) = 50 • Número de Elementos 0 50
ElementosDelVector(1) = 51 1 51
ElementosDelVector(2) = 52 2 52
ElementosDelVector(3) = 53 3 53
ElementosDelVector(4) = 54 4 54
ElementosDelVector(5) = 55 5 55
ElementosDelVector(6) = 56 6 56
P á g i n a 74 | 106
Este vector puede contener 7 elementos
La matriz mostrada llamada ElementosDelVector puede contener 7 elementos y se enumeran
de 0 a 6.
Cuando declaremos una matriz tenemos que colocar entre paréntesis el número de valores que
contendrá, si colocamos 6 como lo indicado líneas arriba, el vector va a contener 7 valores,
comenzando desde el cero por defecto y no desde el uno, veamos un ejemplo, queremos que
los elementos que se encuentran en las celdas B5:B11, se copien en las celdas B15:H15:
P á g i n a 75 | 106
Explicamos los códigos:
Dim vectores(6) As String: declaramos nuestra matriz como String (texto) con una capacidad
de almacenar 7 valores.
Dim x As Integer: Declaramos nuestro contador como número.
For x = 0 To 6: nuestro contador tomará valores de cero hasta seis.
Vectores(x) = Cells(5 + x, 2).Value: nuestra matriz irá tomando valores desde la fila 5 hacia
abajo (hasta la fila 11) en la columna 2 o B.
Cells(15, 2 + x).Value = vectores(x): Las celdas irán tomando los valores de la matriz a
medida que estos vayan cambiando, dichas celdas serán de la fila 15 y comenzarán en la
columna 2 o B hasta la 8 o H.
El funcionamiento de los códigos For Next ya lo conocemos, y acabará el bucle cuando “x”
sea igual a 6.
Hemos visto que primer vector por defecto comienza con base cero, pero podemos cambiar la
base de nuestro vector, por ejemplo podemos ponerle base 1 solo colocando el siguiente
código al inicio:
Option Base 1
También para que la Matriz siga teniendo 7 valores colocamos Vectores(7) en vez de
Vectores(6), y “x” tomará valores de 1 a 7:
Si no queremos definir una base de antemano, podemos comenzar con la base que deseemos
declarando nuestra matriz de la siguiente manera:
Dim vectores(1 To 7) As String
Y nuestro código quedaría de la siguiente manera:
P á g i n a 76 | 106
7.14. Matrices en Dos Dimensiones: Al igual que las de una dimensión, este tipo de Matrices
pueden contener más de un valor en distintos "espacios en Memoria" pero en dos dimensiones,
en el siguiente ejemplo veremos cómo se almacena la información:
Dim Matriz(2, 3) As Integer: Declaramos nuestra matriz bidimensional como números enteros
para este ejemplo, también podemos declararla como String si queremos almacenar textos, al
decir (2, 3) podemos considerarlo como si 2 fuera el número de columnas y 3 el número de
P á g i n a 77 | 106
filas, aunque también puede ser al revés, lo importante es la cantidad de datos que se pueda
almacenar, en este caso con dos tenemos 0, 1 y 2, tres (3) espacios en una dimensión, y con
tres tenemos 0, 1, 2 y 3, cuatro (4) espacios en la otra dimensión, en total tendríamos 3 x 4 =
12 datos para almacenar.
Finalmente hemos utilizado el ciclo For para colocar estos datos en celdas.
Hemos visto que el cero también se cuenta como fila y/o columna, pero también podemos
hacer que sólo cuente desde el uno o desde cualquier número que queramos de la siguiente
manera:
Pero la diferencia es que tenemos menos capacidad para almacenar datos (seis datos).
7.15. Ventana de Mensaje (MsgBox): Con este código, VBA hará que nos aparezca una
ventana con un mensaje y opciones, veamos algunos ejemplos de aplicación.
Si queremos que nos muestre una ventana con un mensaje a una hora determinada:
P á g i n a 78 | 106
Application.OnTime TimeValue(“10:05:00”), “AVISO”: nos indica la hora en que se iniciará
el procedimiento AVISO (que es el que contiene el mensaje).
MsgBox “Es un mensaje como ejemplo”: con este código nos aparecerá a la hora indicada la
ventana con el aviso que está entre comillas, pero antes tenemos que ejecutar el procedimiento
Sub reunión () con el botón , o sino no se ejecutará:
Si queremos editar esta ventana lo podemos hacer con los siguientes códigos:
P á g i n a 79 | 106
Con Buttons podemos elegir de entre una variedad de botones, en este caso elegimos
vbOKOnly (que sería el botón Aceptar):
Solo con “+” agregamos más botones, en este caso adicionamos el vbInformation:
P á g i n a 80 | 106
Otra manera sería la siguiente:
El programa se ejecutará en la hoja activa, la celda B26 empezaba con el valor 26 y la celda
B25 con el valor 1.
Entonces:
Quiere decir que la celda C26 (26 es el valor de B26) tendrá el valor de: CORRECTO1 (1 es
el valor de B25).
Luego según los contadores mostrados en el rectángulo rojo, las celdas B25 y B26 aumentarán
de uno en uno, cada vez que se presione el botón Sí.
P á g i n a 81 | 106
Quedando las celdas con los valores mostrados en el rectángulo azul (se presionó el botón Sí
seis veces), termina cuando se presione el botón No.
Para la ventana siguiente colocamos un código donde la ventana desaparecerá sólo cuando
hagamos clic en No:
A la variable declarada escoger le damos el código de un mensaje con un texto (prompt) y dos
botones (vbYesNo), y un título (Title); con el código Do … Loop Until, le estamos indicando
al programa que termine el bucle cuando se cumpla la condición: escoger = vbNo, es decir
cuando hagamos clic en No.
7.16. LBound y UBound: Estos códigos nos dan como resultados los límites inferiores y
superiores de un vector o matriz respectivamente, haremos un ejemplo donde nos aparezca un
mensaje indicando el límite inferior, superior y número de elementos de un vector:
P á g i n a 82 | 106
La segunda ventana mostrada es la continuación de la primera.
Como ya conocemos declaramos nuestro vector, declaramos “mensaje” como String (texto)
que es la variable que almacenará el mensaje a mostrar, y “x” lo declaramos como Integer
(número) que será nuestro contador.
For x = LBound (vectores) To UBound (vectores): x va a tomar los valores desde el límite
inferior hasta el límite superior del vector.
vectores(x) = x: nuestro vector va a ir tomando los valores de “x”, hasta que acabe el bucle, es
decir:
vectores(1) = 1
vectores(2) = 2
vectores(3) = 3
vectores(4) = 4
vectores(5) = 5
vectores(6) = 6
vectores(7) = 7
En la variable mensaje indicamos el texto del límite inferior, superior y número de elementos,
con LBound(vectores) nos da el límite inferior y con UBound(vectores) nos da el límite
superior.
WorksheetFunction.Count(vectores): cuenta la cantidad de elementos del vector.
El código vbCrLf hace que la siguiente información del mensaje aparezca en la siguiente línea,
en una línea inferior, como si se presionar enter.
MsgBox mensaje: el código MsgBox hace que nos aparezca una ventana con el mensaje
almacenado en la variable “mensaje”.
P á g i n a 83 | 106
7.17. InputBox: Podemos hacer que aparezca una ventana con un mensaje y un casillero en
blanco para colocar un dato solicitado, y que este quede registrado en una celda determinada:
P á g i n a 84 | 106
7.18. Call: Esta instrucción nos permite ejecutar una macro desde otra macro, es decir, llamar
una macro desde otro procedimiento (Sub o Function).
P á g i n a 85 | 106
El procedimiento que se encuentra en un rectángulo azul tiene dos argumentos entre sus
paréntesis, el dato1 y dato2, quiere decir que son 02 los valores que puede recibir el
procedimiento, adicional a eso hay un mensaje que nos mostrará la diferencia o resta entre los
argumentos.
Tal como está ese procedimiento no podría funcionar porque necesita que se le ingresen los
valores, para eso se ha creado el procedimiento que está en un rectángulo rojo, el
procedimiento Llamar_resta tiene declarado 02 variables como Integer (número enteros), que
van a tomar valores de dos InputBox, el detalle está que al llamar al procedimiento resta (en
rectángulo verde) tenemos que colocar entre los paréntesis los valores o las variables con los
valores que tomarán dato1 y dato 2, según se indican con las flechas de la siguiente figura:
En ese orden, dato1 toma el valor de d1 y dato2 toma el valor de d2, y se ejecuta el
procedimiento resta como estaba previsto, mostrando lo siguiente:
P á g i n a 86 | 106
Finalmente nos muestra la diferencia de 25 – 18 = 7, es verdad que todo se pudo hacer dentro
del procedimiento llamado Llamar_resta, pero en un procedimiento más complejo, donde se
tenga que llamar a varios diferentes procedimientos, con Call tenemos una manera de unir
como se dice todas las piezas de un bloque, para no tener un solo procedimiento demasiado
largo, y que pueda ser también más complicado detectar el error.
7.19. End: Este código es muy usado cuando se requiere seleccionar un grupo determinado de
celdas, teniendo las siguientes variaciones:
P á g i n a 87 | 106
Con , estamos seleccionando para copiar el rango
desde B2 hasta has la última celda con información partiendo desde B2, lo que sería la celda
B9, seleccionando de esta manera el rango B2:B9.
Si hubiésemos usado Current.Region en vez de End también hubiera copiado la palabra
PAISES, pero no era lo que se quería, sólo queríamos copiar lo que se encuentra hacia abajo
de la celda B2; vemos también que las celdas B12 y B13 no se han copiado, y es porque las
celdas B10 y B11 se encuentran vacías, para copiar las últimas celdas podemos hacer lo
siguiente:
P á g i n a 88 | 106
Con End(xlUp) estamos seleccionando la primera celda que encontremos que contenga
información partiendo desde la celda B100000 hacia arriba, que sería la celda B13, de ahí la
selección se completa hasta la celda B2, sin tocar la cela B1 con la palabra PAISES, que era lo
que buscábamos; ahora si queremos cortar los valores que se encuentran desde la celda B2,
simplemente colocamos Cut en vez de Copy.
Ahora si solo queremos seleccionar el rango de celdas indicados, colocamos Select en vez de
Copy, pero ya no colocaríamos Range(“E2”), porque no estamos copiando nada a esa celda,
sólo estamos seleccionándolas:
Podemos hacer una variación del ejemplo anterior de seleccionar rangos usando el código
Offset, para ello mostraremos dos procedimientos para una mejor explicación:
El del rectángulo rojo selecciona la primera celda con datos que encuentra partiendo desde la
celda B100000 hacia arriba, que sería la celda B17, pero con Offset movemos la selección una
celda a la derecha y otra hacia abajo, quedando en la celda C18.
P á g i n a 89 | 106
El del rectángulo azul selecciona el
rango de celdas tomando como
primera celda seleccionada, la que
encuentre con datos partiendo desde la
celda B100000 hacia arriba, que sería
la celda B18, hasta la celda B2, pero
con Offset incrementamos la
selección en cero filas hacia abajo y
una columna a la derecha, quedando
el rango comoB2:C18.
7.20. Format: Con esta función damos un formato determinado al valor que se encuentra en
una celda, veamos algunos ejemplos:
1. Para número:
General number: Muestra un número sin separador de miles y con todos los decimales.
Currency: Muestra y redondea a dos dígitos a la derecha de decimal, en formato de moneda
utilizando el símbolo de moneda definido en el panel de control.
Scientific: Muestra el número en notación científica.
Percent: Muestra el valor en términos porcentuales (multiplicado por 100) y con 2 dígitos a la
derecha del decimal.
Standard: Muestra el número y redondea a dos dígitos a la derecha de decimal.
Veamos un ejemplo:
P á g i n a 90 | 106
Con los 03 códigos finales tenemos algo parecido:
FormatCurrency: Muestra el valor en formato de moneda, pero al colocarle 4 al final nos
redondea el valor a 04 decimales.
FormatNumber: Muestra el valor en formato de número, pero aunque le coloquemos 3 al final
nos redondea el valor a 02 decimales, si colocamos 1 será a un decimal.
FormatPercent: Muestra el valor en formato de porcentaje, pero al colocarle “0” al final nos
redondea el valor a cero decimales.
2. Para fecha:
Long Date: Permite obtener la fecha en formato completo.
Medium Date: Permite obtener la fecha en un formato más corto.
D: Permite obtener el número del día.
Short date: fecha en formato corto.
Long time: permite obtener la hora actual en formato completo.
Short time: permite obtener la hora en formato corto.
Veamos algunos ejemplos:
P á g i n a 91 | 106
7.21. WorksheetFunction: Esta función tiene la finalidad de emplear casi todas las funciones
que trae incorporadas Excel, y permite poder llamar a las funciones desde Visual Basic, hay
que tener en cuenta que el nombre de las mismas es similar a los nombres de las funciones en
Excel en inglés, cada una de estas funciones a ser empleadas por medio de WorksheetFunction
son métodos.
Veámoslo con un ejemplo, en la columna B tenemos una serie de valores, queremos que en la
columna E se muestren la suma, el promedio, el máximo, mínimo, la cantidad y que el número
de la celda E37 sea reemplazado por el número 777, todo eso lo haremos haciendo uso de los
WorksheetFunction:
FormatNumber: Hacemos que cada valor obtenido tenga un formato número y con 02
decimales.
Application.WorksheetFunction.Sum: Función encargada de realizar la suma.
P á g i n a 92 | 106
Application.WorksheetFunction.Average: Función encargada de realizar el promedio.
Application.WorksheetFunction.Max: Función encargada de encontrar el máximo número.
Application.WorksheetFunction.Min: Función encargada de encontrar el número mínimo.
Application.WorksheetFunction.Count: Función encargada de contar la cantidad de números.
Application.WorksheetFunction.Replace: Función encargada de realizar el reemplazo de
números.
Range(“B:B”): Con este código estamos seleccionando toda la columna B, para trabajar con
todos los valores de la columna B, aunque sólo era necesario usar los valores de las celdas
B32:B38, pero a modo de ejemplo se usó toda la columna.
(REP, 37, 5, “777”): Código usado para indicar que el valor de la celda de la fila 37 y de la
quinta columna, o sea la columna E, va a ser reemplazado por 777.
7.22. Shell: A través de una Macros podemos hacer que se abran otro tipo de archivos, como
por ejemplo de Word:
P á g i n a 93 | 106
Con la función Shell también podemos abrir diversos programas e incluso abrir archivos
creados en dichos programas.
Por ejemplo si queremos abrir un documento de Word en el que hayamos estado trabajando,
primero colocamos la ubicación del ejecutable .exe y luego la ubicación del archivo, eso sí, si
queremos abrir un archivo en Word el ejecutable también tiene que ser de Word, y lo mismo
ocurre con Excel y otros programas:
Ubicación del
ejecutable
P á g i n a 94 | 106
Pero sólo podremos abrir los archivo que sean del mismo tipo que el ejecutable .exe.
8. Temas Complementarios
8.1. Sub y Function: Ya hemos trabajado con el procedimiento Sub, ahora conoceremos
también el procedimiento Function, para ellos veremos algunas semejanzas y diferencias.
Semejanzas:
Ambos son procedimientos (conjunto de instrucciones de VBA).
Pueden recibir argumentos.
Pueden ser llamados desde un procedimiento Sub.
Diferencias:
Un procedimiento Sub no retorna valor alguno, mientras que un procedimiento
Function si lo hace.
Un procedimiento Sub inicia con la sentencia SUB seguida del nombre del
procedimiento y finaliza con END SUB, pero un procedimiento Function inicia con
la sentencia FUNCTION seguida del nombre del procedimiento y finaliza con
END FUNCTION.
Un procedimiento Sub puede ser creado desde la grabadora de macros; un
procedimiento Function no.
Veamos el siguiente ejemplo primero con 02 procedimientos Sub, uno llama al otro con la
instrucción Call para mostrarnos el resultado de la operación mostrada en una ventana:
Colocamos Dim Peso As Integer al inicio, parar que esa variable sea declarada para nuestros
dos procedimientos Sub, y no tengamos que declararlos a un procedimiento y luego al otro.
Ahora veamos el mismo ejemplo pero con un procedimiento Sub y uno Function:
P á g i n a 95 | 106
Nos da el mismo resultado pero hay ligeras diferencias en los procedimientos, con Function
aparte de colocar los argumentos al inicio entre paréntesis, tenemos que declarar la misma
Function como un determinado tipo de dato, que en este caso es un Double (en un rectángulo
rojo), por eso no es necesario declarar el nombre de la Function después, con el
procedimiento Sub que se muestra llamamos a la Function colocando los valores para sus
argumentos, y así nos aparezca el resultado en una ventana.
8.2. Control de Errores: Durante nuestro aprendizaje de VBA, seguro que nos han aparecido
algunos mensajes como el siguiente:
Es un mensaje de error, ya sea por un error de programación o por otro tipo de errores que no
necesariamente indican que algún código esté mal escrito o algo similar, sino que se debe a
otras razones como la que veremos a continuación con el siguiente procedimiento:
P á g i n a 96 | 106
Este procedimiento sólo acepta números porque fue declarado como Integer, y los coloca en la
celda B22, pero que pasaría si colocamos un texto?:
Vemos que aparece un error, porque hemos colocado un texto, para que acepte texto tenemos
que declarar la variable como String, de esa manera si colocamos un texto (hasta un número)
ya no nos aparecería el mensaje de error que hemos visto, pero para que no muestre el error
pensaremos en otra solución sólo con fines didácticos, modificaremos el procedimiento para
que nos muestre un mensaje indicando que se tiene que ingresar un número, y no un texto:
P á g i n a 97 | 106
Con On Error GoTo hacemos que el procedimiento salte hasta la etiqueta saltar si es que
ocurre un error (como se indica con la flecha roja), pero si ingresamos un número el
procedimiento llega hasta Exit Sub con lo que acabará el mismo, sin necesidad de pasar por la
etiqueta saltar para llegar a End Sub y finalizar el procedimiento, de esta manera evitamos que
salga el mensaje de error.
8.3. Eventos: En ejemplos anteriores hemos visto sobre la aplicación de algunos eventos, pero
sin dar una mayor explicación de los mismos, un evento es toda acción que puede ser
reconocida por un objeto, como puede ser el clic del mouse o la pulsación de una tecla, y para
la que es posible escribir un código como respuesta.
Uno de los primeros eventos que se aprende de forma sencilla es el uso de un botón, cuando se
presiona un botón ocurre un evento (un suceso) que puede ser controlado desde una macro,
hay otros eventos como por ejemplo la apertura de un archivo, el cierre de un archivo, la
selección de un elemento en una lista, etc.
Para una hoja de Excel o Worksheet podemos tener varios eventos, como se muestra en la lista
desplegable de la derecha:
Para cada evento podemos colocar una instrucción, en los siguientes procedimientos aparecerá
el mensaje “Funcionó el evento” si se cumple el evento:
P á g i n a 98 | 106
El mensaje aparecerá si ocurren los siguientes eventos:
Activate: Hacer clic a la pestaña de la hoja donde se creó el evento.
BeforeDoubleClick: Al hacer doble clic en cualquier celda de la hoja.
BeforeRightClick: Al hacer clic derecho en cualquier celda de la hoja.
Calculate: Al realizar un cálculo en cualquier celda de la hoja.
SelectionChange: Al cambiar de celda en la hoja.
Veamos algunos ejemplos, con Open podemos hacer que aparezca un mensaje cuando se abra
el archivo:
P á g i n a 99 | 106
Con BeforeClose podemos hacer que aparezca un mensaje cuando cerremos un archivo de
Excel:
Con AfterSave podemos hacer que aparezca un mensaje cuando guardar el archivo:
Con NewSheet podemos hacer que aparezca un mensaje cada vez que creemos una pestaña u
hoja nueva:
Los UserForm o formularios también tienen evento que son los que se muestran en la lista
desplegable de la derecha:
P á g i n a 100 | 106
Por ejemplo con DblClick podemos hacer que aparezca un mensaje al hacer doble clic sobre la
ventana del formulario:
Con Click podemos hacer que aparezca un mensaje al hacer clic sobre la ventana del
formulario:
Los botones también tienen sus propios eventos, como los que se muestran en la lista
desplegable de la ventana de la derecha:
P á g i n a 101 | 106
El más conocido es Click, cuando hacemos un clic al botón para que se ejecute, comentemos
algunos otros:
DblClick: hay que hacer doble clic al botón.
KeyPress: si hacemos clic al botón y luego presionamos cualquier tecla se ejecutará el evento.
MouseMove: sólo hay que mover el ratón sobre el botón para que se ejecute.
GotFocus: Por ejemplo si vamos a la pestaña donde se encuentra el botón, se ejecutará el
evento (como si estuviéramos enfocándonos en el botón).
LostFocus: Por ejemplo si salimos de la pestaña donde se encuentra el botón, se ejecutará el
evento (como si estuviéramos desenfocándonos del botón).
8.4. Crear un Ícono de acceso directo a una Macros: Si queremos tener la aplicación de una
Macro a la mano, lo mejor puede ser crearle un botón de acceso directo, lo podemos hacer
siguiendo la siguiente ruta:
P á g i n a 102 | 106
Le escogemos el ícono para el botón que deseemos:
8.5. Referencias Relativas: Cuando tengamos activada la opción “Usar referencias relativas”
hay que tener en cuenta la siguiente:
P á g i n a 103 | 106
8.6. Seguridad de Macros: Al activar esta opción nos aparecerá una serie de alternativas para
configurar la seguridad de la macro:
8.7. Fecha y Hora con Macros: Veremos algunas maneras de poder ver la fecha y hora con
Macros, colocando los siguientes códigos a un botón:
P á g i n a 104 | 106
MsgBox Now: Nos aparecerá un mensaje con la fecha y hora actual según la que esté
registrada en nuestro computador.
ActiveCell.Value = Now: En la celda que este activa en ese momento aparecerá la fecha y hora
actual según la que esté registrada en nuestro computador.
Now: Es un código que nos mostrará la fecha y hora actual según la que esté registrada en
nuestro computador, es igual que la función AHORA en Excel.
Ahora haremos un reloj en Excel siguiendo los siguientes pasos:
P á g i n a 105 | 106
Application.Workbooks(“Reloj.xlsm“).Worksheets(“Reloj”).Range(“B6”).Formula =
(“=Now ()”): Tenemos que colocar toda la ruta de la celda, para evitar que este procedimiento
se ejecute en otro libro activo, nuestro libro y hoja para este caso se llaman Reloj, con Now
cada vez que se corra el programa en la celda B6 aparecerá la fecha y hora actual según la que
esté registrada en nuestro computador.
Application.OnTime Now + TimeValue(“00:00:01”), “hora”: se actualizará cada segundo el
procedimiento llamado “hora” (que es el que coloca la fecha y la hora en la celda B6)
automáticamente, al cambiar o actualizarse B6 también se actualiza B8 (que es la que nos
interesa) porque están enlazadas (la diferencia es que en B6 se muestra también la fecha).
Ahora, para que este procedimiento se active cada vez que abramos el archivo, tenemos que
colocar el siguiente evento en el Workbook:
Para darle una mejor presentación, podemos insertar una imagen a la cual enlazamos con la
celda que tiene la hora (B8), y está aparecerá en la imagen como se ve a continuación:
Se vende auto marca Hyundai Grand i10, gasolinero, del año 2018, un año y medio de
antigüedad, con solo 16,000 km de recorrido, es hatchback, de transmisión mecánica.
El auto se encuentra en perfectas condiciones, con sus mantenimientos respectivos.
Sus asientos se encuentran protegidos con sus forros.
Comunicarse con los números: 971630873 / 949485557
P á g i n a 106 | 106