Introducción a LibreOffice Basic: Sintaxis y Estructuras

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.

Etiquetas: LibreOffice Basic programación scripts macros sintaxis

Publicado el 7-24 15:56