Fichas de Referencia LO Basic

Ficha nº 3.
Tipos Estructurados

Nivel: Intermedio

Créditos

Autor: Jean-François Nifenecker – jean-francois.nifenecker@laposte.net

Traducción y adaptación: B. Antonio Fernández

Esta ficha de referencia está bajo licencia de CreativeCommons BY-SA v3 (fr) o posterior.: https://creativecommons.org/licenses/by-sa/3.0/fr/

img_FB26203-001

Este documento es una adaptación del documento original, en Francés, que se puede obtener en la Wiki de publicaciones de LibreOffice.

Versión

Fecha

Comentarios

2.0

06/04/2021

Mise à jour de la mise en forme ; actualisations

2.0_ES

15/09/2026

Traducción, cambio de formato para esta versión

Somos como enanos a hombros de gigantes. Si alcanzamos a ver más cosas y más lejanas que ellos, no es por la perspicacia de nuestra visión, ni por nuestra grandeza, sino porque son ellos quienes nos elevan. (atribuido a Bernard de Chartres )

Matrices

Agrupación de elementos similares, aplicando un índice interno (Long).

Dimensiones

Una matriz puede contener varias dimensiones (max: 60).

Declaración

En la tabla siguiente: el índice se expresa como ix.

Matrices estáticas

Características predefinidas

Una dimension («vector»)

 

Dim T(ixMin To ixMax) As UnTipo

Dim T(1 To 12) As UnTipo

1 dimensión, 12 elementos, (ix = 1)

Dim T(ixMax) As UnTipo

Dim T(9): 1 dimensión, 10 elementos,

(íx = 0) (se empieza a contar desde cero)

Varias dimensiones

 

Dim T(ixMin1 To ixMax1, ixMin2 To ixMax2) As UnTipo

Varias dimensiones (en el ejemplo 2).

Dim T(1 To 12, 1 To 31) As Integer

2 dimensiones, 12 y 31 elementos (ix = 1)

Dim T(ixMax1, ixMax2, … ) As UnTipo

Dim T(2,4) As String: 2 dimensiones.

3 elementos para la 1ª, 5 para la 2ª.(ix = 0)

Matrices dinámicas

Las  dimensiones se definen durante ejecución.

Dim Array1() As UnTipo

Dim Array1 As Variant

Matriz de dimensiones desconocidas. Después

será necesario usar ReDim

Matrices anidadas (Nested arrays/Jagged matrices)

O matrices de matrices. Ej: usadas para acceder a los intervalos de datos en Calc.

Una matriz externa (de variants) tiene por elementos matrices de datos:

Dim T As Variant
Anidada = Array(Array(1, 2, 3), Array(10, 20, 30), Array(7, 8, 9))

Anidada(0)(0) vale 1; -  Anidada(2)(2) vale 9, etc.

Acceso a un elemento de la matriz

Por índice :

Dim Matriz(9) As Integer

Matriz(5) = 123 '(modifica el 5º elem).

Dim Matriz(11, 31) As Integer

Matriz(5, 28) = 123

Funciones e instrucciones relativas a la matriz

Verificación de una matriz

Una variable «Matriz» sólo se procesa si pasa las siguientes (3) comprobaciones:

¿Existe la variable? – Not IsNull(Matriz)

¿Es una matriz? – IsArray(Matriz)

¿Están definidas sus dimensiones? – UBound(Matriz) >= LBound(Matriz)

Recorrer una matriz de una dimensión (vector)

Por sus índices

Dim Matriz(9) As Integer, i As Long
 For i = LBound(Matriz) To Ubound(Matriz)
   Print Matriz(i)
 Next i

Por sus elementos

Dim Element As 'tipo compatible con todos los elementos
 For Each Elemento In Matriz
   Print Elemento
 Next

Recorrer una matriz de dos dimensiones

Dim Matriz(2, 4) '3 filas, 5 columnas
Dim i As Long, j As Long
 For i = LBound(Matriz) To Ubound(Matriz)
   For j = Lbound(Matriz, 2) To UBound(Matriz, 2)
     Print Matriz(i, j)
   Next j
 Next i

Ordenación de los elementos de matrices

Duplicar matrices

Método General

Un bucle (For … Next) que copie los valores entre 2 matrices (el proceso puede ser muy largo)

Truco

Por asignación y después usando ReDim Preserve:

Matriz2 = Matriz1  'Dos matrices -> mismos valores
ReDim Preserve Matriz2(Tamaño)  '-> 2 matrices distintas

Usar una matriz en subrutinas

Como parámetro de una subrutina

Sub con parámetro matriz)

Sub UsarArray(ByRef Matriz() As String

Llamada a la subrutina

Dim Matriz(9) As String
UsarArray(Matriz)

Como resultado de una función

Función con resultado matriz

Function ObtenArray() As Integer()
 ObtenArray = MatrizDeEnteros()'Después de crear la «MatrizDeEnteros»
End function

Llamada a la función desde una sub

Dim Matriz As Integer
 Matriz = ObtenArray()

Tablas e intervalos de libros de cálculo

(Vea la Ficha 4. Calc)

Tipos personalizados (Custom types)

Permiten añadir varios valores (miembros) en un tipo de valor único.

Simplifican la manipulación de datos, paso de parámetros o resultado de función.

Declaración de tipo

Type MiTipoPerso
 UnMiembro As TipoSimple
 OtroMiembro As OtroTipoSimple
End Type
' -----------------
Type Suceso
 Nombre As String
 FechaHora As Date
End Type

Declaración de una variable de un tipo personalizado

Dim UnaVar As MiTipoPerso

Uso

Asignación: VarPerso.UnMiembro = UnValor

Lectura: UnaVar = VarPerso.OtroMiembro

With VarPerso
 .UnMiembro = UnValor 'Observe la presencia del punto.
End With

Colecciones

Estructura que permite el acceso rápido a los datos al indexarlos. Una colección se manipula como un tipo Object. Los elementos almacenados pueden ser de cualquier tipo, incluido Object.

Declarar una colección

Dim oColec As New Collection

Añadir un elemento

Con clave:  oColec.Add(Elt, "Clave")

Sin clave: oColl.Add(Elt)

Accceder a un elemento

Remplazar un elemento

Misma clave, nuevo valor de elemento.

Eliminar un elemento

Eliminar todos los elementos

ReDim oColl As New Collection

Número de elementos

Numero = oColl.Count

Verificación de la existencia de un elemento

Intento de acceso y tratamiento del error eventual (la función siguiente devuelve true o false)

Function ExistsItem(ByRef pColl As Object, pKey As String) As Boolean
 Dim Item As Variant, Exists As Boolean
 On Local Error Goto ErrHandler
 Exists = False
 Item = pColl(pKey)  'si pKey no existe -> ErrHandler:
 Exists = True
ErrHandler:
   'do nothing
 ExistsItem = Exists
End Function

Recorrer una colección

Puede obtener los elementos de una colección recorriéndola.

Por índices

  For i = 1 To oColl.Count
   Valor = oColl.Item(i)  'acceso al dato
 Next i

Por acceso directo a los elementos

Dim Element As 'tipo compatible con los elementos de la colección.
 For Each Element In oColl
   'Hacer algo con el elemento(dato)
 Next

Creación de clases en Basic

Embrión de programación orientada a objetos (POO) (OOP en inglés).

Una clase LibreOffice Basic podría entenderse como un tipo personalizado mejorado, al que se añade un comportamiento (funciones o subrutinas).

Vocabulario

Módulo de clase

Módulo de código destinado a contener las declaraciones de la clase

Clase

Tipo que permite crear (instanciar) variables objeto.

Sucesos

Métodos para interceptar la creación y destrucción del objeto.

Miembro

Variable interna de una clase.

Propiedad

Refleja el estado del objeto.

Método

Realiza una acción con el objeto.

Instancia

Objeto creado a partir de un tipo clase.

Especificar una clase

Las especificaciones de una clase (miembros, propiedades, métodos) se hacen en el interior de un módulo de código dedicado. En LibreOffice Basic, este módulo no se distingue de un módulo estándar más que por sus opciones iniciales.

Opciones iniciales

Al principio del modulo de clase indique las opciones:

Option Explicit  'como habitualmente
Option Compatible
Option ClassModule

Variables miembros

Son internas, por tanto declaradas Private.

Private mNombre As String
Private mSheet As Object

Sucesos (Events)

Son dos subrutinas internas por tanto, declaradas Private.

Constructor: Private Sub Class_Initialize() Para iniciar el objeto durante su creación.

Destructor: Private Sub Class_Terminate() Para purgar sus componentes internos durante su destrucción.

Propiedades (Properties)

Propiedad = estado del objeto. Son visibles desde el exterior, por tanto declarados  Public.

De lectura (Get)

(todo tipo de datos, incluidos objetos)
Public Property Get Name() As String
 Name = mName
End Property

De escritura (Let)

(todo tipo de datos excepto objetos)
Public Property Let Name(ByRef pName As String)
 mName = pName
End Property

De escritura (Set)

(sólo objetos)
Public Property Set Sheet(ByRef pSheet As Object)
 Set mSheet = pSheet
End Property

Una clase puede contener propiedades de lectura y escritura: Escriba sucesivamente las dos propiedades Get y Let/Set si es necesario.

Las propiedades pueden acceder a los miembros, propiedades y métodos de la clase.

Métodos (Methods)

Método = action sobre/de el objeto.

Sub y Function propias de la clase, internas (Private) o visibles (Public). Se escriben como Sub o Function estándar precedidas de la palabra clave Public o Private. Estas tienen acceso a los miembros y propiedades de la clase.

Utilización de las clases en Basic

Declarar/crear un objeto

Instanciación inmediata

Set MiObjeto = MiClase

Instanciación diferida (1ª llamada)

Dim MiObjeto As New MiClase : MiObjeto = New MiClase

El constructor de la clase se llama en el momento de la instanciación del objeto.

No se puede declarar un objeto As New MiClase fuera de la bibliloteca en la que el módulo clase existe. Por lo general deberá declarar el objeto As Object.

Acceder a las propiedades y métodos de un objeto

Sintaxis de acceso a los elementos de un objeto:

objeto.propiedad u objeto.metodo

Como para los tipos personalizados, puede utilizar la sintaxis With..End With

Liberar un objeto

Cuando un objeto no sea ya necesario, puede destruirlo: Set oObjet = Nothing

En ese momento se hace una llamada al destructor de la clase

Función de «fábrica» (Factory) / Accesor (accessor)

Cuestión de visibilidad de tipos y clases personalizados

Para solucionar este problema, cree una función «fábrica» (o accesor) para crear las variables. A esta función se la podrá llamar desde cualquier módulo o biblioteca.

 

Uso

Visibilidad

Fábrica creada en

Declarado

Tipo personal.

As MiTipo

Mismo módulo

Mismo módulo

As Variant

Clase

As MiClase

Misma biblioteca

Misma biblioteca, otro módulo

As Object

Creación de la función «fábrica» / accesor

Tipos personalizados

Function CreateMiTipoPerso() As MiTipoPerso
 Dim oVar As MiTipoPerso
 CreateMiTipoPerso = oVar
End Function

Clases

Function CreateMiClase() As MiClase
 Dim oVar As New MiClase
 CreateMiClase = oVar
End Function

Uso de la función «fábrica» / accesor

Tipos personalizados

Dim MiVar As Variant
 MiVar = CreateMiTypoPerso()

Clases

Dim MiVar As Object
 MiVar = CreateMiClase()

Contenido