Contenido

# Lectura y escritura de valores en intervalos

Las macros en LibreOffice Calc a menudo deben leer y escribir valores en hojas de cálculo. Esta página de la ayuda describe los diversos enfoques para acceder a hojas e intervalos y leer o escribir sus valores.

Todos los ejemplos presentados en esta página pueden ser implementados tanto en BASIC como en Python.

## Acceder a una única celda

El ejemplo siguiente introduce el valor numérico 123 en la celda «A1» de la hoja activa.

        Dim oSheet as Object
        Dim oCell as Object
        oSheet = ThisComponent.CurrentController.getActiveSheet()
        oCell = oSheet.getCellRangeByName("A1")
        oCell.setValue(123)

Se puede lograr lo mismo con Python:

        doc = XSCRIPTCONTEXT.getDocument()
        sheet = doc.getCurrentController().getActiveSheet()
        cell = sheet.getCellRangeByName("A1")
        cell.setValue(123)

Observe que, en los ejemplos anteriores, la celda es accesible utilizando su nombre de intervalo «A1». Es también posible acceder a las celdas con la ayuda de índices, como si la hoja fuese una matriz en la que las columnas y filas están indizadas a partir de cero.

Esto se puede hacer utilizando el método getCellByPosition(colIndex, rowIndex), que tiene en cuenta los índices de columna y fila. El ejemplo siguiente en Basic modifica el valor del texto en la celda "C1" (columna 2, fila 0).

        oSheet = ThisComponent.CurrentController.getActiveSheet()
        oCell = oSheet.getCellByPosition(2, 0)
        oCell.setString("Hello")

El ejemplo también puede implementarse en Python:

        doc = XSCRIPTCONTEXT.getDocument()
        sheet = doc.getCurrentController().getActiveSheet()
        cell = sheet.getCellByPosition(2, 0)
        cell.setString("Hello")

La diferencia principal entre los scripts Python y Basic reside en la manera de acceder al objeto hoja utilizando la variable de contexto XSCRIPTCONTEXT. Después de esto, todos los métodos y propiedades son idénticos en Basic y en Python.

## Valores, cadenas y fórmulas

Las celdas de Calc pueden tener tres tipos de valores: numéricos, de cadena y fórmulas. Cada tipo posee sus propios métodos «get» y «set»:

Tipo | Get Method | Set Method
--- | --- | ---
Numérico | getValue() | setValue(newValue)
Texto | getString() | setString(newString)
Fórmula | getFormula() | setFormula(newFormula)

En Calc, las fechas y los valores monetarios se consideran valores numéricos.

El ejemplo siguiente introduce valores numéricos en las celdas "A1" y "A2" e inserta una fórmula en la célda "A3" que devuelve la multiplicación de esos valores.

        oSheet = ThisComponent.CurrentController.getActiveSheet()
        oCell = oSheet.getCellRangeByName("A1")
        oCell.setValue(10)
        oCell = oSheet.getCellRangeByName("A2")
        oCell.setValue(20)
        oCell = oSheet.getCellRangeByName("A3")
        oCell.setFormula("=A1*A2")

## Acceder a intervalos de hojas distintas

Los ejemplos anteriores usaban la hoja activa únicamente para efectuar operaciones. Es posible acceder a intervalos de celdas de diferentes hojas por sus índices o sus nombres.

El ejemplo siguiente introduce un valor numérico en la celda "A1" de la hoja con nombre "Sheet2"

        oSheet = ThisComponent.Sheets.getByName("Sheet2")
        oCell = oSheet.getCellRangeByName("A1")
        oCell.setValue(123)

El ejemplo también puede implementarse en Python:

        doc = XSCRIPTCONTEXT.getDocument()
        sheet = doc.Sheets["Sheet2"]
        cell = sheet.getCellRangeByName("A1")
        cell.setValue(123)

Las hojas son también accesibles con ayuda de índices en base cero que indican que la hoja se toma en cuenta según el orden en el que aparecen el el archivo Calc.

En BASIC, en lugar de utilizar el método getByName, utilice Sheets(sheetIndex) como se indica a continuación:

        oSheet = ThisComponent.Sheets(0)

Esto puede lograrse de manera similar en Python:

        sheet = doc.Sheets[0]

## Uso de la biblioteca ScriptForge

Sírvase del servicio Calc de la biblioteca ScriptForge para obtener y establecer valores de celdas:

        ' Carga la biblioteca ScriptForge
        GlobalScope.BasicLibraries.LoadLibrary("ScriptForge")
        ' Obtiene acceso al documento actual de Calc
        oDoc = CreateScriptService("Calc")
        ' Establece los valores de las celdas A1 y A2
        oDoc.setValue("A1", "Hello")
        oDoc.setValue("A2", 123)

El método setValue puede utilizarse para definir valores numéricos o de texto. Para definir una fórmula en una celda, utilice el método setFormula.

Con el servicio Calc, es posible efectuar la obtención y definición de valores de celdas en una sola línea de código. El ejemplo siguiente obtiene el valor de la celda «A1» y la muestra en un diálogo de mensaje.

        Dim val as Variant, oDoc as Object
        oDoc = CreateScriptService("Calc")
        val = oDoc.getValue("A1")
        MsgBox val

La biblioteca ScriptForge también simplifica el acceso a intervalos de distintas hojas, como se demuestra en el ejemplo siguiente:

        Dim val1, val2
        ' Obtiene el valor de la celda "A1" de la hoja con nombre "Sheet1"
        val1 = oDoc.getValue("Sheet1.A1")
        ' Obtiene el valor de la celda "B3" de la hoja con nombre "Sheet2"
        val2 = oDoc.getValue("Sheet2.B3")
        ' Coloca el resultado de la multiplicación en la celda "A1" de la hoja "Report"
        Dim result : result = val1 * val2
        oDoc.setValue("Report.A1", result)

Los ejemplos anteriores pueden asimismo implementarse en Python:

        from scriptforge import CreateScriptService
        doc = CreateScriptService("Calc")
        doc.setValue("A1", "Hello")

        doc = CreateScriptService("Calc")
        bas = CreateScriptService("Basic")
        val = doc.getValue("A1")
        bas.MsgBox(val)

        first_val = doc.getValue("Sheet1.A1")
        second_val = doc.getValue("Sheet2.B3")
        result = first_val * second_val
        doc.setValue("Report.A1", result)

Temas relacionados

La biblioteca ScriptForge

Servicio SFDocuments.Calc

Programar con secuencias de órdenes en Python

¡Necesitamos su ayuda!