Fichas de Referencia L.O. Basic
Ficha nº 4.
Calc
Nivel: Principiante
|
Esta ficha de referencia está bajo licencia de CreativeCommons BY-SA v3 (fr) o posterior.: https://creativecommons.org/licenses/by-sa/3.0/fr/ |
|
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 |
Révision de la mise en forme |
|
2.0_ES |
15/09/2026 |
Traducción, y cambio de formato para esta edició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 )
Document activo
Dim Doc As Object
Doc = ThisComponent
Abrir un documento existente
Modo visible
Dim Doc As Object, RutaDoc As String
Dim Props() 'este array no se inicializa pero es necesario definirlo
RutaDoc = ConvertToURL("C:\Ruta\a\UnaHoja.ods")
Doc = StarDesktop.loadComponentFromURL(RutaDoc,"_blank",0,Props())
Modo invisible
Dim Doc As Object, RutaDoc As String
Dim Props(0) As New com.sun.star.beans.PropertyValue
RutaDoc = ConvertToURL("C:\Ruta\a\UnaHojaDeCalculo.ods")
Props(0).Name = "Hidden" 'el documento se abre como "oculto"
Props(0).Value = True
Doc = StarDesktop.loadComponentFromURL(RutaDoc,"_blank",0,Props())
Hacerlo visible (después , en la misma macro)
Doc.CurrentController.Frame.ContainerWindow.Visible = True
Doc.CurrentController.Frame.ContainerWindow.toFront()
Crear una nueva hoja de cálculo
A partir (1) de la plantilla predeterminada o (2) de una plantilla especifica.
Dim Doc As Object
Dim Props() 'este array no se inicializa pero es necesario
Modelo = "private:factory/scalc" '(1)
Modelo = ConvertToURL("C:\Ruta\a\UnaPlantillaDeHoja.ots") '(2)
Doc = StarDesktop.loadComponentFromURL(Modelo,"_blank",0,Props())
Guardar un documento
El documento ya existe
El documento todavía no se ha guardado
Dim Doc As Object, RutaDoc As String
Dim Props() 'las propiedades de guardado (vacías)
RutaDoc = convertToURL("C:\Ruta\a\UnaHojaDeCálculo.ods")
Doc.storeAsURL(RutaDoc, Props())
Si se guarda como un documento ya existente, este pasa a ser el documento activo.
Guardar una copia
Al guardarlo como copia, la copia NO pasa a estar activa, se sigue usando el original
Guardar con contraseña (cualquiera de los casos anteriores)
Props(n).Name = "Password" '(n es la enumeración de propiedades)
Props(n).Value = "mypwd"
Cerrar un documento
Utilice el método close del objeto documento :
ThisComponent.close(True)
Información del documento
El objeto documento contiene las propiedades:
|
Location |
El directorio de almacenamiento del documento.
|
|
DocumentProperties (Objeto) |
Propiedades complementarias. |
DocumentProperties
|
Author |
Nombre del autor. |
ModifyDate |
Fecha última modificación |
|
CreationDate |
Fecha de creación. |
Subject |
Asunto (String). |
|
Description |
Comentarios. |
Title |
Título (String). |
|
ModifiedBy |
Usuario que ha modificado el documento. |
UserDefinedProperties |
Propriedades personalizadas (Objeto). |
¿Es una hoja de cálculo?
El objeto Doc se refiere al documento (Doc = ThisComponent).
CalcOK = Doc.SupportsService("com.sun.star.sheet.SpreadsheetDocument")
El objeto Doc se refiere al documento (Doc = ThisComponent).
Cálculo automático
|
¿Está activo? (Booleano) |
Auto = Doc.isAutomaticCalculationEnabled |
|
Désactivar |
Doc.enableAutomaticCalculation(False) |
|
Activar |
Doc.enableAutomaticCalculation(True) |
|
Forzar el recálculo de fórmulas |
Doc.calculate '(sólo fórmulas no actualizadas) Doc.calculateAll '(recalcula todo) |
Proteger el libro
|
¿Libro protegido? (Booleano) |
Test = Doc.isProtected |
|
Proteger el documento |
Doc.protect(Contraseña) 'puede estar vacía |
|
Desproteger el documento |
Doc.unprotect(Contraseña) |
El objeto Doc se refiere al documento (Doc = ThisComponent).
Acceder a las hojas
Se puede trabajar con los objetos hojas (se empieza contando por 0) :
|
Hoja activa |
Hoja = Doc.CurrentController.ActiveSheet |
|
Lista de hojas |
Hojas = Doc.Sheets |
|
Número de hojas |
NumHojas = Doc.Sheets.Count |
|
Objeto hoja (por su índice) |
Hoja = Doc.Sheets(número_índice) |
|
Objeto hoja (por su nombre) |
Hoja = Doc.Sheets.getByName(Nombre_Hoja) |
|
Verificar la existencia (nombre) |
Exist = Doc.Sheets.hasByName(Nombre_Hoja) |
|
Índice de una hoja |
Indice = Hoja.RangeAddress.Sheet |
Modificar las hojas
p es la posición en el documento (índice, empezando por 0).
|
Añadir una hoja con Nombre |
Doc.Sheets.insertNewByName(Nombre, p) |
|
Eliminar una hoja |
Doc.Sheets.removeByName(Nombre_Hoja) |
|
Duplicar una hoja |
Doc.Sheets.copyByName(NomOrigen, NomDestino, p) |
|
Mover una hoja |
Doc.Sheets.moveByName(Nombre_Hoja, p) |
Gestionar las hojas
Hoja se refiere a un objeto Sheet (hoja).
|
Activar una hoja |
Hoja = Doc.CurrentController.ActiveSheet |
|
Ocultar/Mostrar una Hoja |
Hoja.IsVisible = False 'True |
|
Comprobar la protección |
Protegida = Hoja.IsProtected |
|
Proteger una hoja |
Hoja.protect(contraseña) '(puede estar vacía) |
|
Desproteger una hoja |
Hoja.unprotect(contraseña) |
|
Colorear la pestaña |
Hoja.tabColor = RGB(255, 255, 0) |
Enlazar una hoja
|
Enlazar a un archivo (ej : CSV) |
Hoja.link(URL, "", "Text - txt - csv (StarCalc)", _ Filtre, com.sun.star.sheet.SheetLinkMode.VALUE) |
|
Eliminar enlace |
Hoja.setLinkMode(com.sun.star.sheet.SheetLinkMode.NONE) |
Encontrar la última fila/columna utilizada
Hoja es el objeto Sheet (hoja) donde buscar. Fila y Col son informaciones buscadas
Dim oCur As Object 'cursor sobre la celda
Dim oRango As Object 'el rango usado
Dim Fila As Long, Col As Long
oCur = Hoja.createCursorByRange(Hoja.getCellRangeByName("A1"))
oCur.gotoEndOfUsedArea(True)
oRango = Hoja.getCellRangeByName(oCur.AbsoluteName)
Fila = oRango.RangeAddress.EndRow
Col = oRango.RangeAddress.EndColumn
Acceder a las celdas
Hoja se refiere a un objeto Sheet (hoja). Se puede acceder a un objeto Cell (celda):
|
Por coordenadas |
Celda = Hoja.getCellRangeByName("A4") |
|
Por nombre |
Celda = Hoja.getCellRangeByName("IVA") |
|
Por coordenadas numéricas X e Y (índice 0) |
Celda = Hoja.getCellByPosition(0,3) ' X=0 (columna A) ; Y=3 (Fila 4) |
Acceder a la celda activa
Doc un objeto documento y ActiveCel el objeto celda seleccionado
If Doc.currentSelection.supportsService _
("com.sun.star.sheet.SheetCell") Then
'comprobamos que sea una celda lo seleccionado
ActiveCel = Doc.currentSelection
End If
Seleccionar una celda
ThisComponent.CurrentController.select(Cel)
Coordenadas de una celda
|
Coordenadas (Object) |
Coord = Cel.CellAddress |
|
Coordenadas absolutas (String) |
Coord = Cel.AbsoluteName |
|
Rango de la hoja (Integer) |
NumH = Cel.CellAddress.Sheet |
|
Rango de la columna (Long) |
NumC = Cel.CellAddress.Column |
|
Rango de la fila (Long) |
NumF = Cel.CellAddress.Row |
|
hoja a que pertenece (Objeto) |
Hoja = Cel.Spreadsheet |
(Des)Proteger las celdas
La propiedad Cel.CellProtection utiliza valores booleanos :
|
Proteger contra modificaciones |
CellProtection.IsLocked = True |
|
Ocultar la fórmula |
CellProtection.IsFormulaHidden = True |
|
Ocultar la celda |
CellProtection.IsHidden = True |
|
Evitar impresión de la celda |
CellProtection.IsPrintHidden = True |
Acceder al contenido de una celda
Propiedades
|
obtener un contenido texto |
MiTexto = Cel.String |
|
Obtener un contenido numérico |
UnNumero = Cel.Value |
|
Obtener una fórmula (US) |
LaFormula = Cel.Formula |
|
Obtener una fórmula (regionalización) |
LaFormula = Cel.FormulaLocal |
|
Obtener el tipo de contenido |
ElTipo = Cel.Type |
|
Vaciar una celda |
Cel.String = "" |
Tipo de contenido (propiedad Type)
|
EMPTY |
Celda vacía |
VALUE |
Valor numérico |
|
TEXT |
Texto |
FORMULA |
Formula |
Escribir en una celda
|
Reemplazar el texto existente |
Cel.String = "Cucú !" |
|
Reemplazar el valor existente |
Cel.Value = 1,234 |
|
Reemplazar la fórmula existente |
Cel.Formula = "= AND(A1="SI";A2="NO")" |
|
Reemplazar la fórmula existente (es) |
Cel.FormulaLocal = "=Y(A1="SI";A2="NO")" |
Rango = conjunto de celdas (puede referirse a una única celda): Dim Rango As Object
Acceder a los rangos
Hoja se refiere a un objeto Sheet (hoja). Accedemos a un objeto Range (Rango)
|
Por sus coordenadas |
Rango = Hoja.getCellRangeByName("C2:G14") |
|
Por su nombre |
Rango = Hoja.getCellRangeByName("NombreDeRango") |
|
Por coordenadas (X1, Y1, X2, Y2) |
Rango = Hoja.getCellRangeByPosition(2,1,6,13) |
|
Arbitrariamente (ej 3.a hoja documento) |
Rango = ThisComponent.Sheets.getCellRangeByPosition _ (2, 1, 6, 13, 2) |
Acceder al rango activo
De la misma manera que se accede a la celda activa (pero verificar antes) "com.sun.star.sheet.SheetCellRange" o "[...].SheetCellRanges".
Seleccionar un rango
ThisComponent.CurrentController.select(MiRango) MiRango es un objeto.
Coordenadas de un rango
|
Coordenadas (Object) |
Coord = MiRango.RangeAddress |
|
Rango de la hoja (Integer) |
Rang = MiRango.RangeAddress.Sheet |
|
Columna de inicio (Long) (ángulo superior / izquierdo) |
NumCHG = MiRango.RangeAddress.StartColumn |
|
Fila de inicio (Long) (ángulo superior / izquierdo) |
NumLHG = MiRango.RangeAddress.StartRow |
|
Columna final (Long) (ángulo inferior/derecho) |
NumCBD = MiRango.RangeAddress.EndColumn |
|
Fila final (Long) (ángulo inferior/derecho) |
NumLBD = MiRango.RangeAddress.EndRow |
|
Hoja contenedora (Objeto) |
Hoja = MiRango.Spreadsheet |
|
Coordenadas absolutas (String) |
Coord = MiRango.AbsoluteName |
Rangos con nombre
El objeto Doc se refiere al documento. Dim MisRangos As Object
|
Los rangos con nombre |
MisRangos = Doc.NamedRanges |
|
Número (Long) |
Num = LosRangos.Count |
|
Acceder a un rango (por índice) |
MiRango = LosRangos(index) |
|
Verificar existencia de un rango (nombre) |
Existe = LosRangos.hasByName(Nombre) |
|
Acceder a un rango (por nombre) |
MiRango = LosRangos.getByName(Nombre) |
|
Añadir un rango: Coord: coordenadas del rango CellRef: objeto celda de réferencia |
LosRangos.addNewByName(Nombre,Coord, CellRef.CellAddress, 0) |
|
Eliminar un rango (por nombre) |
LosRangos.removeByName(Nombre) |
Borrar el contenido de un rango
|
Borrar el contenido de MiRango |
MiRango.clearContents(ModoBorrar) |
ModoBorrar es un valor que determina el tipo de borrado. Las constantes com.sun.star.sheet.CellFlags.XXX permiten la elección (se pueden combinar con +) :
|
ANNOTATION |
Comentarios |
STRING |
Texto |
|
DATETIME |
Números formato fecha-hora |
VALUE |
Números (excepto fecha-hora) |
|
FORMULA |
Fórmulas |
|
|
Acceder al contenido de las celdas de un rango
MiRango.DataArray est un array de los valores de las celdas para MiRango.
Copiar el contenido de un rango en otro
|
Copiar el contenido (valores) Orig. a Dest. |
Destino.DataArray = Origen.DataArray |
Escribir valores en un rango (desde un array a un rango)
Dim Tabla As Variant
Tabla = MiRango.DataArray 'Tabla obtiene las dimensiones del rango
'(transferir los valores a los elementos del array)
MiRango.DataArray = Tabla
.DataArray puede ser un array anidado : utilice .DataArray(i)(j) si es el caso
Recorrer las celdas de un rango
Cree una enumeración desde una colección (Rango.Celdas). La cual se recorre llamando a sus propiedades hasMoreElements y NextElement:
Dim Rangos As Object
Rangos = ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges")
Rangos.insertByName("", MiRango)
LEnum = Rangos.Cells.CreateEnumeration
Do While LEnum.hasMoreElements
Celda = Lenum.NextElement
'hacer algo en cada objeto Celda
Loop
Las celdas vacías No se recorren !
Rangos : varios
|
Fusionar las celdas de MiRango |
MiRango.Merge |
Según el modo de acceso a un rango, este implementa uno de los servicios :
|
com.sun.star.sheet.SheetCell |
com.sun.star.sheet.SheetCellRange |
|
com.sun.star.table.CellRange |
com.sun.star.sheet.SheetCellRanges |
|
com.sun.star.sheet.NamedRange |
|
dependiendo del servicio implementado, los rangos deben ser utilizados de manera diferente. Compruebe por medio del método supportsService().
Para conocer el tipo de objeto, compruebe el objeto rango/celda con supportsService():
If MiObj.supportsService(nomb_servicio)Then… Remplace Nombre de servicio con:
|
¿Celda ? |
"com.sun.star.sheet.SheetCell" ① |
|
¿Rango simple ? |
"com.sun.star.sheet.SheetCellRange" ④ |
|
¿Rango múltiple ? |
"com.sun.star.sheet.SheetCellRanges" ➄ |
compruebe siempre celda antes que rango (una celda es también un rango simple)
Filas y columnas son propiedades de los objetos Sheet y Range.
Generalidades
|
Filas (Objeto LasFilas) |
LasFilas = MiRango.Rows |
|
Columnas (Objeto LasColumnas) |
LasColumnas = MiRango.Columns |
|
Número de elementos |
NumF = MiRango.Rows.Count NumC = MiRango.Columns.Count |
|
Una fila (Objeto Fila) (base 0) |
Fila = MiRango.Rows(index) |
|
Una columna (Objeto Columna) (base 0) |
Columna = MiRango.Columns(index) |
Propiedades de filas / columnas
Se aplican a los objetos Fila o Filas / Columna o Columna.
|
Es Visible u oculta (Boolean) |
IsVisible = True |
|
Longitud óptima o fija (Boolean) |
OptimalWidth = True |
Insertar / eliminar filas / columnas
Use el objeto Sitio. PosInicio y Num son la posición inicial y el número de filas / columnas que quiera insertar / eliminar (Long).
|
Insertar |
Sitio.insertByIndex(PosInicio, Num) |
|
Borrar |
Sitio.clearContents(Modoborrado)'vea «Borrar el contenido de rango» |
|
Eliminar |
Sitio.removeByIndex(PosInicio, Num) |
Sólo en un documento visible.
Use el objeto Controlador : MiContrlr = ThisComponent.CurrentController
|
¿hay alguna fija ? |
Fijas = MiContrlr.hasFrozenPanes |
|
Fijar (X, Y) |
MiContrlr.freezeAtPosition(1,2) |
|
Liberar |
MiContrlr.freezeAtPosition(0,0) |
Utilice el servicio "com.sun.star.sheet.FunctionAccess"
Principio
Dim FCalc As Object , Resultado As (según contexto)
Dim Params As (según contexto), NombreFunc As String
FCalc = CreateUnoService("com.sun.star.sheet.FunctionAccess")
Resultado = FCalc.callFunction(Nombre_Función, Parámetros)
El nombre, los parámetros y el tipo de resultado dependen de la función elegida.
El nombre de la función debe ser su nombre en inglés.
Para averigurarlo, cambie temporalmente la presentación de nombres de funciones en Herramientas > Opciones > LibreOffice Calc > Formula, Usar nombres [...] inglés.
Ejemplo 1, función SUMA()
Dim FCalc As Object, Resultado As Long
FCalc = CreateUnoService("com.sun.star.sheet.FunctionAccess")
Resultado = FCalc.callFunction("SUM", Array(1, 55, 321, 8))
Ejemplo 2, función REDONDEAR()
Dim FCalc As Object, Resultado As Double
Dim Params(1) As Variant
Params(0) = 1,2345 'número que se quiere redondear
Params(1) = 3 '3 decimales
FCalc = CreateUnoService("com.sun.star.sheet.FunctionAccess")
Resultado = FCalc.callFunction("ROUND", Params())
Creación
Ejemplo : calculo de la superficie de un trapecio = (lado mayor + lado menor / 2 ) * altura
Function SupTrapecio(BMay As Double, BMen As Double, H As Double)_ As Double
SurpTrapecio = ((BMay + BMen) / 2) * H
End Function
Uso en Calc
Si A2 es la base mayor, A3 la base menor y A4 la altura, la superficie del trapecio se obtiene insertando la fórmula siguiente en una celda: =SUPTRAPECIO(A2;A3;A4)
- La macro recibe los valores de los argumentos y no el objeto celda.
- La macro reenvía un valor, No puede actuar sobre una celda
- La función se debe colocar en una biblioteca accesible en el momento de su uso (ej. : Standard del documento o del usuario) (sino devolverá el error #VALOR!)