Vista previa del material en texto
Capítulo
Programación con VBA
En este capítulo trataremos:
Programación con Visual Basic
SENATI-Computación e Informática 159
Microsoft Office
Excel 2007
Introducción al Visual Basic
Microsoft VBA (Visual Basic for Applications) es el lenguaje de macros de Microsoft
Visual Basic y viene integrado en aplicaciones de Microsoft Office, como Word, Excel
y Access, Powerpoint y Visio. VBA permite acceder a las
funcionalidades de un lenguaje orientado a eventos con acceso a
la API de Windows.
La utilidad de VBA es automatizar tareas cotidianas, el programa
generado sólo se puede compilar con el documento, hoja o base
de datos en que fue creado
Visual Basic es una herramienta de diseño de aplicaciones para
Windows, en la que estas se desarrollan en una gran parte a partir del diseño de una
interface gráfica. En una aplicación Visual Basic, el programa está formado por una
parte de código puro, y otras partes asociadas a los objetos que forman la interface
gráfica.
Objetos
Procedimientos
Código
Es por tanto un término medio entre la programación tradicional, formada por una
sucesión lineal de código estructurado, y la programación orientada a objetos.
Combina ambas tendencias. Ya que no podemos decir que Visual Basic
pertenezca por completo a uno de esos dos tipos de programación, debemos
inventar una palabra que la defina: PROGRAMACION VISUAL.
Pasos para la creación de un programa en VBA
La creación de un programa bajo Visual Basic lleva los siguientes pasos:
Análisis, planteamiento lógico de la solución del problema, diagrama de flujo,
diseño del formulario, programa.
160 SENATI-Computación e Informática
ción con VBA
Análisis
En esta etapa se construye un modelo del problema extraído del mundo real
especificando los elementos que alimentan el proceso (especificaciones de
entrada), los elementos que se espera produzca el proceso (especificaciones de
salida) y se define lo mejor posible al problema en sí mismo.
Para poder definir bien un problema es conveniente responder a las siguientes
preguntas
1. ¿Qué es lo que me pide que realice el problema?
2. ¿Qué datos se requieren ingresar, analice el tipo de dato que necesita
(numérico, texto, fecha, hora, …) y su valor inicial?
3. ¿Qué resultado desea hallar, cálculos, reportes, consultas, analice el
tipo de dato?
4. ¿Qué método puedo utilizar para encontrar este resultado?
Requerimientos del análisis del problema:
Análisis del
problema
Definición
del
problema
Definir
datos de
entrada
Definir
datos de
salida
Planteamiento lógico de la solución del problema.
El planteamiento lógico de basa en la idea que uno tiene para resolver el
problema, basado en un modelo matemático o secuencia de procesos (leer
datos, registrar datos, consultar datos, reportar datos, … etc.).
Diagrama de flujo
Es una herramienta que permite plantear una solución lógica a un problema de
computadoras.
Diseño del formulario
Es la interfaz de comunicación hombre máquina, tanto para salida de datos
como para entrada.
Programa
El programa está distribuido en: Las propiedades de los controles, los
procedimientos (Eventos Click, keypress, etc.)
SENATI-Computación e Informática 161
Microsoft Office
Excel 2007
Fundamentos de programación VBA
Los algoritmos se estructuran de diversas formas, en algunos casos simplemente su
desarrollo es consecutivo, a este tipo de algoritmos se denomina de estructura
secuencial, en otros casos durante el desarrollo secuencial se generan preguntas a este
tipo de algoritmos se denomina de estructura condicional y en otros casos generan
bucles es decir repetición de ciertas líneas de programas, a estos algoritmos se
denominan de estructura repetitiva.
Estructura básica para cualquier algoritmo a desarrollar:
Declaración de
variables
Captura de
datos
Proceso de
datos
Salida de
información
Estructura Secuencial.
Este tipo de algoritmos se caracteriza por que entre sus
instrucciones no existen estructuras condicionales ni
repetitivas, se desarrollan línea a línea hasta culminar con su
ejecución, gráficamente se observaría de la siguiente manera:
162 SENATI-Computación e Informática
ción con VBA
Ejemplo
Diseñar un programa que permita hallar el área de un triangulo rectángulo si se
sabe: Área_triángulo = (B * H) / 2
Donde B es base del triangulo y H es la altura.
1. Análisis
i. ¿Qué te piden que realices?
Hallar el área de un triangulo.
ii. ¿Qué datos necesito conocer?
Según la fórmula que se muestra debería de conocer la base y la altura.
2. Planteamiento Lógico.
El problema se resuelve con una fórmula matemática AR = B*H
3. Definición de variables de entrada
Las variables que se usaran para la captura de la base y la altura son: B y H.
4. Definición de variables de salida
La variable en donde se muestra el área del triangulo rectángulo es: AR
5. Programa
Sub AreaTriangulo()
Dim a B as integer
Dim H as integer
Dim AR as single
B= val (Textbox1.text)
H = val (Textbox¨2.text)
AR = (B*H) / 2
Textbox2.text = AR
End Sub
Estructura Condicional.
Este tipo de algoritmos se caracteriza por que entre sus instrucciones muestran
estructuras condicionales.
a. Condiciones Simples. Sentencia SI – ENTONCES
Se ejecuta un conjunto de instruciones si se cumple la condición
V
Condición Instrucciones
SENATI-Computación e Informática 163
Microsoft Office
Excel 2007
b. Condiciones doble. Sentencia SI – ENTONCES – SINO
Se ejecuta un conjunto de instruciones si se cumple la condición, caso
contrario se ejecuta otro conjunto de instrucciones.
F V
Condición
Instrucciones_B Instrucciones_A
Ejemplo
Realizar un algoritmo que permita ingresar 2 números, luego determinar
si el primer número ingresado fue el mayor (mostrar un mensaje).
1. Análisis.
i. ¿Qué te piden que realices?
Evaluar 2 números para determinar si el primer número
ingresado fue el mayor.
ii. ¿Qué datos necesito conocer?
Los 2 números.
2. Planteamiento Lógico.
La forma directa de poder saber si un número es mayor a otro es
creando una condición relacional. A > B
3. Definición de variables de entrada.
Se requerirán dos variables, N1 y N2 que representen a los números
que se evalúan.
4. Definición de variables de salida.
Para este problema no existirán variables de salida debido a que se
desea mostrar solo mensajes.
5. Programa
Private Sub CommandButton1_Click()
N1 = val(text1.text)
N2 = val(text2.text)
If n1>n2 then
164 SENATI-Computación e Informática
ción con VBA
Else
End If
End Sub
Textbox1.text = “El primer número es el mayor”
Textbox1.text = “El segundo número es el mayor”
6. Diagrama de Flujo
INICIO
Declaración de variablesN1, N2: entero
N1, N2
F V
A>B
El primer
número no
es mayor
El primer
número es
mayor
FIN
Sentencia selección-caso
Esta es una estructura de decisión múltiple, evaluará una expresión condicional
que podrá tomar uno de los “n” valores distintos que para algunos casos puede
tratarse de rangos o valores individuales, según cumpla con uno de estos.
SENATI-Computación e Informática 165
Microsoft Office
Excel 2007
Ejemplo
Un movil recorre un tramo de la carretera con Movimiento Rectilíneo Uniforme
(MRU), determinar y mostrar cual es el espacio recorrido:
Espacio = Velocidad * Tiempo
Adicionalmente mostrar un mensaje que indique el consumo de gasolina según la
tabla:
Espacio Recorrido
Gasolina
0 y 30
1 galón
31 y 60
2 galones
61 y 200
3 o más galones
1. Análisis.
ii. ¿Qué te piden que realices?
Calcular el espacio recorrido y en base a ello mostrar cuanta
gasolina se consume.
iii. ¿Qué datos necesito conocer?
La velocidad y el tiempo (según formula).
2. Planteamiento Lógico.
El desarrollo es simple, solamente deberá ingresar la velocidad y el tiempo
para calcular el espacio recorrido, en base a ello deberá observar la tabla para
que desarrolle la estructura correspondiente y muestre el mensaje solicitado.
Ejemplo:
Si el espacio recorrido es de 25 kilómetros
El mensaje es 1 galón.
3. Definición de variables de entrada.
Se requerirán dos variables, V y T que representen a la velocidad y el tiempo
respectivamente.
4. Definición de variables de salida.
La variable de salida estará representada por E.
5. Programa.
Private Sub CommandButton1_Click()
v = val(text1.text)
t = val(text2.text)
e = v*t
Select case e
case 0 to 30
166 SENATI-Computación e Informática
ción con VBA
text3.text =”Debe usar un galón”
case 31 to 60
text3.text =”Debe usar dos galones”
case 61 to 200
text3.text =”Debe usar tres galones”
End select
End Sub
6. Diagrama de flujo.
INICIO
Declaración de variables
V, T, E: entero
V, T
E = V * T
E
31 y 60
0 y 30 60 y 200
Debe
usar 1
galón
Debe
usar 2
galones
Debe
usar 3 o
más
galones
E
FIN
Estructura Repetitiva.
Conjunto de instrucciones que se repiten un número determinado de veces
mientras se cumple una determinada condición o en todo caso se le ha dado un
límite de veces a ejecutar.
Inicio de Bucle
Instrucción 1
Instrucción N
Fin de Bucle
SENATI-Computación e Informática 167
Microsoft Office
Excel 2007
Contador. Los procesos repetitivos por lo general lo utilizan, ya que necesitan
contar los sucesos o acciones internas del bucle. Una
Inicio de Bucle
C = C + 1
de las formas de controlar un bucle es mediante un
contador. Un contador es una variable cuyo valor
crece o decrece en una cantidad constante por cada
vuelta (interacción) que da el bucle.
Inicio de Bucle
Fin de Bucle
Acumulador. Es denominado también totalizador,
es una variable cuya misión es almacenar cantidades
o valores resultantes de sumas sucesivas. Realiza la
misma función que un contador con la diferencia de
que el incremento o decremento de cada suma es
variable en lugar de constante como en el caso del
contador.
N
AC = AC + N
Fin de Bucle
Ejemplo
Desarrollar un algoritmo que permita calcular y mostrar la suma de los n
primeros números naturales, deberá ingresar el límite de números a sumar.
S = 1 + 2 + 3 + 4 + 5 +... + n
1. Análisis.
i. ¿Qué te piden que realices?
Calcular la suma de n números naturales.
ii. ¿Qué datos necesito conocer?
La cantidad de números a sumar.
2. Planteamiento Lógico.
Este problema se puede haciendo uso de acumuladores y contadores.
3. Definición de variables de entrada.
Se requerirán una variable que represente a la cantidad de números a
sumar(N).
4. Definición de variables de salida.
Tilizaremos la variable AC.
5. Programa
General Declaraciones
Dim i As Byte
Dim AC As Integer
168 SENATI-Computación e Informática
ción con VBA
Private Sub CmdProcesar_Click()
List1.Clear
AC = 0
For i = 1 To Val(Text1.Text)
List1.AddItem Str(i)
AC = AC + i
Next i
Text2 = AC
End Sub
Private Sub CmdLimpiar_Click()
Text1 = 0
Text2 = 0
Text1.SetFocus
End Sub
Private Sub CmdSalir_Click()
If MsgBox("Desea salir?", vbInformation + vbYesNo, "SALIDA") = vbYes Then
End
End If
End Sub
6. Diagrama de flujo
INICIO
Declaración de variables
I, N, AC: entero
N
AC = 0
Para I=1
Hasta N
AC = AC + I
AC
FIN
SENATI-Computación e Informática 169
Microsoft Office
Excel 2007
La ventana del editor de Visual Basic
Para trabajar en el Entorno de Visual Basic, hacer lo siguiente.
Hacer clic en la ficha , botón
Se presenta la ventana de programación Visual Basic
Barra de menú Barra de herramienta
Ventana de
proyecto
Formulario
Cuadro de
herramientas
A continuación se describen los principales elementos de la ventana de Microsoft
Visual Basic.
a. Barra de Menús
Presenta los comandos que se usan para trabajar con Visual Basic. Además
de los menús estándar Archivo, Edición, Ver, Insertar, Formato, Depuración,
Ejecutar, Herramientas, Complementos, Ventana y Ayuda.
b. Barra de Herramientas
Permite un acceso directo (solo un clic) a muchas de las operaciones más
frecuentes utilizadas durante el desarrollo de aplicaciones.
c. Cuadro de Herramientas
Contiene todos los objetos y controles que se pueden añadir a los formularios
para crear aplicaciones.
170 SENATI-Computación e Informática
ción con VBA
d. Diseñador de Formularios
Funciona como una ventana en la que se puede personalizar el diseño de la
interfaz de usuario (ventana) de una aplicación.
e. Explorador de Proyectos
Lista de los archivos (formularios, módulos, etc.) del proyecto actual. Un
Proyecto es una colección de archivos que utiliza para construir una
aplicación.
f. Ventana de Propiedades
Lista los valores de las propiedades del formulario o control seleccionado
que pueden ser modificados durante el diseño del formulario o control.
g. Ventana de Código
Funciona como un editor para escribir el código (sentencias) de la
aplicación. Cuando se ingresa el nombre de una función en la ventana de
código, Visual Basic automáticamente proporciona el formato o sintaxis de
la función.
Terminología de Visual Basic
Conforme trabaje con VBA necesitará estar familiarizado con los siguientes
términos:
Término
Definición
Tiempo de diseño
Es el momento en el que se construye la aplicación.
Tiempo de ejecución
Es el momento en el cual ejecutamos aplicación.
Formulario
ES el contenedor de los controles donde se diseña la
aplicación, también conocida como interfaz de
usuario.
Controles
Representación gráfica de objetos tales como botones,
cuadros de lista, cuadros de edición, etc.
Objetos
Un término general usado para describir todoslos
formularios y controles que forman parte de la
aplicación.
Propiedades
Los valores de un objeto, tales como tamaño, título,
color, etc.
Métodos
Las acciones que un objeto puede realizar sobre sí
mismo.
Eventos
Son acciones reconocidas por un formulario o control.
Los eventos ocurren a medida que el usuario interactúa
SENATI-Computación e Informática 171
Microsoft Office
Excel 2007
con los objetos de la aplicación.
Programación
controlada por
eventos
La programación controlada por eventos es la esencia
de las interfaces gráficas de usuario; el usuario acciona
y el código responde.
Programación por eventos
En las aplicaciones manejadas por eventos, la ejecución no sigue una ruta
predefinida. En vez de esto, se ejecutan diferentes secciones de código en
respuesta a eventos.
La secuencia de eventos determina la secuencia en que el código se ejecuta. Es
por esto que la ruta que sigue el código de la aplicación es diferente cada vez que
se ejecuta el programa.
Convenciones para los nombres de los objetos
Los objetos deben llevar nombres con un prefijo coherente que facilite la
identificación del tipo de objeto. A continuación se ofrece una lista de
convenciones recomendadas para algunos de los objetos permitidos poro Visual
Basic.
Tipo de Control
Prefijo
Detalles
Etiqueta
lbl
lblAPELLIDOS
Cuadro de texto
txt
txtAPELLIDO
Casilla de verificación
chk
chkIMPRESORA
Botones de opción
opt
optCPU
Cuadro combinado, cuadro
lista desplegable
cbo
cboCUDADES
Cuadro de lista
lst
lstPAISES
Botón de comando
cmd
cmdSALIR
Formulario
frm
frmENTRADA
Marco
fra
fraTIPOS
Línea
lin
linVERTICAL
Imagen (Picture)
pic
picLOGOTIPO
Cuadro de número
spn
spnPÁGINAS
172 SENATI-Computación e Informática
ción con VBA
Formularios
El formulario es el principal medio de
comunicación entre el usuario y la
aplicación. Los usuarios interactúan con los
controles sobre el formulario para ingresarle
datos y obtener resultados, para mostrar las
propiedades de un objeto pulsar F4.
Propiedades
BackColor Color de fondo del formulario.
Caption Texto en la barra de título del formulario.
Enabled True/False. Determina si está habilitado para responder a las
acciones del usuario.
Left y Top Ubicación del formulario.
Name Nombre del formulario.
Eventos
Activate Ocurre cuando el formulario se convierte en la ventana activa.
Click Ocurre cuando hace clic sobre el formulario.
Deactivate Ocurre cuando el formulario deja de ser la ventana activa.
Añadir controles al formulario
Para añadir controles a un formulario lo hacemos de la siguiente manera:
1. Haga clic sobre el control en el Cuadro de Herramientas.
2. Ubique el puntero del Mouse (una cruz) sobre el formulario en la
esquina superior izquierda donde desea colocar el control.
3. Realice un clic sostenido mientras arrastra el puntero a la esquina
superior derecha donde colocará el control.
4. Suelte el botón del Mouse.
Estos cuatro pasos se repiten con cada control que desea añadir al
formulario.
La Ventana de Código
La Ventana de Código se usa para escribir, mostrar y editar el código de su
aplicación. Puede abrir una ventana de código por cada módulo de su aplicación,
de modo que puede fácilmente copiar y pegar entre ellos. El editor de texto es
solo un editor ASCII.
SENATI-Computación e Informática 173
Microsoft Office
Excel 2007
La Ventana de Código contiene:
Lista de objetos
Lista de eventos
La barra de división
a. El Cuadro Lista de Objetos
Muestra el nombre del objeto seleccionado. Haga clic en la flecha a la
derecha del cuadro Objeto para mostrar una lista de todos los objetos
asociados con el formulario.
b. El Cuadro Lista de Eventos
Muestra todos los eventos reconocidos para el formulario o control mostrado
en el cuadro Objeto. Cuando seleccionamos un evento, en la ventana de
código se muestra el procedimiento de evento asociado con ese evento.
Ejemplo:
c. La Barra de División
Permite dividir la ventana de código en dos partes.
Editando Código
Use las características de edición de Visual Basic para que su código sea más
fácil de leer.
Sangría
Use la sangría para diferenciar partes de su código, tales como estructuras
repetitivas y condicionales. Veamos el siguiente ejemplo:
Private Sub cmdIngresar_Click()
If Len(Trim(txtUsuario))=0 Then
txtUsuario.SetFocus
ElseIf Len(Trim(txtContraseña))=0 Then
txtContraseña.SetFocus
ElseIf txtContraseña = “AGPS” Then
Para aplicar sangría a una
sección de sentencias de un
código use la tecla Tab.
174 SENATI-Computación e Informática
ción con VBA
Else
End If
MsgBox “La clave ingresada es correcta”
Unload Me
MsgBox “La clave ingresada no es válida”
txtContraseña.SelStart=0
txtContraseña.SelLength= Len(Trim(txtContraseña))
txtContraseña.SetFocus
End Sub
Comentarios
El añadir documentación y comentarios a su código permite comprender mejor lo
que hace el código. El texto que continúe al símbolo de comentario será ignorado
en la ejecución de la aplicación. Veamos el siguiente ejemplo:
Private Sub cmdLimpiar_Click()
'Este procedimiento limpia la ventana de identificación
txtUsuario.Text = "" 'Limpia el cuadro de texto
txtUsuario.SetFocus ' Mueve el enfoque a txtUsuario End
Sub
Un comentario se
inicia con el carácter
apóstrofe ( „ )
Creación y uso de procedimientos
En las aplicaciones tradicionales o procedurales, es la aplicación quien controla que
porciones de código se ejecuta, y la secuencia en que este se ejecuta. La ejecución de la
aplicación se inicia con la primera línea de código, y sigue una ruta predefinida a través
de la aplicación, llamando procedimientos según sea necesario.
Procedimientos
Existen dos tipos de procedimientos con los que se trabaja en Visual Basic: los
procedimientos de evento y los procedimientos generales.
Procedimientos de Evento
Visual Basic invoca automáticamente procedimientos de evento en respuesta a
acciones del teclado, del ratón o del sistema. Cada control tiene un conjunto fijo
de procedimientos de evento. Los procedimientos de evento para cada control
son mostrados en un cuadro de lista despegable en la ventana de código.
SENATI-Computación e Informática 175
Microsoft Office
Excel 2007
El código que se escriba en el
procedimiento de evento Click es
ejecutado cuando el usuario haga
clic en un botón de comando.
Procedimientos Generales
Son procedimientos Sub o Function que son creados para que lleven a cabo tareas
específicas.
Para crearlos hacer clic en el menú Insertar, Procedimiento.
Si se tiene código duplicado en varios procedimientos de evento, se puede
colocar el código en un procedimiento general y luego invocar al procedimiento
general desde los procedimientos de evento.
Procedimientos Sub
Los procedimientos Sub no retornan valores. Por ejemplo:
Public Sub Seleccionar(Cuadro As TextBox)
Cuadro.SelStart = 0
Cuadro.SelLength = Len(Cuadro.Text)End Sub
Los procedimientos Sub son invocados especificando sólo el nombre del
procedimiento, o empleando la instrucción Call con el nombre del procedimiento.
Por ejemplo:
Call Seleccionar(Text1)
Si se emplea la instrucción Call, se debe encerrar la lista de argumentos entre
paréntesis. Si se omite Call, también se deben omitir los paréntesis alrededor de
la lista de argumentos.
176 SENATI-Computación e Informática
ción con VBA
:
Procedimientos Function
Los procedimientos Function devuelven valores. En el siguiente ejemplo, el
procedimiento Function recibe un número y devuelve ese número al cuadrado.
Public Function Cuadrado(N As Integer) As Integer
Cuadrado = N * N
End Function
Si se desea guardar el valor devuelto, se debe usar paréntesis cuando se invoque a
la función, como se muestra a continuación:
Resultado = Cuadrado (5)
Si se omiten los paréntesis, se puede ignorar el valor devuelto y no guardarlo en
una variable. Esto puede ser útil si se quiere ejecutar una función y no se desea el
valor devuelto. Por ejemplo:
Ámbito de las variables.
Denominamos ámbito de una variable a las partes del programa donde esa
variable está declarada. Para entenderlo mejor, veamos someramente la forma de
un programa desarrollado en VB.
A estas partes las habíamos llamado Procedimientos. Podemos tener
procedimientos que no estén relacionados con ningún evento ocurrido al
formulario o a sus controles. (Los Procedimientos que iremos insertando a lo
largo de la aplicación).
Aquí puede insertar proc. y funciones del módulo.
Si se declara una variable dentro de un procedimiento o
Función, esa variable tiene como ámbito el Procedimiento
o Función donde se declaró.
En un Formulario, una variable puede declararse de dos formas:
Privada o Pública.
Variable Privada tiene como ámbito sólo el proc. y función donde
fue declarada
Variable Pública tiene como ámbito todos los proc. y funciones
del formulario y sus controles.
Variable a nivel de formulario debe declararse en la sección de
declaraciones, que está la ventana de código Objeto = General,
Proc. = Declaraciones. Tiene como ámbito todo el formulario
En un Módulo una variable puede declararse como Privada, con
lo que no saldrá de ese Módulo, o Pública, pudiendo en este caso
usarse en todo el programa
No es recomendable declarar variables con el mismo nombre.
SENATI-Computación e Informática 177
Microsoft Office
Excel 2007
Formas de declaración de variables en un proyecto VB.
Sentencia Dim
Es la forma más común de declarar una variable como Privada. Puede emplearse
en un Procedimiento, Función, Formulario o Módulo. La sintaxis es de la
siguiente forma:
Dim nombrevariable As Integer
Sentencia PRIVATE
Su ámbito depende donde la declaro.
Cada vez que entremos al formulario,
procedimiento o módulo, esa variable tomará el
valor cero (si es numérica) o nulo (si es string).
Es la forma de declarar una variable como Privada. Puede emplearse solamente
en la sección de declaraciones de un Formulario o Módulo. La sintaxis es de la
siguiente forma:
Private nombrevariable As Tipovariable
La sentencia Private no puede usarse en un
procedimiento o función.
La variable NO puede utilizarse fuera
del Formulario o Módulo donde se
declaró.
Sentencia PUBLIC
Puede emplearse solamente en la sección de declaraciones de un Formulario o
Módulo. La sintaxis es de la siguiente forma:
Public nombrevariable As Tipovariable
Para nombrarla, si estamos en el Formulario
donde se declaró basta con citarla por su
nombre. Si no estamos en ese Formulario,
Si se declara de esta forma en la
sección de declaraciones de un
Formulario, esa variable puede usarse
en toda el programa.
habrá que citarla por el nombre del Formulario, seguido del nombre de la
variable, separado por un punto:
NombreFormulario.Nombrevariable
Sentencia GLOBAL
Una variable declarada como Global es reconocida en cualquiera de los
formularios y módulos del proyecto. La sintaxis es:
Global nombrevariable As tipovariable
Sentencia STATIC
La sentencia Global sólo puede usarse
en el apartado de declaraciones de un
Módulo.
Variable estática permite retener el valor de la variable cuando se vuelve a
invocar el proc. o función. Esta declaración como estática se realiza mediante la
instrucción Static
Static nombrevariable As tipovariable Sólo ̀ puede declararlo dentro
de un procedimiento o función.
178 SENATI-Computación e Informática
ción con VBA
Pese a que Visual Basic no obliga a declarar variables, es muy útil hacerlo. De
esta forma se tiene control sobre el programa. La experiencia se lo irá
demostrando.
Resumen de declaración de variables
Procedimiento
La variable no puede usarse
fuera de esta Procedimiento
Dim Variable As
Tipovariable
Procedimiento, como
permanente
La variable no puede usarse
fuera de este procedimiento, y
dentro de él conserva el valor
aunque se salga y se vuelva a
entrar
Static Variable As
Tipovariable
Formulario
En su sección de
declaraciones, como
Privada
Solamente se puede usar en
ese Formulario
Dim Variable As
Tipovariable
Private Variable As
Tipovariable
Formulario
En su sección de
declaraciones, como
Pública
Puede usarse en toda la
aplicación
Public Variable As
Tipovariable
Módulo
Como Privada
Solamente puede usarse en
ese Módulo
Dim Variable As
Tipovariable
Private Variable As
Tipovariable
Módulo
Como Pública
Puede usarse en toda la
aplicación
Public Variable As
Tipovariable
Global Variable As
Tipovariable
Forma de conocer el tipo de una variable. Función TypeName
Podemos conocer el tipo con el que se ha declarado una variable. Esto se hace
mediante la Función TypeName, que devuelve una cadena con el tipo de una
variable.
MiTipo = TypeName(NombreVariable)
NombreVariable puede ser cualquier variable con excepción de las de tipos
definidos por el usuario.
SENATI-Computación e Informática 179
Microsoft Office
Excel 2007
La cadena de caracteres devuelta por TypeName puede ser una de las siguientes:
Cadena devuelta La variable contiene
Byte Un byte
Entero Un entero.
Largo Un entero largo.
Simple Un número de punto flotante de precisión simple.
Doble Un número de punto flotante de precisión doble.
Moneda Un valor de moneda.
Fecha Una fecha.
Cadena Una cadena.
Boolean Un valor Boolean.
Error Un valor de error.
Empty No inicializado.
Null No hay datos válidos.
Objeto Un objeto que no respalda Automatización OLE.
Desconocido Un objeto de Automatización OLE cuyo tipo es
desconocido.
Nada Una variable de objeto que no se refiere a un objeto.
Si NombreVariable es una matriz, la cadena devuelta puede ser cualquiera de las
cadenas posibles con un paréntesis vacío adherido. Por ejemplo, si
NombreVariable es una matriz de enteros, TypeName devolverá "Integer()".
Objetos propiedades, métodos y eventos
Control Etiqueta (Label)
Se utiliza para mostrar texto que el usuario no puede modificar.
Generalmente para identificar otros controles en el formulario o para mostrarinstrucciones al usuario.
Propiedades
Name Nombre del control.
AutoSize True/False. Determina si el tamaño del control se ajusta
automáticamente al texto que contiene.
Caption Texto que muestra el control.
Font Establece la fuente, estilo y tamaño para el texto del control.
180 SENATI-Computación e Informática
ción con VBA
Control Cuadro de Texto (Textbox)
Se utiliza para que el usuario le proporcione datos a la aplicación o
para que la aplicación le devuelva la información al usuario. El texto que se
muestra en el control puede ser cambiado por el usuario.
Propiedades
Enabled True/False. Establece un valor que determina si el control
puede responder a eventos generados por el usuario.
Font Establece la fuentes, estilo y tamaño para el texto del control.
Locked True/False. Determina si es posible modificar el texto en el
control.
MaxLength Establece la longitud máxima permitida para el texto en el
control.
MultiLine Establece si el control puede aceptar múltiples líneas de texto.
Name Nombre del control.
PasswordChar Carácter utilizado para ocultar el texto que realmente contiene
el control.
Text Texto que realmente contiene y muestra el control.
Visible Establece si el control será visible para el usuario.
Eventos
Change Ocurre cuando cambia el texto que contiene el control.
KeyDown Ocurre cuando el usuario presiona una tecla mientras el
control tiene el enfoque.
Control Botón de Comando (Commandbutton)
Permite que la aplicación inicie, interrumpa o termine un proceso.
Propiedades
Caption Establece el texto que muestra el botón.
Font Establece la fuente, estilo y tamaño para el texto del control.
Name Nombre del botón.
Visible True/False. Establece si el botón será visible para el usuario.
Eventos
Click Ocurre cuando se hace clic sobre el botón.
SENATI-Computación e Informática 181
Microsoft Office
Excel 2007
Estableciendo Propiedades
Al diseñar la interface de usuario de una aplicación Visual Basic, se deben
establecer la propiedades para los controles (objetos) creados.
Estableciendo Propiedades en Tiempo de Diseño
Algunas propiedades pueden ser establecidas en tiempo de diseño.
Para establecer estas propiedades se emplea la ventana de propiedades.
Si selecciona varios objetos a la vez y accede a la ventana de propiedades, sólo se
mostrarán las propiedades que son
comunes para todos los controles seleccionados. Cualquier cambio que se haga a
una propiedad será aplicada a todos los controles.
Para acceder a la ventana de
propiedades, oprima en botón
secundario del ratón sobre un
objeto, y luego haga clic en
Propiedades.
También se puede obtener el
mismo resultado seleccionado el
objeto y luego presionando F4
Estableciendo Propiedades en Tiempo de Ejecución
En tiempo de ejecución, se puede escribir código para establecer u obtener el
valor de una propiedad.
txtData.Font.Bold = True
La siguiente línea de código establece a negrita la
fuente de un cuadro de texto llamado txtData.
Este código establece la propiedad Text del cuadro de texto txtData
txtData.Text = "Hola mundo" Establece el valor del texto
Si se omite el nombre de la propiedad, se establece la propiedad predeterminada
del control. La propiedad predeterminada de un cuadro de texto es la propiedad
Text. La propiedad predeterminada de una etiqueta es la propiedad Caption. Las
siguientes líneas de código establecen las propiedades predeterminadas text y
caption de un cuadro de texto y de una etiqueta.
txtData = “Pedro”
lblData = "Nombre”
Se establece la propiedad Text del cuadro de texto
Se establece la propiedad Caption de la etiqueta
182 SENATI-Computación e Informática
ción con VBA
Obteniendo Propiedades en Tiempo de Ejecución
Puede emplear el siguiente código para obtener el valor de una propiedad en
tiempo de ejecución.
Dim sNombre as String
sNombre = txtName.Text
Asigna a la variable sNombre el valor del cuadro de texto
txtName
Definición de variables, tipos de datos y constantes
Una variable es un lugar de memoria en la memoria del computado.
Es un nombre que en el programa le asignamos a un dato.
Ese dato podrá cambiar.
Piense por ejemplo, en un programa
consistente en la toma de datos de los
Variable
alumnos de un centro escolar. Existirán varias
variables para poder introducir los datos de los
Valor de la variable
alumnos. Estas variables pueden tener nombre tales como:
Nombre, Apellido_Paterno, Apellido_Materno, Direccion, Telefono,
La variable Nombre tomará valores distintos según vayamos introduciendo los
datos de los distintos alumnos. Es posible, que a lo largo de la ejecución del
programa, esta variable Nombre contenga los datos:
Option Explicit
Obliga a declarar previamente las variables que se vayan a usar.
Esta declaración debe ponerla al comienzo de la sección de declaraciones de cada
formulario y módulo que contenga su aplicación.
Tipos de Variables
Las variables pueden ser de los siguientes tipos: (El número indicado en segundo
lugar indica el número de Bytes que ocupa en memoria.)
VARIABLE
ESPACIO
QUE
OCUPA
DETALLES
Booleana
2 Bytes
Admite los valores 0 y 1, o True (verdadero) y
False (falso)
Byte
1 Bytes
Números enteros, en el rango de 0 a 255
SENATI-Computación e Informática 183
Microsoft Office
Excel 2007
Integer
2 Bytes
Números enteros en el rango de -32768 a 32767
Long
4 Bytes
Números enteros en el rango de -2147483648 a
2147483647
Single
4 Bytes
Punto flotante, simple precisión
Doble
8 Bytes
Punto flotante, doble precisión.
Currency
Entero,
con punto
decimal
fijo
(Típico de
monedas)
String
* Cadenas alfanuméricas de longitud variable o fija.
Una variable tipo String ocupa el mismo número
de bytes que caracteres tenga la cadena.
Date
8 Bytes
Fechas
Objet
4 Bytes
Referencia a objetos
Variant
*
Otros tipos de datos.
Una variable tipo Variant ocupa 16 bytes si se
trata de un número y 22 bytes + longitud de la
cadena si se trata de un dato tipo cadena de
caracteres.
Los bytes necesarios para almacenar esa variable dependerán de los datos que se
hayan definido.
NOTA. Observe en la lista anterior que un dato Booleano ocupa 2 Bytes,
mientras que un dato tipo Byte ocupa un byte. En muchas ocasiones declaramos
variables tipo Boolean con la intención de que ocupen menos espacio.
Declaración de variables
Para declarar una variable se utiliza la sentencia Dim.
Sintaxis: Dim nombre_variable As Tipo_variable
Tipos de variables
A continuación se describen los tipos de variable.
184 SENATI-Computación e Informática
ción con VBA
a. Variables Alfanuméricas
Es toda información que va a contener texto o la unión de textos y números;
información que no representa cálculos matemáticos.
Ejemplo:
Nombre de una persona Dim nombres As String
Apellido Paterno de una persona Dim apel_pat As String
Dirección de una persona Dim direccion As String
Definiendo la cantidad de caracteres que aceptará la variableDim nombres1 As String
Dim nombres2 As String *15
nombres1 puede tener cualquier número de caracteres.
nombres2 puede tener un máximo de 15 caracteres.
En el caso del DNI, código postal, No. De calle, piso del edificio, etc. Es
recomendable declararlo como cadena. Para ahorrar memoria.
b. Variable Numéricas
¿Qué variables debemos declarar entonces como numéricas ? La respuesta es
bien sencilla: Aquellas que van a contener datos con lo que vamos a realizar
operaciones matemáticas.
Ejemplo:
Edad de una persona Dim nombres As Byte
Nota de un curso Dim nota1 As Byte
Sueldo Básico Dim basico As Single
Bonificaciones Dim boni1 As Single
Las variables booleanas (True/False) pueden en muchos casos sustituirse por una
variable del tipo Byte. Si ese datos True / False se va a introducir en una base de
datos o en fichero en el disco, puede ser más prudente poner 0 en vez de False y 1
en vez de True.
Una variable byte ocupa muy poco, simplemente 1 byte como su nombre indica.
Pero no puede contener números mayores de 255 ni números negativos.
Cada vez que declare una variable numérica piense en los valores que puede
tener, sobre todo cuando esa variable va a ser el resultado de una operación
matemática. Recuerde el escaso margen de una variable tipo Integer ( de -32768
a 32767)
Si la aplicación va a tratar moneda, piense en la forma de expresar los números
decimales y el número de ellos permitidos, así como el redondeo.
SENATI-Computación e Informática 185
Microsoft Office
Excel 2007
La variable correcta para este caso es Currency, pero Currency le añade
automáticamente el tipo de moneda de cada país lo que con frecuencia es un
engorro. Los datos del tipo de moneda los toma del sistema operativo del
ordenador, por lo que no se extrañe si le expresa el número en dólares. Cambie el
país en su Sistema Operativo Windows.
c. Variable Date
Otro tipo de variable es Date. Este tipo de variable representa una fecha.
Ejemplo:
Fecha de nacimiento de una persona Dim fnac As Date
d. Variable Boolean
Este tipo de variable representa dos valores TRUE (verdadero) o FLASE (falso).
Ejemplo:
Sexo Dim sexo As Boolean
Error típico de un programador novel
Creo que esta costumbre viene del lenguaje C. Pero no vale en VB. Se trata de
declarar varias variables juntas en una misma línea:
Dim Variable1, Variable2, Variable3, Variable4 As String
Esta declaración está MAL hecha. Visual Basic interpretará que Variable1,
Variable2 y Variable3 son del tipo Variant, y solamente Variable4 la supone
como tipo String
La forma correcta de hacerlo, si queremos declarar esas variables un una sola
línea, es la siguiente :
Dim Variable1 As String, Variable2 As String, Variable3 As String, Variable4
As String.
Constantes
Una constante es un nombre significativo que sustituye a un número o una
cadena que no varía. Hay dos orígenes para las constantes:
Constantes intrínsecas o definidas por el sistema proporcionadas por
Visual Basic.
Las constantes simbólicas o definidas por el usuario se declaran mediante
la instrucción Const.
186 SENATI-Computación e Informática
ción con VBA
La sintaxis para declarar una constante es la siguiente:
[Public|Private] Const nombre_constante [As tipo] = expresión
El argumento nombre_constante es un nombre simbólico válido (las reglas son
las mismas que para crear nombres de variable) y expresión está compuesta por
constantes y operadores de cadena o numéricos; sin embargo, no puede utilizar
llamadas a funciones en expresión. Una instrucción Const puede representar una
cantidad matemática o de fecha y hora:
Const conPi = 3.14159265358979
Public Const conMaxPlanetas As Integer = 9
Const conFechaSalida = #1/1/95#
Se puede utilizar también la instrucción Const para definir constantes de cadena:
Public Const conVersion = “ 07.10.A”
Const conNombreClave = “Enigma”
Puede colocar más de una declaración de constante en una única línea si las
separa con comas:
Public Const conPi=3.14, conMaxPlanetas=9, conPobMundial=6E+09
Operadores
a. Aritméticos
^ Exponenciación
* Multiplicación
/ División
\ División entera
Mod Residuo entero (Ejm: A Mod B)
+ Suma
- Resta
& Concatenación de cadenas
b. Comparación
= Igual
<> Distinto
< Menor que
SENATI-Computación e Informática 187
Microsoft Office
Excel 2007
<= Menor o igual
>= Mayor o igual
Like Compara dos cadenas
* Cero o más caracteres (Ejm: cad Like “ma*”)
? Cualquier carácter
# Cualquier dígito (0-9)
c. Lógicos
And “Y” lógico
Or “O” lógico
Xor “O” Exclusivo
Not Negación
Construcciones: If – then, Select Case
Las estructuras condicionales le permiten controlar el flujo de ejecución del programa.
A continuación se describen las estructuras de control
Condicional simple. If .. then
Use la estructura If...Then para ejecutar una o más instrucciones basadas en una
condición. Puede utilizar la sintaxis de una línea o un bloque de varias líneas:
If condición Then Sentencias
If condición Then
Sentencias
End If
Donde:
Condición. Es una expresión lógica, que devuelve un valor lógico: Verdadero o
falso. Ejemplo:
If cualquierFecha < Now Then CualquierFecha = Now
o
If then en una sola línea,
sólo puede ejecutar una
línea de código
If cualquierFecha < Now Then
CualquierFecha = Now
De este otro modo se pueden ejecutar varias líneas de
código
End If
188 SENATI-Computación e Informática
ción con VBA
Condicional doble If...Then...Else
Utilice un bloque If...The...Else para definir varios bloques de sentencias, uno de
los cuales se ejecutará:
If condición1 Then
[bloque de sentencias 1]
[ElseIf condición2 Then
Se evalúa esta condición si es verdadera se ejecuta el
bloque de sentencias 1
[Else
[bloque de sentencias 2]] ...
Si es falsa la condición1, evalúa la condición2, si es
verdadera ejecuta el bloque de sentencias 2
End If
[bloque de sentencias n]]
Si no se cumple ninguna condición se ejecuta el bloque
de sentencias n
Por ejemplo, la aplicación podría realizar distintas acciones dependiendo del
control en que se haya hecho clic de una matriz de controles de menú:
Private Sub mnuCut_Click (Index As Integer)
If Index = 0 Then „ Comando Cortar
CopyActiveControl „ Llama a procedimientos generales
ClearActiveControl
ElseIf Index = 1 Then „ Comando Copiar
CopyActiveControl
ElseIf Index = 2 Then „ Comando Borrar
ClearActiveControl
Else „ Comando Pegar
PasteActiveControl
End If
End Sub
o
If ClaveUsuario=”DSI” Then
„ Permite al usuario entrar al sistema
...
...
Else
„ Mostrar un mensaje advirtiendo error en la clave
...
...
End If
SENATI-Computación e Informática 189
Microsoft Office
Excel 2007
o
Private Sub DeterminaCondición ( )
If Val (txtPromedio) >=13 Then
txtCondición = “Aprobado”
ElseIf Val (txtPromedio) >= 10 Then
txtCondición = “Asistente”
Else
txtCondición = “Desaprobado”
End If
End Sub
Observe que siempre puede agregar más cláusulas ElseIf a la estructura If...Then.
Sinembargo, esta sintaxis puede resultar tediosa de escribir cuando cada ElseIf
compara la misma expresión con un valor distinto. Para estas situaciones, puede
utilizar la estructura de decisión Select Case.
Condicional múltiple Select Case
Visual Basic proporciona la estructura Select Case para ejecutar selectivamente
un bloque de sentencias entre varios bloques.
La estructura Select Case funciona con una única expresión de prueba que se
evalúa una vez solamente, al principio de la estructura. Visual Basic compara el
resultado de esta expresión con los valores de cada Case de la estructura. Si hay
una coincidencia, ejecuta el bloque de sentencias asociado a ese Case:
Selec Case expresión_prueba
[Case lista_expresiones1
[bloque de sentencias 1]]
[Case lista_expresiones2
[bloque de sentencias 2]]
.
.
.
[Case Else
[bloque de sentencias n]]
End Select
Cada lista_expresiones es una lista de uno a
más valores.
Si hay más de un valor en una lista, se
separan los valores con comas.
Cada bloque de sentencias contiene cero o
más instrucciones.
Si más de un Case coincide con la expresión
de prueba, sólo se ejecutará el bloque de
instrucciones asociado con la primera
coincidencia.
Visual Basic ejecuta las instrucciones de la
cláusula (opcional) Case Else si ningún valor
de la lista de expresiones coincide con la
expresión de prueba.
Por ejemplo, suponga que agrega otro comando al menú Edición en el ejemplo
If...Then...Else. Podría agregar otra cláusula ElseIf o podría escribir la función
con Select Case:
190 SENATI-Computación e Informática
ción con VBA
Private Sub mnuCut_Click (Index As Integer)
Select Case Index
Case 0 „ Comando Cortar
CopyActiveControl „Llama a procedimientos generales
ClearActiveControl
Case 1 „ Comando copiar.
CopyActiveControl
Case 2 „ Comando borrar.
ClearActiveControl
Case 3 „ Comando Pegar.
PasteActiveControl
Case Else
frmFind.Show „ Muestra el cuadro de diálogo Buscar.
End Select
End Sub
o
Select Case TipoUsuario
Case “Supervisor”
„ Proporciona al usuario privilegios de Supervisor
...
...
Case “Usuario”
„ Proporciona al usuario privilegios de Usuario
...
...
Case Else
„ Proporciona al usuario privilegio de invitado
...
...
End Select
Observe que la estructura Select Case evalúa una expresión cada vez que al
principio de la estructura. Por el contrario, la estructura If...Then...Else puede
evaluar una expresión diferente en cada sentencia ElseIf. Sólo puede sustituir una
esructura If...Then...Else con una estructura Select Case si la intrucción If y cada
instrucción ElseIf evalúa la misma expresión.
SENATI-Computación e Informática 191
Microsoft Office
Excel 2007
Otros Ejemplos
If Ventas > 100000 Then
strDscto = Format (0.10, “Fixed”)
ElseIf Ventas > 50000 Then
strDscto = Format (0.05, “Fixed”)
Else
strDscto = Format (0.02, “Fixed”)
End If
Select Case Cantidad
Case 1
sngDscto = 0.0
Case 2, 3
sngDscto = 0.05
Case 4 To 6
sngDscto = 0.10
Case Else
sngDscto = 0.20
End Select
intRpta = MsgBox (“Guarda cambios antes de salir” , vbYesNo)
Select Case intRpta
Case vbYes
GuardarCambios
Unload Me
Case vbNo
Unload Me
End Select
Bucles For … Next, While .. Do
Las estructuras de repetición o bucle le permiten ejecutar una o más líneas de
código repetidamente. Las estructuras de repetición que acepta Visual Basic son:
Do...Loop
For...Next
For Each...Next
192 SENATI-Computación e Informática
ción con VBA
Do...Loop
Utilice el bucle Do para ejecutar un bloque de sentencias un número indefinido
de veces. Hay algunas variantes en la sentencia Do...Loop, pero cada una evalúa
una condición numérica para determinar si continúa la ejecución. Como ocurre
con If...Then, la condición debe ser un valor o una expresión que dé como
resultado False (cero) o True (distinto de cero).
Do While condición
Sentencias
Loop
Cuando se ejecuta este bucle Do, primero evalúa condición. Si
condición es False (cero), se salta todas las sentencias. Si es True
(distinto de cero) Visual Basic ejecuta las sentencias, vuelve a la
instrucción Do While y prueba la condición de nuevo.
Por tanto, el bucle se puede ejecutar cualquier número de veces, siempre y
cuando condición sea distinta de cero o True. Nunca se ejecutan las sentencias si
condición es False inicialmente. Por ejemplo, este procedimiento cuenta las veces
que se repite una cadena destino dentro de otra cadena repitiendo el bucle tantas
veces como se encuentre la cadena de destino:
Function ContarCadenas (cadenalarga, destino)
Dim posición, contador
posición = 1
Do While InStr (posición, cadenalarga, destino)
posición = InStr (posición, cadenalarga, destino)+1
contador = contador + 1
Loop
ContarCadenas = contador
End Function
Si la cadena destino no está en la otra cadena, InStr devuelve 0 y no se ejecuta el
bucle.
Otra variante de la instrucción Do...Loop
Do
Sentencias
Loop While condición
Se ejecuta las sentencias primero y prueba la condición después de
cada ejecución. Esta variación garantiza al menos una ejecución
de sentencias:
Hay otras dos variantes análogas a las dos anteriores, excepto en que repiten el
bucle siempre y cuando condición sea False en vez de True.
Hace el bucle cero o más veces Hace el bucle al menos una vez
Do Until condición Do
Sentencias Sentencias
Loop Loop Until condición
SENATI-Computación e Informática 193
Microsoft Office
Excel 2007
For...Next
Utiliza una variable llamada contador que incrementa o reduce su valor en cada
repetición del bucle. La sintaxis es la siguiente:
For contador = iniciar To finalizar [Step incremento]
Los argumentos contador,
iniciar, finalizar e incremento
son todos numéricos.
Sentencias
Next [contador]
El argumento incremento puede ser positivo
o negativo. Si incremento es positivo, iniciar
debe ser menor o igual que finalizar o no se
ejecutarán las sentencias del bucle.
Si incremento es negativo, iniciar debe ser mayor o igual que finalizar para que se ejecute el
cuerpo del bucle. Si no se establece Step, el valor predeterminado de incremento es 1.
Al ejecutar el bucle For, Visual Basic:
1. Establece contador al mismo valor que iniciar.
2. Comprueba si contador es mayor que finalizar. Si lo es, Visual Basic
sale del bucle. (Si incremento es negativo, Visual Basic comprueba si
contador es menor que finalizar.)
3. Ejecuta las sentencias.
4. Incrementa contador en 1 o en incremento, si se especificó.
5. Repite los pasos 2 a 4.
Este código imprime los nombres de todas las fuentes de pantalla disponibles:
Private Sub Form-Click ( )
Dim I As Integer
For i = 0 To Screen.FontCount
Print Screen.Fonts (i)
Next
End Sub
For Each...Next
El bucle For Each...Next es similar al bucle For...Next, pero repite un grupo de
sentencia por cada elemento de una colección de objetos o de una matriz en vez
de repetir las sentencias un número especificado de veces.
Esto resulta especialmente útil si no se sabe cuántos elementos hay en la
colección. He aquí la sintaxis del bucle For Each...Next:
194 SENATI-Computación e Informática
ción con VBAFor Each elemento In grupo
Sentencias
Next elemento
El siguiente ejemplo habilita todos los
Cuadro de Texto del formulario:
Private Sub ModoEdición ( )
Dim control
For Each control In form1.Controls
If TypeOf control Is TextBox Then
Control.Enabled = True
End If
Next control
End Sub
Tenga en cuenta las restricciones siguientes
cuando utilice For Each...Next:
Para las colecciones, elemento sólo puede
ser una variable Variant, una variable
Object genérica o un objeto mostrado en el
Examinador de objetos.
Para las matrices, elemento sólo puede ser
una variable Variant.
No puede utilizar For Each...Next con una
matriz de tipos definidos por el usuario
porque un Variant no puede contener un
tipo definido por el usuario.
Salida de una Estructura de Control
La instrucción Exit le permite salir directamente de un bucle For o de un bucle
Do. La sintaxis de la sentencia Exit es sencilla: Exit For puede aparecer tantas
veces como sea necesario dentro de un bucle For y Exit Do puede aparecer
tantas veces como sea necesario dentro de un bucle Do:
For contador = iniciar To finalizar [Step incremento]
[bloque sentencias]
[Exit For]
[bloque sentencias]
Next [contador]
Do [{While / Until} condición]
[bloque de sentencias]
[Exit Do]
[bloque de sentencias]
Loop
Do
[bloque de sentencias]
[Exit Do]
[bloque de sentencias]
Loop [{While / Until} condición]
Exit For y Exit Do
Son muy útiles ya que, algunas veces, resulta
apropiado salir inmediatamente de un bucle sin
realizar más iteraciones o sentencias dentro del
bucle.
Cuando utilice la instrucción Exit para salir de
un bucle, el valor de la variable contador
difiere, dependiendo de cómo haya salido del
bucle:
Cuando termina un bucle, la variable
contador contiene el valor del límite
superior más el paso.
Cuando sale de un bucle prematuramente,
la variable contador conserva su valor
según las reglas usuales del alcance.
Cuando sale antes del final de una
colección, la variable contador contiene
Nothing si se trata de un tipo de dato
Object y Empty si es un tipo de dato
Variant.
SENATI-Computación e Informática 195
Microsoft Office
Excel 2007
Trabajar con rangos de celda
Utilizando la notación A1
Puede hacer referencia a una celda o rango de celdas del estilo de referencia A1
utilizando el método Range.
La siguiente subrutina cambia el formato de las celdas A1:D5 a negrita.
Sub FormatoRango()
Workbooks("Libro1").Sheets("Hoja1").Range("A1:D5").Font.Bold = True End
Sub
La siguiente tabla muestra algunas referencias de estilo A1 utilizando el método
Range.
Referencia
Significado
Range("A1")
Celda A1
Range("A1:B5")
Celdas de la A1 a la B5
Range("C5:D9,G9:H16")
Selección de varias
áreas
Range("A:A")
Columna A
Range("1:1")
Fila 1
Range("A:C")
Columnas de la A a la C
Range("1:5")
Filas de la 1 a la 5
Range("1:1,3:3,8:8")
Filas 1, 3 y 8
Range("A:A,C:C,F:F")
Columnas A, C y F
Hacer referencia a celdas utilizando números de índice
Esta propiedad devuelve un objeto Range que representa una sola celda.
En el siguiente ejemplo, Cells(6,1) devuelve la celda A6 de la hoja Hoja1.
Entonces, la propiedad Value se establece en 10.
Sub IngreseValor()
Worksheets("Hoja1").Cells(6, 1).Value = 10
End Sub
196 SENATI-Computación e Informática
ción con VBA
La propiedad Cells funciona bien para ejecutar bucles en un rango de celdas, ya
que puede sustituir las variables por los números de índice, como se muestra en el
siguiente ejemplo.
Sub CicloHojas()
Dim Contador As Integer
For Contador = 1 To 20
Worksheets("Hoja1").Cells(Contador,3).Value = Contador
Next Contador
End Sub
Hacer referencia a filas y columnas
Estas propiedades devuelven un objeto Range que representa un rango de celdas.
En el siguiente ejemplo, Rows(1) devuelve la fila uno de la hoja Hoja1.
A continuación, la propiedad Bold del objeto Font del rango se establece en True.
Sub FilasNegrita()
Worksheets("Hoja1").Rows(1).Font.Bold = True
End Sub
La siguiente tabla muestra algunas referencias de fila y columna, utilizando las
propiedades Rows y Columns.
Referencia Significado
Rows(1) Fila uno
Rows Todas las filas de la hoja de cálculo
Columns(1) Columna uno
Columns("A") Columna uno
Columns Todas las columnas de la hoja de cálculo
Para trabajar con varias filas o columnas al mismo tiempo, cree una variable de
objeto y utilice el método Union, combinando varias llamadas a la propiedad
Rows o Columns.
SENATI-Computación e Informática 197
Microsoft Office
Excel 2007
El siguiente ejemplo cambia a negrita el formato de las filas uno, tres y cinco de
la hoja de cálculo uno del libro activo.
Sub FilasNegritaVarios()
Worksheets("Hoja1").Activate Dim
myUnion As Range
Set myUnion = Union(Rows(1), Rows(3), Rows(5))
myUnion.Font.Bold = True
End Sub
Hacer referencia a celdas utilizando una notación abreviada
Puede utilizar el estilo de referencia A1 o un rango con nombre entre paréntesis
como método abreviado para la propiedad Range.
No es necesario escribir la palabra "Range" o utilizar comillas, como se muestra
en los siguientes ejemplos.
Sub BorrarRango()
Worksheets("Hoja1").[A1:B5].ClearContents
End Sub
Sub AsinarValor()
[MyRange].Value = 30
End Sub
Hacer referencia a rangos con nombre
Es más sencillo identificar los rangos por nombre que por la notación A1. Para
asignar un nombre a un rango seleccionado, haga clic en el cuadro de nombre
situado a la izquierda de la barra de fórmulas, escriba un nombre y, a
continuación, presione la tecla ENTRAR.
Hacer referencia a un rango con nombre
El siguiente ejemplo hace referencia al rango denominado "MiRango" en el libro
"Libro1.xls".
Sub FormatoRango ()
Range("Libro1.xls!MiRango").Font.Italic = True
End Sub
198 SENATI-Computación e Informática
ción con VBA
El siguiente ejemplo hace referencia al rango de hojas de cálculo específico
denominado "Hoja1!Ventas" en el libro "Libro1.xls".
Sub FormatSales()
Range("[Libro1.xls]Hoja1!Ventas").BorderAround Weight:=xlthin
End Sub
Para seleccionar un rango con nombre utilice el método GoTo, que activa el libro
y la hoja de cálculo y, a continuación, selecciona el rango.
Sub LimpiaRango()
Application.Goto Reference:="Libro1.xls!MiRango"
Selection.ClearContents
End Sub
El siguiente ejemplo muestra cómo se escribiría el mismo procedimiento para el
libro activo.
Sub LimpiarRango()
Application.Goto Reference:="MiRango"
Selection.ClearContents
End Sub
Ejecutar un bucle en las celdas de un rango con nombre
El siguiente ejemplo ejecuta un bucle en cada una de las celdas de un rango con
nombre utilizando un bucle For Each...Next. Si el valor de cualquiera de las
celdas del rango supera el valor de limit, el color de la celda cambia a amarillo.
Sub AplicarColor()
Const Limit As Integer = 25
For Each c In Range("MiRango")
If c.Value > Limit Then
c.Interior.ColorIndex = 27
End If
Next c
End Sub
SENATI-Computación e Informática 199
Microsoft Office
Excel 2007
Hacer referencia a celdas en relación con otras celdasUna manera de trabajar con una celda relacionada con otra es utilizar la
propiedad Offset.
El siguiente ejemplo asigna un formato de doble subrayado al contenido de la
celda situada una fila más abajo y a tres columnas de la hoja de cálculo activa.
Sub SubrayadoDoble()
ActiveCell.Offset(1, 3).Font.Underline = xlDouble
End Sub
Nota. Puede grabar macros que utilicen la propiedad Offset en lugar en
referencias absolutas. En el menú Herramientas elija Macro, haga clic en Grabar
nueva macro, haga clic en Aceptar y, a continuación, en el botón Referencia
relativa en la barra de herramientas de grabación de macros.
Para ejecutar un bucle en un rango de celdas, utilice en el rango una variable con
la propiedad Cells. El siguiente ejemplo rellena las primeras 20 celdas de la
tercera columna con valores entre 5 y 100, en incrementos de 5.
La variable contador se utiliza como índice de fila para la propiedad Cells.
Sub HojasValores()
Dim contador As Integer
For contador = 1 To 20
Worksheets("Hoja1").Cells(contador, 3).Value = contador * 5
Next contador
End Sub
Hacer referencia a celdas usando un objeto Range
Si establece una variable de objeto para un objeto Range, puede manipular
fácilmente el rango utilizando el nombre de la variable.
El siguiente procedimiento crea la variable de objeto myRange y, a continuación,
asigna la variable al rango A1:D5 de la hoja Hoja1 del libro activo. Las
instrucciones posteriores modifican las propiedades del rango, sustituyendo el
nombre de la variable por el objeto del rango.
Sub Aleatorio()
Dim MiRango As Range
Set MiRango = Worksheets("Hoja1").Range("A1:D5")
MiRango.Formula = "=RAND()"
MiRango.Font.Bold = True
End Sub
200 SENATI-Computación e Informática
ción con VBA
Hacer referencia a todas las celdas de la hoja de cálculo
Al aplicar la propiedad Cells a una hoja de cálculo sin especificar un número de
índice, el método devuelve un objeto Range que representa todas las celdas de la
hoja de cálculo. El siguiente procedimiento Sub borra el contenido de todas las
celdas de la hoja Hoja1 del libro activo.
Sub ClearSheet()
Worksheets("Hoja1").Cells.ClearContents
End Sub
Hacer referencia a varios rangos
Utilizando el método apropiado puede hacer referencia fácilmente a varios
rangos. Utilice los métodos Range y Union para hacer referencia a cualquier
grupo de rangos; utilice la propiedad Areas para hacer referencia al grupo de
rangos seleccionados en una hoja de cálculo.
Usar la propiedad Range
Puede hacer referencia a varios rangos con la propiedad Range, pero debe poner
comas entre dos o más referencias.
El siguiente ejemplo borra el contenido de los tres rangos de la hoja Hoja1.
Sub ClearRanges()
Worksheets("Hoja1").Range("C5:D9,G9:H16,B14:D18"). _
ClearContents
End Sub
Los rangos con nombre permiten que la propiedad Range funcione más
fácilmente con varios rangos.
El siguiente ejemplo funciona cuando los tres rangos con nombre están en la
misma hoja.
Sub BorrarNombres()
Range("MiRango, TLista, TValores").ClearContents
End Sub
Usar el método Union
Puede combinar varios rangos en un objeto Range utilizando el método Union.
El siguiente ejemplo crea un objeto Range denominado myMultipleRange, los
define como A1:B2 y C3:D4 y, a continuación, asigna el formato de negrita a los
rangos combinados.
SENATI-Computación e Informática 201
Microsoft Office
Excel 2007
Sub MultiplesRangos()
Dim r1, r2, MiMultiplesRangos As Range
Set r1 = Sheets("Hoja1").Range("A1:B2")
Set r2 = Sheets("Hojat1").Range("C3:D4")
Set MiMultiplesRangos = Union(r1, r2)
MiMultiplesRangos.Font.Bold = True
End Sub
Usar la propiedad Areas
Puede utilizar la propiedad Areas para hacer referencia al rango o conjunto de
rangos seleccionados en una selección de varias áreas.
El siguiente procedimiento cuenta las áreas de la selección. Si existe más de un
área, se muestra un mensaje de advertencia.
Sub BusquedaMultiple()
If Selection.Areas.Count > 1 Then
MsgBox "Existe más de una area de selección…"
End If
End Sub
Bucles en un rango de celdas
Al utilizar Visual Basic, con frecuencia necesitará ejecutar el mismo bloque de
instrucciones en cada una de las celdas de un rango. Para ello, combine una
instrucción de repetición y uno o más métodos para identificar cada celda, una a
una, y ejecutar la operación.
Una manera de ejecutar un bucle en un rango es utilizar el bucle For...Next con la
propiedad Cells. Al utilizar la propiedad Cells, puede sustituir el contador del
bucle, u otras variables o expresiones, por el número de índice de las celdas.
En el siguiente ejemplo se sustituye la variable contador por el índice de fila. El
procedimiento ejecuta un bucle en el rango C1:C20, estableciendo en 0 (cero)
cualquier número cuyo valor absoluto sea menor que 0,01.
Sub EstableceCero1()
For Contador = 1 To 20
Set curCell = Worksheets("Hoja1").Cells(Contador, 3)
If Abs(curCell.Value) < 0.01 Then curCell.Value = 0
Next Contador
End Sub
202 SENATI-Computación e Informática
ción con VBA
Otra manera sencilla de ejecutar un bucle en un rango es utilizar el bucle For
Each...Next en el conjunto de celdas devuelto por el método Range. Visual Basic
establece automáticamente una variable de objeto para la siguiente celda cada vez
que se ejecuta el bucle.
El siguiente procedimiento realiza un bucle en el rango A1:D20, estableciendo en
0 (cero) cualquier número cuyo valor absoluto sea menor que 0.01.
Sub EstableceCero2()
For Each c In Worksheets("Hoja1").Range("A1:D10").Cells
If Abs(c.Value) < 0.01 Then c.Value = 0
Next
End Sub
Si no conoce los límites del rango en que desea ejecutar el bucle, puede utilizar la
propiedad CurrentRegion para devolver el rango que rodea la celda activa.
Por ejemplo, el siguiente procedimiento, cuando se ejecuta desde una hoja de
cálculo, ejecuta un bucle en el rango que rodea la celda activa, estableciendo en 0
(cero) todos los números cuyo valor absoluto sea menor que 0.01.
Sub EstableceCero3()
For Each c In ActiveCell.CurrentRegion.Cells
If Abs(c.Value) < 0.01 Then c.Value = 0
Next
End Sub
Seleccionar y activar celdas
Al trabajar con Microsoft Excel, normalmente selecciona una o varias celdas y, a
continuación, realiza una acción, como darles formato o escribir valores. En
Visual Basic normalmente no es necesario seleccionar las celdas antes de
modificarlas.
Por ejemplo, si desea escribir una fórmula en la celda D6 utilizando Visual Basic,
no es necesario seleccionar el rango D6. Sólo necesita devolver el objeto Range
y, a continuación, establecer la propiedad Formula en la fórmula que desee, como
se muestra en el siguiente ejemplo.
Sub IngreseFormula()
Worksheets("Hoja1").Range("D6").Formula = "=SUM(D2:D5)"
End Sub
Para obtener ejemplos sobre cómo utilizar métodos para controlar las celdas sin
seleccionarlas, consulte Cómo hacer referencia a celdas y rangos.
SENATI-Computación e Informática 203
Microsoft Office
Excel 2007
Usar el método Select y la propiedad Selection
El método Select activa las hojas y los objetos de las hojas; la propiedad
Selection devuelve un objeto que representa la selección actual de la hoja activa
del libro activo.Antes de utilizar la propiedad Selection, debe activar un libro,
activar o seleccionar un hoja y, a continuación, seleccionar un rango, u otro
objeto, con el método Select.
La grabadora de macros suele crear una macro que utiliza el método Select y la
propiedad Selection.
El siguiente procedimiento Sub se creó utilizando la grabadora de macros, y
muestra cómo trabajan juntas Select y Selection.
Sub Macro1()
Sheets("Hoja1").Select
Range("A1").Select
ActiveCell.FormulaR1C1 = "Nombres"
Range("B1").Select
ActiveCell.FormulaR1C1 = "Direccion"
Range("A1:B1").Select
Selection.Font.Bold = True
End Sub
El siguiente ejemplo realiza la misma tarea, sin activar ni seleccionar la hoja de
cálculo ni las celdas.
Sub Etiquetas()
With Worksheets("Hoja1")
.Range("A1") = "Nombres"
.Range("B1") = "Direccion"
.Range("A1:B1").Font.Bold = True
End With
End Sub
Seleccionar celdas en la hoja de cálculo activa
Si utiliza el método Select para seleccionar celdas, recuerde que Select sólo
funciona en la hoja de cálculo activa. Si ejecuta el procedimiento Sub desde el
módulo, el método Select devuelve un error a menos que el procedimiento active
la hoja de cálculo antes de utilizar el método Select en un rango de celdas.
Por ejemplo, el siguiente procedimiento copia una fila de la hoja "Hoja1" a la
hoja "Hoja2" del libro activo.
204 SENATI-Computación e Informática
ción con VBA
Sub CopiarFilas()
Worksheets("Hoja1").Rows(1).Copy
Worksheets("Hoja2").Select
Worksheets("Hoja2").Rows(1).Select
Worksheets("Hoja2").Paste
End Sub
Activar una celda en una selección
Puede utilizar el método Activate para activar una celda en una selección. Sólo
puede haber una celda activa, aunque se haya seleccionado un rango de celdas.
El siguiente procedimiento selecciona un rango y, a continuación, activa una
celda del rango sin cambiar la selección.
Sub ActivarRango()
Worksheets("Hoja1").Activate
Range("A1:D4").Select
Range("B2").Activate
End Sub
Trabajar con rangos 3D
Si trabaja con el mismo rango en más de una hoja, utilice la función Array para
especificar dos o más hojas a seleccionar.
El ejemplo siguiente da formato al borde de un rango tridimensional de celdas.
Sub FormatoHojas()
Sheets(Array("Hoja2", "Hoja3", "Hoja5")).Select
Range("A1:H1").Select
Selection.Borders(xlBottom).LineStyle = xlDouble
End Sub
El ejemplo siguiente aplica el método FillAcrossSheets para transferir los
formatos y datos del rango de la hoja Hoja2 a los rangos correspondientes de
todas las hojas de cálculo del libro activo.
Sub FormatoTodasHojas()
Worksheets("Hoja2").Range("A1:H1").Borders(xlBottom).LineStyle=xlDouble
Worksheets.FillAcrossSheets (Worksheets("Hoja2").Range("A1:H1"))
End Sub
SENATI-Computación e Informática 205
Microsoft Office
Excel 2007
Trabajar con la celda activa
La propiedad ActiveCell devuelve un objeto Range que representa la celda que
está activa. Puede aplicar cualquiera de las propiedades o los métodos de un
objeto Range a la celda activa, como en el ejemplo siguiente.
Sub CeldaActiva1()
Worksheets("Hoja1").Activate
ActiveCell.Value = 35
End Sub
Nota. Sólo se puede trabajar con la celda activa cuando la hoja de cálculo en la
que se encuentra sea la hoja activa.
Mover la celda activa
Puede utilizar el método Activate para designar cuál es la celda activa. Por
ejemplo, el siguiente procedimiento convierte B5 en la celda activa y, a
continuación, le da formato de negrita.
Sub CeldaActiva2()
Worksheets("Hoja1").Activate
Worksheets("Hoja1").Range("B5").Activate
ActiveCell.Font.Bold = True
End Sub
Nota. Para seleccionar un rango de celdas, use el método Select. Para activar sólo
una celda, utilice el método Activate.
Puede utilizar la propiedad Offset para pasar a la celda activa.
El siguiente procedimiento inserta texto en la celda activa del rango seleccionado
y, a continuación, mueve la celda activa una celda a la derecha, sin cambiar la
selección.
Sub MoverDatos()
Worksheets("Hoja1").Activate
Range("A1:D10").Select
ActiveCell.Value = "Total Mensual"
ActiveCell.Offset(0, 1).Activate
End Sub
206 SENATI-Computación e Informática
ción con VBA
Seleccionar las celdas que rodean la celda activa
La propiedad CurrentRegion devuelve un rango de celdas limitadas por filas y
columnas en blanco.
En el siguiente ejemplo, la selección se amplía para incluir las celdas contiguas a
la celda activa que contiene datos. A continuación, se asigna el estilo Moneda a
este rango.
Sub Region()
Worksheets("Hoja1").Activate
ActiveCell.CurrentRegion.Select
Selection.Style = "Currency"
End Sub
Trabajo con libros y hojas
Hacer referencia a hojas por número de índice
Un número de índice es un número secuencial asignado a una hoja, según la
posición de su etiqueta, contando desde la izquierda, respecto a las hojas del
mismo tipo.
El siguiente procedimiento utiliza la propiedad Worksheets para activar la hoja
de cálculo uno del libro activo.
Sub SeleccionarHoja()
Worksheets(1).Activate
End Sub
Si desea trabajar con todos los tipos de hojas (hojas de cálculo, de gráficos, de
módulos y de diálogo), utilice la propiedad Sheets.
El siguiente procedimiento activa la hoja cuatro del libro.
Sub SeleccionarHoja()
Sheets(4).Activate End
Sub
Hacer referencia a hojas por su nombre
Puede identificar las hojas por su nombre, utilizando las propiedades Worksheets
y Charts. Las siguientes instrucciones activan varias hojas del libro activo.
SENATI-Computación e Informática 207
Microsoft Office
,
Excel 2007
Puede utilizar la propiedad Sheets para devolver una hoja de cálculo, de gráficos,
de módulo o de cuadro de diálogo, incluidos todos en el conjunto Sheets.
El siguiente ejemplo activa la hoja denominada "hoja1" del libro activo.
Sub ActivarHoja()
Worksheets("hoja1").Activate
End Sub
El siguiente ejemplo activa la hoja denominada "grafico1" del libro activo.
Sub ActivarHojaGrafico()
Sheets("grafico1").Activate
End Sub
Añadir módulos VBA
Para añadir módulos seguir el siguiente procedimiento.
1. Hacer clic en la ficha , botón
2. Se abre la ventana de Visual Basic, hacer clic en el menú botón
3. Se presenta la ventana de programación de módulo.
Trabajar con UserForms
Para añadir formularios seguir el siguiente procedimiento.
1. Hacer clic en la ficha , botón
2. Se abre la ventana de Visual Basic, hacer clic en el menú
208 SENATI-Computación e Informática
ción con VBA
Botón
3. Se presenta la ventana de formulario
Uso de controles de formulario
A continuación se describe el uso de controles de un formulario
Control Marco (Frame)
Este control permite agrupar otros controles para darle mayor funcionalidad a la
interfaz. Los controles Botones de Opción necesariamente tienen que estar
agrupados por el control Marco. Para agrupar controles, dibuje primero el control
Marco y, a continuación, dibuje los controles dentro de Marco.
Propiedades
Caption Título de marco.
Enabled Determina si está habilitado para responder a las acciones del
usuario.
Name Nombre del control.
Visible Determina si el Marco y los controles que contiene están
visibles o no.Control Casilla de Verificación (CheckBox)
Las casillas de verificación se utilizan para proporcionar al usuario opciones de
tipo Si/No o Verdadero/Falso. Cuando el usuario selecciona una opción (activa la
casilla), aparece una marca de verificación () dentro de la casilla.
Propiedades
Caption Descripción que acompaña a la casilla.
Enabled True/False. Determina si está habilitado para responder a las
acciones del usuario.
Name Nombre del control.
SENATI-Computación e Informática 209
Microsoft Office
Excel 2007
Value 0 – Unchecked (Vacío, no marcado)
1 – Checked (Marcado)
2 – Grayed (Gris, Indefinido)
Visible Determina si la casilla está visible o no.
Eventos
Click Ocurre cuando el usuario hace clic sobre la casilla.
Control Botón de Opción (OptionButton)
Estos controles se utilizan para que el usuario seleccione una
opción de un grupo opciones. La opción seleccionada tiene un punto en el centro.
Propiedades
Caption Descripción que acompaña a la opción.
Enabled True/False. Determina si está habilitado para responder a las
acciones del usuario.
Name Nombre del control.
Value True/False, marcado o no marcado.
Visible True/False.
Determina si el
botón está visible
o no.
Eventos
Click Ocurre cuando el
usuario hace clic
sobre el botón.
210 SENATI-Computación e Informática
ción con VBA
Control Cuadro de Lista (ListBox)
Un control ListBox muestra una lista de elementos entre los cuales el
usuario puede seleccionar uno o más elementos. Si el número de elementos
supera el número que puede mostrarse, se agregará automáticamente una barra de
desplazamiento al control ListBox
La propiedad List es un arreglo que contiene los elementos de la lista, y comienza
con índice 0. La propiedad ListCount establece el número total de elementos de
la lista. La propiedad ListIndex contiene el índice del elemento seleccionado, el
cual es un número entre 0 (primer elemento) y el número total de elementos en la
lista –1 (ListCount – 1). Si no se selecciona ningún elemento, el valor de la
propiedad ListIndex será –1.
La propiedad NewIndex contiene el índice del último elemento añadido a la lista.
Esto puede ser útil si desea hacer algo con el elemento añadido, por ejemplo, que
sea el elemento actualmente seleccionado.
Propiedades
Enabled True/False. Determina si el control responde a las acciones del
usuario.
List Arreglo con los elementos de la lista.
ListCount Número de elementos de la lista.
ListIndex Elemento seleccionado.
MultiSelect Establece si es posible seleccionar varios elementos o uno
solo.
Name Nombre del control.
Selected Arreglo de valores lógicos paralelo y del mismo tamaño al
arreglo list, indica que elementos han sido seleccionados
(True) de la lista. Se utiliza en lugar de ListIndex cuando
establecemos la propiedad Multiselect en 1 ó 2.
Sorted True/False. Establece los elementos se ordenan
alfabéticamente.
Style Establece el comportamiento del control.
Text Devuelve el elemento seleccionado en el cuadro de lista; el
valor de retorno es siempre equivalente al que devuelve la
expresión List(ListIndex). Es de sólo lectura en tiempo de
diseño y es de sólo lectura en tiempo de ejecución.
Métodos
AddItem Permite añadir nuevos elementos a la lista.
RemoveItem Permite eliminar elementos de la lista.
SENATI-Computación e Informática 211
Microsoft Office
Excel 2007
Eventos
Click Ocurre cuando el usuario interactúa con el control.
Ejemplos:
Muestra en el Cuadro de Texto
txtGaseosa el elemento seleccionado
Private Sub lstGaseosas_Click()
txtGaseosa.Text =
lstGaseosas.Text
End Sub
Añade un nuevo elemento al Cuadro de Lista lstGaseosas
Private Sub cmdAgregar_Click()
Dim strNuevoElemento As String
strNuevoElemento = InputBox("Ingrese una nueva gaseosa:", _
"Nueva gaseosa")
If Trim(strNuevoElemento) <> "" Then
lstGaseosas.AddItem strNuevoElemento
End If
End Sub
Elimina el elemento actual del Cuadro de Lista lstGaseosas
Private Sub cmdEliminar_Click()
If lstGaseosas.ListIndex <> -1 Then
lstGaseosas.RemoveItem lstGaseosas.ListIndex
End If
End Sub
Control Cuadro Combinado (ComboBox)
Un control ComboBox combina las características de un control
TextBox y un control ListBox; los usuarios pueden introducir información en la
parte del cuadro de texto o seleccionar un elemento en la parte de cuadro de lista
del control.
212 SENATI-Computación e Informática
ción con VBA
Para agregar o eliminar elementos en un control ComboBox, se usa el método
AddItem o RemoveItem. Establezca las propiedades List, ListCount y ListIndex
para permitir a un usuario tener acceso a los elementos de un control ComboBox.
Como alternativa, puede agregar elementos a la lista mediante la propiedad List
en tiempo de diseño.
Propiedades
Enabled True/False. Determina si el control responde a las acciones del
usuario.
List Arreglo con los elementos de la lista.
ListCount Número de elementos de la lista
ListIndex Elemento seleccionado.
Name Nombre del control.
Sorted True/False. Establece si los elementos se ordenan
alfabéticamente.
Style Establece el comportamiento del control.
Text Texto que contiene el control.
Métodos
AddItem Permite añadir nuevos elementos a la lista.
RemoveItem Permite eliminar elementos de la lista.
Eventos
Click Ocurre cuando el usuario interactúa con el control
Change Ocurre cuando el valor de la propiedad Text es modificado.
Constante
Valor
Descripción
vbComboDropDown
0
(Predeterminado) Cuadro combinado desplegable.
Incluye una lista desplegable y un cuadro de
texto.El Usuario puede seleccionar datos en la lista
o escribir en cuadro de texto.
vbComboSimple
1
Cuadro combinado simple. Incluye un cuadro de
texto y una lista, que no se despliega. Incremente
la propiedad Height para mostrar más elementos
de la lista.
vbComboDrop-
DownList
2
Lista desplegable. Este estilo sólo permite la
selección desde la lista desplegable.
SENATI-Computación e Informática 213
Microsoft Office
Excel 2007
Propiedad Style
Esta propiedad establece el comportamiento del control ComboBox, y puede
tomar los siguientes valores:
Ejemplo
En la siguiente interfaz se ilustra el uso del control ComboBox y la propiedad
Style.
Muestra la gaseosa seleccionada por el usuario en la etiqueta lblGaseosa
Private Sub cboGaseosas_Click()
lblGaseosa.Caption = cboGaseosas.Text
End Sub
Actualiza la etiqueta lblGaseosa cuando el usuario modifica el control
cboGaseosas
Private Sub cboGaseosas_Change()
lblGaseosa.Caption = cboGaseosas.Text
End Sub
Muestra el encuestado seleccionado por el usuario en la etiqueta
lblEncuestado
Private Sub cboEncuestados_Click()
lblEncuestado.Caption = cboEncuestados.Text
End Sub
214 SENATI-Computación e Informática
ción con VBA
Muestra en la etiqueta lblCiudad el elemento seleccionado del control
cboCiudades
Private Sub cboCiudades_Click()
lblCiudad.Caption = cboCiudades.Text
End Sub
Funciones VBA InputBox, MsgBox
Una de las formas más simples de obtener información para y desde el usuario es
utilizandolas funciones MagBox e InpuBox respectivamente.
Función MsgBox()
Los cuadros de mensaje ofrecen un modo simple y rápido de consultar a los
usuarios por información simple o para permitirles tomar decisiones sobre el
camino que su programa debe tomar. Puede usar esta función para mostrar
diferentes tipos de mensaje y botones con los cuales el usuario da una respuesta.
Rpta = MsgBox("¿Está seguro de eliminar a este cliente?"
vbQuestion + vbYesNo, "Confirmación")
Función InpuBox()
La función InputBox muestra un mensaje en un cuadro de diálogo, espera que el
usuario escriba un texto o haga clic en un botón y devuelve un tipo String con el
contenido del cuadro de texto.
strCodigo = InputBox("Ingrese el código del cliente a
buscar:","Búsqueda", "CLI0001")
Metodo GetOpenfilename , GetSaveAsFileName
Función GetOpenfilename ()
Este método nos permite desplegar el cuadro de dialogo abrir (del menu archivo)
pero no abre el archivo indicado.
SENATI-Computación e Informática 215
Microsoft Office
Excel 2007
El método nos devuelve una cadena con la ruta y nombre del archivo
seleccionado.
Sintaxis
Object.GetOpenFilename(FileFilter,FilterIndex,Title,ButtonText,Multiselect)
Argumentos
FileFilter. Opcional. Una serie especifica con criterios de filtro de
archivo.
FilterIndex. Opcional. Los números del índice por defecto bajo criterios
de filtro de archivo.
Titulo. Opcional .El titulo del cuadro de dialogo. si se omite, el titulo..
mostrara "Abrir"
ButtonText. Solo para Macintosh
Multiselect. Opcional. Si es verdadero, se pueden seleccionar varios
nombres de archivos
El argumento Filtro de archivo determínalo que muestra el cuadro de
dialogo de los archivos del tipo lista desplegable. Consiste en pares de
series de filtro de archivo seguido del comodín especificado. Si se omite
sera por defecto : "All File(*.*),*.*"
Ejemplo
El argumento Filterindex especificara el tipo de archivo que aparece por defecto,
'el titulo del argumento es un texto que se despliega en la barra del título. si el
argumento de multiselect es verdadero,el usuario puede seleccionar varios
archivos(y se devolveran en una serie)
Private Sub CommandButton1_Click()
Dim filtrox As String
Dim FilterIndex As Integer
Dim titulo As String
Dim nombreArchivo As Variant
'Configurar Filtro para la lista de archivos
filtrox = "Archivos de texto (*.txt),*.txt," & _
"Word(*.doc),*.doc, " & _
"Excel (*.xls), *.xls, " & _
"Power Point(*.ppt), *.ppt, " & _
"Todos los archivos (*.*),*.* "
216 SENATI-Computación e Informática
ción con VBA
'Mostrar por defecto todos los archivos
FiltroIndex = 3
titulo = "Ejemplo"
'Obtener Nombre del archivo
nombreArchivo = Application.GetOpenFilename(FileFilter:=filtrox,
FilterIndex:=FiltroIndex, Title:=titulo)
TextBox1.Text = nombreArchivo
End Sub
Función GetSaveAsFileName
Permite grabar un archivo
Ejemplo
Private Sub CommandButton2_Click()
Dim FileSaveName As Variant
FileSaveName = Application.GetSaveAsFilename( _
Filefilter:="Libro de microsoft Office Excel (*.Xls), *.Xls," & "Ficheros de
TEXTO (*.TXT), *.TXT", _
Title:="Guardar Archivo", _
InitialFileName:="MyLibro666", _
FilterIndex:=1)
'Si Anulamos la operacion con Cancelar...
If FileSaveName = False Then
MsgBox "El libro no será Guardado", vbInformation + vbOKOnly,
"ATENCION:"
Exit Sub
End If
ActiveWorkbook.SaveAs Filename:=FileSaveName
End Sub
Crear y abrir libro
Crear un libro nuevo
Para crear un nuevo libro en Visual Basic, utilice el método Add. El siguiente
procedimiento crea un nuevo libro. Microsoft Excel asigna automáticamente el
SENATI-Computación e Informática 217
Microsoft Office
Excel 2007
nombre BookN al libro, donde N es el siguiente número disponible. El nuevo
libro se convertirá en el libro activo.
Sub CrearNuevoLibro()
Workbooks.Add
End Sub
Abrir un libro
Al abrir un nuevo libro utilizando el método Open, se convierte en un miembro
del conjunto Workbooks.
El siguiente procedimiento abre un libro denominado Amortizacion.xls, ubicado
en la carpeta SENATI de la unidad C.
Sub AbrirLibro()
Workbooks.Open("C:\SENATI\Amortizacion.xls")
End Sub
Cuestionarios
1. Realice un formulario aplicativo de acuerdo a las necesidades de su área donde
labores, donde pueda aplicar los conocimiento aprendidos en programación.
2. Crear un formulario aplicativo que permita ingresar una contraseña al abrir una
hoja de cálculo.
3. Crear un atajo que permita llamar a un formulario que contiene un calendario.
218 SENATI-Computación e Informática
ción con VBA
Ejercicios utilizando Macro, Formulario y VBA
Ejercicio 1: Números primos
Grabar el archivo con el nombre primo.xls
Option Explicit
Sub primos() ' Igual que primos pero evitando usar etiquetas y goto
Dim i As Long
Dim j As Long
Dim p As Long
Dim n As Long
Dim primo As Boolean
n = InputBox("¿Hasta que número? (máximo 821507)", "Calculo de primos")
p = 1
Application.Workbooks("primos.xls").Sheets("Hoja1").Range("c6").Select
ActiveCell.Value = 2
ActiveCell.Offset(1, 0).Value = 3
For i = 5 To n Step 2
primo = True
For j = 3 To Sqr(i) Step 2
If (i / j) - Int(i / j) = 0 Then primo = False: Exit For
Next j
If primo Then
p = p + 1
ActiveCell.Offset(p, 0).Value = i
End If
Next i End
Sub
Sub Limpiar()
Range("B6").Select
Selection.CurrentRegion.Select
Selection.ClearContents
Range("B6").Select
End Sub
SENATI-Computación e Informática 219
Microsoft Office
Excel 2007
Ejercicio 2: Fechas
Option Explicit
Sub nacimiento()
Dim dias As Integer, Dsemana As Integer, Factual As Date, d As String, cumple As Date
Rem Dsemana es una variable que da un número que indica el día de la semana
Rem dado por la función WEEKDAY, que en Excel es =DIASEM(fecha)
Static Fnacimiento As Date
Factual = Date 'Date es la función de VBA equivalente a =HOY()
Fnacimiento = Factual
Fnacimiento = InputBox(Prompt:="Introduzca su fecha de nacimiento", _
Title:="Formato DD-MM-AAAA", Default:=Fnacimiento)
dias = Factual - Fnacimiento
Dsemana = Application.WorksheetFunction.Weekday(Fnacimiento)
Select Case Dsemana
Case 1: d = "Domingo"
Case 2: d = "Lunes" Case
3: d = "Martes" Case 4: d =
"Miercoles" Case 5: d =
"Jueves" Case 6: d =
"Viernes" Case 7: d =
"Sabado" End Select
MsgBox Prompt:="Usted nació un " & d & " hace " & dias & " días" & Chr(10) _
& "Tiene " & CalEdad(Fnacimiento) & " Años", _
Title:="Esta información es correcta siempre que hoy sea " & Factual
End Sub
220 SENATI-Computación e Informática
ción con VBA
'Función que calcula la edad en años
Function CalEdad(Fnacimiento As Date)
Dim Fecha As Date
CalEdad = Abs(DateDiff("yyyy", Fnacimiento, Date))
Fecha = DateAdd("YYYY", CalEdad, Fnacimiento)
If Fecha > Date Then CalEdad = CalEdad - 1
End Function
Sub Trimestres()
'Proporciona el trimestre en el que se encuentra una fecha
Dim LaFecha As Date
Dim Msj
LaFecha = InputBox("Escriba una fecha:")
Msj = "Trimestre: " & DatePart("q", LaFecha)
'DatePart es una función VBA
MsgBox Msj
End Sub
Ejercicio3: TIR
Option Explicit
Sub CalculaTIR()
Range("F7").Value = 0
Range("H7").Value = 1
Do While Abs(Range("G8")) > 0.00001 'error admitido
If Range("G8") < 0 Then
Range("H7") = Range("G7")
Else
Range("F7") = Range("G7")
End If
'La siguiente línea se utiliza para retrasar la ejecución de la macro
'de esta forma se puede ver como converge la tasa a la TIR
Application.Wait Now + TimeValue("00:00:1")
Loop
End Sub
SENATI-Computación e Informática 221
Microsoft Office
Excel 2007
Ejercicio 4: =PAGO
Option Explicit
Sub prestamo()
Static Principal 'Variable estática. No cambia
Static Tasa
Static Terminos
Dim Pago As Double
Principal = Application.InputBox(Prompt:="Principal (100000 por jemplo)",Default:=Principal)
Tasa = Application.InputBox(Prompt:="Tipo de interés nominal anual (4,75 por ejemplo)", Default:=Tasa)
Terminos = Application.InputBox(Prompt:="Número de años (30 por ejemplo)",Default:=Terminos)
'Vea como se usa la función de Excel Pmt (Pago) sin necesidad de calcularla en una celda
Pago = Application.WorksheetFunction.Pmt(Tasa / 1200, Terminos * 12, Principal)
MsgBox Prompt:="La Mensualidad es " & Format(-Pago, "Currency"), Title:="Calculadora de Préstamos"
End Sub
Ejercicio 5: Listado de hojas
222 SENATI-Computación e Informática
ción con VBA
Option Explicit
Sub NombreHojas()
'Pone los nombres de las hojas, salvo la primera
Dim contador As Integer
For contador = 1 To Sheets.Count
With Sheets(1)
Cells(contador + 5, 6).Value = Sheets(contador).Name
End With
Next
End Sub
Sub Limpia()
Range("F6").Select
Selection.CurrentRegion.Select
Selection.ClearContents
Range("A1").Select
End Sub
Ejercicio 6: Eliminar registros en blanco
Option Explicit
Sub EliminarFilasEnBlanco()
Dim strC As String, lngFila As Long
With Worksheets("Hoja1") 'Nombre de la hoja
For lngFila = 1 To .UsedRange.Rows.Count
If WorksheetFunction.CountA(.Rows(lngFila)) = 0 Then strC = strC & lngFila & ":" & lngFila & ","
Next lngFila
Application.ScreenUpdating = False
.Range(Left(strC, Len(strC) - 1)).Delete
Application.ScreenUpdating = True
End With
End Sub
SENATI-Computación e Informática 223
Microsoft Office
Excel 2007
Ejercicio 7: Funciones personalizadas
Option Explicit
Function DiasLaborablesYSabados(Fecha_Inicial As Date, Fecha_Final As Date,
Optional Festivos As Range) As Long
Dim Laborables As Long
Dim i As Long
Dim c As Variant
Dim F As Long
Dim esta As Boolean
esta = False
Laborables = 0
If Festivos Is Nothing Then
For i = Fecha_Inicial To Fecha_Final
If i Mod 7 <> 1 Then
Laborables = Laborables + 1
224 SENATI-Computación e Informática
ción con VBA
End If
Next i
Else
For i = Fecha_Inicial To Fecha_Final
If i Mod 7 <> 1 Then
esta = False
For Each c In Festivos
F = CDate(c)
If i = F Then esta = True: Exit For
Next c
If Not esta Then Laborables = Laborables + 1
End If
Next i
End If
DiasLaborablesYSabados = Laborables
End Function
Ejercicio 8: Filtrar la base de datos
Sub Filtra()
Range("basedatos").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= _
Range("H5:K6"), CopyToRange:=Range("H12:K12"), Unique:=False
Range("A1").Select
End Sub
SENATI-Computación e Informática 225
Microsoft Office
Excel 2007
Sub Auto_Open()
'Copiamos y pegamos, con pegado especial valores, las celdas y9.ab9
'que son las que generan la base de datos.
Range("Y9:AB9").Select
Selection.Copy
Range("B6:E1005").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
'Nombramos la base de datos como basedatos
Range("B5").Select
Selection.CurrentRegion.Select
ActiveWorkbook.Names.Add Name:="basedatos", RefersToR1C1:="=Hoja1!R5C2:R1005C5"
Range("A1").Select
End Sub
Ejercicio 9: Eliminar valores duplicados de una lista
Option Explicit
Function CuentaListaA()
226 SENATI-Computación e Informática
ción con VBA
Application.Workbooks("EliminarValores.xls").Worksheets("Hoja1").Range("C5").Activate
Selection.End(xlDown).Select
CuentaListaA = ActiveCell.Row - 5
End Function
Sub Repetidos()
'Borra los elementos de la columna E que esten en la C
'Pero sólo los borra una vez. Si se repiten en C sólo borra el 1º
'Si se quiere que se eliminen todos quitar del programa la vble. "salir"
Dim posicion As Long
Dim salir As Boolean
Dim comodin
Dim respuesta As String * 5
Dim filasiniciales As Long
Dim filasfinales As Long
filasiniciales = CuentaListaA
Range("E6").Select
posicion = 1
While ActiveCell.Value <> ""
comodin = ActiveCell.Value
Range("C6").Select
salir = False
While ActiveCell.Value <> "" And salir = False
If ActiveCell.Value = comodin Then
ActiveCell.Font.Bold = True
respuesta = MsgBox("¿Deseas borrar la celda " & ActiveCell.Address & "?", 4, "¡¡Encontrado!!")
If respuesta = vbYes Then
'Edición, Eliminar, Desplazar las celdas hacia arriba
Selection.Delete Shift:=xlUp
End If
salir = True
Else
ActiveCell.Offset(1, 0).Select
End If
Wend
posicion = posicion + 1
Range("E6").Select
ActiveCell.Offset(posicion - 1, 0).Select
Wend
filasfinales = CuentaListaA
MsgBox "La Lista A inicialmente tenia " & filasiniciales & " filas." & Chr(13) _
& "Se han eliminado " & filasiniciales - filasfinales & " filas." & Chr(13) _
& "Por tanto, quedan " & filasfinales & " filas."
End Sub
SENATI-Computación e Informática 227
Microsoft Office
Excel 2007
Ejercicio 10: Rellenar y Eliminar registros de una lista
'En las celdas vacias de una tabla copia el valor de la celda precedente
Sub RellenarCeldas()
Range("B5").Select
228 SENATI-Computación e Informática