Contenu

# Lecture et écriture des valeurs dans les plages

Les macros dans LibreOffice Calc ont souvent besoin de lire et d'écrire des valeurs depuis/vers des feuilles. Cette page d'aide décrit les différentes approches pour accéder aux feuilles et aux plages pour lire ou écrire leurs valeurs.

Tous les exemples présentés dans cette page peuvent être implémentés à la fois en Basic et en Python.

## Accéder à une seule cellule

L'exemple ci-dessous entre la valeur numérique 123 dans la cellule "A1" de la feuille active.

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

La même chose peut être accomplie avec Python :

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

Notez que dans les exemples précédents, la cellule est accessible en utilisant son nom de plage "A1". Il est également possible d'accéder aux cellules à l'aide d'indices comme si la feuille était une matrice où les colonnes et les lignes sont indexées à partir de zéro.

Cela peut être fait en utilisant la méthode getCellByPosition(colIndex, rowIndex), qui prend en compte une colonne et un index de ligne. L'exemple ci-dessous dans Basic modifie la valeur du texte dans la cellule "C1" (colonne 2, ligne 0).

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

Cet exemple peut également être implémenté en Python comme suit :

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

La principale différence entre les scripts Python et Basic réside dans la façon d'accéder à l'objet de feuille en utilisant la variable de contexte XSCRIPTCONTEXT. Après cela, toutes les méthodes et propriétés sont identiques en Basic et Python.

## Valeurs, chaînes et formules

Les cellules Calc peuvent avoir trois types de valeurs : numériques, chaînes et formules. Chaque type a ses propres méthodes set et get :

Type de contenu | Get Method | Set Method
--- | --- | ---
Numérique | getValue() | setValue(newValue)
Texte | getString() | setString(newString)
Formule | getFormula() | setFormula(newFormula)

Les dates et les valeurs monétaires sont considérées comme des valeurs numériques dans Calc.

L'exemple suivant entre des valeurs numériques dans les cellules "A1" et "A2" et insère une formule dans la cellule "A3" qui renvoie la multiplication de ces valeurs.

        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")

## Accès aux plages dans différentes feuilles

Les exemples précédents utilisaient uniquement la feuille active pour effectuer des opérations. Il est possible d'accéder aux plages de cellules dans différentes feuilles par leurs indices ou leurs noms.

L'exemple ci-dessous entre une valeur numérique dans la cellule "A1" de la feuille nommée "Sheet2".

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

Cet exemple peut également être implémenté en Python comme suit :

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

Les feuilles sont également accessibles à l'aide d'indices de base zéro indiquant quelle feuille compte tenu de l'ordre dans lequel elles apparaissent dans le fichier Calc.

En Basic, au lieu d'utiliser la méthode getByName, utilisez Sheets(sheetIndex) comme indiqué ci-dessous :

        oSheet = ThisComponent.Sheets(0)

Cela peut être fait de la même manière en Python :

        sheet = doc.Sheets[0]

## Utilisation de la bibliothèque ScriptForge

Le service Calc de la bibliothèque ScriptForge peut être utilisé pour obtenir et définir les valeurs des cellules comme suit :

        ' Charge la bibliothèque ScriptForge
        GlobalScope.BasicLibraries.LoadLibrary("ScriptForge")
        ' Obtient l'accès au document Calc actuel
        oDoc = CreateScriptService("Calc")
        ' Définit la valeur des cellules A1 et A2
        oDoc.setValue("A1", "Hello")
        oDoc.setValue("A2", 123)

La méthode setValue peut être utilisée pour définir des valeurs numériques et textuelles. Pour définir une formule de cellule, utilisez la méthode setFormula.

Avec le service Calc, l'obtention et la définition des valeurs des cellules peuvent être effectuées avec une seule ligne de code. L'exemple ci-dessous obtient la valeur de la cellule "A1" et l'affiche dans une boîte de message.

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

La bibliothèque ScriptForge simplifie également l'accès aux plages dans différentes feuilles, comme le montre l'exemple ci-dessous :

        Dim val1, val2
        ' Obtient la cellule "A1" de la feuille nommée "Sheet1"
        val1 = oDoc.getValue("Sheet1.A1")
        ' Obtient la cellule "B3" de la feuille nommée "Sheet2"
        val2 = oDoc.getValue("Sheet2.B3")
        ' Place le résultat dans la cellule "A1" de la feuille "Report"
        Dim result : result = val1 * val2
        oDoc.setValue("Report.A1", result)

Les exemples ci-dessus peuvent également être implémentés en Python comme suit :

        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)

Rubriques connexes

La bibliothèque ScriptForge

SFDocuments. Service Calc

Programmer avec des Scripts Python