Professional Documents
Culture Documents
Roddy Rivas-Llosa M.
Presentación
En este documento encontrará un apretado resumen de los elementos esenciales de programación en el lenguaje Visual
Basic for Applications incluido en el paquete Microsoft Office 97. Con el propósito de clarificar la exposición, se ha
dividido el texto en dos secciones. En la primera se ofrece un marco de referencia general sobre el entorno y las
características del lenguaje de programación. En la segunda, se presenta una síntesis de las principales estructuras
funcionales y comandos incorporados en el lenguaje. Cabe notar que esta guía de referencia se concentra, sin pretender
ser exhaustiva, en la interacción del lenguaje Visual Basic con la aplicación Microsoft Excel 97.
*
Nota para el lector: este material debe considerarse como un complemento y no un sustituto de los apuntes y asistencia a clases.
Seminario de Informática Avanzada Lenguaje Visual Basic for Applications – Guía de referencia
Primera parte
Aspectos generales del entorno y del lenguaje
Con fines didácticos, distinguiremos tres aproximaciones o soluciones prácticas al problema de cómo crear
un programa en la computadora. Estos tres “estilos” se podrían denominar respectivamente grabación de
macros, programación de código fuente y programación mixta. Una breve reseña de los dos primeros y un
esquema intuitivo de la relación entre todos ellos se muestra en el cuadro siguiente.
CUADRO 1
LOS TRES ESTILOS DE PROGRAMACIÓN
Cuando el usuario registra un conjunto de operaciones manuales mediante el menú Herramientas / Macro /
Grabar nueva macro..., la computadora crea una secuencia de comandos automáticamente y le asigna un
nombre a esta secuencia. El programa generado de esta forma se conoce como “macro” y puede ser
posteriormente ejecutado mediante el menú Herramientas / Macro / Macros..., asignándolo a un objeto (tal
como un botón de comando), a una combinación de teclas o invocándolo mediante su nombre desde otra
macro o subrutina.
Las instrucciones que conforman una macro son accesibles para su revisión y edición a través del entorno de
programación de Visual Basic, al que puede ingresarse mediante el menú Herramientas / Macro / Editor de
Visual Basic o haciendo click derecho con el mouse sobre una etiqueta de hoja y seleccionando Ver código.
Una vez dentro de este entorno, se deberán localizar los llamados “Módulos”, que funcionan como
contenedores de instrucciones. Cada módulo puede contener una gran cantidad de programas independientes,
ya sea subrutinas o funciones1.
Si el usuario ingresa al entorno Visual Basic y allí elabora el programa enteramente, entonces se puede decir
que ha llevado a cabo la programación en código fuente. En contraste, la técnica de programación mixta
consiste en grabar una macro base (“macro de ejemplo”), que en sí misma no será ejecutada. A partir de ella,
el usuario adapta la secuencia de comandos autogenerada por la computadora en código fuente a sus
necesidades específicas.
¿Cuál es la diferencia esencial entre la grabación de macros y la edición de código fuente? Ya que una macro
es autogenerada por la computadora a medida que el usuario realiza una tarea, este tipo de programas no
1
Una subrutina es un programa diseñado para funcionar activamente y es capaz de cambiar los contenidos de la hoja de cálculo. Por
su parte, una función es un programa diseñado para realizar cálculos y devolver un valor, normalmente dependiente de ciertos
parámetros.
2
Seminario de Informática Avanzada Lenguaje Visual Basic for Applications – Guía de referencia
puede contener estructuras lógicas. A diferencia de un programa elaborado a nivel de código fuente, una
macro carece del potencial para tomar decisiones, llevar a cabo repeticiones automáticamente o interactuar
con el usuario.
Un proyecto de programación en Visual Basic se desarrolla en dos ámbitos: uno visual y otro operativo
(usualmente en este mismo orden). En el ámbito visual se crean ventanas que son utilizadas para interactuar
con el usuario. Estas ventanas son llamadas “formas” o “formularios” y contienen objetos de menor
jerarquía, tales como botones, textos estáticos, cuadros de texto, listas, opciones, marcos, imágenes, entre
otros. En el ámbito operativo, se crean “módulos” para contener las definiciones de variables, subrutinas y
funciones que llevarán a cabo los procesos y cálculos involucrados en el proyecto. Ambos, formularios y
módulos, se graban como parte integral del archivo XLS; aunque también es posible exportarlos como
archivos separados si se hace necesario.
Para crear una “forma” o “formulario” nuevo, debe ingresarse al entorno de programación de Visual Basic y
utilizar el menú Insertar / UserForm. Por su parte, para insertar un módulo para escribir programas en él, se
debe utilizar el menú Insertar / Módulo. Es importante no confundir los Módulos con los llamados Módulos
de clase, que no contienen subrutinas o funciones, sino que se utilizan para crear “objetos descendientes”,
una técnica refinada propia de la programación orientada a objetos.
Todo objeto (ya sea un formulario, un botón, una hoja de cálculo, etc.) tiene tres componentes esenciales:
propiedades, métodos y eventos. Las propiedades son piezas de información que se utilizan para
caracterizar al objeto. Considérese como ejemplo un formulario. Sus propiedades fundamentales podrían ser:
nombre interno (propiedad name), título (propiedad caption), posición (propiedades top y left), color de
fondo (propiedades backcolor y picture), tamaño (propiedades height y width) o tipo de letra (propiedad
font). Pero también puede contar con propiedades más específicas como tipo de borde o decoración.
Por su parte, los métodos son procedimientos que el usuario le ordena ejecutar al objeto. En el caso de un
formulario, por ejemplo, puede ordenársele mostrarse en la pantalla. A este método específico se le llama
Show y si el formulario se llamara internamente “MiVentana”, entonces el comando para mostrarlo sería
MiVentana.Show
El método complementario, que cierra un formulario, se llama UnLoad y se ordena así: Unload MiVentana
o, en caso de que la subrutina que lo invoca esté definida dentro del mismo formulario, se podría indicar
Unload Me
Finalmente, los eventos representan ocurrencias sobre un objeto. Así, cada vez que el usuario mueve el
puntero del ratón, presiona una tecla, abre o cierra una ventana, etc. , se “dispara” el evento correspondiente
para el objeto correspondiente. Cada evento se relaciona con una subrutina, que se activa automáticamente
cuando el evento ocurre. Por defecto, estas subrutinas (llamadas gestores de eventos) no contienen código
alguno. Al escribir código fuente dentro de los gestores de eventos, el usuario va añadiendo funcionalidad al
programa. Por ejemplo, si se desea programar qué debe ocurrir cuando el usuario presione un determinado
botón, en el entorno de diseño se deberá dar doble click a dicho objeto y seleccionar luego el evento Click en
la lista desplegable derecha del editor de código, donde se indican todos los eventos que es posible
interceptar. En el procedimiento que aparecerá de inmediato podrán escribirse los comandos que se desea
ejecutar al ocurrir el evento.
Típicamente, se debe iniciar todo proyecto haciendo un boceto del producto finalmente deseado, tratando de
responder a las siguientes preguntas: ¿qué características debe tener? ¿Qué información utiliza? ¿Qué
resultados genera? Y ¿cómo puede llegar a esos resultados?
Es recomendable iniciar un proyecto de programación por la fase visual: creando las ventanas que
constituirán la interfaz con el usuario. Muchas veces este tiempo invertido en el desarrollo del aspecto
3
Seminario de Informática Avanzada Lenguaje Visual Basic for Applications – Guía de referencia
estético contribuye a que el programador clarifique sus propias ideas sobre el funcionamiento del programa.
El resultado final de esta etapa debe ser un “prototipo no funcional”, es decir, un programa que se ve como
se debe ver el sistema final, pero no realiza ninguna operación compleja, salvo tal vez abrir o cerrar ventanas,
ya que los gestores de eventos de sus objetos se encuentran aún vacíos.
La segunda etapa podría abordar los problemas más elementales de funcionamiento, tales como colocar
botones en la hoja de cálculo para llamar a la ventana principal del programa y crear una macro de
autoejecución para que el programa principal se active al abrir el archivo XLS.
En una tercera etapa, el programador podría concentrarse en declarar las variables globales y escribir las
subrutinas y funciones de uso general. Para esto es necesario crear un módulo si el proyecto todavía no
tuviera uno. Normalmente estas rutinas se utilizan para recoger información general de la hoja de cálculo
(contar datos y verificar la presencia de errores, por ejemplo) o definir funciones del usuario.
Como cuarta etapa se puede llevar a cabo la fase esencial de la programación mixta, es decir, la grabación de
macros de ejemplo. Aquí el programador deberá tener cuidado en respetar tanto como le sea posible las
condiciones iniciales y finales al grabar cada macro2 y efectuar sólo las interacciones indispensables con la
computadora durante la grabación3.
Una vez grabadas las macros de ejemplo, la quinta etapa consiste en readaptarlas para cubrir las necesidades
del proyecto específico y escribir nuevas rutinas que no puedan ser ejemplificadas a través de macros. Esta
es posiblemente la fase más exigente de todo el proceso, ya que el programador se ve obligado a mantener
una idea clara del proyecto en su totalidad. Resulta óptimo que, de ser posible, la quinta etapa la lleve a cabo
un mismo equipo de personas en un solo período de tiempo continuo. No obstante, cuando el proyecto
resulta demasiado complejo, se hace necesario dividir el esfuerzo en varias sesiones. Por este motivo se
recomienda que esta etapa se desarrolle consultando permanentemente el boceto y manteniendo apuntes
sobre los nombres y tipos de variables creadas, las relaciones entre formularios y las celdas clave en las hojas
de cálculo para no perder de vista la estructura interna del programa.
La sexta y última etapa del proceso de creación de una aplicación se denomina depuración (debugging). Esta
fase consiste en llevar a cabo pruebas sobre el programa. Las pruebas deben tratar de ser tan exigentes como
sea posible, considerando casos extremos y atípicos, tales como la ejecución de la aplicación en una
computadora configurada con otros separadores decimales, zona horaria, tipo de video, tamaño de monitor,
etc. Es recomendable que una de las personas que prueba la aplicación no esté familiarizada con ella. Un
usuario sin experiencia puede cometer algunos errores valiosos, ya que le permitirán al programador evaluar
la robustez del programa ante situaciones imprevistas. La sexta etapa concluye con la corrección de los
problemas detectados y la comprobación del funcionamiento de la aplicación corregida4.
2
En la práctica, esto se traduce en prestar mucha atención a la posición del cursor y la hoja activa antes de empezar a grabar y justo
antes de terminar de grabar cada macro. Estas posiciones no deben dejarse al azar. El programador debe estar consciente de ellas
en todo momento, ya que de otro modo pueden ocasionar errores imprevistos.
3
Además, al utilizar la técnica de programación mixta se debe tener en cuenta que no todas las macros grabadas pueden ser
ejecutadas. En particular, algunas macros que operan sobre elementos gráficos como ejes y líneas de división no pueden ejecutarse,
ya que contienen errores al grabarse (este es un problema localizado dentro de MS Excel 97). Las únicas alternativas son corregir
manualmente el código fuente que contiene tales errores u optar por crear una nueva macro que utilice otro método operativo.
4
Al tratarse de aplicaciones críticas, se distingue una etapa adicional, conocida como optimización. En esta fase se mide la velocidad
de ejecución, la precisión, claridad y tamaño del programa, adaptando el código fuente para hacerlo lo más eficiente y compacto
posible. Todas las etapas anteriormente tratadas se acompañan de un proceso permanente de documentación, en el que se detalla el
funcionamiento del programa, tanto para el usuario como para otros programadores.
4
Seminario de Informática Avanzada Lenguaje Visual Basic for Applications – Guía de referencia
Segunda parte
Estructuras funcionales y comandos básicos del lenguaje
[Dirección]
Se refiere al valor de una celda específica en la hoja activa5.
Ejemplos:
[a1] = 10
[b9] = “Probando...”
Range(“Dirección”) o Range(“NombreDeRango”)
Se refiere a un rango específico (puede ser una celda o grupo de celdas)6.
Ejemplos:
Range(“A1”) = 2 ó Range(“A1”).Value = 2
Range(“A11:C22”) = “X” o Range(“A11:C22”).Value = “X”
Range(“B9:C15”).Formula = “=Aleatorio()”
Range(“D11”).ClearContents
Range(“C20”).Copy
Offset(numFilas, numColumnas)
Es una propiedad del objeto Range. Se refiere a un rango que se encuentra tantas filas y columnas hacia
abajo y a la derecha a partir del rango original como lo indican los parámetros de la propiedad.
Ejemplo:
Range(“B9”).Offset(3,1).Select
x = Sheets(“Datos”).Range(“C14”).Offset(i,j)
ActiveCell.Offset(3,2)=[A8].Offset(3,9)
Sheets(“Hoja”)
Se refiere a una hoja de cálculo del libro activo.
Ejemplos:
Sheets(“Hoja1”).Select
Sheets(“Hoja1”).Range(“B9”).Clear
Workbooks(“Libro”)
Se refiere a un libro de cálculo abierto.
Uso típico:
Workbooks(“Libro1”).Activate
Existen 13 tipos de datos incorporados en el lenguaje Visual Basic for Applications7. Sin embargo, los tipos
básicos son seis: integer, long, double, string, boolean y range. Ellos contienen, respectivamente, números
enteros cortor, enteros largos, reales, textos, valores lógicos y rangos de celdas.
Para declarar una variable se utiliza la palabra reservada DIM, seguida del nombre de la variable, la palabra
reservada AS y el nombre del tipo de variable8.
5
Aunque, en general, se prefiere la sintaxis Range a la sintaxis [ ] para gestionar información de la hoja de cálculo, ya que la
nomenclatura [ ] requiere el cumplimiento de ciertas precondiciones para operar correctamente.
6
Nótese que al omitir el nombre de la propiedad de un rango se interpreta por defecto como la propiedad Value.
7
El usuario puede crear tipos adicionales, además de arreglos (“matrices”) basadas en datos de cualquier tipo.
8
También se puede utilizar la palabra GLOBAL dentro de la zona de declaraciones de un módulo para que el ámbito de la variable se
extienda a todo el proyecto y no solamente al módulo en el que se declara (esta técnica es comúnmente utilizada para compartir
información entre distintas formas y módulos).
5
Seminario de Informática Avanzada Lenguaje Visual Basic for Applications – Guía de referencia
Debe evitarse el uso de nombres con tildes, espacios o caracteres internacionales. Los nombres de variables o
rutinas deben comenzar siempre por una letra y no deben entrar en conflicto con los nombres reservados del
lenguaje o nombres de objetos previamente definidos (es decir, deben ser únicos). Asimismo, debe
considerarse que este lenguaje no distingue entre letras mayúsculas y minúsculas respecto al nombre de
variables (para el contenido de variables de tipo texto sí hace distinción).
Ejemplos:
Dim I as Integer
Dim X,Y,Z as Double, S as String, OtraVariable as Boolean, Var123 as Double
Global NombreUsuario as String, NivelDeAcceso as integer
2.3 Subrutinas
Las subrutinas se declaran mediante la palabra reservada SUB, seguida del nombre de la subrutina y,
opcionalmente (entre paréntesis) la lista de argumentos y sus tipos. Las subrutinas no devuelven ningún valor
como respuesta, sino que se utilizan para ejecutar comandos que normalmente alteran la visualización, el
contenido o el formato de la hoja de cálculo9.
Ejemplos:
SUB CreaInforme()
...
END SUB
Préstese especial atención al emparejamiento de las cláusulas de apertura y cierre. Si existiese un SUB o un
END SUB de más, la computadora se negaría a ejecutar cualquier porción del programa.
Ejemplo10:
SUB EstoEstaMal()
...
END SUB
Nota importante: en caso de encontrarse un error en el código fuente, el programa resaltará con color
amarillo la línea de código identificable más cercana al error y la computadora entrará en un estado llamado
“modo de interrupción”. Antes de realizar cualquier corrección o ejecutar nuevamente el programa, debe
detenerse la ejecución y salir del modo de interrupción, presionando el botón de “detener” (el cuadrado azul
en la barra superior de herramientas) en el entorno de Visual Basic.
2.4 Funciones
Las funciones se declaran mediante la palabra reservada FUNCTION, seguida del nombre de la función,
entre paréntesis la lista de argumentos y sus tipos, si los tuviese, y el tipo de valor de salida. Dentro del
cuerpo de la función se debe incluir una línea de asignación de resultado, que asigne valor a una variable
implícitamente declarada con el mismo nombre y tipo devuelto por la función.
Ejemplos:
FUNCTION SinParametros() AS Integer
...
SinParametros = 1 ‘Aquí se asigna la respuesta
9
Para ejecutar una subrutina desde otra subrutina o función basta colocar su nombre como si fuera un comando incorporado. En caso
de tener argumentos, éstos se separan del nombre con un espacio y entre sí con comas (P.Ej. CreaOtroInforme 2,”Enero”,3 )
10
Nótese el uso del apóstrofe como indicador de que todo el texto que sigue en dicha línea es un comentario, que no ha de ser
ejecutado por la computadora.
6
Seminario de Informática Avanzada Lenguaje Visual Basic for Applications – Guía de referencia
END FUNCTION
Los Bucles o repeticiones funcionan como estructuras de automatización. Cuando el lenguaje encuentre estas
estructuras, repetirá un fragmento de código tantas veces como lo indique el usuario o mientras se cumpla
una condición lógica. Los bucles propiamente dichos se expresan mediante las palabras reservadas
FOR...TO...STEP...NEXT, mientras que las repeticiones (abiertas) se ingresan mediante la palabra reservada
DO WHILE...LOOP.
Ejemplos11:
DIM i, j, k AS INTEGER
FOR i = 1 TO 100 STEP 2
Range(“A1”).Offset(i,0) = i ^ 2
NEXT i
i=0
DO WHILE i < 100
Range(“A1”).Offset(i,0) = i
i = i + Range(“A1”).Offset(i,1) + 1
LOOP
2.6 Condicionales
Las estructuras condicionales se utilizan para programar la toma de decisiones en medio del programa. Las
formas básicas del condicional son dos: la forma corta y la forma larga. En ambos casos, las palabras
reservadas son IF...THEN...ELSE. En la forma larga, aparece la palabra ENDIF como cierre de la cláusula.
Ejemplos12:
IF x>0 THEN i = i + 1 ELSE q = r / 2
IF x>0 THEN
i=i+1
k=k*7
ELSE
i=i–1
k=k\7
ENDIF
11
Nótese que si en el segundo ejemplo no se incrementara el valor de la variable i la repetición nunca concluiría. De hecho, no es
posible saber a priori si esta repetición concluirá o no (si la celda B1 contuviera un –1 la repetición continuaría indefinidamente). En
estos casos, cuando se hace necesario detener la ejecución de un programa, basta presionar la combinación de teclas CTRL-Pausa.
12
Véase en el segundo ejemplo el uso del operador \ (backslash). Cuando se utiliza este operador en lugar del operador / de división,
la división se realiza considerando sólo resultados enteros. Así, mientras que 8 / 3 = 2.6667, 8 \ 3 = 2.
7
Seminario de Informática Avanzada Lenguaje Visual Basic for Applications – Guía de referencia
Esta estructura se utiliza para indicar a la computadora que tome una decisión en función del valor de una
variable o expresión. Las palabras reservadas son SELECT CASE... CASE... END SELECT. Puede
considerarse el SELECT CASE como una aplicación especializada de los condicionales.
Ejemplo:
SELECT CASE x
CASE 1
S = “X tomó el valor 1”
j=j+1
Range(“A1”).Offset(1,j) = [B20]
CASE 2
S = “X tomó el valor 2”
CASE 3
S = “X tomó el valor 3”
CASE ELSE
S = “X tomó un valor a partir de cuatro”
END SELECT
En el ejemplo, la variable S toma distintos valores según el contenido de la variable x. Además, en caso de
que x sea igual a la unidad, se llevan a cabo dos procesos adicionales (esto ilustra cómo pueden incluirse
varias líneas de código fuente dentro de cada una de las instrucciones CASE, tal como sucede en la versión
larga de una cláusula condicional).
LEN(Texto)
Devuelve el número de caracteres de un texto. Es equivalente a la función LARGO(Texto) en Excel.
VAL(Texto)
Convierte un texto a su valor numérico.
STR$(Número)
Convierte un número a su equivalente en texto.
ASC(Carácter)
Devuelve el código ASCII del carácter especificado (ASC(“A”) devuelve el número 65). Esta función se
utiliza en conjunto con la siguiente (ver a continuación el ejemplo).
CHR$(Código de carácter)
Devuelve el carácter que corresponde al código ASCII indicado (CHR$(65) corresponde a la letra “A”)
Ejemplo:
Dim NumFila , NumColumna as Integer
Dim Rango as String
NumFila = 10
NumColumna = 16
Rango = “A1:” & CHR$(65+NumColumna-1) & NumFila
Range(Rango).ClearContents
8
Seminario de Informática Avanzada Lenguaje Visual Basic for Applications – Guía de referencia
En este ejemplo, se desea borrar el rango rectangular que comprende las 10 primeras filas y las 16 primeras
columnas (A1:P10). ¿Cómo saber que la letra de la columna 16 es la “P”? La función CHR$ convierte el
número 16 en la letra adecuada. Nótese el uso del operador de concatenación “&”.
INT(Número)
Redondea un número al menor entero relativo más próximo.
Ejemplo:
INT(8.99) devuelve 8
INT(-8.01) devuelve –9
RND
Devuelve un número pseudo-aleatorio Z tal que 0 <= Z < 1
Ejemplo:
INT(RND*100+1)
LOG(Número positivo)
Devuelve el logaritmo natural de un número positivo.
EXP(Número)
Devuelve el antilogaritmo natural de un número. (Debe tenerse precaución pare evitar los errores de
desbordamiento si se intenta antilogaritmar un número de magnitud muy grande).
9
Seminario de Informática Avanzada Lenguaje Visual Basic for Applications – Guía de referencia
Evento MouseMove del objeto Image dentro de un formulario y del formulario mismo
Este evento se activa cada vez que el usuario mueve el puntero del mouse sobre un objeto imagen o el fondo
del formulario.
10