Cada línea en LibreOffice Basic es una unidad independiente. Elementos como llamadas a funciones o expresiones deben completarse en la misma línea donde comienzan.
Extensión de Línea con Guion Bajo
Para líneas de código extensas, se puede usar un guion bajo (_) al final de una línea para indicar que la instrucción continúa en la siguiente línea. Es crucial que el guion bajo sea el último carácter de la línea, sin espacios ni tabulaciones posteriores, para evitar errores.
MiExpresionLarga = (Expresion1 * Expresion2) + _
(Expresion3 * Expresion4) + _
(Expresion5 * Expresion6) + _
(Expresion7 * Expresion8)
Uso del Doble Punto (:) para Separar Instrucciones
Alternativamente, se pueden agrupar múltiples instrucciones cortas en una sola línea utilizando el carácter de dos puntos (:).
a = 1 : a = a + 1 : a = a + 1
Comentarios
Los comentarios se utilizan para explicar el código y se ignoran durante la ejecución. LibreOffice Basic soporta dos métodos:
1. Apóstrofo (')
Cualquier texto que siga a un apóstrofo en una línea se considera un comentario.
Dim contador ' Este es un comentario para la variable contador
2. Palabra Clave 'Rem'
La palabra clave 'Rem' seguida de texto también introduce un comentario.
Rem Este comentario se introduce con la palabra clave Rem.
Si un comentario abarca varias líneas, cada línea debe comenzar con un apóstrofo o 'Rem'.
Identificadores (Tokens)
Los identificadores, también conocidos como tokens, son los nombres que se dan a variables, constantes, funciones, etc. Deben seguir estas reglas:
- Solo pueden contener letras latinas, números y guiones bajos (_).
- El primer carácter debe ser una letra o un guion bajo.
- No se permiten caracteres especiales (ej. ä, â, î, ß).
- La longitud máxima es de 255 caracteres.
- No distinguen entre mayúsculas y minúsculas (ej. MiVariable, miavariable, MIVARIABLE son lo mismo), con la excepción de las constantes de la API UNO, que sí distinguen entre mayúsculas y minúsculas.
Uso de Variables
Declaración de Variables
Declaración Implícita
Las variables se crean automáticamente al usarlas por primera vez, sin necesidad de una declaración explícita. Esto puede llevar a errores sutiles si hay errores tipográficos, ya que el intérprete creará una nueva variable inicializada a 0 en lugar de generar un error.
resultado = valor1 + valor2 ' Si valor1 o valor2 no están declaradas, se crean implícitamente
Declaración Explícita
Para evitar los problemas de la declaración implícita, se recomienda usar la directiva Option Explicit al inicio del código. Esto forzará la declaración explícita de todas las variables, generando un error si se intenta usar una no declarada.
Option Explicit
La forma más simple de declaración explícita es con Dim:
Dim miVariable
Esta declaración crea una variable llamada miVariable de tipo Variant, que puede almacenar cualquier tipo de dato (cadenas, números enteros, flotantes, booleanos).
miVariable = "Hola Mundo" ' Cadena
miVariable = 1 ' Número entero
miVariable = 1.0 ' Número flotante
miVariable = True ' Valor booleano
También se pueden declarar variables con tipos específicos:
Dim miNumero As Integer ' Declaración de una variable de tipo entero
Los tipos de datos numéricos también pueden declararse usando un carácter de tipo al final del nombre de la variable:
Dim miNumero% ' Equivalente a Dim miNumero As Integer
Se pueden declarar múltiples variables en una sola línea:
Dim var1, var2, var3
Para especificar un tipo para todas ellas, se debe indicar explícitamente:
Dim var1 As String, var2 As String, var3 As String
Si no se especifica el tipo, se asume Variant:
Dim var1, var2 As Integer ' var1 es Variant, var2 es Integer
Tipos de Variables
Cadenas (String)
Una variable de tipo String puede almacenar hasta 65,535 caracteres. LibreOffice Basic los almacena internamente usando valores Unicode.
Dim miCadena As String
O usando el carácter de tipo:
Dim miCadena$
Los literales de cadena se delimitan con comillas dobles (").
miCadena = " Este es un ejemplo de cadena"
Para dividir una cadena literal en varias líneas, se usa el ampersand (&) al final de la línea:
miCadena = "Esta cadena es tan larga que " & _
"ha sido dividida en dos líneas."
Para incluir comillas dobles dentro de una cadena literal, se duplican:
miCadena = "Él dijo: ""Hola""." ' Produce: Él dijo: "Hola".
Números
LibreOffice Basic soporta cinco tipos numéricos fundamentales:
- Entero (Integer): Almacena enteros entre -32,768 y 32,767. Ocupa 2 bytes. Carácter de tipo: %.
- Entero Largo (Long): Almacena enteros entre -2,147,483,648 y 2,147,483,647. Ocupa 4 bytes. Carácter de tipo: &.
- Precisión Simple (Single): Almacena números de punto flotante entre 3.402823E38 y 1.401298E-45 (positivos o negativos). Ocupa 4 bytes. Carácter de tipo: !. Se usaba para optimizar el cálculo, pero su uso ha disminuido.
- Precisión Doble (Double): Almacena números de punto flotante entre 1.79769313486232E308 y 4.94065645841247E-324. Ocupa 8 bytes. Ideal para cálculos de alta precisión. Carácter de tipo: #.
- Moneda (Currency): Diseñado para cálculos financieros, tiene 4 decimales fijos. Almacena valores entre -922,337,203,685,477.5808 y +922,337,203,685,477.5807. Ocupa 8 bytes. Carácter de tipo: @. Su uso puede generar errores de redondeo debido a la naturaleza de punto flotante.
Los tipos Single, Double y Currency se agrupan comúnmente como tipos de punto flotante. Las variables declaradas como Float (un alias en algunos contextos) adoptarán uno de estos tipos (Single, Double, Currency) al asignarse un valor.
Literales Numéricos
Los números pueden expresarse en formato decimal, notación científica o bases distintas.
- Enteros: Simplemente el número entero. Pueden tener signo explícito (+ o -).
- Decimales: Usan el punto (.) como separador decimal. Se redondean si se asignan a variables Enteras.
- Notación Científica (Exponencial): Se usa la letra 'e' (mayúscula o minúscula) para indicar la potencia de 10. Ejemplo:
1.5E-10. - Hexadecimal: Se prefijan con
&H. Ejemplo:&HFF(decimal 255). - Octal: Se prefijan con
&O. Ejemplo:&O77(decimal 63).
Ejemplos de Notación Científica:
Dim A As Double
A = 1.43E2 ' Correcto
A = + 1.43E2 ' Correcto
A = - 1.43E2 ' Correcto
A = 1.43E-2 ' Correcto (exponente negativo)
A = 1.43E -2 ' Incorrecto (espacio prohibido)
A = 1,43E-2 ' Incorrecto (punto decimal requerido)
A = 1.43E2.2 ' Incorrecto (exponente debe ser entero)
Nota: Errores como 1.43E -2 se interpretan incorrectamente (como 1.43 - 2) sin generar un mensaje de error.
Booleanos (Boolean)
Solo pueden contener los valores True o False. Internamente se almacenan como enteros de 2 bytes (0 para False, cualquier otro valor para True). No tienen carácter de tipo, se declaran con As Boolean.
Dim esValido As Boolean
Fechas (Date)
Pueden almacenar valores de fecha y hora en un formato interno que permite operaciones matemáticas y comparaciones. No tienen carácter de tipo, se declaran con As Date.
Dim fechaInicio As Date
Arrays (Arreglos/Vectores)
Arrays Unidimensionales:
Se definen con un nombre seguido de paréntesis, que pueden contener el índice inferior y superior. Por defecto, el índice inferior es 0.
Dim totales(20) As Integer ' Array con índices de 0 a 20 (21 elementos)
Dim totales(0 To 20) As Integer ' Idéntico al anterior
Se puede espeicficar un rango de índices diferente:
Dim miEntero(5 To 10) ' Array con índices de 5 a 10 (6 elementos)
Dim miEntero(-10 To -5) ' Rango negativo de índices (6 elementos)
Limitaciones: El índice mínimo es -32768, el máximo es 32767. El número máximo de elementos es 16368.
Option Base: La directiva Option Base 1, si se usa al inicio, cambia el índice base por defecto a 1. Sin embargo, se recomienda evitarla para mayor claridad y compatibilidad.
Option Base 1
Dim miEntero(3) ' Crea 4 elementos con índices de 1 a 4
Arrays Multidimensionales:
Se definen separando los límites de cada dimensión con comas.
Dim miArrayBidimensional(5, 5) ' Array de 6x6 (índices 0-5 en cada dimensión)
Arrays de Tamaño Dinámico:
Se puede redimensionar un array usando ReDim después de su declaración inicial.
Dim miArray() As Integer ' Declaración de array dinámico
ReDim miArray(10) ' Ahora tiene 11 elementos (índices 0-10)
ReDim miArray(20) ' Ahora tiene 21 elementos (índices 0-20)
Al redimensionar, los contenidos se pierden. Para conservarlos, se usa ReDim Preserve.
Dim miArray(10) As Integer
ReDim Preserve miArray(20) As Integer ' Conserva los valores existentes
Nota: Con Preserve, solo se puede redimensionar la última dimensión en VBA; LibreOffice Basic permite redimensionar cualquier dimensión.
LBound() y UBound():
Estas funciones devuelven el índice inferior y superior de un array, respectivamente. Son útiles para arrays dinámicos.
Dim miArray(10) As Integer
Dim n As Integer
n = 47
ReDim MyArray(n) As Integer
MsgBox(LBound(miArray)) ' Muestra: 0
MsgBox(UBound(miArray)) ' Muestra: 47
Para arrays multidimensionales, se especifica la dimensión:
Dim miArray(10, 13 To 28) As Integer
MsgBox(LBound(miArray, 2)) ' Límite inferior de la 2ª dimensión: 13
MsgBox(UBound(miArray, 2)) ' Límite superior de la 2ª dimensión: 28
Arrays Vacíos:
Un array declarado sin dimensiones (ej. Dim miArray()) se considera vacío. UBound() devolverá -1 para un array vacío.
Dim miArray() As Integer
MsgBox(LBound(miArray)) ' Muestra: 0
MsgBox(UBound(miArray)) ' Muestra: -1
Acceso a Elementos:
Los valores se asignan y leen usando el índice:
miArray(0) = "algun valor"
MsgBox(miArray(0))
Ámbito de Variables
Variables Locales
Declaradas dentro de una función o procedimiento (Sub/Function). Solo existen mientras se ejecuta dicho bloque.
Sub EjemploLocal
Dim miVariableLocal As Integer ' Solo existe dentro de EjemploLocal
End Sub
Para que una variable local conserve su valor entre llamadas, se declara con la palabra clave Static.
Sub EjemploStatic
Static contador As Integer
contador = contador + 1
MsgBox("Contador: " & contador) ' Conserva el valor en cada llamada
End Sub
Variables Públicas (Globales en Módulos)
Declaradas con Dim o Public en la sección de cabecera de un módulo. Son accesibles desde cualquier parte de ese módulo y otros módulos del mismo proyecto.
' Módulo A
Dim contadorGlobal As Integer
Sub Incrementar()
contadorGlobal = contadorGlobal + 1
End Sub
' Módulo B
Sub Mostrar()
MsgBox(contadorGlobal) ' Accede al contadorGlobal definido en Módulo A
End Sub
Las variables Public se reinician al finalizar la ejecución de la macro asociada.
Variables Globales (Persistentes)
Declaradas con Global en la cabecera de un módulo. Son similares a las públicas, pero conservan su valor incluso después de que la macro asociada haya terminado de ejecutarse.
Global contadorPersistente As Integer
Variables Privadas
Declaradas con Private en la cabecera de un módulo. Solo son accesibles dentro de ese módulo específico.
' Módulo A
Private miVariablePrivada As Integer
Sub ProcesoA()
miVariablePrivada = 100
End Sub
' Módulo B
Private miVariablePrivada As Integer ' Esta es una variable distinta
Sub ProcesoB()
miVariablePrivada = 200
End Sub
Si se usan variables con el mismo nombre en diferentes módulos declaradas como Private, son entidades independientes.
Constantes
Los valores constantes no cambian durante la ejecución del programa. Se definen con Const.
Const PI As Double = 3.14159
Const MENSAJE = "Procesando..."
El ámbito de las constantes es similar al de las variables. Se pueden declarar como Public para que sean accesibles desde otros módulos.
Public Const UNIDAD As Integer = 1
Operadores
Operadores Matemáticos
Aplicables a tipos numéricos. El operador + también se usa para concatenar cadenas.
+: Suma (numérica) o Concatena (cadenas).-: Resta.*: Multiplicación./: División (resultado flotante).\: División entera (redondea hacia abajo).^: Potencia.MOD: Módulo (resto de la división).
Nota: Se prefiere el operador & para concatenar cadenas, ya que maneja la conversión de tipos de forma más segura que el +.
Operadores Lógicos
Se aplican a valores booleanos o a nivel de bits en enteros.
AND: Y lógico.OR: O lógico.XOR: O exclusivo lógico.NOT: Negación lógica.EQV: Equivalencia lógica.IMP: Implicación lógica.
Operadores de Comparación
Se usan para comparar valores de casi todos los tipos.
=: Igualdad.<>: Desigualdad.>: Mayor que.>=: Mayor o igual que.<: Menor que.<=: Menor o igual que.
LibreOffice Basic no soporta el operador de comparación Like de VBA.
Flujo de Control
Ramificación (Condicionales)
If...Then...Else
Permite ejecutar código basado en una condición.
If A > 3 Then
B = 2
End If
If A > 3 Then
B = 2
Else
B = 0
End If
If A = 0 Then
B = 0
ElseIf A < 3 Then
B = 1
Else
B = 2
End If
Select Case
Una alternativa más limpia a múltiples ElseIf cuando se evalúa una única variable contra varios valores posibles.
Select Case DiaDeLaSemana
Case 1: NombreDia = "Domingo"
Case 2: NombreDia = "Lunes"
Case 3: NombreDia = "Martes"
' ... hasta Case 7
Case Else
NombreDia = "Día inválido"
End Select
' Variantes de Case:
Select Case variable
Case 1 To 5 ' Rango
Case 6, 7, 8 ' Lista de valores
Case Is > 8 And Is < 11 ' Expresión con operador
Case Else
End Select
Bucles (Repeticiones)
For...Next
Ejecuta un bloque de código un número predeterminado de veces.
Dim i
For i = 1 To 10
' Código a repetir
Next i
' Con pasos personalizados:
For i = 1 To 10 Step 0.5
' ...
Next i
' Con cuenta regresiva:
For i = 10 To 1 Step -1
' ...
Next i
' Salida anticipada del bucle:
For i = 1 To 10
If i = 5 Then Exit For
' ...
Next i
For Each
LibreOffice Basic no soporta la variante For Each...Next de VBA. Los bucles deben usar contadores explícitos con For...Next.
Do...Loop
Ejecuta código mientras (o hasta que) una condición sea verdadera/falsa. Existen cuatro variantes:
Do While...Loop: La condición se evalúa al principio. Si es falsa, el bucle no se ejecuta.Do Until...Loop: La condición se evalúa al principio. Si es verdadera, el bucle no se ejecuta.Do...Loop While: La condición se evalúa al final. El bucle se ejecuta al menos una vez.Do...Loop Until: La condición se evalúa al final. El bucle se ejecuta al menos una vez.
' Do While
Do While A > 10
' Cuerpo del bucle
Loop
' Do Until
Do Until A > 10
' Cuerpo del bucle
Loop
' Do...Loop While
Do
' Cuerpo del bucle
Loop While A > 10
' Do...Loop Until
Do
' Cuerpo del bucle
Loop Until A > 10
' Salida anticipada:
Do
If A = 4 Then Exit Do
' Cuerpo del bucle
Loop While A > 10
While...Wend
Similar a Do While...Loop.
While A > 10
' Cuerpo del bucle
Wend
Funciones y Procedimientos
Sub: Un bloque de código que realiza una acción pero no devuelve un valor.
Function: Un bloque de código que realiza una acción y devuelve un valor.
Definición
Sub
[Modificador] Sub NombreSub [(ListaArgumentos)]
Instrucciones
End Sub
Sub MostrarMensaje(mensaje As String)
MsgBox(mensaje)
End Sub
Function
[Modificador] Function NombreFuncion [(ListaArgumentos)] As TipoRetorno
Instrucciones
NombreFuncion = ValorRetorno ' Asignación del valor de retorno
End Function
Function CalcularHipotenusa(lado1 As Double, lado2 As Double) As Double
CalcularHipotenusa = Sqr((lado1 ^ 2) + (lado2 ^ 2)) ' Sqr es la raíz cuadrada
End Function
El valor de retorno de una función es el último valor asignado a su nombre.
Uso
Llamar a un Sub
NombreSub [(ListaArgumentos)]
MostrarMensaje("Hola desde Sub.")
Llamar a una Function
variableResultado = NombreFuncion [(ListaArgumentos)]
Dim longitud, hipotenusa As Double
hipotenusa = CalcularHipotenusa(longitud, 10.7)
Terminación Anticipada
Exit Sub y Exit Function se usan para salir prematuramente de un procedimiento o función.
Sub ProcesoEjemplo
Dim errorOcurrido As Boolean
' ...
If errorOcurrido Then
MsgBox("Error detectado.")
Exit Sub ' Sale del Sub
End If
' ...
End Sub
Paso de Parámetros
Los argumentos se pasan normalmente por referencia (los cambios dentro de la función afectan a la variable original).
Sub CambiarValor(valorRef As Integer)
valorRef = 20
End Sub
Sub Principal
Dim miValor As Integer
miValor = 10
CambiarValor(miValor) ' miValor ahora es 20
MsgBox(miValor)
End Sub
Para pasar por valor (los cambios no afectan a la variable original), se usa ByVal.
Sub CambiarValorPorValor(ByVal valorVal As Integer)
valorVal = 20 ' Este cambio solo afecta a valorVal dentro de la subrutina
End Sub
LibreOffice Basic identifica ByRef pero lo ignora ya que el paso por referencia es el comportamiento por defecto.
Parámetros Opcionales
Se definen con la palabra clave Optional. La función IsMissing() se usa para verificar si un parámetro opcional fue proporcionado.
Sub ProcesoConOpcional(obligatorio As Integer, Optional opcional As Integer)
Dim valorOpcional As Integer
If Not IsMissing(opcional) Then
valorOpcional = opcional
Else
valorOpcional = 0 ' Valor por defecto si no se proporcionó
End If
' ... usar valorOpcional
End Sub
LibreOffice Basic no soporta el modificador ParamArray de VBA.