Biblioteca Online : ¡La Suscripción ENI por 9,90 € el primer mes!, con el código PRIMER9. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. VBA Excel (versiones 2021 y Microsoft 365)
  3. El lenguaje VBA
Extrait - VBA Excel (versiones 2021 y Microsoft 365) Programar en Excel: Macros y lenguaje VBA
Extractos del libro
VBA Excel (versiones 2021 y Microsoft 365) Programar en Excel: Macros y lenguaje VBA Volver a la página de compra del libro

El lenguaje VBA

Módulos

1. Presentación

El código VBA asociado a un libro está agrupado en un proyecto que contiene varias carpetas:

La carpeta Microsoft Excel Objetos

Contiene un módulo de clase asociado al libro del proyecto (llamado por defecto ThisWorkbook) y un módulo de clase por cada una de las hojas de cálculo u hojas de gráfico del libro. En particular, en estos módulos de clase se encuentran los procedimientos de eventos asociados al libro y a las hojas.

La carpeta Formularios

Contiene los formularios (UserForm) del proyecto y el código VBA asociado.

La carpeta Módulos

Agrupa los diferentes módulos estándares (compuestos por uno o más procedimientos) que pueden ser llamados desde cualquier procedimiento del proyecto.

La carpeta Módulos de clase

Contiene los módulos de clase usados para la creación de nuevas clases de objetos. Los módulos de clase se utilizan especialmente para la escritura de los procedimientos de eventos asociados a los objetos Application y Chart (ver capítulo Administración de eventos).

La lista de todos los módulos aparece en forma jerárquica en el Explorador de proyectos del entorno VBE.

Si el explorador de proyectos no está visible, elija la opción Explorador de proyectos del menú Ver o pulse el método abreviado [Ctrl] R.

images/02RITEXCV01.png

Para ver el código asociado a un módulo...

Procedimientos

1. Definiciones

Los procedimientos son subprogramas que permiten descomponer una tarea de programación compleja en un conjunto de tareas más breves y simples. Permiten organizar el código dentro de módulos para obtener un código de mantenimiento más simple y fácilmente reutilizable.

En VBA Excel, se distinguen tres tipos de procedimientos:

  • Los procedimientos Sub (por subrutina) se llaman subprogramas o procedimientos Sub.

  • Los procedimientos Function se llaman funciones.

  • Los procedimientos Property se llaman procedimientos de propiedad.

En este capítulo, solamente nos interesan los dos primeros, que son los más utilizados.

  • Puntos comunes entre procedimientos Sub y funciones:

    • Ambos contienen instrucciones o métodos VBA.

    • Ambos aceptan argumentos.

    • Ambos se pueden llamar desde otras funciones o procedimientos Sub.

  • Características específicas de las funciones:

    • Devuelven un valor.

    • Se pueden utilizar desde Excel como cualquier función.

2. Acceso a los procedimientos

 Para acceder a un procedimiento desde la ventana de código de un módulo, abra la segunda lista de la ventana del módulo, haga clic en el nombre del procedimiento al que desea acceder o recorra los procedimientos con [Ctrl][Flecha arriba] y [Ctrl][Flecha abajo].

 Para seleccionar una palabra, haga doble clic en la palabra.

 Para seleccionar una línea, sitúe el puntero del ratón a la izquierda de la línea y haga clic cuando el puntero se convierta en una flecha.

 Para seleccionar un grupo de caracteres, use la técnica de arrastrar y soltar o haga [Mayús] clic.

 Para seleccionar un procedimiento completo, sitúe el puntero del ratón a la izquierda de cualquier línea del procedimiento. Cuando el puntero se transforme en una flecha, haga doble clic.

 Para ejecutar un procedimiento, haga clic en el procedimiento que desea ejecutar y pulse [F5] o images/ri019.PNG.

 Para eliminar un procedimiento, seleccione todo el procedimiento y pulse [Supr].

3. Procedimientos Sub

Hay dos tipos de procedimientos Sub:

  • Los procedimientos Sub generales,

  • Los procedimientos Sub asociados a eventos.

Un procedimiento general es un procedimiento declarado en un módulo (generalmente un módulo estándar). La llamada a este tipo de procedimiento se define explícitamente en el código.

Un procedimiento...

Variables

Las variables permiten almacenar valores intermedios durante la ejecución del código VBA para usarlos luego en cálculos, comparaciones, pruebas…

Las variables se identifican por un nombre que permite hacer referencia al valor que contienen y un tipo que determina la naturaleza de los datos que pueden almacenar.

1. Tipos de variables

Numéricas

Tipo

Rango

Tamaño en bytes

Byte

0 a 255

1

Integer (entero)

-32 768 a 32 767

2

Long (entero largo)

-2 147 483 648 a 2 147 483 647

4

Single (real simple de coma flotante)

-3,402823E38 a 1,401298E-45

(valores negativos)

1,401298E-45 a 3,402823E38

(valores positivos)

4

Double (real doble de coma flotante)

-1,79769313486231E308 a 4,94065645841247E-324

(valores negativos)

4,94065645841247E-324 a 1,79769313486231E308

(valores positivos)

8

Currency (monetario de punto fijo)

-922 337 203 685 477,5808 a 922 337 203 685 477,5807

8

Decimal

+/-79 228 162 514 264 337 593 543950 335 sin separador decimal;

+/-7,9228162514264337593543950335 con 28 cifras a la derecha del separador decimal;

el menor número distinto de cero es +/-0.0000000000000000000000000001

12

Cadenas de caracteres

El tipo es String. Existen dos tipos de cadenas:

  • Las cadenas de longitud variable pueden contener aproximadamente dos mil millones de caracteres.

  • Las cadenas de longitud fija pueden contener de 1 a aproximadamente 64 KB de caracteres.

Ejemplo

' Cadena de longitud variable 
Dim sDomicilio As String 
' Cadena de longitud fija (20 caracteres) 
Dim sNombre As String * 20 

Boolean o lógica

El tipo es Boolean (o booleano). La variable puede tomar los valores True (Verdadero) o False (Falso), que es su valor por defecto. Ocupa dos bytes.

Fecha

El tipo es Date. La variable puede tomar los valores de fecha y de hora del 1 de enero del año 100 al 31 de diciembre de 9999. Ocupa ocho bytes.

Variant

Las variables de tipo Variant pueden contener datos de todo tipo, además de los valores especiales Empty, Error y Null.

Usar el tipo de dato Variant ofrece más flexibilidad en el tratamiento de datos. Por ejemplo, si una variable de tipo Variant contiene cifras, se puede usar su valor real o su representación en forma de cadena, según el contexto.

De todas formas, las variables de tipo Variant requieren 16 bytes de memoria para números y 22 bytes más la longitud de la cadena para los caracteres; esto puede ser perjudicial...

Matrices

1. Presentación

Las variables en forma de matriz permiten almacenar y trabajar con un conjunto de valores llamados elementos. Una variable matriz se caracteriza por un número de dimensiones y un tamaño (número de ocurrencias) para cada una de las dimensiones. El número total de elementos de la tabla es el producto de los tamaños de todas las dimensiones.

Una tabla de una dimensión permite almacenar una lista de valores, una tabla de dos dimensiones permite sobre todo almacenar datos de un rango de celdas Excel: el primer argumento representa las filas y el segundo argumento representa las columnas.

El número de elementos de cada dimensión se define:

  • Por el valor del índice más grande. En este caso, el índice del primer elemento de la tabla se determina con la instrucción Option Base en la sección de declaración del módulo.

  • Por los valores del primer y del último índice de la tabla

Una tabla cuya dimensión y tamaño se especifican en su declaración es una tabla estática. Una tabla cuyo tamaño se puede especificar y modificar durante la ejecución de un programa es una tabla dinámica, o tabla de dimensión libre.

Ejemplos

'    Tabla estática de una dimensión que puede almacenar  
'    13 valores de tipo cadena de caracteres (índice de 0 a 12)  
Option base 0   
Dim TabGastos(12) as String   
  
  
'    Tabla estática de una dimensión que puede almacenar  
'    12 valores enteros (índice de 1 a 12)   
Option base 1   
Dim TabGastos(12) As Integer    
  
'    Tabla estática de dos dimensiones que permite almacenar 
'    los valores de 11 líneas y 11 columnas 
Option base 0   
Dim TabGastos (10, 10) As Double    
Dim TabGastos (0 to 10, 0 to 10) as Double   
  
  
'    Tabla dinámica de dos dimensiones 
Option base 1   
Dim TabGastos() As Double   
Redim TabGastos(11,11) 

2. Declaración de una tabla

Para crear una variable matriz, use la siguiente...

Estructuras de decisión

Es conveniente testear las condiciones específicas antes de ejecutar las instrucciones.

Las estructuras de decisión, llamadas también alternativas o bifurcaciones condicionales, permiten, tras una evaluación, optar por uno u otro bloque de código.

Se distinguen dos instrucciones de bifurcación condicional:

  • If ... Then ... Else

  • Select ... Case

IIf también se puede usar para definir un valor en función de una condición. Ejemplo: Port = IIf(Cantidad < 100, 100, 0).

1. Instrucción If

Permite ejecutar ciertas instrucciones en función del resultado de una condición.

If...Then

If <condición> Then <instrucción> [:<instrucción>] 

Si hay varias instrucciones, sepárelas por el signo de puntuación : (dos puntos). Esta sintaxis se usa especialmente para pruebas cortas y simples.

Ejemplo

Si la celda A1 está vacía, emite un bip y muestra un mensaje.

Sub Test_Celda_A1() 
  If IsEmpty(Range("A1")) Then Beep: MsgBox "Olvidó el título" 
End Sub 

If...Then...End If

If <condición> Then 
   <instrucción1> 
   <instrucción2> 
... 
End If 

Ejemplo

Sub Test_Titulo() 
'  Si la celda A1 no está vacía 
'  entonces ponerla en negrita y pintarla de rojo 
    If Not IsEmpty(Range("A1")) Then 
        With Range("A1") 
            .Font.Bold = True 
            .Interior.ColorIndex = 3 
        End With ...

Estructuras en ciclo

Las estructuras en ciclo (o repetitivas) permiten repetir la ejecución de un conjunto de instrucciones.

Se distinguen varios tipos de estructuras en ciclo:

  • Do...Loop

  • While...Wend

  • For...Next

  • For Each...Next

Do...Loop y While...Wend repiten las operaciones en función de una cierta condición, mientras que For...Next repite las operaciones una cantidad de veces determinada por un contador.

For Each...Next permite recorrer los elementos de una colección.

1. Instrucción Do...Loop

Ejecuta un bloque de instrucciones un número indeterminado de veces.

Sintaxis 1

Las instrucciones se ejecutan, mientras que la condición devuelve el valor True.

Do While <Condición> 
      <Instrucciones> 
Loop 

Sintaxis 2

Las instrucciones se ejecutan una primera vez sin condición y, luego, mientras la condición devuelva True.

Do  
    <Instrucciones> 
Loop While <Condición> 

Ejemplo

El siguiente código solicita al usuario que escriba un número mientras que el valor introducido no sea numérico o superior a 100.

Sub Introducir_Numero ()  
  Dim vRespuesta as Variant  
  Do  
     vRespuesta = InputBox("Introduzca un número > 100") 
  Loop While (Not IsNumeric(vRespuesta) Or vRespuesta <= 100) 
End Sub 

Sintaxis 3

Las instrucciones se ejecutan hasta que la condición toma el valor True (mientras que la condición devuelva el valor False).

Do Until <Condición> 
    <Instrucciones> 
Loop 

Sintaxis 4

Las instrucciones se ejecutan una primera vez sin condición y luego hasta que la condición devuelva el valor True.

Do 
    <Instrucciones> 
Loop Until <Condición> 

Ejemplo

El siguiente código solicita al usuario que escriba un número hasta que el valor introducido sea numérico y mayor que 100.

Sub Introducir_Numero() 
  Dim vResponse as Variant 
  Do 
     vResponse = InputBox("Introduzca un número > 100") 
  Loop Until (IsNumeric(vResponse) And vResponse > 100) 
End Sub 

2. Instrucción While...Wend

Ejecuta una serie de instrucciones...

Operadores

Los operadores permiten realizar operaciones aritméticas con variables o constantes, comparar variables entre ellas, evaluar varias condiciones, etc.

Se distinguen varios tipos de operadores:

  • Operadores aritméticos.

  • Operadores de comparación.

  • Operadores lógicos.

  • Operador de concatenación.

El operador de asignación es el signo =. El valor de la expresión situada a la derecha del signo igual se asigna a la variable situada a la izquierda del signo (ejemplo: IntA = 12, IntA = Intb * 12).

1. Operadores aritméticos

Permiten efectuar cálculos aritméticos con variables o constantes.

Operador

Cálculo realizado

+

Adición

-

Sustracción

/

División con resultado de un número con coma flotante

Mod

Resto de la división entre dos números

\

División con resultado entero

*

Multiplicación

^

Potenciación

2. Operadores de comparación

Comparan dos valores o dos cadenas de caracteres.

Operador

Cálculo realizado

<

Menor que

<=

Menor o igual que

>

Mayor que

>=

Mayor o igual que

=

Igual a

<>

Distinto de

La instrucción Option Compare utilizada a nivel de módulo permite declarar el método de comparación por defecto que conviene usar en la comparación de cadenas.

Puede tomar uno de estos tres valores posibles:

  • La opción Compare Binary (opción por defecto) realiza la comparación de cadenas basada en el orden derivado de la representación binaria interna de los caracteres: A < B < E < Z < a < b < e < z < Á < Ê < Ø < á < ê...

  • La opción Compare Text realiza la comparación de cadenas sin distinguir mayúsculas de minúsculas: (A=a) < (Á=á) < (B=b) < (E=e) < (Ê=ê) < (Z=z) < (Ø=ø)...

  • La opción Compare...

Reglas de escritura del código

1. Comentarios

Los comentarios permiten documentar el código VBA para hacerlo más legible. 

REM comentario 

o

' comentario 

Al validar la línea de comentario, esta se muestra, por defecto, en verde.

2. Carácter de continuación

Una instrucción VBA puede escribirse en muchas líneas usando un guion bajo "_" precedido de un espacio.

Ejemplo

'   Pide la introducción de un precio en tanto que 
'   esté vacío o sea incorrecto 
Dim vPrecio as Variant 
Do While IsEmpty(vPrecio) Or Not IsNumeric(vPrecio) _ 
  Or vPrecio < 50 Or vPrecio > 500 
  vPrecio = InputBox("Escribir un importe comprendido entre " _ 
         & "50 y 500 ") 
Loop 

3. Sangrías

Las sangrías (o tabulaciones) permiten una mayor legibilidad del código. Es especialmente importante usarlas en las estructuras de control (sobre todo si hay varias instrucciones If anidadas) y las estructuras de decisión.

 Para generar las sangrías, use la tecla [Tab].

 Para retroceder a la tabulación precedente, use las teclas [Mayús][Tab].

 Para modificar el tamaño de la tabulación (cuatro espacios por defecto), seleccione Opciones en el menú Herramientas, haga clic en la pestaña Editor y modifique...