Ejemplos de Basic (Macros de Office)

 

Nociones de Basic (VBA)

 Resumen de Visual Basic para aplicaciones (VBA).


INTRODUCCIÓN

BASIC  ( Beginner's All Purpose Symbolic Instruction Code)  fue creado en los años 60 en el Darmouth College por los matemáticos John George Kemeny y Tom Kurtzas. Se trataba de un intérprete apto para todo y para todos (All Purpose). Desde entonces se ha ramificado en multitud de dialectos. Durante un tiempo llegó a dominar de forma hegemónica como lenguaje de "todo uso" aunque no ha podido hacer frente de forma competitiva a lenguajes  como C, Java etc. En las páginas web el lenguaje VBasicScript tampoco ha podido imponerse al lenguaje JavaScript.

Sin embargo,  existen importantes aplicaciones que incorporan Visual Basic para aplicaciones (VBA) como lenguaje de macros. En particular los programas de  Microsoft Excel, Access, Word etc.

Una macro es una serie de instrucciones que reproducen las acciones del usuario con la computadora durante el periodo de grabación. En la macro se pueden grabar automáticamente en Basic acciones habituales para que un usuario de Word o de Excel etc. no se vea obligado a repetirlas constantemente. Por ejemplo, el formato de página de una oficina, una empresa, un colegio etc.

Se accede a este sistema mediante el menú Herramientas>Macro>Grabar nueva macro. La macro  puede ser posteriormente ejecutada mediante el menú Herramientas>Macro>Macros...  

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 entrarse mediante el menú Herramientas>Macro>Editor de Visual Basic.  El usuario puede adaptar la secuencia de comandos generada por el ordenador a sus necesidades específicas. 


VARIABLES

Las variables permiten almacenar datos. Los nombres de las variables no admiten espacios y nunca van entre comillas. Conviene que el nombre se relacione con el dato que se almacena. Si queremos guardar en la memoria una edad, lo deseable es que el nombre de la variable sea edad. Si queremos guardar un nombre lo lógico es que la variable se llame nombre. 

Hay diversos tipos de variables, los principales son: 

Integer Valor Entero  Entre -32768 y 32767
Long Valor Entero Largo  Si se quiere un entero que exceda los valores de Integer
Single Valor Real Admite valores decimales
Double Valor Real Doble Si se quiere un real que exceda los valores de Single
String Carácter (texto) Cadenas de texto
Boolean Valor Lógico TRUE / FALSE
Currency Monedas y Punto Fijo Decimales fijos
Date Fecha
Object Referencias a objetos
Variant Cualquiera

Declarar una variable significa darla a conocer antes de utilizarla. En VBA no es necesario declarar las variables. Sin embargo, es una buena práctica el declararlas.
Las variables se declaran al principio del programa o de una subrutina mediante: DIM. Podemos declarar las variables diciendo de qué tipo son:

DIM a AS INTEGER
DIM temp AS LONG
DIM b AS STRING
DIM euro AS CURRENCY

Si no decimos de qué tipo es, se le asigna el tipo VARIANT que puede ser numérica o alfanumérica según convenga.

Una tabla o matriz o array es un conjunto de variables que tienen el mismo nombre pero distinto subíndice :

DIM a(7)

Crea estos elementos : a(0), a(1), a(2), a(3), a(4), a(5), a(6), a(7)

Asignación e incremento de las variables

Para asignar el contenido de una variable se utiliza el operador = 

edad=18

mensaje="Escribe tu nombre"

nombre=InputBox(mensaje) 

Para incrementar una variable se utiliza la sintaxis

n=n+1

si n tenía un valor 1 después de esa instrucción n tendrá un valor 2.

También se pueden incrementar variables del tipo string:

Frase="Buenos "

Frase=Frase+"días"

---> Buenos días


Una variable es válida sólo en el sitio en el que se declara.
Para que una variable sea reconocible por todas las subrutinas hay que declararla al principio.(General)


OPERADORES

BASIC incorpora los operadores habituales de todos los lenguajes:

a) Numéricos

         +   suma
         -   resta
         *   multiplicación
         /   división
         ^   exponenciación
         \   división entera   
         MOD resto de la división

b) Alfanuméricos. Se incluyen los operadores  + y & de concatenación de cadenas.

c) Relacionales

         =  igual
         <> distinto
         >  mayor
         >= mayor o igual
         <  menor
         <= menor o igual

El operador = tiene dos sentidos. Por un lado, como acabamos de ver, indica la igualdad. Por otro permite la asignación, es decir la introducción de datos en una variable. En otros lenguajes (C, Java, Pascal etc.)  existen operadores diferentes para la igualdad y la asignación,

d) Lógicos

         AND
         OR etc.
     


ESTRUCTURAS DE CONTROL

 Ejecución condicional.

Se consigue mediante la sentencia IF.

Su sintaxis es:

IF condicion THEN <sentencia>

Se puede usar en combinación con ELSEIF:

IF condicion1 THEN
bloque de sentencias 1
ELSEIF
bloque de sentencias 2
ENDIF

Pueden escribirse tantos ELSEIF como se desee, pero cuando hay varias posibilidades, es mejor usar la sentencia SELECT CASE, según el modelo siguiente:

SELECT CASE expresion
CASE valor1
bloque 1
CASE valor2
bloque 2
CASE valor 3
bloque 3
CASE ELSE
bloque alternativo
END SELECT

Ejemplo: 

SELECT CASE periodo
CASE 1
vacaciones = "Navidad"
CASE 2
vacaciones = "Semana Santa"
CASE  3
vacaciones = "Verano"
CASE ELSE
vacaciones ="Puente"
END SELECT


BUCLES

Los Bucles o repeticiones permiten repetir un fragmento de código tantas veces como lo indique el usuario o mientras se cumpla una condición lógica.  

La instrucción FOR..NEXT ejecuta un bloque de sentencias un número determinado de veces. Su sintaxis es

FOR contador=inicio TO final (STEP incremento)
bloque
NEXT contador

donde inicio es el valor inicial del contador, fin su valor final y opcionalmente podemos especificar el incremento del contador en cada iteración.

Los arrays (o matrices) se utilizan frecuentemente dentro de los bucles FOR - NEXT.

 

Un grupo de sentencias puede ejecutarse mientras se cumple una determinada condición, o hasta que se cumpla una determinada condición. En el primer caso, se escribe

DO WHILE condicion
bloque
LOOP

y en el segundo

DO UNTIL condicion
bloque
LOOP

En estos dos casos, la condición se evalúa antes de ejecutar el bloque de sentencias. Cuando WHILE o UNTIL se sitúan al final del bloque, tras LOOP, la condición se evalúa después de ejecutarse el bloque de sentencias:

DO 
bloque 
LOOP WHILE condicion    (o LOOP UNTIL condicion1)

Es posible forzar la salida del bloque mediante la instrucción EXIT DO. La sintaxis habitual es:

DO 
bloque 
IF condicion2 THEN EXIT DO 
LOOP WHILE condicion1     (o LOOP UNTIL condicion1)

La antigua sentencia WHILE..WEND no es necesaria, dada la flexibilidad de la construcción DO..LOOP.

SUBRUTINAS Y FUNCIONES

Para escribir las instrucciones es necesario agrupar este código dentro de Subrutinas o Funciones.

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 .

Ejemplo: 

Sub escribe(contenido)
Selection.TypeText Text:=contenido
End Sub

Hay que prestar 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. 

Las funciones se declaran mediante la palabra reservada FUNCTION, seguida del nombre de la función, entre paréntesis la lista de argumentos y , opcionalmente, 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. 

Ejemplo:

FUNCTION Resultado( x, y AS Integer) AS String 

Resultado = “El resultado es ” & (x+y) 

END FUNCTION 

 


FUNCIONES DE BIBLIOTECA (Integradas en casi todas las versiones de Basic)

Existen muchas funciones de uso frecuente que ya están incorporadas dentro de BASIC. Son las llamadas funciones de biblioteca: 

Funciones numéricas habituales:

En cuanto a las funciones de manejo de cadenas, las más habituales son:

VAL devuelve el valor numérico de una cadena

STR convierte un número en una cadena de caracteres

LEN Cuenta el número de caracteres.

nom = "Juan Antonio"
c = LEN (nom)
MsgBox(c)      ------------> 12

LEFT Devuelve los primeros caracteres de la izquierda de una cadena.

nom = "Juan Antonio"
izq = LEFT (nom, 4)         ---------> Juan

RIGHT Devuelve los últimos carácteres de la derecha de una cadena.

nom = "Juan Antonio"
izq = RIGHT (nom, 7)        ---------> Antonio

MID Devuelve los n carácteres después del m.

nom = "Juan Antonio"
izq = MID (nom, 2, 3)        ---------> uan
Ejemplos:

nom = "Juan Antonio"
r = ""

For n = 1 To Len(nom)
x = Mid(nom, n, 1)
r = r & x & "-"
Next n

MsgBox r              ------> J-u-a-n- -A-n-t-o-n-i-o-


nom = "Juan Antonio"
r = ""

For n = Len(nom) To 1 Step -1
x = Mid(nom, n, 1)
r = r & x & "-"
Next n

MsgBox r              ------> o-i-n-o-t-n-A- -n-a-u-J-

Cambia la letra "n" por la "M"

nom = "Juan Antonio"
r = ""

For n = 1 To Len(nom)
x = Mid(nom, n, 1)
If x = "n" Then Mid(nom, n, 1) = "M"
Next n

MsgBox nom                -------> JuaM aMtoMio

CHR y ASC son complementarios.

a CHR le ponemos un número y nos devuelve su carácter.
a ASC le ponemos un carácter y nos devuleve su número.

CHR (97)  ------> a
ASC ("b") ------> 98


OBJETOS

Los objetos son entidades que combinan datos, comportamiento (métodos) y propiedades  (variables que los diferencia del resto).  VBA incorpora muchos objetos que permiten realizar un gran número de tareas.

Por ejemplo para dibujar un corazón en el documento actual:

izquierda=20

derecha=20

ancho=100

alto= 100

ActiveDocument.Shapes.AddShape(msoShapeHeart, izquierda, arriba, ancho, alto).Select

 

En este ejemplo se utiliza utiliza el objeto ActiveDocument para hacer referencia a un documento específico word y dibujar un corazón en este documento.

Los objetos se presentan en forma de jerarquías. Cuando nos referimos a un objeto contenido o miembro, estamos especificando su posición en la jerarquía del objeto, usando un
punto como separador entre el contenedor y el miembro.

Aunque el lenguaje VBA es común para todas las aplicaciones de Office, cada programa Excel, Access, Word tiene objetos propios.

Es propio de especialistas el conocimiento exhaustivo de todos estos objetos. Se puede consultar la ayuda para utilizar estos objetos. 

Lo más sencillo es grabar macros y observar los objetos que se han escrito automáticamente.

Posteriormente podemos crear subrutinas más sencillas para acceder fácilmente a estos objetos por ejemplo:

Sub escribe(contenido)
Selection.TypeText Text:=contenido
End Sub

Sub salta(n)
For i = 1 To n
Selection.TypeParagraph
Next
End Sub

Sub muestra()
escribe ("Primera frase ")
salta (1)

escribe ("Segunda frase ")
End Sub